Compare commits
134 commits
backup/pre
...
local/wind
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
52ce463a59 | ||
|
|
48eae39858 | ||
|
|
ba5fb65b44 | ||
|
|
95a82c0d69 | ||
|
|
c06b184ecf | ||
|
|
d0fa882596 | ||
|
|
2b7fd9b8e2 | ||
|
|
eb55cd020f | ||
|
|
96ce377ebf | ||
|
|
09c4d04b49 | ||
|
|
f4e8a920ff | ||
|
|
3639bafcfa | ||
|
|
04da80bb90 | ||
|
|
251162f846 | ||
|
|
285718ac72 | ||
|
|
5384a8b1c5 | ||
|
|
59ccde22fa | ||
|
|
a82f24ed39 | ||
|
|
dbc755a0d6 | ||
|
|
76495af986 | ||
|
|
91a4a8a588 | ||
|
|
18ff4d01de | ||
|
|
98fc3d5952 | ||
|
|
7dc9530a3e | ||
|
|
4597822df4 | ||
|
|
ca581c2c3a | ||
|
|
0b9a8cd9c8 | ||
|
|
1e8bce8395 | ||
|
|
c2d9959e41 | ||
|
|
9ae465c00f | ||
|
|
ffc53eb55f | ||
|
|
28fb6cc4af | ||
|
|
243d302447 | ||
|
|
9118be4093 | ||
|
|
5c20aa9a75 | ||
|
|
cf7fc32adf | ||
|
|
0020132e63 | ||
|
|
415e1d8832 | ||
|
|
b3e3738189 | ||
|
|
2252964196 | ||
|
|
40ef4c4539 | ||
|
|
536cee276f | ||
|
|
c299b6bc67 | ||
|
|
aae22f862c | ||
|
|
5e31a1ee56 | ||
|
|
b5a3a9311b | ||
|
|
8df385b2a6 | ||
|
|
41639a3aa8 | ||
|
|
d5140ebde6 | ||
|
|
8d5a7c3e60 | ||
|
|
d0dcf83115 | ||
|
|
4a15250a9e | ||
|
|
ec0daf0d2e | ||
|
|
6eb529f662 | ||
|
|
99977a2fde | ||
|
|
92f40bc77d | ||
|
|
ec806474d9 | ||
|
|
754b657abf | ||
|
|
ef72008559 | ||
|
|
2524f48c5e | ||
|
|
23021c519b | ||
|
|
2d25dce518 | ||
|
|
bd9ae61de2 | ||
|
|
ab95afb0c8 | ||
|
|
bf9c82e0c1 | ||
|
|
d5d1dd59cc | ||
|
|
935c31bff4 | ||
|
|
5c00ea5483 | ||
|
|
4d3d579bbe | ||
|
|
d1224aaa5e | ||
|
|
28c3510671 | ||
|
|
eb8d0e349f | ||
|
|
787c5ed49f | ||
|
|
6e022755f1 | ||
|
|
91e14abe49 | ||
|
|
2019f1c33c | ||
|
|
52553ca482 | ||
|
|
0a1f4901cd | ||
|
|
a5ea3dc62c | ||
|
|
408b9aa5af | ||
|
|
cd03bdadc7 | ||
|
|
b46a55d423 | ||
|
|
a0245a29e8 | ||
|
|
f5f6d3e8f0 | ||
|
|
1139e34928 | ||
|
|
9db1681e0d | ||
|
|
fde0ae0beb | ||
|
|
46090ae210 | ||
|
|
ceed2b9ac1 | ||
|
|
e5f8731eb2 | ||
|
|
55b502dff3 | ||
|
|
4a311f15a4 | ||
|
|
3182327417 | ||
|
|
5ded31bef1 | ||
|
|
18beed5712 | ||
|
|
c654b6764b | ||
|
|
43bd2f7e74 | ||
|
|
be8a904c97 | ||
|
|
9d56b0d551 | ||
|
|
7c9f04adcc | ||
|
|
13a7271dde | ||
|
|
585ff2760e | ||
|
|
f48bcde63b | ||
|
|
2924fea3ac | ||
|
|
eec172cdae | ||
|
|
56dea23d77 | ||
|
|
85f35c45c1 | ||
|
|
d1a29cfbf6 | ||
|
|
6b4a3d565c | ||
|
|
1839ad375f | ||
|
|
a552e72438 | ||
|
|
cd7b39826b | ||
|
|
d8387de321 | ||
|
|
b91f2a0b05 | ||
|
|
12ed26a81e | ||
|
|
a3579ea1a6 | ||
|
|
bc68d44393 | ||
|
|
c8bd8f603d | ||
|
|
8ed5d82499 | ||
|
|
19a6bc96e6 | ||
|
|
56b141d8ee | ||
|
|
f114253293 | ||
|
|
9f475ee222 | ||
|
|
360c10aaf5 | ||
|
|
cc71d557c3 | ||
|
|
74727e6e6a | ||
|
|
b81cb0ceae | ||
|
|
00d8ea41e4 | ||
|
|
9f4882c48c | ||
|
|
407c1cfad1 | ||
|
|
d3d0bff3fb | ||
|
|
8c504103fd | ||
|
|
45ca79e0b2 | ||
|
|
38a0f54769 |
186 changed files with 13770 additions and 6853 deletions
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
- [ ] I have disclosed use of any AI generated code in my commit messages.
|
||||||
|
- If you are using an LLM, and do not fully understand the changes it is making to the code base, do not create a PR.
|
||||||
|
- In our experience, AI generated code often results in overly complex code that lacks enough context for a proper fix or feature inclusion. This results in considerably longer code reviews. Due to this, AI authored or partially authored PRs may be closed without comment.
|
||||||
|
- [ ] I understand these changes in full and will be able to respond to review comments.
|
||||||
|
- [ ] My change is accurately described in the commit message.
|
||||||
|
- [ ] My contribution is tested and working as described.
|
||||||
|
- [ ] I have read the [Developer Certificate of Origin](https://developercertificate.org/) and certify my contribution under its conditions.
|
||||||
|
|
||||||
22
.github/workflows/ci.yml
vendored
22
.github/workflows/ci.yml
vendored
|
|
@ -15,9 +15,9 @@ jobs:
|
||||||
name: Rustfmt
|
name: Rustfmt
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v6
|
||||||
- name: install toolchain
|
- name: install toolchain
|
||||||
run: rustup toolchain install 1.80.1 --component rustfmt
|
run: rustup toolchain install 1.90.0 --component rustfmt
|
||||||
- name: fmt
|
- name: fmt
|
||||||
run: cargo fmt --all --check
|
run: cargo fmt --all --check
|
||||||
|
|
||||||
|
|
@ -27,9 +27,9 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: install system dependencies
|
- name: install system dependencies
|
||||||
run: sudo apt-get update && sudo apt-get install lld cmake libclang-dev libexpat1-dev libfontconfig-dev libfreetype-dev libpipewire-0.3-dev libpulse-dev pkg-config libxkbcommon-dev libudev-dev libinput-dev libwayland-dev
|
run: sudo apt-get update && sudo apt-get install lld cmake libclang-dev libexpat1-dev libfontconfig-dev libfreetype-dev libpipewire-0.3-dev libpulse-dev pkg-config libxkbcommon-dev libudev-dev libinput-dev libwayland-dev
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v6
|
||||||
- name: install toolchain
|
- name: install toolchain
|
||||||
run: rustup toolchain install 1.80.1 --component clippy
|
run: rustup toolchain install 1.90.0 --component clippy
|
||||||
- name: clippy
|
- name: clippy
|
||||||
run: cargo clippy --all-features
|
run: cargo clippy --all-features
|
||||||
|
|
||||||
|
|
@ -39,8 +39,20 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: install system dependencies
|
- name: install system dependencies
|
||||||
run: sudo apt-get update && sudo apt-get install lld cmake libclang-dev libexpat1-dev libfontconfig-dev libfreetype-dev libpipewire-0.3-dev libpulse-dev pkg-config libxkbcommon-dev libudev-dev libinput-dev libwayland-dev
|
run: sudo apt-get update && sudo apt-get install lld cmake libclang-dev libexpat1-dev libfontconfig-dev libfreetype-dev libpipewire-0.3-dev libpulse-dev pkg-config libxkbcommon-dev libudev-dev libinput-dev libwayland-dev
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v6
|
||||||
- name: install toolchain
|
- name: install toolchain
|
||||||
run: rustup show
|
run: rustup show
|
||||||
- name: test
|
- name: test
|
||||||
run: cargo test --all-features
|
run: cargo test --all-features
|
||||||
|
|
||||||
|
check-features:
|
||||||
|
name: Check features
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: install system dependencies
|
||||||
|
run: sudo apt-get update && sudo apt-get install lld cmake libclang-dev libexpat1-dev libfontconfig-dev libfreetype-dev libpipewire-0.3-dev libpulse-dev pkg-config libxkbcommon-dev libudev-dev libinput-dev libwayland-dev just
|
||||||
|
- uses: actions/checkout@v6
|
||||||
|
- name: install toolchain
|
||||||
|
run: rustup show
|
||||||
|
- name: check features
|
||||||
|
run: just check-features
|
||||||
|
|
|
||||||
2
.github/workflows/validate-desktop-files.yml
vendored
2
.github/workflows/validate-desktop-files.yml
vendored
|
|
@ -18,7 +18,7 @@ jobs:
|
||||||
image: ubuntu:25.10
|
image: ubuntu:25.10
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Install desktop-file-utils
|
- name: Install desktop-file-utils
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
3823
Cargo.lock
generated
3823
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
39
Cargo.toml
39
Cargo.toml
|
|
@ -4,14 +4,22 @@ default-members = ["cosmic-settings"]
|
||||||
resolver = "3"
|
resolver = "3"
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
rust-version = "1.85"
|
rust-version = "1.90"
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
cosmic-randr = { git = "https://github.com/pop-os/cosmic-randr" }
|
cosmic-randr = { git = "https://github.com/pop-os/cosmic-randr" }
|
||||||
tokio = { version = "1.49.0", features = ["macros"] }
|
tokio = { version = "1.49.0", features = ["macros"] }
|
||||||
|
iced_winit = { git = "https://github.com/pop-os/libcosmic", default-features = false }
|
||||||
|
|
||||||
[workspace.dependencies.libcosmic]
|
[workspace.dependencies.libcosmic]
|
||||||
features = ["dbus-config", "desktop", "multi-window", "winit", "tokio", "qr_code"]
|
features = [
|
||||||
|
"dbus-config",
|
||||||
|
"desktop",
|
||||||
|
"multi-window",
|
||||||
|
"winit",
|
||||||
|
"tokio",
|
||||||
|
"qr_code",
|
||||||
|
]
|
||||||
git = "https://github.com/pop-os/libcosmic"
|
git = "https://github.com/pop-os/libcosmic"
|
||||||
|
|
||||||
[workspace.dependencies.cosmic-config]
|
[workspace.dependencies.cosmic-config]
|
||||||
|
|
@ -54,21 +62,32 @@ debug = true
|
||||||
# [patch.'https://github.com/pop-os/cosmic-text']
|
# [patch.'https://github.com/pop-os/cosmic-text']
|
||||||
# cosmic-text = { git = "https://github.com/pop-os/cosmic-text//", rev = "b017d7c" }
|
# cosmic-text = { git = "https://github.com/pop-os/cosmic-text//", rev = "b017d7c" }
|
||||||
|
|
||||||
# [patch.'https://github.com/pop-os/cosmic-protocols']
|
[patch.'https://github.com/pop-os/cosmic-protocols']
|
||||||
# cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols//", rev = "d0e95be" }
|
cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols//", rev = "d0e95be" }
|
||||||
# cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", rev = "d0e95be" }
|
cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", rev = "d0e95be" }
|
||||||
|
|
||||||
# [patch.'https://github.com/pop-os/cosmic-settings-daemon']
|
# [patch.'https://github.com/pop-os/cosmic-settings-daemon']
|
||||||
# cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daemon//", branch = "input_nobuild" }
|
# cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daemon//", branch = "input_nobuild" }
|
||||||
|
|
||||||
# For development and testing purposes
|
# For development and testing purposes
|
||||||
# [patch.'https://github.com/pop-os/libcosmic']
|
[patch.'https://github.com/pop-os/libcosmic']
|
||||||
# libcosmic = { path = "../libcosmic" }
|
libcosmic = { path = "../libcosmic" }
|
||||||
# cosmic-config = { path = "../libcosmic/cosmic-config" }
|
cosmic-config = { path = "../libcosmic/cosmic-config" }
|
||||||
# cosmic-theme = { path = "../libcosmic/cosmic-theme" }
|
cosmic-theme = { path = "../libcosmic/cosmic-theme" }
|
||||||
# iced_futures = { path = "../libcosmic/iced/futures" }
|
iced_futures = { path = "../libcosmic/iced/futures" }
|
||||||
|
iced_winit = { path = "../libcosmic/iced/winit" }
|
||||||
|
|
||||||
|
# libcosmic = { git = "https://github.com/pop-os/libcosmic//" }
|
||||||
|
# cosmic-config = { git = "https://github.com/pop-os/libcosmic//" }
|
||||||
|
# cosmic-theme = { git = "https://github.com/pop-os/libcosmic//" }
|
||||||
|
# iced_futures = { git = "https://github.com/pop-os/libcosmic//" }
|
||||||
|
# iced_winit = { git = "https://github.com/pop-os/libcosmic//" }
|
||||||
|
|
||||||
# [patch.'https://github.com/pop-os/dbus-settings-bindings']
|
# [patch.'https://github.com/pop-os/dbus-settings-bindings']
|
||||||
# cosmic-dbus-networkmanager = { path = "../dbus-settings-bindings/networkmanager" }
|
# cosmic-dbus-networkmanager = { path = "../dbus-settings-bindings/networkmanager" }
|
||||||
# upower_dbus = { path = "../dbus-settings-bindings/upower" }
|
# upower_dbus = { path = "../dbus-settings-bindings/upower" }
|
||||||
# nm-secret-agent-manager = { git = "https://github.com/pop-os/dbus-settings-bindings//", branch = "nm-secret-agent" }
|
# nm-secret-agent-manager = { git = "https://github.com/pop-os/dbus-settings-bindings//", branch = "nm-secret-agent" }
|
||||||
|
|
||||||
|
[patch.crates-io]
|
||||||
|
atspi = { git = "https://github.com/wash2/atspi" }
|
||||||
|
atspi-common = { git = "https://github.com/wash2/atspi" }
|
||||||
|
|
|
||||||
12
TESTING.md
12
TESTING.md
|
|
@ -10,6 +10,12 @@ This document provides a regression testing checklist for COSMIC Settings and th
|
||||||
|
|
||||||
- [ ] Able to disconnect from and connect to a network.
|
- [ ] Able to disconnect from and connect to a network.
|
||||||
|
|
||||||
|
#### Bluetooth
|
||||||
|
|
||||||
|
- [ ] Bluetooth device connects.
|
||||||
|
- [ ] Paired device can be disconnected & reconnected.
|
||||||
|
- [ ] Paired device can be forgotten & connecting again works.
|
||||||
|
|
||||||
### Desktop
|
### Desktop
|
||||||
|
|
||||||
#### Wallpaper
|
#### Wallpaper
|
||||||
|
|
@ -32,7 +38,7 @@ This document provides a regression testing checklist for COSMIC Settings and th
|
||||||
#### Dock
|
#### Dock
|
||||||
|
|
||||||
- [ ] Enable tiling. "Automatically hide dock" takes effect immediately.
|
- [ ] Enable tiling. "Automatically hide dock" takes effect immediately.
|
||||||
- [ ] Disable tiling; maximize a window. "Autommatically hide dock" takes effect immediately.
|
- [ ] Disable tiling; maximize a window. "Automatically hide dock" takes effect immediately.
|
||||||
- [ ] Changing position on screen works.
|
- [ ] Changing position on screen works.
|
||||||
- [ ] All Style settings take effect as expected.
|
- [ ] All Style settings take effect as expected.
|
||||||
|
|
||||||
|
|
@ -63,13 +69,13 @@ TBD after devices/profiles are fixed.
|
||||||
|
|
||||||
#### X11 Applications Compatibility
|
#### X11 Applications Compatibility
|
||||||
|
|
||||||
- [ ] Global Shortcuts in X11 Applications works (in e.g. Discord).
|
- [ ] Global Shortcuts in X11 Applications work (in e.g. Discord).
|
||||||
|
|
||||||
### Time & Language
|
### Time & Language
|
||||||
|
|
||||||
#### Date & Time
|
#### Date & Time
|
||||||
|
|
||||||
- [ ] Changing time zome works.
|
- [ ] Changing time zone works.
|
||||||
- [ ] Toggling 24-hour time takes effect in Settings preview, on top panel, and on the lock screen.
|
- [ ] Toggling 24-hour time takes effect in Settings preview, on top panel, and on the lock screen.
|
||||||
- [ ] Toggling seconds takes effect in Settings preview and on top panel.
|
- [ ] Toggling seconds takes effect in Settings preview and on top panel.
|
||||||
- [ ] Changing first day of week takes effect in Calendar applet.
|
- [ ] Changing first day of week takes effect in Calendar applet.
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,22 @@
|
||||||
[package]
|
[package]
|
||||||
name = "cosmic-settings"
|
name = "cosmic-settings"
|
||||||
version = "1.0.2"
|
version = "1.0.7"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license = "GPL-3.0-only"
|
license = "GPL-3.0-only"
|
||||||
publish = false
|
publish = false
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
xdgen = "0.1"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
accounts-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
accounts-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
||||||
anyhow = "1.0"
|
anyhow = "1.0"
|
||||||
ashpd = { version = "0.12", default-features = false, features = [
|
ashpd = { version = "0.12", default-features = false, features = [
|
||||||
"tokio",
|
"tokio",
|
||||||
], optional = true }
|
], optional = true }
|
||||||
chrono = "0.4.42"
|
chrono = "0.4"
|
||||||
clap = { version = "4.5.54", features = ["derive"] }
|
jiff = "0.2"
|
||||||
|
clap = { version = "4.5.59", features = ["derive"] }
|
||||||
color-eyre = "0.6.5"
|
color-eyre = "0.6.5"
|
||||||
cosmic-bg-config.workspace = true
|
cosmic-bg-config.workspace = true
|
||||||
cosmic-comp-config = { workspace = true, optional = true }
|
cosmic-comp-config = { workspace = true, optional = true }
|
||||||
|
|
@ -37,11 +41,11 @@ cosmic-settings-sound-subscription = { path = "../subscriptions/sound", optional
|
||||||
] }
|
] }
|
||||||
cosmic-settings-wallpaper = { path = "../pages/wallpapers" }
|
cosmic-settings-wallpaper = { path = "../pages/wallpapers" }
|
||||||
cosmic-settings-daemon-config = { git = "https://github.com/pop-os/cosmic-settings-daemon", optional = true }
|
cosmic-settings-daemon-config = { git = "https://github.com/pop-os/cosmic-settings-daemon", optional = true }
|
||||||
derive_setters = "0.1.8"
|
derive_setters = "0.1.9"
|
||||||
dirs = "6.0.0"
|
dirs = "6.0.0"
|
||||||
eyre = "0.6.12"
|
eyre = "0.6.12"
|
||||||
freedesktop-desktop-entry = "0.8.1"
|
freedesktop-desktop-entry = "0.8.1"
|
||||||
futures = "0.3.31"
|
futures = "0.3.32"
|
||||||
hostname-validator = "1.1.1"
|
hostname-validator = "1.1.1"
|
||||||
hostname1-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
hostname1-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
||||||
i18n-embed-fl = "0.10.0"
|
i18n-embed-fl = "0.10.0"
|
||||||
|
|
@ -56,31 +60,32 @@ indexmap = "2.13.0"
|
||||||
itertools = "0.14.0"
|
itertools = "0.14.0"
|
||||||
itoa = "1.0.17"
|
itoa = "1.0.17"
|
||||||
libcosmic.workspace = true
|
libcosmic.workspace = true
|
||||||
|
iced_winit.workspace = true
|
||||||
locale1 = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
locale1 = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
||||||
sysinfo = { version = "0.37.2", optional = true }
|
sysinfo = { version = "=0.38.0", optional = true }
|
||||||
mime-apps = { package = "cosmic-mime-apps", git = "https://github.com/pop-os/cosmic-mime-apps", optional = true }
|
mime-apps = { package = "cosmic-mime-apps", git = "https://github.com/pop-os/cosmic-mime-apps", optional = true }
|
||||||
notify = "8.2.0"
|
notify = "8.2.0"
|
||||||
regex = "1.12.2"
|
regex = "1.12.3"
|
||||||
ron = "0.12"
|
ron = "0.12"
|
||||||
rust-embed = "8.9.0"
|
rust-embed = "8.11.0"
|
||||||
sctk = { workspace = true, optional = true }
|
sctk = { workspace = true, optional = true }
|
||||||
secure-string = "0.3.0"
|
secure-string = "0.3.0"
|
||||||
serde = { version = "1.0.228", features = ["derive"] }
|
serde = { version = "1.0.228", features = ["derive"] }
|
||||||
slab = "0.4.11"
|
slab = "0.4.12"
|
||||||
slotmap = "1.1.1"
|
slotmap = "1.1.1"
|
||||||
static_init = "1.0.4"
|
static_init = "1.0.4"
|
||||||
sunrise = "2.1.0"
|
sunrise = "3.0.0"
|
||||||
timedate-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
timedate-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
||||||
tokio = { workspace = true, features = ["fs", "io-util", "sync"] }
|
tokio = { workspace = true, features = ["fs", "io-util", "process", "sync"] }
|
||||||
tracing = "0.1.44"
|
tracing = "0.1.44"
|
||||||
tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
|
||||||
udev = { version = "0.9.3", optional = true }
|
udev = { version = "0.9.3", optional = true }
|
||||||
upower_dbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
upower_dbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
||||||
bluez-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
bluez-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
|
||||||
url = "2.5.8"
|
url = "2.5.8"
|
||||||
xkb-data = "0.2.1"
|
xkb-data = "0.2.2"
|
||||||
xkeysym = { version = "0.2.1", optional = true }
|
xkeysym = { version = "0.2.1", optional = true }
|
||||||
zbus = { version = "5.13.1", default-features = false, features = [
|
zbus = { version = "5.13.2", default-features = false, features = [
|
||||||
"tokio",
|
"tokio",
|
||||||
], optional = true }
|
], optional = true }
|
||||||
zbus_polkit = { version = "5.0.0", optional = true }
|
zbus_polkit = { version = "5.0.0", optional = true }
|
||||||
|
|
@ -92,6 +97,7 @@ gettext-rs = { version = "0.7.7", features = [
|
||||||
], optional = true }
|
], optional = true }
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
pwhash = "1"
|
pwhash = "1"
|
||||||
|
which = "8.0.0"
|
||||||
|
|
||||||
[dependencies.icu]
|
[dependencies.icu]
|
||||||
version = "2.1.1"
|
version = "2.1.1"
|
||||||
|
|
@ -112,6 +118,7 @@ gettext = ["dep:gettext-rs"]
|
||||||
|
|
||||||
# Default features for Linux
|
# Default features for Linux
|
||||||
linux = [
|
linux = [
|
||||||
|
"cosmic-comp-config",
|
||||||
"page-accessibility",
|
"page-accessibility",
|
||||||
"page-about",
|
"page-about",
|
||||||
"page-bluetooth",
|
"page-bluetooth",
|
||||||
|
|
@ -133,9 +140,9 @@ linux = [
|
||||||
|
|
||||||
# Pages
|
# Pages
|
||||||
page-accessibility = [
|
page-accessibility = [
|
||||||
|
"cosmic-comp-config",
|
||||||
"dep:sctk",
|
"dep:sctk",
|
||||||
"dep:cosmic-protocols",
|
"dep:cosmic-protocols",
|
||||||
"dep:cosmic-comp-config",
|
|
||||||
"dep:cosmic-settings-config",
|
"dep:cosmic-settings-config",
|
||||||
"dep:cosmic-settings-daemon-config",
|
"dep:cosmic-settings-daemon-config",
|
||||||
"dep:cosmic-settings-accessibility-subscription",
|
"dep:cosmic-settings-accessibility-subscription",
|
||||||
|
|
@ -151,14 +158,14 @@ page-date = ["dep:timedate-zbus", "dep:zbus"]
|
||||||
page-default-apps = ["dep:cosmic-settings-config", "dep:mime-apps"]
|
page-default-apps = ["dep:cosmic-settings-config", "dep:mime-apps"]
|
||||||
page-display = ["dep:udev"]
|
page-display = ["dep:udev"]
|
||||||
page-input = [
|
page-input = [
|
||||||
|
"cosmic-comp-config",
|
||||||
"gettext",
|
"gettext",
|
||||||
"dep:cosmic-comp-config",
|
|
||||||
"dep:cosmic-settings-config",
|
"dep:cosmic-settings-config",
|
||||||
"dep:udev",
|
"dep:udev",
|
||||||
"dep:xkeysym",
|
"dep:xkeysym",
|
||||||
"wayland",
|
"wayland",
|
||||||
]
|
]
|
||||||
page-legacy-applications = ["dep:cosmic-comp-config"]
|
page-legacy-applications = ["cosmic-comp-config", "dep:cosmic-randr"]
|
||||||
page-networking = [
|
page-networking = [
|
||||||
"dep:cosmic-settings-network-manager-subscription",
|
"dep:cosmic-settings-network-manager-subscription",
|
||||||
"xdg-portal",
|
"xdg-portal",
|
||||||
|
|
@ -167,18 +174,25 @@ page-networking = [
|
||||||
"dep:zbus",
|
"dep:zbus",
|
||||||
]
|
]
|
||||||
page-power = ["dep:upower_dbus", "dep:zbus"]
|
page-power = ["dep:upower_dbus", "dep:zbus"]
|
||||||
page-region = ["gettext", "dep:locales-rs", "dep:locale1", "dep:zbus"]
|
page-region = [
|
||||||
|
"gettext",
|
||||||
|
"dep:locales-rs",
|
||||||
|
"dep:locale1",
|
||||||
|
"dep:zbus",
|
||||||
|
"dep:accounts-zbus",
|
||||||
|
]
|
||||||
page-sound = ["dep:cosmic-settings-sound-subscription"]
|
page-sound = ["dep:cosmic-settings-sound-subscription"]
|
||||||
page-users = ["xdg-portal", "dep:accounts-zbus", "dep:zbus", "dep:zbus_polkit"]
|
page-users = ["xdg-portal", "dep:accounts-zbus", "dep:zbus", "dep:zbus_polkit"]
|
||||||
page-window-management = ["dep:cosmic-settings-config"]
|
page-window-management = ["cosmic-comp-config", "dep:cosmic-settings-config"]
|
||||||
page-workspaces = ["dep:cosmic-comp-config"]
|
page-workspaces = ["cosmic-comp-config"]
|
||||||
|
|
||||||
# Other features
|
# Other features
|
||||||
a11y = ["libcosmic/a11y"]
|
a11y = ["libcosmic/a11y"]
|
||||||
ashpd = ["dep:ashpd"]
|
ashpd = ["dep:ashpd"]
|
||||||
|
cosmic-comp-config = ["dep:cosmic-comp-config"]
|
||||||
dbus-config = ["libcosmic/dbus-config", "cosmic-config/dbus"]
|
dbus-config = ["libcosmic/dbus-config", "cosmic-config/dbus"]
|
||||||
single-instance = ["libcosmic/single-instance"]
|
single-instance = ["libcosmic/single-instance"]
|
||||||
test = []
|
test = []
|
||||||
wayland = ["libcosmic/wayland", "dep:cosmic-panel-config", "dep:cosmic-randr"]
|
wayland = ["libcosmic/wayland", "dep:cosmic-panel-config", "dep:cosmic-randr", "iced_winit/cctk"]
|
||||||
wgpu = ["libcosmic/wgpu"]
|
wgpu = ["libcosmic/wgpu"]
|
||||||
xdg-portal = ["ashpd", "libcosmic/xdg-portal"]
|
xdg-portal = ["ashpd", "libcosmic/xdg-portal"]
|
||||||
|
|
|
||||||
223
cosmic-settings/build.rs
Normal file
223
cosmic-settings/build.rs
Normal file
|
|
@ -0,0 +1,223 @@
|
||||||
|
use std::{env, fs, path::PathBuf};
|
||||||
|
use xdgen::{App, Context, FluentString};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let ctx = Context::new("../i18n", env::var("CARGO_PKG_NAME").unwrap()).unwrap();
|
||||||
|
|
||||||
|
[
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings",
|
||||||
|
"app",
|
||||||
|
"xdg-entry-comment",
|
||||||
|
"xdg-entry-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.About",
|
||||||
|
"xdg-entry-about",
|
||||||
|
"xdg-entry-about-comment",
|
||||||
|
"xdg-entry-about-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Accessibility",
|
||||||
|
"xdg-entry-ally",
|
||||||
|
"xdg-entry-a11y-comment",
|
||||||
|
"xdg-entry-a11y-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Appearance",
|
||||||
|
"appearance",
|
||||||
|
"xdg-entry-appearance-comment",
|
||||||
|
"xdg-entry-appearance-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Applications",
|
||||||
|
"xdg-entry-applications",
|
||||||
|
"xdg-entry-applications-comment",
|
||||||
|
"xdg-entry-applications-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Bluetooth",
|
||||||
|
"bluetooth",
|
||||||
|
"xdg-entry-bluetooth-comment",
|
||||||
|
"xdg-entry-bluetooth-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.DateTime",
|
||||||
|
"xdg-entry-date-time",
|
||||||
|
"xdg-entry-date-time-comment",
|
||||||
|
"xdg-entry-date-time-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.DefaultApps",
|
||||||
|
"xdg-entry-default-apps",
|
||||||
|
"xdg-entry-default-apps-comment",
|
||||||
|
"xdg-entry-default-apps-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Desktop",
|
||||||
|
"xdg-entry-desktop",
|
||||||
|
"xdg-entry-desktop-comment",
|
||||||
|
"xdg-entry-desktop-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Displays",
|
||||||
|
"xdg-entry-displays",
|
||||||
|
"xdg-entry-displays-comment",
|
||||||
|
"xdg-entry-displays-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Dock",
|
||||||
|
"xdg-entry-dock",
|
||||||
|
"xdg-entry-dock-comment",
|
||||||
|
"xdg-entry-dock-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Input",
|
||||||
|
"xdg-entry-input",
|
||||||
|
"xdg-entry-input-comment",
|
||||||
|
"xdg-entry-input-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Keyboard",
|
||||||
|
"xdg-entry-keyboard",
|
||||||
|
"xdg-entry-keyboard-comment",
|
||||||
|
"xdg-entry-keyboard-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Mouse",
|
||||||
|
"xdg-entry-mouse",
|
||||||
|
"xdg-entry-mouse-comment",
|
||||||
|
"xdg-entry-mouse-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Network",
|
||||||
|
"xdg-entry-network",
|
||||||
|
"xdg-entry-network-comment",
|
||||||
|
"xdg-entry-network-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Notifications",
|
||||||
|
"xdg-entry-notifications",
|
||||||
|
"xdg-entry-notifications-comment",
|
||||||
|
"xdg-entry-notifications-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Panel",
|
||||||
|
"xdg-entry-panel",
|
||||||
|
"xdg-entry-panel-comment",
|
||||||
|
"xdg-entry-panel-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Power",
|
||||||
|
"xdg-entry-power",
|
||||||
|
"xdg-entry-power-comment",
|
||||||
|
"xdg-entry-power-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.RegionLanguage",
|
||||||
|
"xdg-entry-region-language",
|
||||||
|
"xdg-entry-region-language-comment",
|
||||||
|
"xdg-entry-region-language-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Sound",
|
||||||
|
"xdg-entry-sound",
|
||||||
|
"xdg-entry-sound-comment",
|
||||||
|
"xdg-entry-sound-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.StartupApps",
|
||||||
|
"xdg-entry-startup-apps",
|
||||||
|
"xdg-entry-startup-apps-comment",
|
||||||
|
"xdg-entry-startup-apps-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.System",
|
||||||
|
"xdg-entry-system",
|
||||||
|
"xdg-entry-system-comment",
|
||||||
|
"xdg-entry-system-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Time",
|
||||||
|
"xdg-entry-time-language",
|
||||||
|
"xdg-entry-time-language-comment",
|
||||||
|
"xdg-entry-time-language-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Touchpad",
|
||||||
|
"xdg-entry-touchpad",
|
||||||
|
"xdg-entry-touchpad-comment",
|
||||||
|
"xdg-entry-touchpad-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Users",
|
||||||
|
"xdg-entry-users",
|
||||||
|
"xdg-entry-users-comment",
|
||||||
|
"xdg-entry-users-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Vpn",
|
||||||
|
"vpn",
|
||||||
|
"xdg-entry-vpn-comment",
|
||||||
|
"xdg-entry-vpn-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Wallpaper",
|
||||||
|
"xdg-entry-wallpaper",
|
||||||
|
"xdg-entry-wallpaper-comment",
|
||||||
|
"xdg-entry-wallpaper-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.WindowManagement",
|
||||||
|
"xdg-entry-window-management",
|
||||||
|
"xdg-entry-window-management-comment",
|
||||||
|
"xdg-entry-window-management-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Wired",
|
||||||
|
"xdg-entry-wired",
|
||||||
|
"xdg-entry-wired-comment",
|
||||||
|
"xdg-entry-wired-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Wireless",
|
||||||
|
"xdg-entry-wireless",
|
||||||
|
"xdg-entry-wireless-comment",
|
||||||
|
"xdg-entry-wireless-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.Workspaces",
|
||||||
|
"xdg-entry-workspaces",
|
||||||
|
"xdg-entry-workspaces-comment",
|
||||||
|
"xdg-entry-workspaces-keywords",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"com.system76.CosmicSettings.LegacyApplications",
|
||||||
|
"xdg-entry-x11-applications",
|
||||||
|
"xdg-entry-x11-applications-comment",
|
||||||
|
"xdg-entry-x11-applications-keywords",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.map(|(id, name, comment, keywords)| {
|
||||||
|
let app = App::new(FluentString(name))
|
||||||
|
.comment(FluentString(comment))
|
||||||
|
.keywords(FluentString(keywords));
|
||||||
|
|
||||||
|
let output = PathBuf::from("../target/xdgen");
|
||||||
|
|
||||||
|
(id, app, output)
|
||||||
|
})
|
||||||
|
.for_each(|(id, app, output)| {
|
||||||
|
fs::create_dir_all(&output).unwrap();
|
||||||
|
fs::write(
|
||||||
|
output.join(format!("{}.desktop", id)),
|
||||||
|
app.expand_desktop(
|
||||||
|
dbg!(format!("../resources/applications/{}.desktop", id)),
|
||||||
|
&ctx,
|
||||||
|
)
|
||||||
|
.unwrap(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
@ -39,7 +39,7 @@ use cosmic::{
|
||||||
settings, text_input,
|
settings, text_input,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#[cfg(any(feature = "page-window-management", feature = "page-accessibility"))]
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
use cosmic_comp_config::CosmicCompConfig;
|
use cosmic_comp_config::CosmicCompConfig;
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
use cosmic_panel_config::CosmicPanelConfig;
|
use cosmic_panel_config::CosmicPanelConfig;
|
||||||
|
|
@ -99,6 +99,7 @@ impl SettingsApp {
|
||||||
PageCommands::Displays => self.pages.page_id::<display::Page>(),
|
PageCommands::Displays => self.pages.page_id::<display::Page>(),
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
PageCommands::Dock => self.pages.page_id::<desktop::dock::Page>(),
|
PageCommands::Dock => self.pages.page_id::<desktop::dock::Page>(),
|
||||||
|
#[cfg(feature = "wayland")]
|
||||||
PageCommands::DockApplet => self.pages.page_id::<desktop::dock::applets::Page>(),
|
PageCommands::DockApplet => self.pages.page_id::<desktop::dock::applets::Page>(),
|
||||||
#[cfg(feature = "page-input")]
|
#[cfg(feature = "page-input")]
|
||||||
PageCommands::Input => self.pages.page_id::<input::Page>(),
|
PageCommands::Input => self.pages.page_id::<input::Page>(),
|
||||||
|
|
@ -114,6 +115,7 @@ impl SettingsApp {
|
||||||
PageCommands::Network => self.pages.page_id::<networking::Page>(),
|
PageCommands::Network => self.pages.page_id::<networking::Page>(),
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
PageCommands::Panel => self.pages.page_id::<desktop::panel::Page>(),
|
PageCommands::Panel => self.pages.page_id::<desktop::panel::Page>(),
|
||||||
|
#[cfg(feature = "wayland")]
|
||||||
PageCommands::PanelApplet => {
|
PageCommands::PanelApplet => {
|
||||||
self.pages.page_id::<desktop::panel::applets_inner::Page>()
|
self.pages.page_id::<desktop::panel::applets_inner::Page>()
|
||||||
}
|
}
|
||||||
|
|
@ -146,9 +148,9 @@ impl SettingsApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn id(&self) -> cosmic::iced_core::id::Id {
|
fn id(&self) -> cosmic::iced::id::Id {
|
||||||
let cur_page_name = self.pages.info[self.active_page].id.as_ref();
|
let cur_page_name = self.pages.info[self.active_page].id.as_ref();
|
||||||
cosmic::iced_core::id::Id::new(cur_page_name.to_owned())
|
cosmic::iced::id::Id::new(cur_page_name.to_owned())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -167,7 +169,7 @@ pub enum Message {
|
||||||
PageMessage(crate::pages::Message),
|
PageMessage(crate::pages::Message),
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
PanelConfig(Box<CosmicPanelConfig>),
|
PanelConfig(Box<CosmicPanelConfig>),
|
||||||
#[cfg(any(feature = "page-window-management", feature = "page-accessibility"))]
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
CompConfig(Box<CosmicCompConfig>),
|
CompConfig(Box<CosmicCompConfig>),
|
||||||
SearchActivate,
|
SearchActivate,
|
||||||
SearchActivateWith(String),
|
SearchActivateWith(String),
|
||||||
|
|
@ -356,7 +358,7 @@ impl cosmic::Application for SettingsApp {
|
||||||
Message::PanelConfig(Box::new(update.config))
|
Message::PanelConfig(Box::new(update.config))
|
||||||
}),
|
}),
|
||||||
page.subscription(self.core()).map(Message::PageMessage),
|
page.subscription(self.core()).map(Message::PageMessage),
|
||||||
#[cfg(any(feature = "page-window-management", feature = "page-accessibility"))]
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
self.core()
|
self.core()
|
||||||
.watch_config::<CosmicCompConfig>("com.system76.CosmicComp")
|
.watch_config::<CosmicCompConfig>("com.system76.CosmicComp")
|
||||||
.map(|update| {
|
.map(|update| {
|
||||||
|
|
@ -684,6 +686,13 @@ impl cosmic::Application for SettingsApp {
|
||||||
return page.update(message).map(Into::into);
|
return page.update(message).map(Into::into);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "page-workspaces")]
|
||||||
|
crate::pages::Message::Workspaces(message) => {
|
||||||
|
if let Some(page) = self.pages.page_mut::<desktop::workspaces::Page>() {
|
||||||
|
return page.update(message).map(Into::into);
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
|
|
@ -778,7 +787,7 @@ impl cosmic::Application for SettingsApp {
|
||||||
return Task::batch(tasks);
|
return Task::batch(tasks);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(feature = "page-window-management", feature = "page-accessibility"))]
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
Message::CompConfig(comp_config) => {
|
Message::CompConfig(comp_config) => {
|
||||||
let mut tasks = Vec::new();
|
let mut tasks = Vec::new();
|
||||||
|
|
||||||
|
|
@ -879,7 +888,7 @@ impl cosmic::Application for SettingsApp {
|
||||||
} else if let Some(sub_pages) = self.pages.sub_pages(self.active_page) {
|
} else if let Some(sub_pages) = self.pages.sub_pages(self.active_page) {
|
||||||
self.sub_page_view(sub_pages)
|
self.sub_page_view(sub_pages)
|
||||||
} else {
|
} else {
|
||||||
return self.page_container(row::row());
|
return self.page_container(cosmic::widget::space());
|
||||||
};
|
};
|
||||||
|
|
||||||
container(view).into()
|
container(view).into()
|
||||||
|
|
@ -1048,7 +1057,7 @@ impl SettingsApp {
|
||||||
Message::Page(parent),
|
Message::Page(parent),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut page_header_content: cosmic::iced_widget::Row<'_, Message, Theme> =
|
let mut page_header_content: cosmic::iced::widget::Row<'_, Message, Theme> =
|
||||||
row::with_capacity(2)
|
row::with_capacity(2)
|
||||||
.align_y(iced::Alignment::End)
|
.align_y(iced::Alignment::End)
|
||||||
.push(page_header);
|
.push(page_header);
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ use std::fmt::Write;
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply,
|
Apply,
|
||||||
iced::{Element, Length},
|
iced::core::text::Wrapping,
|
||||||
iced_core::text::Wrapping,
|
iced::{Element, Length, stream},
|
||||||
surface,
|
surface,
|
||||||
widget::{self, icon, settings, svg, text},
|
widget::{self, icon, settings, svg, text},
|
||||||
};
|
};
|
||||||
|
|
@ -129,9 +129,9 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
Ok((tx, mut rx)) => {
|
Ok((tx, mut rx)) => {
|
||||||
self.wayland_thread = Some(tx);
|
self.wayland_thread = Some(tx);
|
||||||
|
|
||||||
return cosmic::Task::stream(cosmic::iced_futures::stream::channel(
|
return cosmic::Task::stream(stream::channel(
|
||||||
1,
|
1,
|
||||||
|mut sender| async move {
|
|mut sender: futures::channel::mpsc::Sender<crate::pages::Message>| async move {
|
||||||
while let Some(event) = rx.recv().await {
|
while let Some(event) = rx.recv().await {
|
||||||
let _ = sender
|
let _ = sender
|
||||||
.send(crate::pages::Message::AccessibilityMagnifier(
|
.send(crate::pages::Message::AccessibilityMagnifier(
|
||||||
|
|
@ -219,19 +219,18 @@ pub fn magnifier(
|
||||||
.add(
|
.add(
|
||||||
settings::item::builder(&descriptions[magnifier])
|
settings::item::builder(&descriptions[magnifier])
|
||||||
.description(&descriptions[controls])
|
.description(&descriptions[controls])
|
||||||
.control(
|
.toggler(page.magnifier_state, Message::SetMagnifier),
|
||||||
widget::toggler(page.magnifier_state).on_toggle(Message::SetMagnifier),
|
)
|
||||||
),
|
.add(
|
||||||
|
settings::item::builder(&descriptions[scroll_controls]).toggler(
|
||||||
|
page.zoom_config.enable_mouse_zoom_shortcuts,
|
||||||
|
Message::SetMouseShortcuts,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.add(
|
||||||
|
settings::item::builder(&descriptions[show_overlay])
|
||||||
|
.toggler(page.zoom_config.show_overlay, Message::SetOverlay),
|
||||||
)
|
)
|
||||||
.add(settings::item(
|
|
||||||
&descriptions[scroll_controls],
|
|
||||||
widget::toggler(page.zoom_config.enable_mouse_zoom_shortcuts)
|
|
||||||
.on_toggle(Message::SetMouseShortcuts),
|
|
||||||
))
|
|
||||||
.add(settings::item(
|
|
||||||
&descriptions[show_overlay],
|
|
||||||
widget::toggler(page.zoom_config.show_overlay).on_toggle(Message::SetOverlay),
|
|
||||||
))
|
|
||||||
.add(settings::item(
|
.add(settings::item(
|
||||||
&descriptions[increment],
|
&descriptions[increment],
|
||||||
widget::dropdown::popup_dropdown(
|
widget::dropdown::popup_dropdown(
|
||||||
|
|
@ -247,10 +246,10 @@ pub fn magnifier(
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
))
|
))
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[signin],
|
settings::item::builder(&descriptions[signin])
|
||||||
widget::toggler(page.zoom_config.start_on_login).on_toggle(Message::SetSignin),
|
.toggler(page.zoom_config.start_on_login, Message::SetSignin),
|
||||||
))
|
)
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::AccessibilityMagnifier)
|
.map(crate::pages::Message::AccessibilityMagnifier)
|
||||||
})
|
})
|
||||||
|
|
@ -300,36 +299,21 @@ pub fn view_movement() -> section::Section<crate::pages::Message> {
|
||||||
|
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(widget::settings::item_row(vec![
|
.add(settings::item::builder(&descriptions[continuous]).radio(
|
||||||
widget::radio(
|
ZoomMovement::Continuously,
|
||||||
text::body(&descriptions[continuous]),
|
Some(page.zoom_config.view_moves),
|
||||||
ZoomMovement::Continuously,
|
Message::SetMovement,
|
||||||
Some(page.zoom_config.view_moves),
|
))
|
||||||
Message::SetMovement,
|
.add(settings::item::builder(&descriptions[onedge]).radio(
|
||||||
)
|
ZoomMovement::OnEdge,
|
||||||
.width(Length::Fill)
|
Some(page.zoom_config.view_moves),
|
||||||
.into(),
|
Message::SetMovement,
|
||||||
]))
|
))
|
||||||
.add(widget::settings::item_row(vec![
|
.add(settings::item::builder(&descriptions[centered]).radio(
|
||||||
widget::radio(
|
ZoomMovement::Centered,
|
||||||
text::body(&descriptions[onedge]),
|
Some(page.zoom_config.view_moves),
|
||||||
ZoomMovement::OnEdge,
|
Message::SetMovement,
|
||||||
Some(page.zoom_config.view_moves),
|
))
|
||||||
Message::SetMovement,
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
.add(widget::settings::item_row(vec![
|
|
||||||
widget::radio(
|
|
||||||
text::body(&descriptions[centered]),
|
|
||||||
ZoomMovement::Centered,
|
|
||||||
Some(page.zoom_config.view_moves),
|
|
||||||
Message::SetMovement,
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::AccessibilityMagnifier)
|
.map(crate::pages::Message::AccessibilityMagnifier)
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Task,
|
Apply, Element, Task,
|
||||||
cosmic_theme::{CosmicPalette, ThemeBuilder},
|
cosmic_theme::{CosmicPalette, ThemeBuilder},
|
||||||
iced_core::text::Wrapping,
|
iced::core::text::Wrapping,
|
||||||
|
iced::stream,
|
||||||
surface,
|
surface,
|
||||||
theme::CosmicTheme,
|
theme::CosmicTheme,
|
||||||
widget::{dropdown, settings, text, toggler},
|
widget::{dropdown, settings, text},
|
||||||
};
|
};
|
||||||
pub use cosmic_comp_config::ZoomMovement;
|
pub use cosmic_comp_config::ZoomMovement;
|
||||||
use cosmic_config::CosmicConfigEntry;
|
use cosmic_config::CosmicConfigEntry;
|
||||||
|
|
@ -127,9 +128,9 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
Ok((tx, mut rx)) => {
|
Ok((tx, mut rx)) => {
|
||||||
self.wayland_thread = Some(tx);
|
self.wayland_thread = Some(tx);
|
||||||
|
|
||||||
return cosmic::Task::stream(cosmic::iced_futures::stream::channel(
|
return cosmic::Task::stream(stream::channel(
|
||||||
1,
|
1,
|
||||||
|mut sender| async move {
|
|mut sender: futures::channel::mpsc::Sender<super::Message>| async move {
|
||||||
while let Some(event) = rx.recv().await {
|
while let Some(event) = rx.recv().await {
|
||||||
let _ = sender
|
let _ = sender
|
||||||
.send(crate::pages::Message::Accessibility(Message::Event(
|
.send(crate::pages::Message::Accessibility(Message::Event(
|
||||||
|
|
@ -199,6 +200,22 @@ pub fn vision() -> section::Section<crate::pages::Message> {
|
||||||
.view::<Page>(move |binder, page, section| {
|
.view::<Page>(move |binder, page, section| {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
|
|
||||||
|
let (magnifier_entity, _magnifier_info) = binder
|
||||||
|
.info
|
||||||
|
.iter()
|
||||||
|
.find(|(_, v)| v.id == "accessibility_magnifier")
|
||||||
|
.expect("magnifier page not found");
|
||||||
|
|
||||||
|
let status_text = if page.wayland_available.is_some() {
|
||||||
|
if page.magnifier_state {
|
||||||
|
&descriptions[on]
|
||||||
|
} else {
|
||||||
|
&descriptions[off]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
&descriptions[unavailable]
|
||||||
|
};
|
||||||
|
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(
|
.add(
|
||||||
|
|
@ -209,31 +226,13 @@ pub fn vision() -> section::Section<crate::pages::Message> {
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.add({
|
.add(crate::widget::go_next_with_item(
|
||||||
let (magnifier_entity, _magnifier_info) = binder
|
&descriptions[magnifier],
|
||||||
.info
|
text::body(status_text).wrapping(Wrapping::Word),
|
||||||
.iter()
|
page.wayland_available
|
||||||
.find(|(_, v)| v.id == "accessibility_magnifier")
|
.is_some()
|
||||||
.expect("magnifier page not found");
|
.then_some(crate::pages::Message::Page(magnifier_entity)),
|
||||||
|
))
|
||||||
let status_text = if page.wayland_available.is_some() {
|
|
||||||
if page.magnifier_state {
|
|
||||||
&descriptions[on]
|
|
||||||
} else {
|
|
||||||
&descriptions[off]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
&descriptions[unavailable]
|
|
||||||
};
|
|
||||||
|
|
||||||
crate::widget::go_next_with_item(
|
|
||||||
&descriptions[magnifier],
|
|
||||||
text::body(status_text).wrapping(Wrapping::Word),
|
|
||||||
page.wayland_available
|
|
||||||
.is_some()
|
|
||||||
.then_some(crate::pages::Message::Page(magnifier_entity)),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.add(
|
.add(
|
||||||
settings::item::builder(&descriptions[high_contrast])
|
settings::item::builder(&descriptions[high_contrast])
|
||||||
.toggler(page.theme.is_high_contrast, |enable| {
|
.toggler(page.theme.is_high_contrast, |enable| {
|
||||||
|
|
@ -241,21 +240,19 @@ pub fn vision() -> section::Section<crate::pages::Message> {
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.add(
|
.add(
|
||||||
settings::item::builder(&descriptions[invert_colors]).control(
|
settings::item::builder(&descriptions[invert_colors]).toggler_maybe(
|
||||||
toggler(page.screen_inverted).on_toggle_maybe(
|
page.screen_inverted,
|
||||||
page.wayland_available
|
page.wayland_available
|
||||||
.is_some_and(|ver| ver >= 2)
|
.is_some_and(|ver| ver >= 2)
|
||||||
.then_some(|set| Message::SetScreenInverted(set).into()),
|
.then_some(|set| Message::SetScreenInverted(set).into()),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.add(
|
.add(
|
||||||
settings::item::builder(&descriptions[color_filters]).control(
|
settings::item::builder(&descriptions[color_filters]).toggler_maybe(
|
||||||
toggler(page.screen_filter_active).on_toggle_maybe(
|
page.screen_filter_active,
|
||||||
page.wayland_available
|
page.wayland_available
|
||||||
.is_some_and(|ver| ver >= 2)
|
.is_some_and(|ver| ver >= 2)
|
||||||
.then_some(|set| Message::SetScreenFilterActive(set).into()),
|
.then_some(|set| Message::SetScreenFilterActive(set).into()),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.add({
|
.add({
|
||||||
|
|
@ -303,13 +300,11 @@ pub fn hearing() -> section::Section<crate::pages::Message> {
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(
|
.add(
|
||||||
cosmic::Element::from(
|
settings::item::builder(&descriptions[mono])
|
||||||
settings::item::builder(&descriptions[mono])
|
.toggler(page.daemon_config.mono_sound, Message::SetSoundMono),
|
||||||
.toggler(page.daemon_config.mono_sound, Message::SetSoundMono),
|
|
||||||
)
|
|
||||||
.map(crate::pages::Message::Accessibility),
|
|
||||||
)
|
)
|
||||||
.into()
|
.apply(Element::from)
|
||||||
|
.map(crate::pages::Message::Accessibility)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,9 @@ use std::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element, Task, surface,
|
Apply, Element, Task,
|
||||||
|
iced::Alignment,
|
||||||
|
surface,
|
||||||
widget::{self, dropdown, icon, settings},
|
widget::{self, dropdown, icon, settings},
|
||||||
};
|
};
|
||||||
use cosmic_config::{ConfigGet, ConfigSet};
|
use cosmic_config::{ConfigGet, ConfigSet};
|
||||||
|
|
@ -103,7 +105,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("default-apps", "preferences-default-applications-symbolic")
|
page::Info::new("default-apps", "preferences-default-applications-symbolic")
|
||||||
.title(fl!("default-apps"))
|
.title(fl!("default-apps"))
|
||||||
.description(fl!("default-apps", "desc"))
|
.description(fl!("xdg-entry-default-apps-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
||||||
|
|
@ -282,146 +284,265 @@ impl Page {
|
||||||
fn apps() -> Section<crate::pages::Message> {
|
fn apps() -> Section<crate::pages::Message> {
|
||||||
Section::default().view::<Page>(move |_binder, page, section| {
|
Section::default().view::<Page>(move |_binder, page, section| {
|
||||||
let Some(mime_apps) = page.mime_apps.as_ref() else {
|
let Some(mime_apps) = page.mime_apps.as_ref() else {
|
||||||
return widget::row().into();
|
return widget::space().into();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Avoid creating popup_dropdown for empty app lists.
|
||||||
|
// Empty categories are rendered as non-interactive text to prevent Wayland crashes.
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add({
|
.add({
|
||||||
let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER];
|
let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER];
|
||||||
settings::flex_item(
|
if meta.apps.is_empty() {
|
||||||
fl!("default-apps", "web-browser"),
|
settings::flex_item(
|
||||||
dropdown::popup_dropdown(
|
fl!("default-apps", "web-browser"),
|
||||||
&meta.apps,
|
widget::text(fl!("default-apps", "not-installed")),
|
||||||
meta.selected,
|
|
||||||
|id| Message::SetDefault(Category::WebBrowser, id),
|
|
||||||
cosmic::iced::window::Id::RESERVED,
|
|
||||||
Message::Surface,
|
|
||||||
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
|
|
||||||
)
|
)
|
||||||
.icons(Cow::Borrowed(&meta.icons)),
|
.align_items(Alignment::Center)
|
||||||
)
|
} else {
|
||||||
.min_item_width(300.0)
|
settings::flex_item(
|
||||||
|
fl!("default-apps", "web-browser"),
|
||||||
|
dropdown::popup_dropdown(
|
||||||
|
&meta.apps,
|
||||||
|
meta.selected,
|
||||||
|
|id| Message::SetDefault(Category::WebBrowser, id),
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(
|
||||||
|
crate::pages::Message::DefaultApps(a),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.icons(Cow::Borrowed(&meta.icons)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
|
.min_item_width(300.0)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.add({
|
.add({
|
||||||
let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER];
|
let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER];
|
||||||
settings::flex_item(
|
if meta.apps.is_empty() {
|
||||||
fl!("default-apps", "file-manager"),
|
settings::flex_item(
|
||||||
dropdown::popup_dropdown(
|
fl!("default-apps", "file-manager"),
|
||||||
&meta.apps,
|
widget::text(fl!("default-apps", "not-installed")),
|
||||||
meta.selected,
|
|
||||||
|id| Message::SetDefault(Category::FileManager, id),
|
|
||||||
cosmic::iced::window::Id::RESERVED,
|
|
||||||
Message::Surface,
|
|
||||||
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
|
|
||||||
)
|
)
|
||||||
.icons(Cow::Borrowed(&meta.icons)),
|
.align_items(Alignment::Center)
|
||||||
)
|
} else {
|
||||||
|
settings::flex_item(
|
||||||
|
fl!("default-apps", "file-manager"),
|
||||||
|
dropdown::popup_dropdown(
|
||||||
|
&meta.apps,
|
||||||
|
meta.selected,
|
||||||
|
|id| Message::SetDefault(Category::FileManager, id),
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(
|
||||||
|
crate::pages::Message::DefaultApps(a),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.icons(Cow::Borrowed(&meta.icons)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.add({
|
.add({
|
||||||
let meta = &mime_apps.apps[DROPDOWN_MAIL];
|
let meta = &mime_apps.apps[DROPDOWN_MAIL];
|
||||||
settings::flex_item(
|
if meta.apps.is_empty() {
|
||||||
fl!("default-apps", "mail-client"),
|
settings::flex_item(
|
||||||
dropdown::popup_dropdown(
|
fl!("default-apps", "mail-client"),
|
||||||
&meta.apps,
|
widget::text(fl!("default-apps", "not-installed")),
|
||||||
meta.selected,
|
|
||||||
|id| Message::SetDefault(Category::Mail, id),
|
|
||||||
cosmic::iced::window::Id::RESERVED,
|
|
||||||
Message::Surface,
|
|
||||||
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
|
|
||||||
)
|
)
|
||||||
.icons(Cow::Borrowed(&meta.icons)),
|
.align_items(Alignment::Center)
|
||||||
)
|
} else {
|
||||||
|
settings::flex_item(
|
||||||
|
fl!("default-apps", "mail-client"),
|
||||||
|
dropdown::popup_dropdown(
|
||||||
|
&meta.apps,
|
||||||
|
meta.selected,
|
||||||
|
|id| Message::SetDefault(Category::Mail, id),
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(
|
||||||
|
crate::pages::Message::DefaultApps(a),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.icons(Cow::Borrowed(&meta.icons)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.add({
|
.add({
|
||||||
let meta = &mime_apps.apps[DROPDOWN_MUSIC];
|
let meta = &mime_apps.apps[DROPDOWN_MUSIC];
|
||||||
settings::flex_item(
|
if meta.apps.is_empty() {
|
||||||
fl!("default-apps", "music"),
|
settings::flex_item(
|
||||||
dropdown::popup_dropdown(
|
fl!("default-apps", "music"),
|
||||||
&meta.apps,
|
widget::text(fl!("default-apps", "not-installed")),
|
||||||
meta.selected,
|
|
||||||
|id| Message::SetDefault(Category::Audio, id),
|
|
||||||
cosmic::iced::window::Id::RESERVED,
|
|
||||||
Message::Surface,
|
|
||||||
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
|
|
||||||
)
|
)
|
||||||
.icons(Cow::Borrowed(&meta.icons)),
|
.align_items(Alignment::Center)
|
||||||
)
|
} else {
|
||||||
|
settings::flex_item(
|
||||||
|
fl!("default-apps", "music"),
|
||||||
|
dropdown::popup_dropdown(
|
||||||
|
&meta.apps,
|
||||||
|
meta.selected,
|
||||||
|
|id| Message::SetDefault(Category::Audio, id),
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(
|
||||||
|
crate::pages::Message::DefaultApps(a),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.icons(Cow::Borrowed(&meta.icons)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.add({
|
.add({
|
||||||
let meta = &mime_apps.apps[DROPDOWN_VIDEO];
|
let meta = &mime_apps.apps[DROPDOWN_VIDEO];
|
||||||
settings::flex_item(
|
if meta.apps.is_empty() {
|
||||||
fl!("default-apps", "video"),
|
settings::flex_item(
|
||||||
dropdown::popup_dropdown(
|
fl!("default-apps", "video"),
|
||||||
&meta.apps,
|
widget::text(fl!("default-apps", "not-installed")),
|
||||||
meta.selected,
|
|
||||||
|id| Message::SetDefault(Category::Video, id),
|
|
||||||
cosmic::iced::window::Id::RESERVED,
|
|
||||||
Message::Surface,
|
|
||||||
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
|
|
||||||
)
|
)
|
||||||
.icons(Cow::Borrowed(&meta.icons)),
|
.align_items(Alignment::Center)
|
||||||
)
|
} else {
|
||||||
|
settings::flex_item(
|
||||||
|
fl!("default-apps", "video"),
|
||||||
|
dropdown::popup_dropdown(
|
||||||
|
&meta.apps,
|
||||||
|
meta.selected,
|
||||||
|
|id| Message::SetDefault(Category::Video, id),
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(
|
||||||
|
crate::pages::Message::DefaultApps(a),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.icons(Cow::Borrowed(&meta.icons)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.add({
|
.add({
|
||||||
let meta = &mime_apps.apps[DROPDOWN_PHOTO];
|
let meta = &mime_apps.apps[DROPDOWN_PHOTO];
|
||||||
settings::flex_item(
|
if meta.apps.is_empty() {
|
||||||
fl!("default-apps", "photos"),
|
settings::flex_item(
|
||||||
dropdown::popup_dropdown(
|
fl!("default-apps", "photos"),
|
||||||
&meta.apps,
|
widget::text(fl!("default-apps", "not-installed")),
|
||||||
meta.selected,
|
|
||||||
|id| Message::SetDefault(Category::Image, id),
|
|
||||||
cosmic::iced::window::Id::RESERVED,
|
|
||||||
Message::Surface,
|
|
||||||
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
|
|
||||||
)
|
)
|
||||||
.icons(Cow::Borrowed(&meta.icons)),
|
.align_items(Alignment::Center)
|
||||||
)
|
} else {
|
||||||
|
settings::flex_item(
|
||||||
|
fl!("default-apps", "photos"),
|
||||||
|
dropdown::popup_dropdown(
|
||||||
|
&meta.apps,
|
||||||
|
meta.selected,
|
||||||
|
|id| Message::SetDefault(Category::Image, id),
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(
|
||||||
|
crate::pages::Message::DefaultApps(a),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.icons(Cow::Borrowed(&meta.icons)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.add({
|
.add({
|
||||||
let meta = &mime_apps.apps[DROPDOWN_CALENDAR];
|
let meta = &mime_apps.apps[DROPDOWN_CALENDAR];
|
||||||
settings::flex_item(
|
if meta.apps.is_empty() {
|
||||||
fl!("default-apps", "calendar"),
|
settings::flex_item(
|
||||||
dropdown::popup_dropdown(
|
fl!("default-apps", "calendar"),
|
||||||
&meta.apps,
|
widget::text(fl!("default-apps", "not-installed")),
|
||||||
meta.selected,
|
|
||||||
|id| Message::SetDefault(Category::Calendar, id),
|
|
||||||
cosmic::iced::window::Id::RESERVED,
|
|
||||||
Message::Surface,
|
|
||||||
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
|
|
||||||
)
|
)
|
||||||
.icons(Cow::Borrowed(&meta.icons)),
|
.align_items(Alignment::Center)
|
||||||
)
|
} else {
|
||||||
|
settings::flex_item(
|
||||||
|
fl!("default-apps", "calendar"),
|
||||||
|
dropdown::popup_dropdown(
|
||||||
|
&meta.apps,
|
||||||
|
meta.selected,
|
||||||
|
|id| Message::SetDefault(Category::Calendar, id),
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(
|
||||||
|
crate::pages::Message::DefaultApps(a),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.icons(Cow::Borrowed(&meta.icons)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.add({
|
.add({
|
||||||
let meta = &mime_apps.apps[DROPDOWN_TERMINAL];
|
let meta = &mime_apps.apps[DROPDOWN_TERMINAL];
|
||||||
settings::flex_item(
|
if meta.apps.is_empty() {
|
||||||
fl!("default-apps", "terminal"),
|
settings::flex_item(
|
||||||
dropdown::popup_dropdown(
|
fl!("default-apps", "terminal"),
|
||||||
&meta.apps,
|
widget::text(fl!("default-apps", "not-installed")),
|
||||||
meta.selected,
|
|
||||||
|id| Message::SetDefault(Category::Terminal, id),
|
|
||||||
cosmic::iced::window::Id::RESERVED,
|
|
||||||
Message::Surface,
|
|
||||||
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
|
|
||||||
)
|
)
|
||||||
.icons(Cow::Borrowed(&meta.icons)),
|
.align_items(Alignment::Center)
|
||||||
)
|
} else {
|
||||||
|
settings::flex_item(
|
||||||
|
fl!("default-apps", "terminal"),
|
||||||
|
dropdown::popup_dropdown(
|
||||||
|
&meta.apps,
|
||||||
|
meta.selected,
|
||||||
|
|id| Message::SetDefault(Category::Terminal, id),
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(
|
||||||
|
crate::pages::Message::DefaultApps(a),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.icons(Cow::Borrowed(&meta.icons)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.add({
|
.add({
|
||||||
let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR];
|
let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR];
|
||||||
settings::flex_item(
|
if meta.apps.is_empty() {
|
||||||
fl!("default-apps", "text-editor"),
|
settings::flex_item(
|
||||||
dropdown::popup_dropdown(
|
fl!("default-apps", "text-editor"),
|
||||||
&meta.apps,
|
widget::text(fl!("default-apps", "not-installed")),
|
||||||
meta.selected,
|
|
||||||
|id| Message::SetDefault(Category::TextEditor, id),
|
|
||||||
cosmic::iced::window::Id::RESERVED,
|
|
||||||
Message::Surface,
|
|
||||||
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
|
|
||||||
)
|
)
|
||||||
.icons(Cow::Borrowed(&meta.icons)),
|
.align_items(Alignment::Center)
|
||||||
)
|
} else {
|
||||||
|
settings::flex_item(
|
||||||
|
fl!("default-apps", "text-editor"),
|
||||||
|
dropdown::popup_dropdown(
|
||||||
|
&meta.apps,
|
||||||
|
meta.selected,
|
||||||
|
|id| Message::SetDefault(Category::TextEditor, id),
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(
|
||||||
|
crate::pages::Message::DefaultApps(a),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.icons(Cow::Borrowed(&meta.icons)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::DefaultApps)
|
.map(crate::pages::Message::DefaultApps)
|
||||||
|
|
|
||||||
|
|
@ -12,16 +12,15 @@ use std::{
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element, Task,
|
Apply, Element, Task,
|
||||||
cosmic_config::{self, ConfigGet, ConfigSet},
|
cosmic_config::{self, ConfigGet, ConfigSet},
|
||||||
iced::Length,
|
iced::stream,
|
||||||
surface,
|
surface,
|
||||||
widget::{self, dropdown, text},
|
widget::{self, dropdown, settings, text},
|
||||||
};
|
};
|
||||||
use cosmic_comp_config::{EavesdroppingKeyboardMode, XwaylandDescaling, XwaylandEavesdropping};
|
use cosmic_comp_config::{EavesdroppingKeyboardMode, XwaylandDescaling, XwaylandEavesdropping};
|
||||||
use cosmic_randr_shell::List;
|
use cosmic_randr_shell::List;
|
||||||
use cosmic_settings_page::Section;
|
use cosmic_settings_page::Section;
|
||||||
use cosmic_settings_page::{self as page, section};
|
use cosmic_settings_page::{self as page, section};
|
||||||
use futures::SinkExt;
|
use futures::SinkExt;
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
use tokio::sync::oneshot;
|
use tokio::sync::oneshot;
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
@ -104,7 +103,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
"preferences-X11-applications-symbolic",
|
"preferences-X11-applications-symbolic",
|
||||||
)
|
)
|
||||||
.title(fl!("legacy-applications"))
|
.title(fl!("legacy-applications"))
|
||||||
.description(fl!("legacy-applications", "desc"))
|
.description(fl!("xdg-entry-x11-applications-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
||||||
|
|
@ -136,9 +135,9 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Forward messages from another thread to prevent the monitoring thread from blocking.
|
// Forward messages from another thread to prevent the monitoring thread from blocking.
|
||||||
let (randr_task, randr_handle) = Task::stream(cosmic::iced_futures::stream::channel(
|
let (randr_task, randr_handle) = Task::stream(stream::channel(
|
||||||
1,
|
1,
|
||||||
|mut sender| async move {
|
|mut sender: futures::channel::mpsc::Sender<_>| async move {
|
||||||
while let Some(message) = rx.recv().await {
|
while let Some(message) = rx.recv().await {
|
||||||
if let cosmic_randr::Message::ManagerDone = message
|
if let cosmic_randr::Message::ManagerDone = message
|
||||||
&& !refresh_pending.swap(true, Ordering::SeqCst)
|
&& !refresh_pending.swap(true, Ordering::SeqCst)
|
||||||
|
|
@ -265,89 +264,75 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn legacy_application_global_shortcuts() -> Section<crate::pages::Message> {
|
pub fn legacy_application_global_shortcuts() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
desc = fl!("legacy-app-global-shortcuts", "desc");
|
||||||
let desc = descriptions.insert(fl!("legacy-app-global-shortcuts", "desc"));
|
none = fl!("legacy-app-global-shortcuts", "none");
|
||||||
let none = descriptions.insert(fl!("legacy-app-global-shortcuts", "none"));
|
modifiers = fl!("legacy-app-global-shortcuts", "modifiers");
|
||||||
let modifiers = descriptions.insert(fl!("legacy-app-global-shortcuts", "modifiers"));
|
combination = fl!("legacy-app-global-shortcuts", "combination");
|
||||||
let combination = descriptions.insert(fl!("legacy-app-global-shortcuts", "combination"));
|
all = fl!("legacy-app-global-shortcuts", "all");
|
||||||
let all = descriptions.insert(fl!("legacy-app-global-shortcuts", "all"));
|
mouse = fl!("legacy-app-global-shortcuts", "mouse");
|
||||||
let mouse = descriptions.insert(fl!("legacy-app-global-shortcuts", "mouse"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("legacy-app-global-shortcuts"))
|
.title(fl!("legacy-app-global-shortcuts"))
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
.view::<Page>(move |_binder, page, section| {
|
.view::<Page>(move |_binder, page, section| {
|
||||||
let title = widget::text::body(§ion.title).font(cosmic::font::bold());
|
let title = text::body(§ion.title).font(cosmic::font::bold());
|
||||||
let description = widget::text::body(§ion.descriptions[desc]);
|
let description = text::body(§ion.descriptions[desc]);
|
||||||
|
|
||||||
let content = widget::settings::section::<'_, crate::pages::Message>()
|
let content = settings::section::<'_, crate::pages::Message>()
|
||||||
.add(widget::settings::item_row(vec![
|
.add(settings::item::builder(§ion.descriptions[none]).radio(
|
||||||
widget::radio(
|
EavesdroppingKeyboardMode::None,
|
||||||
text::body(§ion.descriptions[none]),
|
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|
||||||
EavesdroppingKeyboardMode::None,
|
|t| Message::SetXwaylandKeyboardMode(t).into(),
|
||||||
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|
))
|
||||||
|t| Message::SetXwaylandKeyboardMode(t).into(),
|
.add(
|
||||||
)
|
settings::item::builder(§ion.descriptions[modifiers]).radio(
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
.add(widget::settings::item_row(vec![
|
|
||||||
widget::radio(
|
|
||||||
text::body(§ion.descriptions[modifiers]),
|
|
||||||
EavesdroppingKeyboardMode::Modifiers,
|
EavesdroppingKeyboardMode::Modifiers,
|
||||||
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|
||||||
|t| Message::SetXwaylandKeyboardMode(t).into(),
|
|t| Message::SetXwaylandKeyboardMode(t).into(),
|
||||||
)
|
),
|
||||||
.width(Length::Fill)
|
)
|
||||||
.into(),
|
.add(
|
||||||
]))
|
settings::item::builder(§ion.descriptions[combination]).radio(
|
||||||
.add(widget::settings::item_row(vec![
|
|
||||||
widget::radio(
|
|
||||||
text::body(§ion.descriptions[combination]),
|
|
||||||
EavesdroppingKeyboardMode::Combinations,
|
EavesdroppingKeyboardMode::Combinations,
|
||||||
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|
||||||
|t| Message::SetXwaylandKeyboardMode(t).into(),
|
|t| Message::SetXwaylandKeyboardMode(t).into(),
|
||||||
)
|
),
|
||||||
.width(Length::Fill)
|
)
|
||||||
.into(),
|
.add(settings::item::builder(§ion.descriptions[all]).radio(
|
||||||
]))
|
EavesdroppingKeyboardMode::All,
|
||||||
.add(widget::settings::item_row(vec![
|
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|
||||||
widget::radio(
|
|t| Message::SetXwaylandKeyboardMode(t).into(),
|
||||||
text::body(§ion.descriptions[all]),
|
))
|
||||||
EavesdroppingKeyboardMode::All,
|
.add(
|
||||||
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|
settings::item::builder(§ion.descriptions[mouse])
|
||||||
|t| Message::SetXwaylandKeyboardMode(t).into(),
|
.toggler(page.comp_config_xwayland_eavesdropping.pointer, |t| {
|
||||||
)
|
Message::SetXwaylandMouseButtonMode(t).into()
|
||||||
.width(Length::Fill)
|
}),
|
||||||
.into(),
|
);
|
||||||
]))
|
|
||||||
.add(widget::settings::item(
|
|
||||||
§ion.descriptions[mouse],
|
|
||||||
widget::toggler(page.comp_config_xwayland_eavesdropping.pointer)
|
|
||||||
.on_toggle(|t| Message::SetXwaylandMouseButtonMode(t).into()),
|
|
||||||
));
|
|
||||||
|
|
||||||
widget::column::with_capacity(3)
|
widget::column::with_capacity(3)
|
||||||
.push(title)
|
.push(title)
|
||||||
.push(description)
|
.push(description)
|
||||||
.push(content)
|
.push(content)
|
||||||
.spacing(cosmic::theme::active().cosmic().spacing.space_xxs)
|
.spacing(cosmic::theme::spacing().space_xxs)
|
||||||
.apply(cosmic::Element::from)
|
.apply(cosmic::Element::from)
|
||||||
.map(Into::into)
|
.map(Into::into)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn legacy_application_scaling() -> Section<crate::pages::Message> {
|
pub fn legacy_application_scaling() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
gaming = fl!("legacy-app-scaling", "scaled-gaming");
|
||||||
|
gaming_desc = fl!("legacy-app-scaling", "gaming-description");
|
||||||
|
apps = fl!("legacy-app-scaling", "scaled-applications");
|
||||||
|
apps_desc = fl!("legacy-app-scaling", "applications-description");
|
||||||
|
compat = fl!("legacy-app-scaling", "scaled-compatibility");
|
||||||
|
compat_desc = fl!("legacy-app-scaling", "compatibility-description");
|
||||||
|
preferred_display = fl!("legacy-app-scaling", "preferred-display");
|
||||||
|
|
||||||
let gaming = descriptions.insert(fl!("legacy-app-scaling", "scaled-gaming"));
|
});
|
||||||
let gaming_desc = descriptions.insert(fl!("legacy-app-scaling", "gaming-description"));
|
|
||||||
let apps = descriptions.insert(fl!("legacy-app-scaling", "scaled-applications"));
|
|
||||||
let apps_desc = descriptions.insert(fl!("legacy-app-scaling", "applications-description"));
|
|
||||||
let compat = descriptions.insert(fl!("legacy-app-scaling", "scaled-compatibility"));
|
|
||||||
let compat_desc = descriptions.insert(fl!("legacy-app-scaling", "compatibility-description"));
|
|
||||||
let preferred_display = descriptions.insert(fl!("legacy-app-scaling", "preferred-display"));
|
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("legacy-app-scaling"))
|
.title(fl!("legacy-app-scaling"))
|
||||||
|
|
@ -356,42 +341,33 @@ pub fn legacy_application_scaling() -> Section<crate::pages::Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
widget::settings::section()
|
widget::settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(widget::settings::item_row(vec![
|
.add(
|
||||||
widget::radio(
|
widget::settings::item::builder(&descriptions[gaming])
|
||||||
widget::column()
|
.description(&descriptions[gaming_desc])
|
||||||
.push(text::body(&descriptions[gaming]))
|
.radio(
|
||||||
.push(text::caption(&descriptions[gaming_desc])),
|
XwaylandDescaling::Fractional,
|
||||||
XwaylandDescaling::Fractional,
|
Some(page.comp_config_descale_xwayland),
|
||||||
Some(page.comp_config_descale_xwayland),
|
Message::SetXwaylandDescaling,
|
||||||
Message::SetXwaylandDescaling,
|
),
|
||||||
)
|
)
|
||||||
.width(Length::Fill)
|
.add(
|
||||||
.into(),
|
widget::settings::item::builder(&descriptions[apps])
|
||||||
]))
|
.description(&descriptions[apps_desc])
|
||||||
.add(widget::settings::item_row(vec![
|
.radio(
|
||||||
widget::radio(
|
XwaylandDescaling::Enabled,
|
||||||
widget::column()
|
Some(page.comp_config_descale_xwayland),
|
||||||
.push(text::body(&descriptions[apps]))
|
Message::SetXwaylandDescaling,
|
||||||
.push(text::caption(&descriptions[apps_desc])),
|
),
|
||||||
XwaylandDescaling::Enabled,
|
)
|
||||||
Some(page.comp_config_descale_xwayland),
|
.add(
|
||||||
Message::SetXwaylandDescaling,
|
widget::settings::item::builder(&descriptions[compat])
|
||||||
)
|
.description(&descriptions[compat_desc])
|
||||||
.width(Length::Fill)
|
.radio(
|
||||||
.into(),
|
XwaylandDescaling::Disabled,
|
||||||
]))
|
Some(page.comp_config_descale_xwayland),
|
||||||
.add(widget::settings::item_row(vec![
|
Message::SetXwaylandDescaling,
|
||||||
widget::radio(
|
),
|
||||||
widget::column()
|
)
|
||||||
.push(text::body(&descriptions[compat]))
|
|
||||||
.push(text::caption(&descriptions[compat_desc])),
|
|
||||||
XwaylandDescaling::Disabled,
|
|
||||||
Some(page.comp_config_descale_xwayland),
|
|
||||||
Message::SetXwaylandDescaling,
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
.add(widget::settings::item(
|
.add(widget::settings::item(
|
||||||
&descriptions[preferred_display],
|
&descriptions[preferred_display],
|
||||||
dropdown::popup_dropdown(
|
dropdown::popup_dropdown(
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> Info {
|
fn info(&self) -> Info {
|
||||||
page::Info::new("startup-apps", "preferences-startup-applications-symbolic")
|
page::Info::new("startup-apps", "preferences-startup-applications-symbolic")
|
||||||
.title(fl!("startup-apps"))
|
.title(fl!("startup-apps"))
|
||||||
.description(fl!("startup-apps", "desc"))
|
.description(fl!("xdg-entry-startup-apps-comment"))
|
||||||
}
|
}
|
||||||
fn content(
|
fn content(
|
||||||
&self,
|
&self,
|
||||||
|
|
@ -132,6 +132,9 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
||||||
|
if self.app_to_remove.is_some() {
|
||||||
|
return Task::none();
|
||||||
|
}
|
||||||
let (task, on_enter_handle) = Task::future(async move {
|
let (task, on_enter_handle) = Task::future(async move {
|
||||||
let locales = freedesktop_desktop_entry::get_languages_from_env();
|
let locales = freedesktop_desktop_entry::get_languages_from_env();
|
||||||
|
|
||||||
|
|
@ -262,6 +265,7 @@ impl Page {
|
||||||
if !confirm {
|
if !confirm {
|
||||||
self.app_to_remove = Some(app);
|
self.app_to_remove = Some(app);
|
||||||
self.target_directory_type = Some(directory_type);
|
self.target_directory_type = Some(directory_type);
|
||||||
|
return cosmic::task::message(crate::app::Message::Page(self.entity));
|
||||||
} else {
|
} else {
|
||||||
let mut file_name = app.clone().appid;
|
let mut file_name = app.clone().appid;
|
||||||
file_name.push_str(".desktop");
|
file_name.push_str(".desktop");
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,14 @@
|
||||||
// Copyright 2024 System76 <info@system76.com>
|
// Copyright 2024 System76 <info@system76.com>
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
|
use cosmic::iced::core::text::Wrapping;
|
||||||
use cosmic::iced::{Alignment, Length, color};
|
use cosmic::iced::{Alignment, Length, color};
|
||||||
use cosmic::iced_core::text::Wrapping;
|
use cosmic::widget::{self, settings, space::horizontal as horizontal_space, text};
|
||||||
use cosmic::widget::{self, settings, text};
|
|
||||||
use cosmic::{Apply, Element, Task, theme};
|
use cosmic::{Apply, Element, Task, theme};
|
||||||
use cosmic_settings_bluetooth_subscription::*;
|
use cosmic_settings_bluetooth_subscription::*;
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
use futures::channel::oneshot;
|
use futures::channel::oneshot;
|
||||||
use futures::{SinkExt, StreamExt};
|
use futures::{SinkExt, StreamExt};
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
@ -167,7 +166,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("bluetooth", "bluetooth-symbolic")
|
page::Info::new("bluetooth", "bluetooth-symbolic")
|
||||||
.title(fl!("bluetooth"))
|
.title(fl!("bluetooth"))
|
||||||
.description(fl!("bluetooth", "desc"))
|
.description(fl!("xdg-entry-bluetooth-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn content(
|
fn content(
|
||||||
|
|
@ -725,9 +724,9 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn status() -> Section<crate::pages::Message> {
|
fn status() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
bluetooth = fl!("bluetooth");
|
||||||
let bluetooth = descriptions.insert(fl!("bluetooth"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -773,12 +772,10 @@ fn status() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
widget::list_column()
|
widget::list_column()
|
||||||
.add(
|
.add(bluetooth_toggle.toggler(
|
||||||
bluetooth_toggle.control(
|
matches!(status, Active::Enabling | Active::Enabled),
|
||||||
widget::toggler(matches!(status, Active::Enabling | Active::Enabled))
|
|active| Message::SetActive(active).into(),
|
||||||
.on_toggle(|active| Message::SetActive(active).into()),
|
))
|
||||||
),
|
|
||||||
)
|
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -812,7 +809,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
page.model.selected_adapter.as_ref().map(|adapter| {
|
page.model.selected_adapter.as_ref().map(|adapter| {
|
||||||
page.model
|
page.model
|
||||||
.devices_for_adapter(adapter)
|
.devices_for_adapter(adapter)
|
||||||
.any(|(_, device)| device.paired)
|
.any(|(_, device)| device.paired || device.is_connected())
|
||||||
}) == Some(true)
|
}) == Some(true)
|
||||||
&& page.model.active != Active::Disabled
|
&& page.model.active != Active::Disabled
|
||||||
})
|
})
|
||||||
|
|
@ -823,7 +820,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
page.model
|
page.model
|
||||||
.devices_for_adapter(page.model.selected_adapter.as_ref().unwrap())
|
.devices_for_adapter(page.model.selected_adapter.as_ref().unwrap())
|
||||||
.filter_map(|(path, device)| {
|
.filter_map(|(path, device)| {
|
||||||
if !device.paired {
|
if !(device.paired || device.is_connected()) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -840,17 +837,19 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
.position(widget::popover::Position::Bottom)
|
.position(widget::popover::Position::Bottom)
|
||||||
.on_close(Message::PopupDevice(None))
|
.on_close(Message::PopupDevice(None))
|
||||||
.popup(
|
.popup(
|
||||||
widget::column()
|
widget::column::with_capacity(2)
|
||||||
.push_maybe(device.is_connected().then(|| {
|
.push_maybe(device.is_connected().then(|| {
|
||||||
popup_button(
|
popup_button(
|
||||||
Some(Message::DisconnectDevice(path.clone())),
|
Some(Message::DisconnectDevice(path.clone())),
|
||||||
&descriptions[device_disconnect],
|
&descriptions[device_disconnect],
|
||||||
)
|
)
|
||||||
}))
|
}))
|
||||||
.push(popup_button(
|
.push_maybe(device.paired.then(|| {
|
||||||
Some(Message::ForgetDevice(path.clone())),
|
popup_button(
|
||||||
&descriptions[device_forget],
|
Some(Message::ForgetDevice(path.clone())),
|
||||||
))
|
&descriptions[device_forget],
|
||||||
|
)
|
||||||
|
}))
|
||||||
.width(Length::Fixed(200.0))
|
.width(Length::Fixed(200.0))
|
||||||
.apply(widget::container)
|
.apply(widget::container)
|
||||||
.padding(theme::spacing().space_xxs)
|
.padding(theme::spacing().space_xxs)
|
||||||
|
|
@ -879,7 +878,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
.wrapping(Wrapping::Word)
|
.wrapping(Wrapping::Word)
|
||||||
.into()
|
.into()
|
||||||
},
|
},
|
||||||
widget::horizontal_space().into(),
|
horizontal_space().into(),
|
||||||
match device.enabled {
|
match device.enabled {
|
||||||
Active::Enabled => widget::text(&descriptions[device_connected]).into(),
|
Active::Enabled => widget::text(&descriptions[device_connected]).into(),
|
||||||
Active::Enabling => widget::text(&descriptions[device_connecting])
|
Active::Enabling => widget::text(&descriptions[device_connecting])
|
||||||
|
|
@ -903,9 +902,10 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn available_devices() -> Section<crate::pages::Message> {
|
fn available_devices() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
device_connect = fl!("bluetooth", "connect");
|
||||||
let device_connecting = descriptions.insert(fl!("bluetooth", "connecting"));
|
device_connecting = fl!("bluetooth", "connecting");
|
||||||
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("bluetooth-available"))
|
.title(fl!("bluetooth-available"))
|
||||||
|
|
@ -914,7 +914,7 @@ fn available_devices() -> Section<crate::pages::Message> {
|
||||||
page.model.selected_adapter.as_ref().map(|adapter| {
|
page.model.selected_adapter.as_ref().map(|adapter| {
|
||||||
page.model
|
page.model
|
||||||
.devices_for_adapter(adapter)
|
.devices_for_adapter(adapter)
|
||||||
.any(|(_, device)| !device.paired)
|
.any(|(_, device)| !device.paired || !device.is_connected())
|
||||||
}) == Some(true)
|
}) == Some(true)
|
||||||
&& page.model.active != Active::Disabled
|
&& page.model.active != Active::Disabled
|
||||||
})
|
})
|
||||||
|
|
@ -925,7 +925,7 @@ fn available_devices() -> Section<crate::pages::Message> {
|
||||||
page.model
|
page.model
|
||||||
.devices_for_adapter(page.model.selected_adapter.as_ref().unwrap())
|
.devices_for_adapter(page.model.selected_adapter.as_ref().unwrap())
|
||||||
.filter_map(|(path, device)| {
|
.filter_map(|(path, device)| {
|
||||||
if device.paired {
|
if device.paired || device.is_connected() {
|
||||||
return None::<Element<'_, Message>>;
|
return None::<Element<'_, Message>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -936,21 +936,26 @@ fn available_devices() -> Section<crate::pages::Message> {
|
||||||
let mut items = vec![
|
let mut items = vec![
|
||||||
widget::icon::from_name(device.icon).size(16).into(),
|
widget::icon::from_name(device.icon).size(16).into(),
|
||||||
text(device.alias_or_addr()).wrapping(Wrapping::Word).into(),
|
text(device.alias_or_addr()).wrapping(Wrapping::Word).into(),
|
||||||
widget::horizontal_space().into(),
|
horizontal_space().into(),
|
||||||
];
|
];
|
||||||
|
|
||||||
if device.enabled == Active::Enabling {
|
if device.enabled == Active::Disabled {
|
||||||
|
items.push(
|
||||||
|
widget::button::text(&descriptions[device_connect])
|
||||||
|
.on_press(Message::ConnectDevice(path.clone()))
|
||||||
|
.into(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if device.enabled == Active::Enabling || device.enabled == Active::Enabled {
|
||||||
items.push(
|
items.push(
|
||||||
text(&descriptions[device_connecting])
|
text(&descriptions[device_connecting])
|
||||||
.class(theme::Text::Color(color!(128, 128, 128)))
|
.class(theme::Text::Color(color!(128, 128, 128)))
|
||||||
.into(),
|
.into(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Some(
|
|
||||||
widget::mouse_area(settings::item_row(items))
|
Some(widget::mouse_area(settings::item_row(items)).into())
|
||||||
.on_press(Message::ConnectDevice(path.clone()))
|
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
.fold(section, settings::Section::add)
|
.fold(section, settings::Section::add)
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
|
|
@ -959,9 +964,9 @@ fn available_devices() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn multiple_adapter() -> Section<crate::pages::Message> {
|
fn multiple_adapter() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
device_connected = fl!("bluetooth", "connected");
|
||||||
let device_connected = descriptions.insert(fl!("bluetooth", "connected"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("bluetooth-adapters"))
|
.title(fl!("bluetooth-adapters"))
|
||||||
|
|
@ -981,11 +986,9 @@ fn multiple_adapter() -> Section<crate::pages::Message> {
|
||||||
widget::icon::from_name("bluetooth-symbolic")
|
widget::icon::from_name("bluetooth-symbolic")
|
||||||
.size(20)
|
.size(20)
|
||||||
.into(),
|
.into(),
|
||||||
widget::horizontal_space()
|
horizontal_space().width(theme::spacing().space_xxs).into(),
|
||||||
.width(theme::spacing().space_xxs)
|
|
||||||
.into(),
|
|
||||||
text(&adapter.alias).wrapping(Wrapping::Word).into(),
|
text(&adapter.alias).wrapping(Wrapping::Word).into(),
|
||||||
widget::horizontal_space().into(),
|
horizontal_space().into(),
|
||||||
widget::icon::from_name("go-next-symbolic").into(),
|
widget::icon::from_name("go-next-symbolic").into(),
|
||||||
];
|
];
|
||||||
if page.model.adapter_connected(path) {
|
if page.model.adapter_connected(path) {
|
||||||
|
|
|
||||||
|
|
@ -41,14 +41,14 @@ pub fn import_theme(path: &Path) -> color_eyre::Result<()> {
|
||||||
|
|
||||||
let mut manager = Manager::default();
|
let mut manager = Manager::default();
|
||||||
|
|
||||||
if manager.mode().is_dark != is_dark {
|
if manager.mode().is_dark != is_dark
|
||||||
if let Err(err) = manager.dark_mode(is_dark) {
|
&& let Err(err) = manager.dark_mode(is_dark)
|
||||||
return Err(color_eyre::eyre::eyre!(
|
{
|
||||||
"Failed to set {} mode: {:?}",
|
return Err(color_eyre::eyre::eyre!(
|
||||||
mode_str,
|
"Failed to set {} mode: {:?}",
|
||||||
err
|
mode_str,
|
||||||
));
|
err
|
||||||
}
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
manager
|
manager
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ use cosmic::app::{ContextDrawer, context_drawer};
|
||||||
use cosmic::config::CosmicTk;
|
use cosmic::config::CosmicTk;
|
||||||
use cosmic::cosmic_config::{Config, ConfigSet};
|
use cosmic::cosmic_config::{Config, ConfigSet};
|
||||||
use cosmic::cosmic_theme::Spacing;
|
use cosmic::cosmic_theme::Spacing;
|
||||||
use cosmic::iced_core::{Color, Length};
|
use cosmic::iced::core::{Color, Length};
|
||||||
use cosmic::widget::{
|
use cosmic::widget::{
|
||||||
ColorPickerModel, color_picker::ColorPickerUpdate, container, flex_row, settings, text,
|
ColorPickerModel, color_picker::ColorPickerUpdate, container, flex_row, settings, text,
|
||||||
};
|
};
|
||||||
|
|
@ -42,11 +42,11 @@ pub struct Content {
|
||||||
tk_config: Option<Config>,
|
tk_config: Option<Config>,
|
||||||
|
|
||||||
comp_config: cosmic_config::Config,
|
comp_config: cosmic_config::Config,
|
||||||
clip_floating: bool,
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
clip_tiled: bool,
|
appearance_conf: cosmic_comp_config::AppearanceConfig,
|
||||||
shadow_tiled: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum CornerMessage {
|
pub enum CornerMessage {
|
||||||
ClipFloating(bool),
|
ClipFloating(bool),
|
||||||
|
|
@ -79,6 +79,7 @@ impl From<&theme_manager::Manager> for Content {
|
||||||
fn from(theme_manager: &theme_manager::Manager) -> Self {
|
fn from(theme_manager: &theme_manager::Manager) -> Self {
|
||||||
let theme = theme_manager.theme();
|
let theme = theme_manager.theme();
|
||||||
let comp_config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap();
|
let comp_config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap();
|
||||||
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
let appearance_conf = comp_config
|
let appearance_conf = comp_config
|
||||||
.get::<cosmic_comp_config::AppearanceConfig>("appearance_settings")
|
.get::<cosmic_comp_config::AppearanceConfig>("appearance_settings")
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
@ -129,9 +130,8 @@ impl From<&theme_manager::Manager> for Content {
|
||||||
icon_handles: Vec::new(),
|
icon_handles: Vec::new(),
|
||||||
tk_config: CosmicTk::config().ok(),
|
tk_config: CosmicTk::config().ok(),
|
||||||
comp_config,
|
comp_config,
|
||||||
clip_floating: appearance_conf.clip_floating_windows,
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
clip_tiled: appearance_conf.clip_tiled_windows,
|
appearance_conf,
|
||||||
shadow_tiled: appearance_conf.shadow_tiled_windows,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -257,6 +257,7 @@ impl Content {
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
pub fn update_shadow_and_corners(
|
pub fn update_shadow_and_corners(
|
||||||
&mut self,
|
&mut self,
|
||||||
message: CornerMessage,
|
message: CornerMessage,
|
||||||
|
|
@ -264,22 +265,20 @@ impl Content {
|
||||||
) -> Task<app::Message> {
|
) -> Task<app::Message> {
|
||||||
match message {
|
match message {
|
||||||
CornerMessage::ClipFloating(enabled) => {
|
CornerMessage::ClipFloating(enabled) => {
|
||||||
self.clip_floating = enabled;
|
self.appearance_conf.clip_floating_windows = enabled;
|
||||||
}
|
}
|
||||||
CornerMessage::ClipTiled(enabled) => {
|
CornerMessage::ClipTiled(enabled) => {
|
||||||
self.clip_tiled = enabled;
|
self.appearance_conf.clip_tiled_windows = enabled;
|
||||||
}
|
}
|
||||||
CornerMessage::ShadowTiled(enabled) => {
|
CornerMessage::ShadowTiled(enabled) => {
|
||||||
self.shadow_tiled = enabled;
|
self.appearance_conf.shadow_tiled_windows = enabled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let conf = cosmic_comp_config::AppearanceConfig {
|
if let Err(err) = self
|
||||||
clip_floating_windows: self.clip_floating,
|
.comp_config
|
||||||
clip_tiled_windows: self.clip_tiled,
|
.set("appearance_settings", self.appearance_conf)
|
||||||
shadow_tiled_windows: self.shadow_tiled,
|
{
|
||||||
};
|
|
||||||
if let Err(err) = self.comp_config.set("appearance_settings", conf) {
|
|
||||||
error!(?err, "Failed to set config 'appearance_settings'");
|
error!(?err, "Failed to set config 'appearance_settings'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -471,6 +470,7 @@ impl Content {
|
||||||
crate::pages::Message::CloseContextDrawer,
|
crate::pages::Message::CloseContextDrawer,
|
||||||
),
|
),
|
||||||
|
|
||||||
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
ContextView::ShadowAndCorners => context_drawer(
|
ContextView::ShadowAndCorners => context_drawer(
|
||||||
self.shadow_and_corners(),
|
self.shadow_and_corners(),
|
||||||
crate::pages::Message::CloseContextDrawer,
|
crate::pages::Message::CloseContextDrawer,
|
||||||
|
|
@ -527,13 +527,14 @@ impl Content {
|
||||||
.map(crate::pages::Message::Appearance)
|
.map(crate::pages::Message::Appearance)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
pub fn shadow_and_corners(&self) -> Element<'_, crate::pages::Message> {
|
pub fn shadow_and_corners(&self) -> Element<'_, crate::pages::Message> {
|
||||||
let Spacing { space_m, .. } = cosmic::theme::spacing();
|
let Spacing { space_m, .. } = cosmic::theme::spacing();
|
||||||
|
|
||||||
cosmic::iced::widget::column![
|
cosmic::iced::widget::column![
|
||||||
settings::section().title(fl!("shadows-floating")).add(
|
settings::section().title(fl!("shadows-floating")).add(
|
||||||
settings::item::builder(fl!("shadows-floating", "clip"))
|
settings::item::builder(fl!("shadows-floating", "clip"))
|
||||||
.toggler(self.clip_floating, |b| {
|
.toggler(self.appearance_conf.clip_floating_windows, |b| {
|
||||||
Message::DrawerCorners(CornerMessage::ClipFloating(b))
|
Message::DrawerCorners(CornerMessage::ClipFloating(b))
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
|
|
@ -541,13 +542,13 @@ impl Content {
|
||||||
.title(fl!("shadows-tiling"))
|
.title(fl!("shadows-tiling"))
|
||||||
.add(
|
.add(
|
||||||
settings::item::builder(fl!("shadows-tiling", "clip"))
|
settings::item::builder(fl!("shadows-tiling", "clip"))
|
||||||
.toggler(self.clip_tiled, |b| {
|
.toggler(self.appearance_conf.clip_tiled_windows, |b| {
|
||||||
Message::DrawerCorners(CornerMessage::ClipTiled(b))
|
Message::DrawerCorners(CornerMessage::ClipTiled(b))
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.add(
|
.add(
|
||||||
settings::item::builder(fl!("shadows-tiling", "shadow"))
|
settings::item::builder(fl!("shadows-tiling", "shadow"))
|
||||||
.toggler(self.shadow_tiled, |b| {
|
.toggler(self.appearance_conf.shadow_tiled_windows, |b| {
|
||||||
Message::DrawerCorners(CornerMessage::ShadowTiled(b))
|
Message::DrawerCorners(CornerMessage::ShadowTiled(b))
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,17 @@
|
||||||
// Copyright 2024 System76 <info@system76.com>
|
// Copyright 2024 System76 <info@system76.com>
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use std::rc::Rc;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element, Task,
|
Apply, Element, Task,
|
||||||
config::{CosmicTk, FontConfig},
|
config::{CosmicTk, FontConfig},
|
||||||
iced_core::text::Wrapping,
|
widget,
|
||||||
widget::{self, settings, svg},
|
|
||||||
};
|
};
|
||||||
use cosmic_config::ConfigSet;
|
use cosmic_config::ConfigSet;
|
||||||
|
|
||||||
use crate::app;
|
use crate::app;
|
||||||
|
use crate::widget::selection_context_item;
|
||||||
|
|
||||||
use super::{ContextView, Message, drawer};
|
use super::{ContextView, Message, drawer};
|
||||||
|
|
||||||
|
|
@ -177,10 +176,6 @@ impl Model {
|
||||||
context_view: &ContextView,
|
context_view: &ContextView,
|
||||||
callback: impl Fn(Arc<str>) -> super::Message,
|
callback: impl Fn(Arc<str>) -> super::Message,
|
||||||
) -> Element<'_, super::Message> {
|
) -> Element<'_, super::Message> {
|
||||||
let svg_accent = Rc::new(|theme: &cosmic::Theme| svg::Style {
|
|
||||||
color: Some(theme.cosmic().accent_text_color().into()),
|
|
||||||
});
|
|
||||||
|
|
||||||
let (mut families, current_font) = match *context_view {
|
let (mut families, current_font) = match *context_view {
|
||||||
ContextView::MonospaceFont => {
|
ContextView::MonospaceFont => {
|
||||||
(&self.monospace_font_families, &self.monospace_font.family)
|
(&self.monospace_font_families, &self.monospace_font.family)
|
||||||
|
|
@ -193,36 +188,17 @@ impl Model {
|
||||||
families = &self.font_filter;
|
families = &self.font_filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
let list = families.iter().fold(widget::list_column(), |list, family| {
|
let list = families.iter().fold(
|
||||||
let selected = &**family == current_font;
|
widget::list_column::with_capacity(families.len()),
|
||||||
list.add(
|
|list, family| {
|
||||||
settings::item_row(vec![
|
let selected = &**family == current_font;
|
||||||
widget::text::body(&**family)
|
list.add(selection_context_item(
|
||||||
.class(if selected {
|
family,
|
||||||
cosmic::theme::Text::Accent
|
selected,
|
||||||
} else {
|
callback(family.clone()),
|
||||||
cosmic::theme::Text::Default
|
))
|
||||||
})
|
},
|
||||||
.wrapping(Wrapping::Word)
|
);
|
||||||
.width(cosmic::iced::Length::Fill)
|
|
||||||
.into(),
|
|
||||||
if selected {
|
|
||||||
widget::icon::from_name("object-select-symbolic")
|
|
||||||
.size(16)
|
|
||||||
.icon()
|
|
||||||
.class(cosmic::theme::Svg::Custom(svg_accent.clone()))
|
|
||||||
.into()
|
|
||||||
} else {
|
|
||||||
widget::horizontal_space().width(16).into()
|
|
||||||
},
|
|
||||||
])
|
|
||||||
.apply(widget::container)
|
|
||||||
.class(cosmic::theme::Container::List)
|
|
||||||
.apply(widget::button::custom)
|
|
||||||
.class(cosmic::theme::Button::Transparent)
|
|
||||||
.on_press(callback(family.clone())),
|
|
||||||
)
|
|
||||||
});
|
|
||||||
list.into()
|
list.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,11 +32,11 @@ pub fn button(
|
||||||
let theme = theme.cosmic();
|
let theme = theme.cosmic();
|
||||||
let background = Background::Color(theme.palette.neutral_4.into());
|
let background = Background::Color(theme.palette.neutral_4.into());
|
||||||
|
|
||||||
cosmic::widget::column()
|
cosmic::widget::column::with_capacity(2)
|
||||||
.push(
|
.push(
|
||||||
cosmic::widget::button::custom_image_button(
|
cosmic::widget::button::custom_image_button(
|
||||||
cosmic::widget::column::with_children([
|
cosmic::widget::column::with_children([
|
||||||
cosmic::widget::row()
|
cosmic::widget::row::with_capacity(ICON_PREV_ROW)
|
||||||
.extend(
|
.extend(
|
||||||
handles
|
handles
|
||||||
.iter()
|
.iter()
|
||||||
|
|
@ -47,7 +47,7 @@ pub fn button(
|
||||||
)
|
)
|
||||||
.spacing(theme.space_xxxs())
|
.spacing(theme.space_xxxs())
|
||||||
.into(),
|
.into(),
|
||||||
cosmic::widget::row()
|
cosmic::widget::row::with_capacity(ICON_PREV_ROW)
|
||||||
.extend(
|
.extend(
|
||||||
handles
|
handles
|
||||||
.iter()
|
.iter()
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,13 @@ use cosmic::app::ContextDrawer;
|
||||||
use cosmic::config::CosmicTk;
|
use cosmic::config::CosmicTk;
|
||||||
use cosmic::cosmic_config::{Config, ConfigSet, CosmicConfigEntry};
|
use cosmic::cosmic_config::{Config, ConfigSet, CosmicConfigEntry};
|
||||||
use cosmic::cosmic_theme::palette::{FromColor, Hsv, Srgb};
|
use cosmic::cosmic_theme::palette::{FromColor, Hsv, Srgb};
|
||||||
use cosmic::cosmic_theme::{CornerRadii, Density, ThemeBuilder};
|
use cosmic::cosmic_theme::{CornerRadii, Density, ThemeBuilder, ThemeMode};
|
||||||
#[cfg(feature = "xdg-portal")]
|
#[cfg(feature = "xdg-portal")]
|
||||||
use cosmic::dialog::file_chooser::{self, FileFilter};
|
use cosmic::dialog::file_chooser::{self, FileFilter};
|
||||||
use cosmic::iced_core::{Alignment, Length};
|
use cosmic::iced::Subscription;
|
||||||
|
use cosmic::iced::core::{Alignment, Length};
|
||||||
use cosmic::widget::{
|
use cosmic::widget::{
|
||||||
button, color_picker::ColorPickerUpdate, container, horizontal_space, radio, row, settings,
|
button, color_picker::ColorPickerUpdate, container, row, settings, space::horizontal, text,
|
||||||
text,
|
|
||||||
};
|
};
|
||||||
use cosmic::{Apply, Element, Task, widget};
|
use cosmic::{Apply, Element, Task, widget};
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
|
|
@ -30,7 +30,6 @@ use cosmic_panel_config::CosmicPanelConfig;
|
||||||
use cosmic_settings_page::Section;
|
use cosmic_settings_page::Section;
|
||||||
use cosmic_settings_page::{self as page, section};
|
use cosmic_settings_page::{self as page, section};
|
||||||
use ron::ser::PrettyConfig;
|
use ron::ser::PrettyConfig;
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::{Key, SlotMap};
|
use slotmap::{Key, SlotMap};
|
||||||
|
|
||||||
use crate::app;
|
use crate::app;
|
||||||
|
|
@ -41,6 +40,7 @@ pub enum ContextView {
|
||||||
ApplicationBackground,
|
ApplicationBackground,
|
||||||
ContainerBackground,
|
ContainerBackground,
|
||||||
ControlComponent,
|
ControlComponent,
|
||||||
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
ShadowAndCorners,
|
ShadowAndCorners,
|
||||||
CustomAccent,
|
CustomAccent,
|
||||||
IconsAndToolkit,
|
IconsAndToolkit,
|
||||||
|
|
@ -123,9 +123,11 @@ pub enum Message {
|
||||||
Autoswitch(bool),
|
Autoswitch(bool),
|
||||||
DarkMode(bool),
|
DarkMode(bool),
|
||||||
Density(Density),
|
Density(Density),
|
||||||
|
ThemeModeUpdate(ThemeMode),
|
||||||
|
|
||||||
DrawerOpen(ContextView),
|
DrawerOpen(ContextView),
|
||||||
DrawerColor(ColorPickerUpdate),
|
DrawerColor(ColorPickerUpdate),
|
||||||
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
DrawerCorners(drawer::CornerMessage),
|
DrawerCorners(drawer::CornerMessage),
|
||||||
DrawerFont(drawer::FontMessage),
|
DrawerFont(drawer::FontMessage),
|
||||||
DrawerIcon(drawer::IconMessage),
|
DrawerIcon(drawer::IconMessage),
|
||||||
|
|
@ -265,6 +267,7 @@ impl Page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
Message::DrawerCorners(message) => {
|
Message::DrawerCorners(message) => {
|
||||||
if let Some(context_view) = self.context_view.as_ref() {
|
if let Some(context_view) = self.context_view.as_ref() {
|
||||||
tasks.push(self.drawer.update_shadow_and_corners(message, context_view));
|
tasks.push(self.drawer.update_shadow_and_corners(message, context_view));
|
||||||
|
|
@ -323,6 +326,10 @@ impl Page {
|
||||||
} else {
|
} else {
|
||||||
ThemeBuilder::light()
|
ThemeBuilder::light()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
self.roundness = builder.corner_radii.into();
|
||||||
|
self.density = Density::Standard;
|
||||||
|
|
||||||
self.theme_manager.set_active_hint(builder.active_hint);
|
self.theme_manager.set_active_hint(builder.active_hint);
|
||||||
|
|
||||||
self.theme_manager
|
self.theme_manager
|
||||||
|
|
@ -479,6 +486,9 @@ impl Page {
|
||||||
tracing::error!(?err, "Error setting dark mode");
|
tracing::error!(?err, "Error setting dark mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.roundness = builder.corner_radii.into();
|
||||||
|
self.density = Density::Standard;
|
||||||
|
|
||||||
self.theme_manager
|
self.theme_manager
|
||||||
.selected_customizer_mut()
|
.selected_customizer_mut()
|
||||||
.set_builder(*builder.clone())
|
.set_builder(*builder.clone())
|
||||||
|
|
@ -488,6 +498,8 @@ impl Page {
|
||||||
|
|
||||||
self.drawer.reset(&self.theme_manager);
|
self.drawer.reset(&self.theme_manager);
|
||||||
|
|
||||||
|
self.can_reset = self.can_reset();
|
||||||
|
|
||||||
return cosmic::task::future(async move {
|
return cosmic::task::future(async move {
|
||||||
app::Message::SetTheme(cosmic::theme::system_preference())
|
app::Message::SetTheme(cosmic::theme::system_preference())
|
||||||
});
|
});
|
||||||
|
|
@ -530,6 +542,20 @@ impl Page {
|
||||||
self.day_time = day_time;
|
self.day_time = day_time;
|
||||||
return Task::none();
|
return Task::none();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Message::ThemeModeUpdate(mode) => {
|
||||||
|
let was_dark = self.theme_manager.mode().is_dark;
|
||||||
|
let was_auto = self.theme_manager.mode().auto_switch;
|
||||||
|
|
||||||
|
self.theme_manager.sync_mode(mode);
|
||||||
|
|
||||||
|
// If auto-switch flipped while the page is open, keep the UI in sync.
|
||||||
|
if was_dark != self.theme_manager.mode().is_dark
|
||||||
|
|| was_auto != self.theme_manager.mode().auto_switch
|
||||||
|
{
|
||||||
|
self.drawer.reset(&self.theme_manager);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut tasks = cosmic::Task::batch(tasks);
|
let mut tasks = cosmic::Task::batch(tasks);
|
||||||
|
|
@ -538,11 +564,7 @@ impl Page {
|
||||||
tasks = tasks.chain(self.theme_manager.build_theme(stage))
|
tasks = tasks.chain(self.theme_manager.build_theme(stage))
|
||||||
}
|
}
|
||||||
|
|
||||||
self.can_reset = if self.theme_manager.mode().is_dark {
|
self.can_reset = self.can_reset();
|
||||||
*self.theme_manager.builder() != ThemeBuilder::dark()
|
|
||||||
} else {
|
|
||||||
*self.theme_manager.builder() != ThemeBuilder::light()
|
|
||||||
};
|
|
||||||
|
|
||||||
tasks
|
tasks
|
||||||
}
|
}
|
||||||
|
|
@ -598,6 +620,7 @@ impl Page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "wayland")]
|
||||||
pub fn update_dock_padding(roundness: Roundness) {
|
pub fn update_dock_padding(roundness: Roundness) {
|
||||||
let dock_config_helper = CosmicPanelConfig::cosmic_config("Dock").ok();
|
let dock_config_helper = CosmicPanelConfig::cosmic_config("Dock").ok();
|
||||||
|
|
||||||
|
|
@ -655,6 +678,14 @@ impl Page {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn can_reset(&self) -> bool {
|
||||||
|
if self.theme_manager.mode().is_dark {
|
||||||
|
*self.theme_manager.builder() != ThemeBuilder::dark()
|
||||||
|
} else {
|
||||||
|
*self.theme_manager.builder() != ThemeBuilder::light()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl page::Page<crate::pages::Message> for Page {
|
impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
@ -694,7 +725,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("appearance", "preferences-appearance-symbolic")
|
page::Info::new("appearance", "preferences-appearance-symbolic")
|
||||||
.title(fl!("appearance"))
|
.title(fl!("appearance"))
|
||||||
.description(fl!("appearance", "desc"))
|
.description(fl!("xdg-entry-appearance-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
||||||
|
|
@ -727,6 +758,17 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
cosmic::task::batch(tasks)
|
cosmic::task::batch(tasks)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn subscription(&self, core: &cosmic::Core) -> Subscription<crate::pages::Message> {
|
||||||
|
// Keep the Appearance page in sync when the daemon auto-switches light/dark.
|
||||||
|
core.watch_config::<ThemeMode>("com.system76.CosmicTheme.Mode")
|
||||||
|
.map(|update| {
|
||||||
|
for why in update.errors {
|
||||||
|
tracing::error!(?why, "theme mode config load error");
|
||||||
|
}
|
||||||
|
crate::pages::Message::Appearance(Message::ThemeModeUpdate(update.config))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn context_drawer(&self) -> Option<ContextDrawer<'_, crate::pages::Message>> {
|
fn context_drawer(&self) -> Option<ContextDrawer<'_, crate::pages::Message>> {
|
||||||
self.drawer.context_drawer(self.context_view)
|
self.drawer.context_drawer(self.context_view)
|
||||||
}
|
}
|
||||||
|
|
@ -747,36 +789,21 @@ pub fn interface_density() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::item_row(vec![
|
.add(settings::item::builder(&descriptions[compact]).radio(
|
||||||
radio(
|
Density::Compact,
|
||||||
text::body(&descriptions[compact]),
|
Some(page.density),
|
||||||
Density::Compact,
|
Message::Density,
|
||||||
Some(page.density),
|
))
|
||||||
Message::Density,
|
.add(settings::item::builder(&descriptions[comfortable]).radio(
|
||||||
)
|
Density::Standard,
|
||||||
.width(Length::Fill)
|
Some(page.density),
|
||||||
.into(),
|
Message::Density,
|
||||||
]))
|
))
|
||||||
.add(settings::item_row(vec![
|
.add(settings::item::builder(&descriptions[spacious]).radio(
|
||||||
radio(
|
Density::Spacious,
|
||||||
text::body(&descriptions[comfortable]),
|
Some(page.density),
|
||||||
Density::Standard,
|
Message::Density,
|
||||||
Some(page.density),
|
))
|
||||||
Message::Density,
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
.add(settings::item_row(vec![
|
|
||||||
radio(
|
|
||||||
text::body(&descriptions[spacious]),
|
|
||||||
Density::Spacious,
|
|
||||||
Some(page.density),
|
|
||||||
Message::Density,
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::Appearance)
|
.map(crate::pages::Message::Appearance)
|
||||||
})
|
})
|
||||||
|
|
@ -784,10 +811,10 @@ pub fn interface_density() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
#[allow(clippy::too_many_lines)]
|
#[allow(clippy::too_many_lines)]
|
||||||
pub fn window_management() -> Section<crate::pages::Message> {
|
pub fn window_management() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
active_hint = fl!("window-management-appearance", "active-hint");
|
||||||
let active_hint = descriptions.insert(fl!("window-management-appearance", "active-hint"));
|
gaps = fl!("window-management-appearance", "gaps");
|
||||||
let gaps = descriptions.insert(fl!("window-management-appearance", "gaps"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("window-management-appearance"))
|
.title(fl!("window-management-appearance"))
|
||||||
|
|
@ -855,17 +882,21 @@ pub fn experimental() -> Section<crate::pages::Message> {
|
||||||
Message::DrawerOpen(ContextView::IconsAndToolkit),
|
Message::DrawerOpen(ContextView::IconsAndToolkit),
|
||||||
);
|
);
|
||||||
|
|
||||||
let shadow_and_corners = crate::widget::go_next_item(
|
let mut section = settings::section()
|
||||||
&descriptions[shadow_and_corners_txt],
|
|
||||||
Message::DrawerOpen(ContextView::ShadowAndCorners),
|
|
||||||
);
|
|
||||||
|
|
||||||
settings::section()
|
|
||||||
.title(&*section.title)
|
.title(&*section.title)
|
||||||
.add(system_font)
|
.add(system_font)
|
||||||
.add(mono_font)
|
.add(mono_font)
|
||||||
.add(icons_and_toolkit)
|
.add(icons_and_toolkit);
|
||||||
.add(shadow_and_corners)
|
|
||||||
|
#[cfg(feature = "cosmic-comp-config")]
|
||||||
|
{
|
||||||
|
section = section.add(crate::widget::go_next_item(
|
||||||
|
&descriptions[shadow_and_corners_txt],
|
||||||
|
Message::DrawerOpen(ContextView::ShadowAndCorners),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
section
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::Appearance)
|
.map(crate::pages::Message::Appearance)
|
||||||
})
|
})
|
||||||
|
|
@ -873,9 +904,9 @@ pub fn experimental() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
#[allow(clippy::too_many_lines)]
|
#[allow(clippy::too_many_lines)]
|
||||||
pub fn reset_button() -> Section<crate::pages::Message> {
|
pub fn reset_button() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
reset_to_default = fl!("reset-to-default");
|
||||||
let reset_to_default = descriptions.insert(fl!("reset-to-default"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -886,7 +917,7 @@ pub fn reset_button() -> Section<crate::pages::Message> {
|
||||||
.on_press(Message::Reset)
|
.on_press(Message::Reset)
|
||||||
.into()
|
.into()
|
||||||
} else {
|
} else {
|
||||||
horizontal_space().width(1).apply(Element::from)
|
horizontal().width(1.).apply(Element::from)
|
||||||
}
|
}
|
||||||
.map(crate::pages::Message::Appearance)
|
.map(crate::pages::Message::Appearance)
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,9 @@ use crate::pages::desktop::wallpaper::widgets::color_image;
|
||||||
use cosmic::cosmic_theme::Spacing;
|
use cosmic::cosmic_theme::Spacing;
|
||||||
use cosmic::cosmic_theme::palette::Srgba;
|
use cosmic::cosmic_theme::palette::Srgba;
|
||||||
use cosmic::iced::ContentFit;
|
use cosmic::iced::ContentFit;
|
||||||
use cosmic::iced_core::{Alignment, Length};
|
use cosmic::iced::core::{Alignment, Length};
|
||||||
use cosmic::widget::icon::{from_name, icon};
|
use cosmic::widget::icon::{from_name, icon};
|
||||||
use cosmic::widget::{self, button, container, settings, text};
|
use cosmic::widget::{self, button, container, list, settings, text};
|
||||||
use cosmic::{Apply, Element};
|
use cosmic::{Apply, Element};
|
||||||
use cosmic_settings_page::Section;
|
use cosmic_settings_page::Section;
|
||||||
use cosmic_settings_wallpaper as wallpaper;
|
use cosmic_settings_wallpaper as wallpaper;
|
||||||
|
|
@ -64,105 +64,117 @@ fn container_background<'a>(
|
||||||
page: &Page,
|
page: &Page,
|
||||||
section: &'a Section<crate::pages::Message>,
|
section: &'a Section<crate::pages::Message>,
|
||||||
labels: &HashMap<String, usize>,
|
labels: &HashMap<String, usize>,
|
||||||
) -> impl Into<Element<'a, Message>> {
|
) -> list::ListButton<'a, Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
let go_next_icon = from_name("go-next-symbolic").handle();
|
let go_next_icon = from_name("go-next-symbolic").handle();
|
||||||
|
|
||||||
settings::item::builder(&descriptions[labels["container_bg"]])
|
list::button(
|
||||||
.description(&descriptions[labels["container_bg_desc"]])
|
settings::item::builder(&descriptions[labels["container_bg"]])
|
||||||
.control(
|
.description(&descriptions[labels["container_bg_desc"]])
|
||||||
if page
|
.control(
|
||||||
.drawer
|
if page
|
||||||
.container_background
|
.drawer
|
||||||
.get_applied_color()
|
.container_background
|
||||||
.is_some()
|
.get_applied_color()
|
||||||
{
|
.is_some()
|
||||||
Element::from(
|
{
|
||||||
page.drawer
|
Element::from(
|
||||||
.container_background
|
page.drawer
|
||||||
.picker_button(
|
.container_background
|
||||||
|_| Message::DrawerOpen(ContextView::ContainerBackground),
|
.picker_button(
|
||||||
Some(24),
|
|_| Message::DrawerOpen(ContextView::ContainerBackground),
|
||||||
)
|
Some(24),
|
||||||
.width(Length::Fixed(48.0))
|
)
|
||||||
.height(Length::Fixed(24.0)),
|
.width(Length::Fixed(48.0))
|
||||||
)
|
.height(Length::Fixed(24.0)),
|
||||||
} else {
|
)
|
||||||
container(
|
} else {
|
||||||
button::text(&descriptions[labels["auto"]])
|
container(
|
||||||
.trailing_icon(go_next_icon.clone())
|
button::text(&descriptions[labels["auto"]])
|
||||||
.on_press(Message::DrawerOpen(ContextView::ContainerBackground)),
|
.trailing_icon(go_next_icon.clone())
|
||||||
)
|
.on_press(Message::DrawerOpen(ContextView::ContainerBackground)),
|
||||||
.into()
|
)
|
||||||
},
|
.into()
|
||||||
)
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.on_press(Message::DrawerOpen(ContextView::ContainerBackground))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn application_background<'a>(
|
fn application_background<'a>(
|
||||||
page: &Page,
|
page: &Page,
|
||||||
section: &'a Section<crate::pages::Message>,
|
section: &'a Section<crate::pages::Message>,
|
||||||
labels: &HashMap<String, usize>,
|
labels: &HashMap<String, usize>,
|
||||||
) -> impl Into<Element<'a, Message>> {
|
) -> list::ListButton<'a, Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
|
|
||||||
settings::item::builder(&descriptions[labels["app_bg"]]).control(
|
list::button(
|
||||||
page.drawer
|
settings::item::builder(&descriptions[labels["app_bg"]]).control(
|
||||||
.application_background
|
page.drawer
|
||||||
.picker_button(
|
.application_background
|
||||||
|_| Message::DrawerOpen(ContextView::ApplicationBackground),
|
.picker_button(
|
||||||
Some(24),
|
|_| Message::DrawerOpen(ContextView::ApplicationBackground),
|
||||||
)
|
Some(24),
|
||||||
.width(Length::Fixed(48.0))
|
)
|
||||||
.height(Length::Fixed(24.0)),
|
.width(Length::Fixed(48.0))
|
||||||
|
.height(Length::Fixed(24.0)),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
.on_press(Message::DrawerOpen(ContextView::ApplicationBackground))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn control_tint<'a>(
|
fn control_tint<'a>(
|
||||||
page: &Page,
|
page: &Page,
|
||||||
section: &'a Section<crate::pages::Message>,
|
section: &'a Section<crate::pages::Message>,
|
||||||
labels: &HashMap<String, usize>,
|
labels: &HashMap<String, usize>,
|
||||||
) -> impl Into<Element<'a, Message>> {
|
) -> list::ListButton<'a, Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
|
|
||||||
settings::item::builder(&descriptions[labels["control_tint"]])
|
list::button(
|
||||||
.description(&descriptions[labels["control_tint_desc"]])
|
settings::item::builder(&descriptions[labels["control_tint"]])
|
||||||
.control(
|
.description(&descriptions[labels["control_tint_desc"]])
|
||||||
page.drawer
|
.control(
|
||||||
.control_component
|
page.drawer
|
||||||
.picker_button(
|
.control_component
|
||||||
|_| Message::DrawerOpen(ContextView::ControlComponent),
|
.picker_button(
|
||||||
Some(24),
|
|_| Message::DrawerOpen(ContextView::ControlComponent),
|
||||||
)
|
Some(24),
|
||||||
.width(Length::Fixed(48.0))
|
)
|
||||||
.height(Length::Fixed(24.0)),
|
.width(Length::Fixed(48.0))
|
||||||
)
|
.height(Length::Fixed(24.0)),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.on_press(Message::DrawerOpen(ContextView::ControlComponent))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn interface_text<'a>(
|
fn interface_text<'a>(
|
||||||
page: &Page,
|
page: &Page,
|
||||||
section: &'a Section<crate::pages::Message>,
|
section: &'a Section<crate::pages::Message>,
|
||||||
labels: &HashMap<String, usize>,
|
labels: &HashMap<String, usize>,
|
||||||
) -> impl Into<Element<'a, Message>> {
|
) -> list::ListButton<'a, Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
|
|
||||||
settings::item::builder(&descriptions[labels["text_tint"]])
|
list::button(
|
||||||
.description(&descriptions[labels["text_tint_desc"]])
|
settings::item::builder(&descriptions[labels["text_tint"]])
|
||||||
.control(
|
.description(&descriptions[labels["text_tint_desc"]])
|
||||||
page.drawer
|
.control(
|
||||||
.interface_text
|
page.drawer
|
||||||
.picker_button(
|
.interface_text
|
||||||
|_| Message::DrawerOpen(ContextView::InterfaceText),
|
.picker_button(
|
||||||
Some(24),
|
|_| Message::DrawerOpen(ContextView::InterfaceText),
|
||||||
)
|
Some(24),
|
||||||
.width(Length::Fixed(48.0))
|
)
|
||||||
.height(Length::Fixed(24.0)),
|
.width(Length::Fixed(48.0))
|
||||||
)
|
.height(Length::Fixed(24.0)),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.on_press(Message::DrawerOpen(ContextView::InterfaceText))
|
||||||
}
|
}
|
||||||
fn auto_switch<'a>(
|
fn auto_switch<'a>(
|
||||||
page: &Page,
|
page: &Page,
|
||||||
section: &'a Section<crate::pages::Message>,
|
section: &'a Section<crate::pages::Message>,
|
||||||
labels: &HashMap<String, usize>,
|
labels: &HashMap<String, usize>,
|
||||||
) -> impl Into<Element<'a, Message>> {
|
) -> list::ListButton<'a, Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
|
|
||||||
settings::item::builder(&descriptions[labels["auto_switch"]])
|
settings::item::builder(&descriptions[labels["auto_switch"]])
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,18 @@
|
||||||
use cosmic::iced_core::{Alignment, Length, text::Wrapping};
|
use cosmic::iced::core::{Alignment, Length, text::Wrapping};
|
||||||
use cosmic::widget::icon::{from_name, icon};
|
use cosmic::widget::icon::{from_name, icon};
|
||||||
use cosmic::widget::{button, container, settings, text};
|
use cosmic::widget::{button, container, settings, text};
|
||||||
use cosmic::{Apply, Element};
|
use cosmic::{Apply, Element};
|
||||||
use cosmic_settings_page::Section;
|
use cosmic_settings_page::Section;
|
||||||
use slab::Slab;
|
|
||||||
|
|
||||||
use super::{Message, Page, Roundness};
|
use super::{Message, Page, Roundness};
|
||||||
|
|
||||||
#[allow(clippy::too_many_lines)]
|
#[allow(clippy::too_many_lines)]
|
||||||
pub fn section() -> Section<crate::pages::Message> {
|
pub fn section() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
round = fl!("style", "round");
|
||||||
let round = descriptions.insert(fl!("style", "round"));
|
slightly_round = fl!("style", "slightly-round");
|
||||||
let slightly_round = descriptions.insert(fl!("style", "slightly-round"));
|
square = fl!("style", "square");
|
||||||
let square = descriptions.insert(fl!("style", "square"));
|
});
|
||||||
|
|
||||||
let dark_round_style = from_name("illustration-appearance-dark-style-round").handle();
|
let dark_round_style = from_name("illustration-appearance-dark-style-round").handle();
|
||||||
let light_round_style = from_name("illustration-appearance-light-style-round").handle();
|
let light_round_style = from_name("illustration-appearance-light-style-round").handle();
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use cosmic::cosmic_theme::{
|
||||||
CornerRadii, DARK_THEME_BUILDER_ID, LIGHT_THEME_BUILDER_ID, Spacing, Theme, ThemeBuilder,
|
CornerRadii, DARK_THEME_BUILDER_ID, LIGHT_THEME_BUILDER_ID, Spacing, Theme, ThemeBuilder,
|
||||||
ThemeMode,
|
ThemeMode,
|
||||||
};
|
};
|
||||||
use cosmic::iced_core::Color;
|
use cosmic::iced::core::Color;
|
||||||
|
|
||||||
use cosmic::Task;
|
use cosmic::Task;
|
||||||
use cosmic::theme::ThemeType;
|
use cosmic::theme::ThemeType;
|
||||||
|
|
@ -260,6 +260,13 @@ impl Manager {
|
||||||
&self.mode.0
|
&self.mode.0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Update the locally cached `ThemeMode` from an external source (daemon / config watcher).
|
||||||
|
///
|
||||||
|
/// This must not write back to config, since the daemon is the source of truth.
|
||||||
|
pub fn sync_mode(&mut self, mode: ThemeMode) {
|
||||||
|
self.mode.0 = mode;
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn builder(&self) -> &ThemeBuilder {
|
pub fn builder(&self) -> &ThemeBuilder {
|
||||||
&self.selected_customizer().builder.0
|
&self.selected_customizer().builder.0
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,10 @@ use cosmic::Apply;
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Element, Task,
|
Element, Task,
|
||||||
cosmic_config::{ConfigSet, CosmicConfigEntry},
|
cosmic_config::{ConfigSet, CosmicConfigEntry},
|
||||||
widget::{settings, text, toggler},
|
widget::{settings, text},
|
||||||
};
|
};
|
||||||
use cosmic_panel_config::{CosmicPanelConfig, CosmicPanelContainerConfig};
|
use cosmic_panel_config::{CosmicPanelConfig, CosmicPanelContainerConfig};
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
||||||
|
|
@ -158,9 +157,9 @@ impl Default for Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn enable() -> Section<crate::pages::Message> {
|
pub(crate) fn enable() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
dock = fl!("dock");
|
||||||
let dock = descriptions.insert(fl!("dock"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -171,16 +170,15 @@ pub(crate) fn enable() -> Section<crate::pages::Message> {
|
||||||
};
|
};
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[dock],
|
settings::item::builder(&descriptions[dock]).toggler(
|
||||||
toggler(
|
|
||||||
container_config
|
container_config
|
||||||
.config_list
|
.config_list
|
||||||
.iter()
|
.iter()
|
||||||
.any(|e| e.name.as_str() == "Dock"),
|
.any(|e| e.name.as_str() == "Dock"),
|
||||||
)
|
Message::EnableDock,
|
||||||
.on_toggle(Message::EnableDock),
|
),
|
||||||
))
|
)
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::Dock)
|
.map(crate::pages::Message::Dock)
|
||||||
})
|
})
|
||||||
|
|
@ -216,7 +214,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("dock", "preferences-dock-symbolic")
|
page::Info::new("dock", "preferences-dock-symbolic")
|
||||||
.title(fl!("dock"))
|
.title(fl!("dock"))
|
||||||
.description(fl!("dock", "desc"))
|
.description(fl!("xdg-entry-dock-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
||||||
|
|
|
||||||
|
|
@ -6,22 +6,22 @@ use cosmic::iced::clipboard::dnd::{
|
||||||
use cosmic::iced::clipboard::mime::AsMimeTypes;
|
use cosmic::iced::clipboard::mime::AsMimeTypes;
|
||||||
use cosmic::iced::id::Internal;
|
use cosmic::iced::id::Internal;
|
||||||
|
|
||||||
use cosmic::iced_core;
|
use cosmic::iced;
|
||||||
use cosmic::iced_core::clipboard::IconSurface;
|
use cosmic::iced::core::clipboard::IconSurface;
|
||||||
use cosmic::widget::{Column, button, column, container, icon, list_column, row, text, text_input};
|
use cosmic::widget::{Column, button, column, container, icon, list_column, row, text, text_input};
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element,
|
Apply, Element,
|
||||||
cosmic_config::{Config, CosmicConfigEntry},
|
cosmic_config::{Config, CosmicConfigEntry},
|
||||||
|
iced::core::{
|
||||||
|
Clipboard, Shell, Widget, layout, renderer,
|
||||||
|
widget::{Operation, Tree, tree},
|
||||||
|
},
|
||||||
|
iced::runtime::{Task, core::id::Id},
|
||||||
iced::{
|
iced::{
|
||||||
Alignment, Border, Color, Length, Point, Rectangle, Size, Vector, core::window, event,
|
Alignment, Border, Color, Length, Point, Rectangle, Size, Vector, core::window, event,
|
||||||
mouse, overlay, touch,
|
mouse, overlay, touch,
|
||||||
},
|
},
|
||||||
iced_runtime::{Task, core::id::Id},
|
|
||||||
iced_widget::core::{
|
|
||||||
Clipboard, Shell, Widget, layout, renderer,
|
|
||||||
widget::{Operation, Tree, tree},
|
|
||||||
},
|
|
||||||
theme,
|
theme,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -650,7 +650,7 @@ impl<'a, Message: 'static + Clone> AppletReorderList<'a, Message> {
|
||||||
let is_dragged = active_dnd.as_ref().is_some_and(|dnd| dnd.id == info.id);
|
let is_dragged = active_dnd.as_ref().is_some_and(|dnd| dnd.id == info.id);
|
||||||
|
|
||||||
let content = if is_dragged {
|
let content = if is_dragged {
|
||||||
row().height(Length::Fixed(32.0))
|
row([]).height(Length::Fixed(32.0))
|
||||||
} else {
|
} else {
|
||||||
row::with_children(vec![
|
row::with_children(vec![
|
||||||
icon::from_name("grip-lines-symbolic")
|
icon::from_name("grip-lines-symbolic")
|
||||||
|
|
@ -899,30 +899,28 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
fn layout(
|
fn layout(
|
||||||
&self,
|
&mut self,
|
||||||
tree: &mut Tree,
|
tree: &mut Tree,
|
||||||
renderer: &cosmic::Renderer,
|
renderer: &cosmic::Renderer,
|
||||||
limits: &layout::Limits,
|
limits: &layout::Limits,
|
||||||
) -> layout::Node {
|
) -> layout::Node {
|
||||||
let inner_layout = self
|
let inner_layout =
|
||||||
.inner
|
self.inner
|
||||||
.as_widget()
|
.as_widget_mut()
|
||||||
.layout(&mut tree.children[0], renderer, limits);
|
.layout(&mut tree.children[0], renderer, limits);
|
||||||
layout::Node::with_children(inner_layout.size(), vec![inner_layout])
|
layout::Node::with_children(inner_layout.size(), vec![inner_layout])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn operate(
|
fn operate(
|
||||||
&self,
|
&mut self,
|
||||||
tree: &mut Tree,
|
tree: &mut Tree,
|
||||||
layout: layout::Layout<'_>,
|
layout: layout::Layout<'_>,
|
||||||
renderer: &cosmic::Renderer,
|
renderer: &cosmic::Renderer,
|
||||||
operation: &mut dyn Operation<()>,
|
operation: &mut dyn Operation<()>,
|
||||||
) {
|
) {
|
||||||
let state = tree.state.downcast_mut::<ReorderWidgetState>();
|
operation.container(Some(&self.id), layout.bounds());
|
||||||
|
|
||||||
operation.custom(state, Some(&self.id));
|
self.inner.as_widget_mut().operate(
|
||||||
|
|
||||||
self.inner.as_widget().operate(
|
|
||||||
&mut tree.children[0],
|
&mut tree.children[0],
|
||||||
layout.children().next().unwrap(),
|
layout.children().next().unwrap(),
|
||||||
renderer,
|
renderer,
|
||||||
|
|
@ -931,31 +929,31 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_lines, clippy::needless_match)]
|
#[allow(clippy::too_many_lines, clippy::needless_match)]
|
||||||
fn on_event(
|
fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
tree: &mut Tree,
|
tree: &mut Tree,
|
||||||
event: event::Event,
|
event: &event::Event,
|
||||||
layout: layout::Layout<'_>,
|
layout: layout::Layout<'_>,
|
||||||
cursor_position: mouse::Cursor,
|
cursor_position: mouse::Cursor,
|
||||||
renderer: &cosmic::Renderer,
|
renderer: &cosmic::Renderer,
|
||||||
clipboard: &mut dyn Clipboard,
|
clipboard: &mut dyn Clipboard,
|
||||||
shell: &mut Shell<'_, Message>,
|
shell: &mut Shell<'_, Message>,
|
||||||
viewport: &Rectangle,
|
viewport: &Rectangle,
|
||||||
) -> event::Status {
|
) {
|
||||||
let space_xxs = theme::spacing().space_xxs;
|
let space_xxs = theme::spacing().space_xxs;
|
||||||
let mut ret = match self.inner.as_widget_mut().on_event(
|
self.inner.as_widget_mut().update(
|
||||||
&mut tree.children[0],
|
&mut tree.children[0],
|
||||||
event.clone(),
|
event,
|
||||||
layout.children().next().unwrap(),
|
layout.children().next().unwrap(),
|
||||||
cursor_position,
|
cursor_position,
|
||||||
renderer,
|
renderer,
|
||||||
clipboard,
|
clipboard,
|
||||||
shell,
|
shell,
|
||||||
viewport,
|
viewport,
|
||||||
) {
|
);
|
||||||
event::Status::Captured => return event::Status::Captured,
|
if shell.is_event_captured() {
|
||||||
event::Status::Ignored => event::Status::Ignored,
|
return;
|
||||||
};
|
}
|
||||||
|
|
||||||
let height = (layout.bounds().height
|
let height = (layout.bounds().height
|
||||||
- space_xxs as f32 * (self.info.len().saturating_sub(1)) as f32)
|
- space_xxs as f32 * (self.info.len().saturating_sub(1)) as f32)
|
||||||
|
|
@ -967,15 +965,14 @@ where
|
||||||
DraggingState::Dragging(applet) => match &event {
|
DraggingState::Dragging(applet) => match &event {
|
||||||
event::Event::Dnd(DndEvent::Source(source_event)) => match source_event {
|
event::Event::Dnd(DndEvent::Source(source_event)) => match source_event {
|
||||||
SourceEvent::Cancelled => {
|
SourceEvent::Cancelled => {
|
||||||
ret = event::Status::Captured;
|
shell.capture_event();
|
||||||
if let Some(on_cancel) = self.on_cancel.clone() {
|
if let Some(on_cancel) = self.on_cancel.clone() {
|
||||||
shell.publish(on_cancel);
|
shell.publish(on_cancel);
|
||||||
}
|
}
|
||||||
DraggingState::None
|
DraggingState::None
|
||||||
}
|
}
|
||||||
SourceEvent::Finished => {
|
SourceEvent::Finished => {
|
||||||
ret = event::Status::Captured;
|
shell.capture_event();
|
||||||
|
|
||||||
DraggingState::None
|
DraggingState::None
|
||||||
}
|
}
|
||||||
_ => DraggingState::Dragging(applet),
|
_ => DraggingState::Dragging(applet),
|
||||||
|
|
@ -989,7 +986,7 @@ where
|
||||||
| event::Event::Touch(touch::Event::FingerPressed { .. })
|
| event::Event::Touch(touch::Event::FingerPressed { .. })
|
||||||
if cursor_position.is_over(layout.bounds()) =>
|
if cursor_position.is_over(layout.bounds()) =>
|
||||||
{
|
{
|
||||||
ret = event::Status::Captured;
|
shell.capture_event();
|
||||||
|
|
||||||
DraggingState::Pressed(cursor_position.position().unwrap_or_default())
|
DraggingState::Pressed(cursor_position.position().unwrap_or_default())
|
||||||
}
|
}
|
||||||
|
|
@ -1023,24 +1020,25 @@ where
|
||||||
));
|
));
|
||||||
|
|
||||||
let p = applet.path.to_path_buf();
|
let p = applet.path.to_path_buf();
|
||||||
iced_core::clipboard::start_dnd::<
|
iced::core::clipboard::start_dnd::<
|
||||||
cosmic::Theme,
|
cosmic::Theme,
|
||||||
cosmic::Renderer,
|
cosmic::Renderer,
|
||||||
>(
|
>(
|
||||||
clipboard,
|
clipboard,
|
||||||
false,
|
false,
|
||||||
Some(iced_core::clipboard::DndSource::Widget(
|
Some(iced::core::clipboard::DndSource::Widget(
|
||||||
self.id.clone(),
|
self.id.clone(),
|
||||||
)),
|
)),
|
||||||
Some(IconSurface::new(
|
Some(IconSurface::new(
|
||||||
dnd_icon(applet.clone(), &layout).into(),
|
dnd_icon(applet.clone(), &layout).into(),
|
||||||
iced_core::widget::tree::State::new(state.clone()),
|
iced::core::widget::tree::State::new(state.clone()),
|
||||||
iced_core::Vector::new(0.0, 0.0),
|
iced::core::Vector::new(0.0, 0.0),
|
||||||
)),
|
)),
|
||||||
Box::new(AppletString(p.clone())),
|
Box::new(AppletString(p.clone())),
|
||||||
DndAction::Move,
|
DndAction::Move,
|
||||||
);
|
);
|
||||||
ret = event::Status::Captured;
|
shell.capture_event();
|
||||||
|
|
||||||
let reordered = self
|
let reordered = self
|
||||||
.info
|
.info
|
||||||
.iter()
|
.iter()
|
||||||
|
|
@ -1063,7 +1061,7 @@ where
|
||||||
| event::Event::Touch(
|
| event::Event::Touch(
|
||||||
touch::Event::FingerLifted { .. } | touch::Event::FingerLost { .. },
|
touch::Event::FingerLifted { .. } | touch::Event::FingerLost { .. },
|
||||||
) => {
|
) => {
|
||||||
ret = event::Status::Captured;
|
shell.capture_event();
|
||||||
DraggingState::None
|
DraggingState::None
|
||||||
}
|
}
|
||||||
_ => DraggingState::Pressed(start),
|
_ => DraggingState::Pressed(start),
|
||||||
|
|
@ -1161,8 +1159,6 @@ where
|
||||||
_ => DndOfferState::HandlingOffer,
|
_ => DndOfferState::HandlingOffer,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
ret
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw(
|
fn draw(
|
||||||
|
|
@ -1189,14 +1185,16 @@ where
|
||||||
fn overlay<'b>(
|
fn overlay<'b>(
|
||||||
&'b mut self,
|
&'b mut self,
|
||||||
tree: &'b mut Tree,
|
tree: &'b mut Tree,
|
||||||
layout: layout::Layout<'_>,
|
layout: layout::Layout<'b>,
|
||||||
renderer: &cosmic::Renderer,
|
renderer: &cosmic::Renderer,
|
||||||
|
viewport: &Rectangle,
|
||||||
translation: Vector,
|
translation: Vector,
|
||||||
) -> Option<overlay::Element<'b, Message, cosmic::Theme, cosmic::Renderer>> {
|
) -> Option<overlay::Element<'b, Message, cosmic::Theme, cosmic::Renderer>> {
|
||||||
self.inner.as_widget_mut().overlay(
|
self.inner.as_widget_mut().overlay(
|
||||||
&mut tree.children[0],
|
&mut tree.children[0],
|
||||||
layout.children().next().unwrap(),
|
layout.children().next().unwrap(),
|
||||||
renderer,
|
renderer,
|
||||||
|
viewport,
|
||||||
translation,
|
translation,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -1243,7 +1241,7 @@ where
|
||||||
_state: &Tree,
|
_state: &Tree,
|
||||||
layout: layout::Layout<'_>,
|
layout: layout::Layout<'_>,
|
||||||
_renderer: &cosmic::Renderer,
|
_renderer: &cosmic::Renderer,
|
||||||
dnd_rectangles: &mut cosmic::iced_core::clipboard::DndDestinationRectangles,
|
dnd_rectangles: &mut cosmic::iced::core::clipboard::DndDestinationRectangles,
|
||||||
) {
|
) {
|
||||||
let Rectangle {
|
let Rectangle {
|
||||||
x,
|
x,
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,8 @@ use cosmic::{
|
||||||
cosmic_config::{self, CosmicConfigEntry},
|
cosmic_config::{self, CosmicConfigEntry},
|
||||||
cosmic_theme::Density,
|
cosmic_theme::Density,
|
||||||
iced::{Alignment, Length},
|
iced::{Alignment, Length},
|
||||||
surface, theme,
|
surface,
|
||||||
widget::{
|
widget::{button, container, dropdown, row, settings, slider, space, text},
|
||||||
button, container, dropdown, horizontal_space, icon, row, settings, slider, text, toggler,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use cosmic::Apply;
|
use cosmic::Apply;
|
||||||
|
|
@ -17,7 +15,6 @@ use cosmic_panel_config::{
|
||||||
CosmicPanelOuput, PanelAnchor, PanelSize,
|
CosmicPanelOuput, PanelAnchor, PanelSize,
|
||||||
};
|
};
|
||||||
use cosmic_settings_page::{self as page, Section};
|
use cosmic_settings_page::{self as page, Section};
|
||||||
use slab::Slab;
|
|
||||||
use std::{collections::HashMap, time::Duration};
|
use std::{collections::HashMap, time::Duration};
|
||||||
|
|
||||||
use crate::pages::desktop::appearance::Roundness;
|
use crate::pages::desktop::appearance::Roundness;
|
||||||
|
|
@ -25,6 +22,7 @@ use crate::pages::desktop::appearance::Roundness;
|
||||||
pub struct PageInner {
|
pub struct PageInner {
|
||||||
pub(crate) config_helper: Option<cosmic_config::Config>,
|
pub(crate) config_helper: Option<cosmic_config::Config>,
|
||||||
pub(crate) panel_config: Option<CosmicPanelConfig>,
|
pub(crate) panel_config: Option<CosmicPanelConfig>,
|
||||||
|
pub size: Option<PanelSize>,
|
||||||
pub opacity: f32,
|
pub opacity: f32,
|
||||||
pub opacity_changing: bool,
|
pub opacity_changing: bool,
|
||||||
pub outputs: Vec<String>,
|
pub outputs: Vec<String>,
|
||||||
|
|
@ -42,6 +40,7 @@ impl Default for PageInner {
|
||||||
Self {
|
Self {
|
||||||
config_helper: Option::default(),
|
config_helper: Option::default(),
|
||||||
panel_config: Option::default(),
|
panel_config: Option::default(),
|
||||||
|
size: Option::default(),
|
||||||
opacity: 0.0,
|
opacity: 0.0,
|
||||||
opacity_changing: false,
|
opacity_changing: false,
|
||||||
outputs: vec![fl!("all-displays")],
|
outputs: vec![fl!("all-displays")],
|
||||||
|
|
@ -102,11 +101,11 @@ pub(crate) fn behavior_and_position<
|
||||||
p: &P,
|
p: &P,
|
||||||
msg_map: T,
|
msg_map: T,
|
||||||
) -> Section<crate::pages::Message> {
|
) -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
autohide_label = p.autohide_label();
|
||||||
let autohide_label = descriptions.insert(p.autohide_label());
|
position = fl!("panel-behavior-and-position", "position");
|
||||||
let position = descriptions.insert(fl!("panel-behavior-and-position", "position"));
|
display = fl!("panel-behavior-and-position", "display");
|
||||||
let display = descriptions.insert(fl!("panel-behavior-and-position", "display"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("panel-behavior-and-position"))
|
.title(fl!("panel-behavior-and-position"))
|
||||||
|
|
@ -119,10 +118,10 @@ pub(crate) fn behavior_and_position<
|
||||||
};
|
};
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[autohide_label],
|
settings::item::builder(&descriptions[autohide_label])
|
||||||
toggler(panel_config.autohide.is_some()).on_toggle(Message::AutoHidePanel),
|
.toggler(panel_config.autohide.is_some(), Message::AutoHidePanel),
|
||||||
))
|
)
|
||||||
.add(settings::item(
|
.add(settings::item(
|
||||||
&descriptions[position],
|
&descriptions[position],
|
||||||
dropdown::popup_dropdown(
|
dropdown::popup_dropdown(
|
||||||
|
|
@ -161,13 +160,13 @@ pub(crate) fn style<
|
||||||
p: &P,
|
p: &P,
|
||||||
msg_map: T,
|
msg_map: T,
|
||||||
) -> Section<crate::pages::Message> {
|
) -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
gap_label = p.gap_label();
|
||||||
let gap_label = descriptions.insert(p.gap_label());
|
extend_label = p.extend_label();
|
||||||
let extend_label = descriptions.insert(p.extend_label());
|
appearance = fl!("panel-style", "appearance");
|
||||||
let appearance = descriptions.insert(fl!("panel-style", "appearance"));
|
background_opacity = fl!("panel-style", "background-opacity");
|
||||||
let background_opacity = descriptions.insert(fl!("panel-style", "background-opacity"));
|
size = fl!("panel-style", "size");
|
||||||
let size = descriptions.insert(fl!("panel-style", "size"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("panel-style"))
|
.title(fl!("panel-style"))
|
||||||
|
|
@ -180,14 +179,14 @@ pub(crate) fn style<
|
||||||
};
|
};
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[gap_label],
|
settings::item::builder(&descriptions[gap_label])
|
||||||
toggler(panel_config.anchor_gap).on_toggle(Message::AnchorGap),
|
.toggler(panel_config.anchor_gap, Message::AnchorGap),
|
||||||
))
|
)
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[extend_label],
|
settings::item::builder(&descriptions[extend_label])
|
||||||
toggler(panel_config.expand_to_edges).on_toggle(Message::ExtendToEdge),
|
.toggler(panel_config.expand_to_edges, Message::ExtendToEdge),
|
||||||
))
|
)
|
||||||
.add(settings::item(
|
.add(settings::item(
|
||||||
&descriptions[appearance],
|
&descriptions[appearance],
|
||||||
dropdown::popup_dropdown(
|
dropdown::popup_dropdown(
|
||||||
|
|
@ -204,14 +203,15 @@ pub(crate) fn style<
|
||||||
move |a| crate::app::Message::PageMessage(msg_map(a)),
|
move |a| crate::app::Message::PageMessage(msg_map(a)),
|
||||||
),
|
),
|
||||||
))
|
))
|
||||||
.add(settings::flex_item(
|
.add(settings::item::builder(&descriptions[size]).flex_control({
|
||||||
&descriptions[size],
|
|
||||||
// TODO custom discrete slider variant
|
// TODO custom discrete slider variant
|
||||||
row::with_children(vec![
|
row::with_children(vec![
|
||||||
text::body(fl!("small")).into(),
|
text::body(fl!("small")).into(),
|
||||||
slider(
|
slider(
|
||||||
0..=4,
|
0..=4,
|
||||||
match panel_config.size {
|
match inner.size.as_ref().expect(
|
||||||
|
"PageInner.size is None even though PageInner.panel_config is Some",
|
||||||
|
) {
|
||||||
PanelSize::XS => 0,
|
PanelSize::XS => 0,
|
||||||
PanelSize::S => 1,
|
PanelSize::S => 1,
|
||||||
PanelSize::M => 2,
|
PanelSize::M => 2,
|
||||||
|
|
@ -233,35 +233,44 @@ pub(crate) fn style<
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
.on_release(Message::PanelSizeCommit)
|
||||||
|
.width(Length::Fill)
|
||||||
|
.apply(cosmic::widget::container)
|
||||||
|
.max_width(250)
|
||||||
.into(),
|
.into(),
|
||||||
text::body(fl!("large")).into(),
|
text::body(fl!("large")).into(),
|
||||||
])
|
])
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
.spacing(8),
|
.spacing(8)
|
||||||
))
|
.width(Length::Fill)
|
||||||
.add(settings::flex_item(
|
}))
|
||||||
&descriptions[background_opacity],
|
.add(
|
||||||
row::with_capacity(2)
|
settings::item::builder(&descriptions[background_opacity]).flex_control({
|
||||||
.align_y(Alignment::Center)
|
row::with_capacity(2)
|
||||||
.spacing(8)
|
.align_y(Alignment::Center)
|
||||||
.push(
|
.spacing(8)
|
||||||
text::body(fl!(
|
.width(Length::Fill)
|
||||||
"number",
|
.push(
|
||||||
HashMap::from_iter(vec![(
|
text::body(fl!(
|
||||||
"number",
|
"number",
|
||||||
(panel_config.opacity * 100.0) as i32
|
HashMap::from_iter(vec![(
|
||||||
)])
|
"number",
|
||||||
))
|
(panel_config.opacity * 100.0) as i32
|
||||||
.width(Length::Fixed(22.0))
|
)])
|
||||||
.align_x(Alignment::Center),
|
))
|
||||||
)
|
.width(Length::Fixed(22.0))
|
||||||
.push(
|
.align_x(Alignment::Center),
|
||||||
slider(0..=100, (panel_config.opacity * 100.0) as i32, |v| {
|
)
|
||||||
Message::OpacityRequest(v as f32 / 100.0)
|
.push(
|
||||||
})
|
slider(0..=100, (panel_config.opacity * 100.0) as i32, |v| {
|
||||||
.breakpoints(&[50]),
|
Message::OpacityRequest(v as f32 / 100.0)
|
||||||
),
|
})
|
||||||
))
|
.width(Length::Fill)
|
||||||
|
.apply(container)
|
||||||
|
.max_width(250),
|
||||||
|
)
|
||||||
|
}),
|
||||||
|
)
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(msg_map)
|
.map(msg_map)
|
||||||
})
|
})
|
||||||
|
|
@ -270,9 +279,9 @@ pub(crate) fn style<
|
||||||
pub(crate) fn configuration<P: page::Page<crate::pages::Message> + PanelPage>(
|
pub(crate) fn configuration<P: page::Page<crate::pages::Message> + PanelPage>(
|
||||||
p: &P,
|
p: &P,
|
||||||
) -> Section<crate::pages::Message> {
|
) -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
applets_label = p.configure_applets_label();
|
||||||
let applets_label = descriptions.insert(p.configure_applets_label());
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("panel-applets"))
|
.title(fl!("panel-applets"))
|
||||||
|
|
@ -285,21 +294,10 @@ pub(crate) fn configuration<P: page::Page<crate::pages::Message> + PanelPage>(
|
||||||
.iter()
|
.iter()
|
||||||
.find(|(_, v)| v.id == page.applets_page_id())
|
.find(|(_, v)| v.id == page.applets_page_id())
|
||||||
{
|
{
|
||||||
let control = row::with_children(vec![
|
settings.add(crate::widget::go_next_item(
|
||||||
horizontal_space().into(),
|
&descriptions[applets_label],
|
||||||
icon::from_name("go-next-symbolic").size(16).into(),
|
crate::pages::Message::Page(panel_applets_entity),
|
||||||
]);
|
))
|
||||||
|
|
||||||
settings.add(
|
|
||||||
settings::item::builder(&*descriptions[applets_label])
|
|
||||||
.control(control)
|
|
||||||
.spacing(16)
|
|
||||||
.apply(container)
|
|
||||||
.class(theme::Container::List)
|
|
||||||
.apply(button::custom)
|
|
||||||
.class(theme::Button::Transparent)
|
|
||||||
.on_press(crate::pages::Message::Page(panel_applets_entity)),
|
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
settings
|
settings
|
||||||
};
|
};
|
||||||
|
|
@ -315,9 +313,9 @@ pub(crate) fn add_panel<
|
||||||
>(
|
>(
|
||||||
msg_map: T,
|
msg_map: T,
|
||||||
) -> Section<crate::pages::Message> {
|
) -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
reset_to_default = fl!("reset-to-default");
|
||||||
let reset_to_default = descriptions.insert(fl!("reset-to-default"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("panel-missing"))
|
.title(fl!("panel-missing"))
|
||||||
|
|
@ -338,9 +336,9 @@ pub fn reset_button<
|
||||||
>(
|
>(
|
||||||
msg_map: T,
|
msg_map: T,
|
||||||
) -> Section<crate::pages::Message> {
|
) -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
reset_to_default = fl!("reset-to-default");
|
||||||
let reset_to_default = descriptions.insert(fl!("reset-to-default"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -348,7 +346,7 @@ pub fn reset_button<
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
let inner = page.inner();
|
let inner = page.inner();
|
||||||
if inner.system_default == inner.panel_config {
|
if inner.system_default == inner.panel_config {
|
||||||
Element::from(horizontal_space().width(1))
|
Element::from(space())
|
||||||
} else {
|
} else {
|
||||||
button::standard(&descriptions[reset_to_default])
|
button::standard(&descriptions[reset_to_default])
|
||||||
.on_press(Message::ResetPanel)
|
.on_press(Message::ResetPanel)
|
||||||
|
|
@ -427,6 +425,7 @@ pub enum Message {
|
||||||
Output(usize),
|
Output(usize),
|
||||||
AnchorGap(bool),
|
AnchorGap(bool),
|
||||||
PanelSize(PanelSize),
|
PanelSize(PanelSize),
|
||||||
|
PanelSizeCommit,
|
||||||
Appearance(usize),
|
Appearance(usize),
|
||||||
ExtendToEdge(bool),
|
ExtendToEdge(bool),
|
||||||
OpacityRequest(f32),
|
OpacityRequest(f32),
|
||||||
|
|
@ -507,6 +506,7 @@ impl PageInner {
|
||||||
if let Err(err) = default.write_entry(config) {
|
if let Err(err) = default.write_entry(config) {
|
||||||
tracing::error!(?err, "Error resetting panel config.");
|
tracing::error!(?err, "Error resetting panel config.");
|
||||||
}
|
}
|
||||||
|
self.size = Some(default.size.clone());
|
||||||
self.system_default = Some(default.clone());
|
self.system_default = Some(default.clone());
|
||||||
self.panel_config.clone_from(&self.system_default);
|
self.panel_config.clone_from(&self.system_default);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -605,7 +605,16 @@ impl PageInner {
|
||||||
_ = panel_config.set_border_radius(helper, new_radius).unwrap();
|
_ = panel_config.set_border_radius(helper, new_radius).unwrap();
|
||||||
}
|
}
|
||||||
Message::PanelSize(size) => {
|
Message::PanelSize(size) => {
|
||||||
_ = panel_config.set_size(helper, size);
|
self.size = Some(size);
|
||||||
|
}
|
||||||
|
Message::PanelSizeCommit => {
|
||||||
|
_ = panel_config.set_size(
|
||||||
|
helper,
|
||||||
|
self.size
|
||||||
|
.as_ref()
|
||||||
|
.expect("PageInner.size is None even though it should be Some, since PageInner.panel_config is Some")
|
||||||
|
.clone()
|
||||||
|
);
|
||||||
// Reset any size overrides the user might have set
|
// Reset any size overrides the user might have set
|
||||||
_ = panel_config.set_size_center(helper, None);
|
_ = panel_config.set_size_center(helper, None);
|
||||||
_ = panel_config.set_size_wings(helper, None);
|
_ = panel_config.set_size_wings(helper, None);
|
||||||
|
|
@ -668,6 +677,7 @@ impl PageInner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Message::PanelConfig(c) => {
|
Message::PanelConfig(c) => {
|
||||||
|
self.size = Some(c.size.clone());
|
||||||
self.panel_config = Some(*c);
|
self.panel_config = Some(*c);
|
||||||
return Task::none();
|
return Task::none();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ impl Default for Page {
|
||||||
// If the config is not present, it will be created with the default values and the name will not match
|
// If the config is not present, it will be created with the default values and the name will not match
|
||||||
(panel_config.name == "Panel").then_some(panel_config)
|
(panel_config.name == "Panel").then_some(panel_config)
|
||||||
});
|
});
|
||||||
|
let size = panel_config.as_ref().map(|c| c.size.clone());
|
||||||
let system_default = cosmic::cosmic_config::Config::system(
|
let system_default = cosmic::cosmic_config::Config::system(
|
||||||
&format!("{}.Panel", cosmic_panel_config::NAME),
|
&format!("{}.Panel", cosmic_panel_config::NAME),
|
||||||
CosmicPanelConfig::VERSION,
|
CosmicPanelConfig::VERSION,
|
||||||
|
|
@ -98,6 +99,7 @@ impl Default for Page {
|
||||||
inner: PageInner {
|
inner: PageInner {
|
||||||
config_helper,
|
config_helper,
|
||||||
panel_config,
|
panel_config,
|
||||||
|
size,
|
||||||
container_config,
|
container_config,
|
||||||
outputs_map: HashMap::new(),
|
outputs_map: HashMap::new(),
|
||||||
system_default,
|
system_default,
|
||||||
|
|
@ -137,7 +139,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("panel", "preferences-panel-symbolic")
|
page::Info::new("panel", "preferences-panel-symbolic")
|
||||||
.title(fl!("panel"))
|
.title(fl!("panel"))
|
||||||
.description(fl!("panel", "desc"))
|
.description(fl!("xdg-entry-panel-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ const CUSTOM_COLORS: &str = "custom-colors";
|
||||||
const CUSTOM_IMAGES: &str = "custom-images";
|
const CUSTOM_IMAGES: &str = "custom-images";
|
||||||
const RECENT_FOLDERS: &str = "recent-folders";
|
const RECENT_FOLDERS: &str = "recent-folders";
|
||||||
const BACKGROUNDS_DIR: &str = "backgrounds";
|
const BACKGROUNDS_DIR: &str = "backgrounds";
|
||||||
|
const ROTATION_FREQUENCY: &str = "rotation-frequency";
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
|
|
@ -24,6 +25,7 @@ pub struct Config {
|
||||||
custom_colors: Vec<wallpaper::Color>,
|
custom_colors: Vec<wallpaper::Color>,
|
||||||
custom_images: Vec<PathBuf>,
|
custom_images: Vec<PathBuf>,
|
||||||
recent_folders: VecDeque<PathBuf>,
|
recent_folders: VecDeque<PathBuf>,
|
||||||
|
pub rotation_frequency: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
|
|
@ -94,6 +96,15 @@ impl Config {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get rotation frequency from cosmic-config.
|
||||||
|
if let Ok(frequency) = context.get::<u64>(ROTATION_FREQUENCY) {
|
||||||
|
// Set rotation frequency if it exists.
|
||||||
|
config.rotation_frequency = frequency;
|
||||||
|
} else {
|
||||||
|
// Set default value if it does not exists.
|
||||||
|
config.rotation_frequency = 300;
|
||||||
|
}
|
||||||
|
|
||||||
config.context = Some(context);
|
config.context = Some(context);
|
||||||
config.state = Some(state);
|
config.state = Some(state);
|
||||||
|
|
||||||
|
|
@ -251,6 +262,21 @@ impl Config {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets a new slideshow wallpaper rotation frequency
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns an error if the on-disk configuration could not be updated.
|
||||||
|
pub fn change_rotation_frequency(
|
||||||
|
&mut self,
|
||||||
|
frequency: u64,
|
||||||
|
) -> Result<(), cosmic_config::Error> {
|
||||||
|
self.rotation_frequency = frequency;
|
||||||
|
self.update_rotation_frequency()?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn update<V: serde::Serialize>(
|
fn update<V: serde::Serialize>(
|
||||||
&self,
|
&self,
|
||||||
key: &str,
|
key: &str,
|
||||||
|
|
@ -274,4 +300,8 @@ impl Config {
|
||||||
fn update_recent_folders(&self) -> Result<(), cosmic_config::Error> {
|
fn update_recent_folders(&self) -> Result<(), cosmic_config::Error> {
|
||||||
self.update(RECENT_FOLDERS, &self.recent_folders)
|
self.update(RECENT_FOLDERS, &self.recent_folders)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn update_rotation_frequency(&self) -> Result<(), cosmic_config::Error> {
|
||||||
|
self.update(ROTATION_FREQUENCY, &self.rotation_frequency)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,15 +17,18 @@ use std::{
|
||||||
use cosmic::dialog::file_chooser;
|
use cosmic::dialog::file_chooser;
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element, Task,
|
Apply, Element, Task,
|
||||||
|
iced::core::text::{Ellipsize, EllipsizeHeightLimit},
|
||||||
widget::{ColorPickerModel, color_picker::ColorPickerUpdate, icon},
|
widget::{ColorPickerModel, color_picker::ColorPickerUpdate, icon},
|
||||||
};
|
};
|
||||||
use cosmic::{app::ContextDrawer, iced_runtime::core::image::Handle as ImageHandle};
|
use cosmic::{app::ContextDrawer, iced::runtime::core::image::Handle as ImageHandle};
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
iced::Subscription,
|
iced::Subscription,
|
||||||
widget::{
|
widget::{
|
||||||
button, dropdown, list_column, row,
|
button, dropdown, list_column, row,
|
||||||
segmented_button::{self, SingleSelectModel},
|
segmented_button::{self, SingleSelectModel},
|
||||||
settings, tab_bar, text, toggler,
|
settings,
|
||||||
|
space::horizontal as horizontal_space,
|
||||||
|
tab_bar, text,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
|
|
@ -38,7 +41,6 @@ use cosmic_settings_page::{self as page, section};
|
||||||
use cosmic_settings_wallpaper::{self as wallpaper, Entry, ScalingMode};
|
use cosmic_settings_wallpaper::{self as wallpaper, Entry, ScalingMode};
|
||||||
use image::imageops::FilterType::Lanczos3;
|
use image::imageops::FilterType::Lanczos3;
|
||||||
use image::{ImageBuffer, Rgba};
|
use image::{ImageBuffer, Rgba};
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::{DefaultKey, Key, SecondaryMap, SlotMap};
|
use slotmap::{DefaultKey, Key, SecondaryMap, SlotMap};
|
||||||
|
|
||||||
use crate::subscription::WallpaperEvent;
|
use crate::subscription::WallpaperEvent;
|
||||||
|
|
@ -80,8 +82,6 @@ pub enum Message {
|
||||||
CacheDisplayImage,
|
CacheDisplayImage,
|
||||||
/// Selects an option in the category dropdown menu.
|
/// Selects an option in the category dropdown menu.
|
||||||
ChangeCategory(Category),
|
ChangeCategory(Category),
|
||||||
/// Changes the displayed images in the wallpaper view.
|
|
||||||
ChangeFolder(Context),
|
|
||||||
/// Emits a wallpaper event.
|
/// Emits a wallpaper event.
|
||||||
Event(WallpaperEvent),
|
Event(WallpaperEvent),
|
||||||
/// Handles messages from the color dialog.
|
/// Handles messages from the color dialog.
|
||||||
|
|
@ -182,9 +182,6 @@ pub struct Page {
|
||||||
/// Model for selecting between display outputs.
|
/// Model for selecting between display outputs.
|
||||||
outputs: SingleSelectModel,
|
outputs: SingleSelectModel,
|
||||||
|
|
||||||
/// Current value of the slideshow rotation frequency.
|
|
||||||
rotation_frequency: u64,
|
|
||||||
|
|
||||||
/// Model for available options for rotation frequencies.
|
/// Model for available options for rotation frequencies.
|
||||||
rotation_options: Vec<String>,
|
rotation_options: Vec<String>,
|
||||||
|
|
||||||
|
|
@ -216,7 +213,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("wallpaper", "preferences-desktop-wallpaper-symbolic")
|
page::Info::new("wallpaper", "preferences-desktop-wallpaper-symbolic")
|
||||||
.title(fl!("wallpaper"))
|
.title(fl!("wallpaper"))
|
||||||
.description(fl!("wallpaper", "desc"))
|
.description(fl!("xdg-entry-wallpaper-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
||||||
|
|
@ -292,6 +289,9 @@ impl page::AutoBind<crate::pages::Message> for Page {}
|
||||||
|
|
||||||
impl Default for Page {
|
impl Default for Page {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
|
let config = Config::new();
|
||||||
|
let selected_rotation = Self::get_selected_rotation(config.rotation_frequency);
|
||||||
|
|
||||||
let mut page = Page {
|
let mut page = Page {
|
||||||
entity: page::Entity::null(),
|
entity: page::Entity::null(),
|
||||||
on_enter_handle: None,
|
on_enter_handle: None,
|
||||||
|
|
@ -328,10 +328,9 @@ impl Default for Page {
|
||||||
},
|
},
|
||||||
wallpaper_service_config: wallpaper::Config::default(),
|
wallpaper_service_config: wallpaper::Config::default(),
|
||||||
color_model: ColorPickerModel::new(fl!("hex"), fl!("rgb"), None, Some(Color::WHITE)),
|
color_model: ColorPickerModel::new(fl!("hex"), fl!("rgb"), None, Some(Color::WHITE)),
|
||||||
config: Config::new(),
|
config,
|
||||||
fit_options: vec![fl!("fill"), fl!("fit-to-screen")],
|
fit_options: vec![fl!("fill"), fl!("fit-to-screen")],
|
||||||
outputs: SingleSelectModel::default(),
|
outputs: SingleSelectModel::default(),
|
||||||
rotation_frequency: 300,
|
|
||||||
rotation_options: vec![
|
rotation_options: vec![
|
||||||
// FIX: fluent is inserting extra unicode characters in formatting
|
// FIX: fluent is inserting extra unicode characters in formatting
|
||||||
fl!("x-minutes", number = 5)
|
fl!("x-minutes", number = 5)
|
||||||
|
|
@ -354,7 +353,7 @@ impl Default for Page {
|
||||||
.replace('\u{2069}', ""),
|
.replace('\u{2069}', ""),
|
||||||
],
|
],
|
||||||
selected_fit: 0,
|
selected_fit: 0,
|
||||||
selected_rotation: 0,
|
selected_rotation,
|
||||||
selection: Context::default(),
|
selection: Context::default(),
|
||||||
update_config: None,
|
update_config: None,
|
||||||
};
|
};
|
||||||
|
|
@ -366,6 +365,18 @@ impl Default for Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Page {
|
impl Page {
|
||||||
|
fn get_selected_rotation(rotation_frequency: u64) -> usize {
|
||||||
|
match rotation_frequency {
|
||||||
|
0..=300 => MINUTES_5,
|
||||||
|
301..=600 => MINUTES_10,
|
||||||
|
601..=900 => MINUTES_15,
|
||||||
|
901..=1800 => MINUTES_30,
|
||||||
|
1801..=3600 => HOUR_1,
|
||||||
|
3601..=7200 => HOUR_2,
|
||||||
|
_ => HOUR_2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn add_recent_folder(&mut self, folder: PathBuf) {
|
fn add_recent_folder(&mut self, folder: PathBuf) {
|
||||||
if let Err(why) = self.config.add_recent_folder(folder) {
|
if let Err(why) = self.config.add_recent_folder(folder) {
|
||||||
tracing::error!(?why, "cannot add recent folder to config");
|
tracing::error!(?why, "cannot add recent folder to config");
|
||||||
|
|
@ -629,10 +640,10 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Changes the slideshow wallpaper rotation frequency
|
/// Changes the slideshow wallpaper rotation frequency
|
||||||
pub fn change_rotation_frequency(&mut self, option: usize) {
|
pub fn change_rotation_frequency(&mut self, option: usize) -> Result<(), cosmic_config::Error> {
|
||||||
self.selected_rotation = option;
|
self.selected_rotation = option;
|
||||||
|
|
||||||
self.rotation_frequency = match self.selected_rotation {
|
let rotation_frequency = match self.selected_rotation {
|
||||||
MINUTES_5 => 300,
|
MINUTES_5 => 300,
|
||||||
MINUTES_10 => 600,
|
MINUTES_10 => 600,
|
||||||
MINUTES_15 => 900,
|
MINUTES_15 => 900,
|
||||||
|
|
@ -641,6 +652,8 @@ impl Page {
|
||||||
HOUR_2 => 7200,
|
HOUR_2 => 7200,
|
||||||
_ => 10800,
|
_ => 10800,
|
||||||
};
|
};
|
||||||
|
self.config.change_rotation_frequency(rotation_frequency)?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Updates configuration for wallpaper image.
|
/// Updates configuration for wallpaper image.
|
||||||
|
|
@ -661,7 +674,7 @@ impl Page {
|
||||||
|
|
||||||
let entry = Entry::new(output, wallpaper::Source::Path(path))
|
let entry = Entry::new(output, wallpaper::Source::Path(path))
|
||||||
.scaling_mode(scaling_mode)
|
.scaling_mode(scaling_mode)
|
||||||
.rotation_frequency(self.rotation_frequency);
|
.rotation_frequency(self.config.rotation_frequency);
|
||||||
|
|
||||||
if let Some(old_entry) = old_entry {
|
if let Some(old_entry) = old_entry {
|
||||||
entry
|
entry
|
||||||
|
|
@ -681,7 +694,10 @@ impl Page {
|
||||||
.width(Length::Fixed(SIMULATED_WIDTH as f32))
|
.width(Length::Fixed(SIMULATED_WIDTH as f32))
|
||||||
.into(),
|
.into(),
|
||||||
|
|
||||||
None => cosmic::widget::Space::new(SIMULATED_WIDTH, SIMULATED_HEIGHT).into(),
|
None => cosmic::widget::Space::new()
|
||||||
|
.width(Length::Fixed(SIMULATED_WIDTH as f32))
|
||||||
|
.height(Length::Fixed(SIMULATED_HEIGHT as f32))
|
||||||
|
.into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -696,27 +712,6 @@ impl Page {
|
||||||
|
|
||||||
Message::CacheDisplayImage => self.cache_display_image(),
|
Message::CacheDisplayImage => self.cache_display_image(),
|
||||||
|
|
||||||
Message::ChangeFolder(mut context) => {
|
|
||||||
// Reassign custom colors and images to the new context.
|
|
||||||
std::mem::swap(&mut context, &mut self.selection);
|
|
||||||
|
|
||||||
for color in context.custom_colors {
|
|
||||||
self.selection.add_custom_color(color);
|
|
||||||
}
|
|
||||||
|
|
||||||
for image in context.custom_images {
|
|
||||||
let path = context.paths.remove(image);
|
|
||||||
let display = context.display_images.remove(image);
|
|
||||||
let selection = context.selection_handles.remove(image);
|
|
||||||
|
|
||||||
if let Some(((display, selection), path)) = display.zip(selection).zip(path) {
|
|
||||||
self.selection.add_custom_image(path, display, selection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.select_first_wallpaper();
|
|
||||||
}
|
|
||||||
|
|
||||||
Message::ColorAdd(message) => {
|
Message::ColorAdd(message) => {
|
||||||
match message {
|
match message {
|
||||||
ColorPickerUpdate::ActionFinished => {
|
ColorPickerUpdate::ActionFinished => {
|
||||||
|
|
@ -841,7 +836,11 @@ impl Page {
|
||||||
return Task::none();
|
return Task::none();
|
||||||
}
|
}
|
||||||
|
|
||||||
Message::RotationFrequency(pos) => self.change_rotation_frequency(pos),
|
Message::RotationFrequency(pos) => {
|
||||||
|
if let Err(err) = self.change_rotation_frequency(pos) {
|
||||||
|
tracing::warn!("Failed to save rotation frequency: {err}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Message::SameWallpaper(value) => {
|
Message::SameWallpaper(value) => {
|
||||||
self.wallpaper_service_config.same_on_all = value;
|
self.wallpaper_service_config.same_on_all = value;
|
||||||
|
|
@ -1112,7 +1111,7 @@ impl Page {
|
||||||
_ => self.selected_rotation = MINUTES_5,
|
_ => self.selected_rotation = MINUTES_5,
|
||||||
}
|
}
|
||||||
|
|
||||||
self.rotation_frequency = entry.rotation_frequency;
|
self.config.rotation_frequency = entry.rotation_frequency;
|
||||||
|
|
||||||
self.cache_display_image();
|
self.cache_display_image();
|
||||||
}
|
}
|
||||||
|
|
@ -1160,6 +1159,10 @@ impl Context {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_custom_image(&mut self, path: PathBuf, display: Image, selection: ImageHandle) {
|
fn add_custom_image(&mut self, path: PathBuf, display: Image, selection: ImageHandle) {
|
||||||
|
if self.paths.values().any(|p| p == &path) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let key = self.paths.insert(path);
|
let key = self.paths.insert(path);
|
||||||
self.is_custom.insert(key, ());
|
self.is_custom.insert(key, ());
|
||||||
self.display_images.insert(key, display);
|
self.display_images.insert(key, display);
|
||||||
|
|
@ -1191,12 +1194,12 @@ impl Context {
|
||||||
|
|
||||||
#[allow(clippy::too_many_lines)]
|
#[allow(clippy::too_many_lines)]
|
||||||
pub fn settings() -> Section<crate::pages::Message> {
|
pub fn settings() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
same_label = fl!("wallpaper", "same");
|
||||||
let same_label = descriptions.insert(fl!("wallpaper", "same"));
|
fit_label = fl!("wallpaper", "fit");
|
||||||
let fit_label = descriptions.insert(fl!("wallpaper", "fit"));
|
slide_label = fl!("wallpaper", "slide");
|
||||||
let slide_label = descriptions.insert(fl!("wallpaper", "slide"));
|
change_label = fl!("wallpaper", "change");
|
||||||
let change_label = descriptions.insert(fl!("wallpaper", "change"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -1255,6 +1258,7 @@ pub fn settings() -> Section<crate::pages::Message> {
|
||||||
} else if page.show_tab_bar {
|
} else if page.show_tab_bar {
|
||||||
let element = tab_bar::horizontal(&page.outputs)
|
let element = tab_bar::horizontal(&page.outputs)
|
||||||
.button_alignment(Alignment::Center)
|
.button_alignment(Alignment::Center)
|
||||||
|
.ellipsize(Ellipsize::End(EllipsizeHeightLimit::Lines(1)))
|
||||||
.on_activate(Message::Output);
|
.on_activate(Message::Output);
|
||||||
|
|
||||||
children.push(element.into());
|
children.push(element.into());
|
||||||
|
|
@ -1271,18 +1275,17 @@ pub fn settings() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
children.push({
|
children.push({
|
||||||
let mut column = list_column()
|
let mut column = list_column()
|
||||||
.add(settings::item(
|
.add(settings::item::builder(&descriptions[same_label]).toggler(
|
||||||
&descriptions[same_label],
|
page.wallpaper_service_config.same_on_all,
|
||||||
toggler(page.wallpaper_service_config.same_on_all)
|
Message::SameWallpaper,
|
||||||
.on_toggle(Message::SameWallpaper),
|
|
||||||
))
|
))
|
||||||
.add(settings::item(&descriptions[fit_label], wallpaper_fit));
|
.add(settings::item(&descriptions[fit_label], wallpaper_fit));
|
||||||
|
|
||||||
if show_slideshow_toggle {
|
if show_slideshow_toggle {
|
||||||
column = column.add(settings::item(
|
column = column.add(
|
||||||
&descriptions[slide_label],
|
settings::item::builder(&descriptions[slide_label])
|
||||||
toggler(slideshow_enabled).on_toggle(Message::Slideshow),
|
.toggler(slideshow_enabled, Message::Slideshow),
|
||||||
));
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The rotation frequency dropdown should only be shown when the slideshow is enabled.
|
// The rotation frequency dropdown should only be shown when the slideshow is enabled.
|
||||||
|
|
@ -1345,7 +1348,7 @@ pub fn settings() -> Section<crate::pages::Message> {
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.push(category_selection)
|
.push(category_selection)
|
||||||
.push(cosmic::widget::horizontal_space())
|
.push(horizontal_space())
|
||||||
.push_maybe(add_button)
|
.push_maybe(add_button)
|
||||||
.into(),
|
.into(),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@
|
||||||
|
|
||||||
use super::Message;
|
use super::Message;
|
||||||
use cosmic::iced::Radius;
|
use cosmic::iced::Radius;
|
||||||
use cosmic::iced_core::Border;
|
use cosmic::iced::core::Border;
|
||||||
use cosmic::iced_core::{self, Background, Color, Degrees, Length, gradient::Linear};
|
use cosmic::iced::core::{Background, Color, Degrees, Length, gradient::Linear};
|
||||||
use cosmic::iced_runtime::core::image::Handle as ImageHandle;
|
use cosmic::iced::runtime::core::image::Handle as ImageHandle;
|
||||||
use cosmic::prelude::*;
|
use cosmic::prelude::*;
|
||||||
use cosmic::widget::{Space, button, container};
|
use cosmic::widget::{Space, button, container};
|
||||||
use cosmic::{Element, iced};
|
use cosmic::{Element, iced};
|
||||||
|
|
@ -47,11 +47,12 @@ pub fn color_image<'a, M: 'a>(
|
||||||
height: u16,
|
height: u16,
|
||||||
border_radius: Option<f32>,
|
border_radius: Option<f32>,
|
||||||
) -> Element<'a, M> {
|
) -> Element<'a, M> {
|
||||||
container(Space::new(width, height))
|
container(Space::new().width(width).height(height))
|
||||||
.class(cosmic::theme::Container::custom(move |theme| {
|
.class(cosmic::theme::Container::custom(move |theme| {
|
||||||
container::Style {
|
container::Style {
|
||||||
icon_color: None,
|
icon_color: None,
|
||||||
text_color: None,
|
text_color: None,
|
||||||
|
snap: true,
|
||||||
background: Some(match &color {
|
background: Some(match &color {
|
||||||
wallpaper::Color::Single([r, g, b]) => {
|
wallpaper::Color::Single([r, g, b]) => {
|
||||||
Background::Color(Color::from_rgb(*r, *g, *b))
|
Background::Color(Color::from_rgb(*r, *g, *b))
|
||||||
|
|
@ -68,7 +69,7 @@ pub fn color_image<'a, M: 'a>(
|
||||||
stop += stop_increment;
|
stop += stop_increment;
|
||||||
}
|
}
|
||||||
|
|
||||||
Background::Gradient(iced_core::Gradient::Linear(linear))
|
Background::Gradient(iced::core::Gradient::Linear(linear))
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use cosmic::{
|
||||||
Apply, Element,
|
Apply, Element,
|
||||||
iced::Length,
|
iced::Length,
|
||||||
surface,
|
surface,
|
||||||
widget::{self, settings, toggler},
|
widget::{self, settings},
|
||||||
};
|
};
|
||||||
|
|
||||||
use cosmic_comp_config::CosmicCompConfig;
|
use cosmic_comp_config::CosmicCompConfig;
|
||||||
|
|
@ -13,7 +13,6 @@ use cosmic_config::{ConfigGet, ConfigSet};
|
||||||
use cosmic_settings_config::{Action, Binding, Shortcuts, shortcuts};
|
use cosmic_settings_config::{Action, Binding, Shortcuts, shortcuts};
|
||||||
use cosmic_settings_page::Section;
|
use cosmic_settings_page::Section;
|
||||||
use cosmic_settings_page::{self as page, section};
|
use cosmic_settings_page::{self as page, section};
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
||||||
|
|
@ -28,6 +27,7 @@ pub enum Message {
|
||||||
ShowActiveWindowHint(bool),
|
ShowActiveWindowHint(bool),
|
||||||
ShowMaximizeButton(bool),
|
ShowMaximizeButton(bool),
|
||||||
ShowMinimizeButton(bool),
|
ShowMinimizeButton(bool),
|
||||||
|
WindowControlsPositionStart(bool),
|
||||||
SetEdgeSnapThreshold(u32),
|
SetEdgeSnapThreshold(u32),
|
||||||
Surface(surface::Action),
|
Surface(surface::Action),
|
||||||
}
|
}
|
||||||
|
|
@ -178,6 +178,19 @@ impl Page {
|
||||||
.set_show_minimize(&config, value);
|
.set_show_minimize(&config, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Message::WindowControlsPositionStart(left) => {
|
||||||
|
if let Ok(config) = cosmic::config::CosmicTk::config() {
|
||||||
|
let position = if left {
|
||||||
|
cosmic::widget::WindowControlsPosition::Start
|
||||||
|
} else {
|
||||||
|
cosmic::widget::WindowControlsPosition::End
|
||||||
|
};
|
||||||
|
let _res = cosmic::config::COSMIC_TK
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.set_window_controls_position(&config, position);
|
||||||
|
}
|
||||||
|
}
|
||||||
Message::ShowActiveWindowHint(value) => {
|
Message::ShowActiveWindowHint(value) => {
|
||||||
self.show_active_hint = value;
|
self.show_active_hint = value;
|
||||||
if let Err(err) = self.comp_config.set("active_hint", value) {
|
if let Err(err) = self.comp_config.set("active_hint", value) {
|
||||||
|
|
@ -222,22 +235,21 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
"preferences-window-management-symbolic",
|
"preferences-window-management-symbolic",
|
||||||
)
|
)
|
||||||
.title(fl!("window-management"))
|
.title(fl!("window-management"))
|
||||||
.description(fl!("window-management", "desc"))
|
.description(fl!("xdg-entry-window-management-comment"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl page::AutoBind<crate::pages::Message> for Page {}
|
impl page::AutoBind<crate::pages::Message> for Page {}
|
||||||
|
|
||||||
pub fn window_management() -> Section<crate::pages::Message> {
|
pub fn window_management() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
super_key = fl!("super-key");
|
||||||
let super_key = descriptions.insert(fl!("super-key"));
|
_launcher = fl!("super-key", "launcher");
|
||||||
let _launcher = descriptions.insert(fl!("super-key", "launcher"));
|
_workspaces = fl!("super-key", "workspaces");
|
||||||
let _workspaces = descriptions.insert(fl!("super-key", "workspaces"));
|
_applications = fl!("super-key", "applications");
|
||||||
let _applications = descriptions.insert(fl!("super-key", "applications"));
|
_disable = fl!("super-key", "disable");
|
||||||
let _disable = descriptions.insert(fl!("super-key", "disable"));
|
edge_gravity = fl!("edge-gravity");
|
||||||
|
});
|
||||||
let edge_gravity = descriptions.insert(fl!("edge-gravity"));
|
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -260,23 +272,24 @@ pub fn window_management() -> Section<crate::pages::Message> {
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
))
|
))
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&descriptions[edge_gravity],
|
settings::item::builder(&descriptions[edge_gravity])
|
||||||
toggler(page.edge_snap_threshold != 0).on_toggle(|is_enabled| {
|
.toggler(page.edge_snap_threshold != 0, |is_enabled| {
|
||||||
Message::SetEdgeSnapThreshold(if is_enabled { 10 } else { 0 })
|
Message::SetEdgeSnapThreshold(if is_enabled { 10 } else { 0 })
|
||||||
}),
|
}),
|
||||||
))
|
)
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::WindowManagement)
|
.map(crate::pages::Message::WindowManagement)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn window_controls() -> Section<crate::pages::Message> {
|
pub fn window_controls() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
maximize = fl!("window-controls", "maximize");
|
||||||
let maximize = descriptions.insert(fl!("window-controls", "maximize"));
|
minimize = fl!("window-controls", "minimize");
|
||||||
let minimize = descriptions.insert(fl!("window-controls", "minimize"));
|
active_window_hint = fl!("window-controls", "active-window-hint");
|
||||||
let active_window_hint = descriptions.insert(fl!("window-controls", "active-window-hint"));
|
position_start = fl!("window-controls", "position-start");
|
||||||
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("window-controls"))
|
.title(fl!("window-controls"))
|
||||||
|
|
@ -286,17 +299,24 @@ pub fn window_controls() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[active_window_hint],
|
settings::item::builder(&descriptions[active_window_hint])
|
||||||
toggler(page.show_active_hint).on_toggle(Message::ShowActiveWindowHint),
|
.toggler(page.show_active_hint, Message::ShowActiveWindowHint),
|
||||||
))
|
)
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[maximize],
|
settings::item::builder(&descriptions[maximize])
|
||||||
toggler(cosmic::config::show_maximize()).on_toggle(Message::ShowMaximizeButton),
|
.toggler(cosmic::config::show_maximize(), Message::ShowMaximizeButton),
|
||||||
))
|
)
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[minimize],
|
settings::item::builder(&descriptions[minimize])
|
||||||
toggler(cosmic::config::show_minimize()).on_toggle(Message::ShowMinimizeButton),
|
.toggler(cosmic::config::show_minimize(), Message::ShowMinimizeButton),
|
||||||
|
)
|
||||||
|
.add(settings::item::builder(&descriptions[position_start]).toggler(
|
||||||
|
matches!(
|
||||||
|
cosmic::config::window_controls_position(),
|
||||||
|
cosmic::widget::WindowControlsPosition::Start
|
||||||
|
),
|
||||||
|
Message::WindowControlsPositionStart,
|
||||||
))
|
))
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::WindowManagement)
|
.map(crate::pages::Message::WindowManagement)
|
||||||
|
|
@ -304,12 +324,11 @@ pub fn window_controls() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn focus_navigation() -> Section<crate::pages::Message> {
|
pub fn focus_navigation() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
focus_follows_cursor = fl!("focus-navigation", "focus-follows-cursor");
|
||||||
let focus_follows_cursor = descriptions.insert(fl!("focus-navigation", "focus-follows-cursor"));
|
focus_follows_cursor_delay = fl!("focus-navigation", "focus-follows-cursor-delay");
|
||||||
let focus_follows_cursor_delay =
|
cursor_follows_focus = fl!("focus-navigation", "cursor-follows-focus");
|
||||||
descriptions.insert(fl!("focus-navigation", "focus-follows-cursor-delay"));
|
});
|
||||||
let cursor_follows_focus = descriptions.insert(fl!("focus-navigation", "cursor-follows-focus"));
|
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("focus-navigation"))
|
.title(fl!("focus-navigation"))
|
||||||
|
|
@ -319,10 +338,10 @@ pub fn focus_navigation() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[focus_follows_cursor],
|
settings::item::builder(&descriptions[focus_follows_cursor])
|
||||||
toggler(page.focus_follows_cursor).on_toggle(Message::SetFocusFollowsCursor),
|
.toggler(page.focus_follows_cursor, Message::SetFocusFollowsCursor),
|
||||||
))
|
)
|
||||||
.add(settings::item(
|
.add(settings::item(
|
||||||
&descriptions[focus_follows_cursor_delay],
|
&descriptions[focus_follows_cursor_delay],
|
||||||
widget::editable_input("", &page.focus_delay_text, false, |editing| {
|
widget::editable_input("", &page.focus_delay_text, false, |editing| {
|
||||||
|
|
@ -333,10 +352,10 @@ pub fn focus_navigation() -> Section<crate::pages::Message> {
|
||||||
.on_submit(|_| Message::SaveFocusFollowsCursorDelay(true))
|
.on_submit(|_| Message::SaveFocusFollowsCursorDelay(true))
|
||||||
.width(Length::Fixed(80.0)),
|
.width(Length::Fixed(80.0)),
|
||||||
))
|
))
|
||||||
.add(settings::item(
|
.add(
|
||||||
&descriptions[cursor_follows_focus],
|
settings::item::builder(&descriptions[cursor_follows_focus])
|
||||||
toggler(page.cursor_follows_focus).on_toggle(Message::SetCursorFollowsFocus),
|
.toggler(page.cursor_follows_focus, Message::SetCursorFollowsFocus),
|
||||||
))
|
)
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::WindowManagement)
|
.map(crate::pages::Message::WindowManagement)
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -6,28 +6,32 @@
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element,
|
Apply, Element,
|
||||||
cosmic_config::{self, ConfigGet, ConfigSet},
|
cosmic_config::{self, ConfigGet, ConfigSet},
|
||||||
iced::Length,
|
surface,
|
||||||
widget::{radio, settings, text},
|
widget::{self, settings},
|
||||||
};
|
};
|
||||||
use cosmic_comp_config::workspace::{WorkspaceConfig, WorkspaceLayout, WorkspaceMode};
|
use cosmic_comp_config::workspace::{Action, WorkspaceConfig, WorkspaceLayout, WorkspaceMode};
|
||||||
use cosmic_settings_page::Section;
|
use cosmic_settings_page::Section;
|
||||||
use cosmic_settings_page::{self as page, section};
|
use cosmic_settings_page::{self as page, section};
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum Message {
|
pub enum Message {
|
||||||
|
SetActionOnTyping(usize),
|
||||||
SetWorkspaceMode(WorkspaceMode),
|
SetWorkspaceMode(WorkspaceMode),
|
||||||
SetWorkspaceLayout(WorkspaceLayout),
|
SetWorkspaceLayout(WorkspaceLayout),
|
||||||
|
SetWorkspaceWraparound(bool),
|
||||||
SetShowName(bool),
|
SetShowName(bool),
|
||||||
SetShowNumber(bool),
|
SetShowNumber(bool),
|
||||||
|
Surface(surface::Action),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Page {
|
pub struct Page {
|
||||||
config: cosmic_config::Config,
|
config: cosmic_config::Config,
|
||||||
comp_config: cosmic_config::Config,
|
comp_config: cosmic_config::Config,
|
||||||
comp_workspace_config: WorkspaceConfig,
|
comp_workspace_config: WorkspaceConfig,
|
||||||
|
action_on_typing_selections: Vec<String>,
|
||||||
|
action_on_typing_active: Option<usize>,
|
||||||
show_workspace_name: bool,
|
show_workspace_name: bool,
|
||||||
show_workspace_number: bool,
|
show_workspace_number: bool,
|
||||||
}
|
}
|
||||||
|
|
@ -43,6 +47,8 @@ impl Default for Page {
|
||||||
WorkspaceConfig::default()
|
WorkspaceConfig::default()
|
||||||
});
|
});
|
||||||
let config = cosmic_config::Config::new("com.system76.CosmicWorkspaces", 1).unwrap();
|
let config = cosmic_config::Config::new("com.system76.CosmicWorkspaces", 1).unwrap();
|
||||||
|
let action_on_typing_active =
|
||||||
|
into_active_selection(&comp_workspace_config.action_on_typing);
|
||||||
let show_workspace_name = config.get("show_workspace_name").unwrap_or_else(|err| {
|
let show_workspace_name = config.get("show_workspace_name").unwrap_or_else(|err| {
|
||||||
if err.is_err() {
|
if err.is_err() {
|
||||||
error!(?err, "Failed to read config 'show_workspace_name'");
|
error!(?err, "Failed to read config 'show_workspace_name'");
|
||||||
|
|
@ -61,6 +67,12 @@ impl Default for Page {
|
||||||
config,
|
config,
|
||||||
comp_config,
|
comp_config,
|
||||||
comp_workspace_config,
|
comp_workspace_config,
|
||||||
|
action_on_typing_selections: vec![
|
||||||
|
fl!("workspaces-overview", "none"),
|
||||||
|
fl!("workspaces-overview", "launcher"),
|
||||||
|
fl!("workspaces-overview", "applications"),
|
||||||
|
],
|
||||||
|
action_on_typing_active,
|
||||||
show_workspace_name,
|
show_workspace_name,
|
||||||
show_workspace_number,
|
show_workspace_number,
|
||||||
}
|
}
|
||||||
|
|
@ -73,15 +85,17 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
|
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
|
||||||
) -> Option<page::Content> {
|
) -> Option<page::Content> {
|
||||||
Some(vec![
|
Some(vec![
|
||||||
|
sections.insert(action_on_typing()),
|
||||||
sections.insert(multi_behavior()),
|
sections.insert(multi_behavior()),
|
||||||
sections.insert(workspace_orientation()),
|
sections.insert(workspace_orientation()),
|
||||||
|
sections.insert(workspace_navigation()),
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("workspaces", "preferences-workspaces-symbolic")
|
page::Info::new("workspaces", "preferences-workspaces-symbolic")
|
||||||
.title(fl!("workspaces"))
|
.title(fl!("workspaces"))
|
||||||
.description(fl!("workspaces", "desc"))
|
.description(fl!("xdg-entry-workspaces-comment"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -97,7 +111,7 @@ impl Page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update(&mut self, message: Message) {
|
pub fn update(&mut self, message: Message) -> cosmic::iced::Task<crate::app::Message> {
|
||||||
match message {
|
match message {
|
||||||
Message::SetWorkspaceMode(value) => {
|
Message::SetWorkspaceMode(value) => {
|
||||||
self.comp_workspace_config.workspace_mode = value;
|
self.comp_workspace_config.workspace_mode = value;
|
||||||
|
|
@ -107,6 +121,16 @@ impl Page {
|
||||||
self.comp_workspace_config.workspace_layout = value;
|
self.comp_workspace_config.workspace_layout = value;
|
||||||
self.save_comp_config();
|
self.save_comp_config();
|
||||||
}
|
}
|
||||||
|
Message::SetActionOnTyping(value) => {
|
||||||
|
self.comp_workspace_config.action_on_typing = into_action(value);
|
||||||
|
self.action_on_typing_active =
|
||||||
|
into_active_selection(&self.comp_workspace_config.action_on_typing);
|
||||||
|
self.save_comp_config();
|
||||||
|
}
|
||||||
|
Message::SetWorkspaceWraparound(value) => {
|
||||||
|
self.comp_workspace_config.workspace_wraparound = value;
|
||||||
|
self.save_comp_config();
|
||||||
|
}
|
||||||
Message::SetShowName(value) => {
|
Message::SetShowName(value) => {
|
||||||
self.show_workspace_name = value;
|
self.show_workspace_name = value;
|
||||||
if let Err(err) = self.config.set("show_workspace_name", value) {
|
if let Err(err) = self.config.set("show_workspace_name", value) {
|
||||||
|
|
@ -119,15 +143,69 @@ impl Page {
|
||||||
error!(?err, "Failed to set config 'show_workspace_number'");
|
error!(?err, "Failed to set config 'show_workspace_number'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Message::Surface(a) => {
|
||||||
|
return cosmic::task::message(crate::app::Message::Surface(a));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
cosmic::iced::Task::none()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn multi_behavior() -> Section<crate::pages::Message> {
|
fn into_active_selection(action_on_typing: &Action) -> Option<usize> {
|
||||||
let mut descriptions = Slab::new();
|
match action_on_typing {
|
||||||
|
Action::None => Some(0),
|
||||||
|
Action::OpenLauncher => Some(1),
|
||||||
|
Action::OpenApplications => Some(2),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let span = descriptions.insert(fl!("workspaces-multi-behavior", "span"));
|
fn into_action(value: usize) -> Action {
|
||||||
let separate = descriptions.insert(fl!("workspaces-multi-behavior", "separate"));
|
match value {
|
||||||
|
1 => Action::OpenLauncher,
|
||||||
|
2 => Action::OpenApplications,
|
||||||
|
_ => Action::None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn action_on_typing() -> Section<crate::pages::Message> {
|
||||||
|
crate::slab!(descriptions {
|
||||||
|
action_on_typing = fl!("workspaces-overview", "action-on-typing");
|
||||||
|
});
|
||||||
|
|
||||||
|
Section::default()
|
||||||
|
.title(fl!("workspaces-overview"))
|
||||||
|
.descriptions(descriptions)
|
||||||
|
.view::<Page>(move |_binder, page, section| {
|
||||||
|
let descriptions = §ion.descriptions;
|
||||||
|
|
||||||
|
settings::section()
|
||||||
|
.title(§ion.title)
|
||||||
|
.add(
|
||||||
|
settings::item::builder(&descriptions[action_on_typing]).control(
|
||||||
|
widget::dropdown::popup_dropdown(
|
||||||
|
&page.action_on_typing_selections,
|
||||||
|
page.action_on_typing_active,
|
||||||
|
Message::SetActionOnTyping,
|
||||||
|
cosmic::iced::window::Id::RESERVED,
|
||||||
|
Message::Surface,
|
||||||
|
|a| {
|
||||||
|
crate::app::Message::PageMessage(crate::pages::Message::Workspaces(
|
||||||
|
a,
|
||||||
|
))
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.apply(Element::from)
|
||||||
|
.map(crate::pages::Message::Workspaces)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn multi_behavior() -> Section<crate::pages::Message> {
|
||||||
|
crate::slab!(descriptions {
|
||||||
|
span = fl!("workspaces-multi-behavior", "span");
|
||||||
|
separate = fl!("workspaces-multi-behavior", "separate");
|
||||||
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("workspaces-multi-behavior"))
|
.title(fl!("workspaces-multi-behavior"))
|
||||||
|
|
@ -136,36 +214,26 @@ fn multi_behavior() -> Section<crate::pages::Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::item_row(vec![
|
.add(settings::item::builder(&descriptions[span]).radio(
|
||||||
radio(
|
WorkspaceMode::Global,
|
||||||
text::body(&descriptions[span]),
|
Some(page.comp_workspace_config.workspace_mode),
|
||||||
WorkspaceMode::Global,
|
Message::SetWorkspaceMode,
|
||||||
Some(page.comp_workspace_config.workspace_mode),
|
))
|
||||||
Message::SetWorkspaceMode,
|
.add(settings::item::builder(&descriptions[separate]).radio(
|
||||||
)
|
WorkspaceMode::OutputBound,
|
||||||
.width(Length::Fill)
|
Some(page.comp_workspace_config.workspace_mode),
|
||||||
.into(),
|
Message::SetWorkspaceMode,
|
||||||
]))
|
))
|
||||||
.add(settings::item_row(vec![
|
|
||||||
radio(
|
|
||||||
text::body(&descriptions[separate]),
|
|
||||||
WorkspaceMode::OutputBound,
|
|
||||||
Some(page.comp_workspace_config.workspace_mode),
|
|
||||||
Message::SetWorkspaceMode,
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::DesktopWorkspaces)
|
.map(crate::pages::Message::DesktopWorkspaces)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn workspace_orientation() -> Section<crate::pages::Message> {
|
fn workspace_orientation() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
vertical = fl!("workspaces-orientation", "vertical");
|
||||||
let vertical = descriptions.insert(fl!("workspaces-orientation", "vertical"));
|
horizontal = fl!("workspaces-orientation", "horizontal");
|
||||||
let horizontal = descriptions.insert(fl!("workspaces-orientation", "horizontal"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("workspaces-orientation"))
|
.title(fl!("workspaces-orientation"))
|
||||||
|
|
@ -174,26 +242,37 @@ fn workspace_orientation() -> Section<crate::pages::Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::item_row(vec![
|
.add(settings::item::builder(&descriptions[vertical]).radio(
|
||||||
radio(
|
WorkspaceLayout::Vertical,
|
||||||
text::body(&descriptions[vertical]),
|
Some(page.comp_workspace_config.workspace_layout),
|
||||||
WorkspaceLayout::Vertical,
|
Message::SetWorkspaceLayout,
|
||||||
Some(page.comp_workspace_config.workspace_layout),
|
))
|
||||||
Message::SetWorkspaceLayout,
|
.add(settings::item::builder(&descriptions[horizontal]).radio(
|
||||||
)
|
WorkspaceLayout::Horizontal,
|
||||||
.width(Length::Fill)
|
Some(page.comp_workspace_config.workspace_layout),
|
||||||
.into(),
|
Message::SetWorkspaceLayout,
|
||||||
]))
|
))
|
||||||
.add(settings::item_row(vec![
|
.apply(Element::from)
|
||||||
radio(
|
.map(crate::pages::Message::DesktopWorkspaces)
|
||||||
text::body(&descriptions[horizontal]),
|
})
|
||||||
WorkspaceLayout::Horizontal,
|
}
|
||||||
Some(page.comp_workspace_config.workspace_layout),
|
|
||||||
Message::SetWorkspaceLayout,
|
fn workspace_navigation() -> Section<crate::pages::Message> {
|
||||||
)
|
crate::slab!(descriptions {
|
||||||
.width(Length::Fill)
|
description = fl!("workspaces-navigation", "wraparound");
|
||||||
.into(),
|
});
|
||||||
]))
|
|
||||||
|
Section::default()
|
||||||
|
.title(fl!("workspaces-navigation"))
|
||||||
|
.descriptions(descriptions)
|
||||||
|
.view::<Page>(move |_binder, page, section| {
|
||||||
|
let descriptions = §ion.descriptions;
|
||||||
|
settings::section()
|
||||||
|
.title(§ion.title)
|
||||||
|
.add(settings::item::builder(&descriptions[description]).toggler(
|
||||||
|
page.comp_workspace_config.workspace_wraparound,
|
||||||
|
Message::SetWorkspaceWraparound,
|
||||||
|
))
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::DesktopWorkspaces)
|
.map(crate::pages::Message::DesktopWorkspaces)
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,14 @@
|
||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use cosmic::Renderer;
|
use cosmic::Renderer;
|
||||||
use cosmic::iced_core::renderer::Quad;
|
use cosmic::iced::core::renderer::Quad;
|
||||||
use cosmic::iced_core::widget::{Tree, tree};
|
use cosmic::iced::core::widget::{Tree, tree};
|
||||||
use cosmic::iced_core::{
|
use cosmic::iced::core::{
|
||||||
self as core, Border, Clipboard, Element, Layout, Length, Rectangle, Renderer as IcedRenderer,
|
self as core, Border, Clipboard, Element, Layout, Length, Rectangle, Renderer as IcedRenderer,
|
||||||
Shell, Size, Widget,
|
Shell, Size, Widget,
|
||||||
};
|
};
|
||||||
use cosmic::iced_core::{Point, layout, mouse, renderer, touch};
|
use cosmic::iced::core::{Point, layout, mouse, renderer, touch};
|
||||||
use cosmic::iced_core::{alignment, event, text};
|
use cosmic::iced::core::{alignment, text};
|
||||||
use cosmic::widget::segmented_button::{self, SingleSelectModel};
|
use cosmic::widget::segmented_button::{self, SingleSelectModel};
|
||||||
use cosmic_randr_shell::{self as randr, OutputKey};
|
use cosmic_randr_shell::{self as randr, OutputKey};
|
||||||
use randr::Transform;
|
use randr::Transform;
|
||||||
|
|
@ -96,7 +96,7 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
|
||||||
}
|
}
|
||||||
|
|
||||||
fn layout(
|
fn layout(
|
||||||
&self,
|
&mut self,
|
||||||
tree: &mut Tree,
|
tree: &mut Tree,
|
||||||
_renderer: &Renderer,
|
_renderer: &Renderer,
|
||||||
limits: &layout::Limits,
|
limits: &layout::Limits,
|
||||||
|
|
@ -157,17 +157,17 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
|
||||||
layout::Node::new(size)
|
layout::Node::new(size)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_event(
|
fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
tree: &mut Tree,
|
tree: &mut Tree,
|
||||||
event: cosmic::iced_core::Event,
|
event: &cosmic::iced::Event,
|
||||||
layout: Layout<'_>,
|
layout: Layout<'_>,
|
||||||
cursor: mouse::Cursor,
|
cursor: mouse::Cursor,
|
||||||
_renderer: &Renderer,
|
_renderer: &Renderer,
|
||||||
_clipboard: &mut dyn Clipboard,
|
_clipboard: &mut dyn Clipboard,
|
||||||
shell: &mut Shell<'_, Message>,
|
shell: &mut Shell<'_, Message>,
|
||||||
viewport: &Rectangle,
|
viewport: &Rectangle,
|
||||||
) -> event::Status {
|
) {
|
||||||
let bounds = layout.bounds();
|
let bounds = layout.bounds();
|
||||||
|
|
||||||
match event {
|
match event {
|
||||||
|
|
@ -198,7 +198,7 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
return event::Status::Captured;
|
shell.capture_event();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -217,7 +217,7 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
|
||||||
state.drag_from = position;
|
state.drag_from = position;
|
||||||
state.offset = (position.x - output_region.x, position.y - output_region.y);
|
state.offset = (position.x - output_region.x, position.y - output_region.y);
|
||||||
state.dragging = Some((output_key, output_region));
|
state.dragging = Some((output_key, output_region));
|
||||||
return event::Status::Captured;
|
shell.capture_event();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -239,7 +239,8 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
shell.capture_event();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ref on_placement) = self.on_placement {
|
if let Some(ref on_placement) = self.on_placement {
|
||||||
|
|
@ -253,14 +254,12 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
shell.capture_event();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
event::Status::Ignored
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mouse_interaction(
|
fn mouse_interaction(
|
||||||
|
|
@ -333,6 +332,7 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
|
||||||
width: 3.0,
|
width: 3.0,
|
||||||
},
|
},
|
||||||
shadow: Default::default(),
|
shadow: Default::default(),
|
||||||
|
snap: true,
|
||||||
},
|
},
|
||||||
core::Background::Color(background.into()),
|
core::Background::Color(background.into()),
|
||||||
);
|
);
|
||||||
|
|
@ -352,6 +352,7 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
shadow: Default::default(),
|
shadow: Default::default(),
|
||||||
|
snap: true,
|
||||||
},
|
},
|
||||||
core::Background::Color(cosmic_theme.palette.neutral_1.into()),
|
core::Background::Color(cosmic_theme.palette.neutral_1.into()),
|
||||||
);
|
);
|
||||||
|
|
@ -364,10 +365,11 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
|
||||||
line_height: core::text::LineHeight::Relative(1.2),
|
line_height: core::text::LineHeight::Relative(1.2),
|
||||||
font: cosmic::font::bold(),
|
font: cosmic::font::bold(),
|
||||||
bounds: id_bounds.size(),
|
bounds: id_bounds.size(),
|
||||||
horizontal_alignment: alignment::Horizontal::Center,
|
align_x: text::Alignment::Center,
|
||||||
vertical_alignment: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping: text::Shaping::Basic,
|
shaping: text::Shaping::Basic,
|
||||||
wrapping: text::Wrapping::Word,
|
wrapping: text::Wrapping::Word,
|
||||||
|
ellipsize: text::Ellipsize::None,
|
||||||
},
|
},
|
||||||
core::Point {
|
core::Point {
|
||||||
x: id_bounds.center_x(),
|
x: id_bounds.center_x(),
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,11 @@ pub mod arrangement;
|
||||||
|
|
||||||
use crate::{app, pages};
|
use crate::{app, pages};
|
||||||
use arrangement::Arrangement;
|
use arrangement::Arrangement;
|
||||||
use cosmic::iced::{Alignment, Length, time};
|
use cosmic::iced::core::text::{Ellipsize, EllipsizeHeightLimit};
|
||||||
use cosmic::iced_widget::scrollable::RelativeOffset;
|
use cosmic::iced::widget::scrollable::RelativeOffset;
|
||||||
|
use cosmic::iced::{Alignment, Length, stream, time};
|
||||||
use cosmic::widget::{
|
use cosmic::widget::{
|
||||||
self, column, container, dropdown, list_column, segmented_button, tab_bar, text, toggler,
|
self, column, container, dropdown, list_column, segmented_button, tab_bar, text,
|
||||||
};
|
};
|
||||||
use cosmic::{Apply, Element, Task, surface};
|
use cosmic::{Apply, Element, Task, surface};
|
||||||
use cosmic_randr_shell::{
|
use cosmic_randr_shell::{
|
||||||
|
|
@ -18,7 +19,6 @@ use cosmic_randr_shell::{
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
use futures::SinkExt;
|
use futures::SinkExt;
|
||||||
use indexmap::Equivalent;
|
use indexmap::Equivalent;
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::{Key, SecondaryMap, SlotMap};
|
use slotmap::{Key, SecondaryMap, SlotMap};
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::{Arc, LazyLock};
|
use std::sync::{Arc, LazyLock};
|
||||||
|
|
@ -231,7 +231,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("display", "preferences-desktop-display-symbolic")
|
page::Info::new("display", "preferences-desktop-display-symbolic")
|
||||||
.title(fl!("display"))
|
.title(fl!("display"))
|
||||||
.description(fl!("display", "desc"))
|
.description(fl!("xdg-entry-displays-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "test"))]
|
#[cfg(not(feature = "test"))]
|
||||||
|
|
@ -286,9 +286,9 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Forward messages from another thread to prevent the monitoring thread from blocking.
|
// Forward messages from another thread to prevent the monitoring thread from blocking.
|
||||||
let (randr_task, randr_handle) = Task::stream(cosmic::iced_futures::stream::channel(
|
let (randr_task, randr_handle) = Task::stream(stream::channel(
|
||||||
1,
|
1,
|
||||||
|mut emitter| async move {
|
|mut emitter: futures::channel::mpsc::Sender<_>| async move {
|
||||||
while let Some(message) = rx.recv().await {
|
while let Some(message) = rx.recv().await {
|
||||||
if let cosmic_randr::Message::ManagerDone = message
|
if let cosmic_randr::Message::ManagerDone = message
|
||||||
&& !refreshing_page.swap(true, Ordering::SeqCst)
|
&& !refreshing_page.swap(true, Ordering::SeqCst)
|
||||||
|
|
@ -358,9 +358,9 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Forward messages from the DRM hotplug thread.
|
// Forward messages from the DRM hotplug thread.
|
||||||
let (hotplug_task, hotplug_handle) = Task::stream(cosmic::iced_futures::stream::channel(
|
let (hotplug_task, hotplug_handle) = Task::stream(stream::channel(
|
||||||
1,
|
1,
|
||||||
|mut emitter| async move {
|
|mut emitter: futures::channel::mpsc::Sender<pages::Message>| async move {
|
||||||
while let Some(message) = rx.recv().await {
|
while let Some(message) = rx.recv().await {
|
||||||
_ = emitter.send(message).await;
|
_ = emitter.send(message).await;
|
||||||
}
|
}
|
||||||
|
|
@ -610,8 +610,8 @@ impl Page {
|
||||||
return cosmic::iced::widget::scrollable::snap_to(
|
return cosmic::iced::widget::scrollable::snap_to(
|
||||||
self.display_arrangement_scrollable.clone(),
|
self.display_arrangement_scrollable.clone(),
|
||||||
RelativeOffset {
|
RelativeOffset {
|
||||||
x: self.last_pan,
|
x: Some(self.last_pan),
|
||||||
y: 0.0,
|
y: None,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -663,7 +663,10 @@ impl Page {
|
||||||
self.last_pan = 0.5;
|
self.last_pan = 0.5;
|
||||||
cosmic::iced::widget::scrollable::snap_to(
|
cosmic::iced::widget::scrollable::snap_to(
|
||||||
self.display_arrangement_scrollable.clone(),
|
self.display_arrangement_scrollable.clone(),
|
||||||
RelativeOffset { x: 0.5, y: 0.5 },
|
RelativeOffset {
|
||||||
|
x: Some(0.5),
|
||||||
|
y: Some(0.5),
|
||||||
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1183,10 +1186,10 @@ impl Page {
|
||||||
|
|
||||||
/// View for the display arrangement section.
|
/// View for the display arrangement section.
|
||||||
pub fn display_arrangement() -> Section<crate::pages::Message> {
|
pub fn display_arrangement() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
_display_arrangement = fl!("display", "arrangement");
|
||||||
_ = descriptions.insert(fl!("display", "arrangement"));
|
display_arrangement_desc = fl!("display", "arrangement-desc");
|
||||||
let display_arrangement_desc = descriptions.insert(fl!("display", "arrangement-desc"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("display", "arrangement"))
|
.title(fl!("display", "arrangement"))
|
||||||
|
|
@ -1199,7 +1202,7 @@ pub fn display_arrangement() -> Section<crate::pages::Message> {
|
||||||
space_xxs, space_m, ..
|
space_xxs, space_m, ..
|
||||||
} = cosmic::theme::spacing();
|
} = cosmic::theme::spacing();
|
||||||
|
|
||||||
column()
|
column::with_capacity(2)
|
||||||
.push(
|
.push(
|
||||||
text::body(&descriptions[display_arrangement_desc])
|
text::body(&descriptions[display_arrangement_desc])
|
||||||
.apply(container)
|
.apply(container)
|
||||||
|
|
@ -1227,18 +1230,18 @@ pub fn display_arrangement() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
/// View for the display configuration section.
|
/// View for the display configuration section.
|
||||||
pub fn display_configuration() -> Section<crate::pages::Message> {
|
pub fn display_configuration() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
_display = fl!("display");
|
||||||
let _display = descriptions.insert(fl!("display"));
|
refresh_rate = fl!("display", "refresh-rate");
|
||||||
let refresh_rate = descriptions.insert(fl!("display", "refresh-rate"));
|
vrr = fl!("vrr");
|
||||||
let vrr = descriptions.insert(fl!("vrr"));
|
resolution = fl!("display", "resolution");
|
||||||
let resolution = descriptions.insert(fl!("display", "resolution"));
|
scale = fl!("display", "scale");
|
||||||
let scale = descriptions.insert(fl!("display", "scale"));
|
additional_scale_options = fl!("display", "additional-scale-options");
|
||||||
let additional_scale_options = descriptions.insert(fl!("display", "additional-scale-options"));
|
orientation = fl!("orientation");
|
||||||
let orientation = descriptions.insert(fl!("orientation"));
|
enable_label = fl!("display", "enable");
|
||||||
let enable_label = descriptions.insert(fl!("display", "enable"));
|
options_label = fl!("display", "options");
|
||||||
let options_label = descriptions.insert(fl!("display", "options"));
|
mirroring_label = fl!("mirroring");
|
||||||
let mirroring_label = descriptions.insert(fl!("mirroring"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -1246,7 +1249,7 @@ pub fn display_configuration() -> Section<crate::pages::Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
|
|
||||||
let Some(&active_id) = page.display_tabs.active_data::<OutputKey>() else {
|
let Some(&active_id) = page.display_tabs.active_data::<OutputKey>() else {
|
||||||
return column().into();
|
return widget::space().into();
|
||||||
};
|
};
|
||||||
|
|
||||||
let active_output = &page.list.outputs[active_id];
|
let active_output = &page.list.outputs[active_id];
|
||||||
|
|
@ -1348,11 +1351,12 @@ pub fn display_configuration() -> Section<crate::pages::Message> {
|
||||||
items
|
items
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut content = column().spacing(cosmic::theme::spacing().space_xs);
|
let mut content = column::with_capacity(2).spacing(cosmic::theme::spacing().space_xs);
|
||||||
|
|
||||||
if page.list.outputs.len() > 1 {
|
if page.list.outputs.len() > 1 {
|
||||||
let display_switcher = tab_bar::horizontal(&page.display_tabs)
|
let display_switcher = tab_bar::horizontal(&page.display_tabs)
|
||||||
.button_alignment(Alignment::Center)
|
.button_alignment(Alignment::Center)
|
||||||
|
.ellipsize(Ellipsize::End(EllipsizeHeightLimit::Lines(1)))
|
||||||
.on_activate(Message::Display);
|
.on_activate(Message::Display);
|
||||||
|
|
||||||
let mut display_enable = if page
|
let mut display_enable = if page
|
||||||
|
|
@ -1366,10 +1370,10 @@ pub fn display_configuration() -> Section<crate::pages::Message> {
|
||||||
|| !active_output.enabled
|
|| !active_output.enabled
|
||||||
{
|
{
|
||||||
list_column()
|
list_column()
|
||||||
.add(widget::settings::item(
|
.add(
|
||||||
&descriptions[enable_label],
|
widget::settings::item::builder(&descriptions[enable_label])
|
||||||
toggler(active_output.enabled).on_toggle(Message::DisplayToggle),
|
.toggler(active_output.enabled, Message::DisplayToggle),
|
||||||
))
|
)
|
||||||
.add(widget::settings::item(
|
.add(widget::settings::item(
|
||||||
&descriptions[mirroring_label],
|
&descriptions[mirroring_label],
|
||||||
widget::dropdown::multi::dropdown(
|
widget::dropdown::multi::dropdown(
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
use super::{Message, NightLight};
|
use super::{Message, NightLight};
|
||||||
use crate::pages;
|
use crate::pages;
|
||||||
use cosmic::iced_core::{Alignment, Length};
|
use cosmic::iced::core::{Alignment, Length};
|
||||||
use cosmic::widget::{
|
use cosmic::widget::{
|
||||||
button, column, container, icon, list_column, row, settings, text, toggler, vertical_space,
|
button, column, container, icon, list_column, row, settings, text, toggler, vertical_space,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,11 @@ use cosmic::{
|
||||||
cosmic_config::{self, ConfigSet},
|
cosmic_config::{self, ConfigSet},
|
||||||
iced::{Alignment, Length},
|
iced::{Alignment, Length},
|
||||||
theme,
|
theme,
|
||||||
widget::{self, ListColumn, button, container, icon, radio, row, settings},
|
widget::{self, ListColumn, button, container, icon, list, row, settings},
|
||||||
};
|
};
|
||||||
use cosmic_comp_config::{KeyboardConfig, NumlockState, XkbConfig};
|
use cosmic_comp_config::{KeyboardConfig, NumlockState, XkbConfig};
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::{DefaultKey, Key, SlotMap};
|
use slotmap::{DefaultKey, Key, SlotMap};
|
||||||
|
|
||||||
static COMPOSE_OPTIONS: &[(&str, &str)] = &[
|
static COMPOSE_OPTIONS: &[(&str, &str)] = &[
|
||||||
|
|
@ -49,6 +48,7 @@ static CAPS_LOCK_OPTIONS: &[(&str, &str)] = &[
|
||||||
("Backspace", "caps:backspace"),
|
("Backspace", "caps:backspace"),
|
||||||
("Super", "caps:super"),
|
("Super", "caps:super"),
|
||||||
("Control", "caps:ctrl_modifier"),
|
("Control", "caps:ctrl_modifier"),
|
||||||
|
("Swap with Control", "ctrl:swapcaps"),
|
||||||
];
|
];
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
|
@ -84,6 +84,7 @@ pub type Description = String;
|
||||||
pub enum LayoutSource {
|
pub enum LayoutSource {
|
||||||
Base,
|
Base,
|
||||||
Extra,
|
Extra,
|
||||||
|
Custom,
|
||||||
}
|
}
|
||||||
|
|
||||||
const KB_REPEAT_DELAY_DEFAULT: u32 = 600;
|
const KB_REPEAT_DELAY_DEFAULT: u32 = 600;
|
||||||
|
|
@ -151,11 +152,11 @@ impl SpecialKey {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn prefix(self) -> &'static str {
|
pub fn prefixes(self) -> &'static [&'static str] {
|
||||||
match self {
|
match self {
|
||||||
Self::Compose => "compose:",
|
Self::Compose => &["compose:"],
|
||||||
Self::AlternateCharacters => "lv3:",
|
Self::AlternateCharacters => &["lv3:"],
|
||||||
Self::CapsLock => "caps:",
|
Self::CapsLock => &["caps:", "ctrl:"],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -243,15 +244,10 @@ fn special_char_radio_row<'a>(
|
||||||
desc: &'a str,
|
desc: &'a str,
|
||||||
value: Option<&'static str>,
|
value: Option<&'static str>,
|
||||||
current_value: Option<&'a str>,
|
current_value: Option<&'a str>,
|
||||||
) -> cosmic::Element<'a, Message> {
|
) -> list::ListButton<'a, Message> {
|
||||||
settings::item_row(vec![
|
settings::item::builder(desc).radio(value, Some(current_value), |_| {
|
||||||
radio(desc, value, Some(current_value), |_| {
|
Message::SpecialCharacterSelect(value)
|
||||||
Message::SpecialCharacterSelect(value)
|
})
|
||||||
})
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
])
|
|
||||||
.into()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl page::Page<crate::pages::Message> for Page {
|
impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
@ -275,7 +271,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("keyboard", "input-keyboard-symbolic")
|
page::Info::new("keyboard", "input-keyboard-symbolic")
|
||||||
.title(fl!("keyboard"))
|
.title(fl!("keyboard"))
|
||||||
.description(fl!("keyboard", "desc"))
|
.description(fl!("xdg-entry-keyboard-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn context_drawer(&self) -> Option<ContextDrawer<'_, crate::pages::Message>> {
|
fn context_drawer(&self) -> Option<ContextDrawer<'_, crate::pages::Message>> {
|
||||||
|
|
@ -332,6 +328,22 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
)
|
)
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
// Add user-defined layouts if any are found
|
||||||
|
let user_layouts = xkb_data::user_keyboard_layouts();
|
||||||
|
match user_layouts {
|
||||||
|
Ok(ref custom) => {
|
||||||
|
sorted_layouts.extend(
|
||||||
|
custom
|
||||||
|
.layouts()
|
||||||
|
.iter()
|
||||||
|
.map(|layout| (layout, LayoutSource::Custom)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Err(why) => {
|
||||||
|
tracing::error!(?why, "failed to get user keyboard layouts");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sorted_layouts.sort_unstable_by(|(a, _), (b, _)| {
|
sorted_layouts.sort_unstable_by(|(a, _), (b, _)| {
|
||||||
match (a.name(), b.name()) {
|
match (a.name(), b.name()) {
|
||||||
// Place US at the top of the list as it's the default
|
// Place US at the top of the list as it's the default
|
||||||
|
|
@ -497,10 +509,10 @@ impl Page {
|
||||||
Message::SpecialCharacterSelect(id) => {
|
Message::SpecialCharacterSelect(id) => {
|
||||||
if let Some(Context::SpecialCharacter(special_key)) = self.context {
|
if let Some(Context::SpecialCharacter(special_key)) = self.context {
|
||||||
let options = self.xkb.options.as_deref().unwrap_or_default();
|
let options = self.xkb.options.as_deref().unwrap_or_default();
|
||||||
let prefix = special_key.prefix();
|
let prefixes = special_key.prefixes();
|
||||||
let new_options = options
|
let new_options = options
|
||||||
.split(',')
|
.split(',')
|
||||||
.filter(|x| !x.starts_with(prefix))
|
.filter(|x| !prefixes.iter().any(|prefix| x.starts_with(prefix)))
|
||||||
.chain(id)
|
.chain(id)
|
||||||
.join(",");
|
.join(",");
|
||||||
|
|
||||||
|
|
@ -536,9 +548,11 @@ impl Page {
|
||||||
pub fn add_input_source_view(&self) -> Element<'_, crate::pages::Message> {
|
pub fn add_input_source_view(&self) -> Element<'_, crate::pages::Message> {
|
||||||
let space_l = theme::spacing().space_l;
|
let space_l = theme::spacing().space_l;
|
||||||
|
|
||||||
let toggler = settings::item::builder(fl!("show-extended-input-sources")).toggler(
|
let toggler = settings::section().add(
|
||||||
self.show_extended_input_sources,
|
settings::item::builder(fl!("show-extended-input-sources")).toggler(
|
||||||
Message::SetShowExtendedInputSources,
|
self.show_extended_input_sources,
|
||||||
|
Message::SetShowExtendedInputSources,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut list = widget::list_column();
|
let mut list = widget::list_column();
|
||||||
|
|
@ -553,7 +567,7 @@ impl Page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
widget::column()
|
widget::column::with_capacity(2)
|
||||||
.spacing(space_l)
|
.spacing(space_l)
|
||||||
.push(toggler)
|
.push(toggler)
|
||||||
.push(list)
|
.push(list)
|
||||||
|
|
@ -594,13 +608,13 @@ impl Page {
|
||||||
SpecialKey::AlternateCharacters => (ALTERNATE_CHARACTER_OPTIONS, None),
|
SpecialKey::AlternateCharacters => (ALTERNATE_CHARACTER_OPTIONS, None),
|
||||||
SpecialKey::CapsLock => (CAPS_LOCK_OPTIONS, None),
|
SpecialKey::CapsLock => (CAPS_LOCK_OPTIONS, None),
|
||||||
};
|
};
|
||||||
let prefix = special_key.prefix();
|
let prefixes = special_key.prefixes();
|
||||||
let current = self
|
let current = self
|
||||||
.xkb
|
.xkb
|
||||||
.options
|
.options
|
||||||
.iter()
|
.iter()
|
||||||
.flat_map(|x| x.split(','))
|
.flat_map(|x| x.split(','))
|
||||||
.find(|x| x.starts_with(prefix));
|
.find(|x| prefixes.iter().any(|prefix| x.starts_with(prefix)));
|
||||||
|
|
||||||
// TODO layout default
|
// TODO layout default
|
||||||
|
|
||||||
|
|
@ -637,16 +651,11 @@ impl Page {
|
||||||
|
|
||||||
let mut list = cosmic::widget::list_column();
|
let mut list = cosmic::widget::list_column();
|
||||||
for (desc, state) in options {
|
for (desc, state) in options {
|
||||||
list = list.add(settings::item_row(vec![
|
list = list.add(settings::item::builder(desc).radio(
|
||||||
radio(
|
Some(state),
|
||||||
cosmic::widget::text(desc),
|
Some(Some(current)),
|
||||||
Some(state),
|
|_| Message::SetNumlockState(state),
|
||||||
Some(Some(current)),
|
));
|
||||||
|_| Message::SetNumlockState(state),
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
list.into()
|
list.into()
|
||||||
|
|
@ -710,11 +719,11 @@ fn input_sources() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn special_character_entry() -> Section<crate::pages::Message> {
|
fn special_character_entry() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
alternate = fl!("keyboard-special-char", "alternate");
|
||||||
let alternate = descriptions.insert(fl!("keyboard-special-char", "alternate"));
|
compose = fl!("keyboard-special-char", "compose");
|
||||||
let compose = descriptions.insert(fl!("keyboard-special-char", "compose"));
|
caps = fl!("keyboard-special-char", "caps");
|
||||||
let caps = descriptions.insert(fl!("keyboard-special-char", "caps"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("keyboard-special-char"))
|
.title(fl!("keyboard-special-char"))
|
||||||
|
|
@ -742,9 +751,9 @@ fn special_character_entry() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn keyboard_shortcuts() -> Section<crate::pages::Message> {
|
fn keyboard_shortcuts() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
shortcuts_desc = fl!("keyboard-shortcuts", "desc");
|
||||||
let shortcuts_desc = descriptions.insert(fl!("keyboard-shortcuts", "desc"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("keyboard-shortcuts"))
|
.title(fl!("keyboard-shortcuts"))
|
||||||
|
|
@ -768,14 +777,14 @@ fn keyboard_shortcuts() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn keyboard_typing_assist() -> Section<crate::pages::Message> {
|
fn keyboard_typing_assist() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
repeat_delay = fl!("keyboard-typing-assist", "repeat-delay");
|
||||||
let repeat_delay = descriptions.insert(fl!("keyboard-typing-assist", "repeat-delay"));
|
repeat_rate = fl!("keyboard-typing-assist", "repeat-rate");
|
||||||
let repeat_rate = descriptions.insert(fl!("keyboard-typing-assist", "repeat-rate"));
|
short = fl!("short");
|
||||||
let short = descriptions.insert(fl!("short"));
|
long = fl!("long");
|
||||||
let long = descriptions.insert(fl!("long"));
|
slow = fl!("slow");
|
||||||
let slow = descriptions.insert(fl!("slow"));
|
fast = fl!("fast");
|
||||||
let fast = descriptions.insert(fl!("fast"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("keyboard-typing-assist"))
|
.title(fl!("keyboard-typing-assist"))
|
||||||
|
|
@ -785,55 +794,63 @@ fn keyboard_typing_assist() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::flex_item(&descriptions[repeat_delay], {
|
.add(
|
||||||
// Delay
|
settings::item::builder(&descriptions[repeat_delay])
|
||||||
let delay_slider = cosmic::widget::slider(
|
.flex_control({
|
||||||
KB_REPEAT_DELAY_MIN..=KB_REPEAT_DELAY_MAX,
|
// Delay
|
||||||
page.xkb.repeat_delay,
|
let delay_slider = cosmic::widget::slider(
|
||||||
Message::SetRepeatKeysDelay,
|
KB_REPEAT_DELAY_MIN..=KB_REPEAT_DELAY_MAX,
|
||||||
)
|
page.xkb.repeat_delay,
|
||||||
.width(Length::Fill)
|
Message::SetRepeatKeysDelay,
|
||||||
.breakpoints(&[KB_REPEAT_DELAY_DEFAULT])
|
)
|
||||||
.step(50_u32)
|
.width(Length::Fill)
|
||||||
.apply(widget::container)
|
.breakpoints(&[KB_REPEAT_DELAY_DEFAULT])
|
||||||
.max_width(250);
|
.step(50_u32)
|
||||||
|
.apply(widget::container)
|
||||||
|
.max_width(250);
|
||||||
|
|
||||||
row::with_capacity(3)
|
row::with_capacity(3)
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
.spacing(theme::spacing().space_s)
|
.spacing(theme::spacing().space_s)
|
||||||
.push(widget::text::body(&descriptions[short]))
|
.push(widget::text::body(&descriptions[short]))
|
||||||
.push(delay_slider)
|
.push(delay_slider)
|
||||||
.push(widget::text::body(&descriptions[long]))
|
.push(widget::text::body(&descriptions[long]))
|
||||||
}))
|
})
|
||||||
.add(settings::flex_item(&descriptions[repeat_rate], {
|
.align_items(Alignment::Center),
|
||||||
// Repeat rate
|
)
|
||||||
let rate_slider = cosmic::widget::slider(
|
.add(
|
||||||
KB_REPEAT_RATE_MIN..=KB_REPEAT_RATE_MAX,
|
settings::item::builder(&descriptions[repeat_rate])
|
||||||
page.xkb.repeat_rate,
|
.flex_control({
|
||||||
Message::SetRepeatKeysRate,
|
// Repeat rate
|
||||||
)
|
let rate_slider = cosmic::widget::slider(
|
||||||
.width(Length::Fill)
|
KB_REPEAT_RATE_MIN..=KB_REPEAT_RATE_MAX,
|
||||||
.breakpoints(&[KB_REPEAT_RATE_DEFAULT])
|
page.xkb.repeat_rate,
|
||||||
.step(5_u32)
|
Message::SetRepeatKeysRate,
|
||||||
.apply(widget::container)
|
)
|
||||||
.max_width(250);
|
.width(Length::Fill)
|
||||||
|
.breakpoints(&[KB_REPEAT_RATE_DEFAULT])
|
||||||
|
.step(5_u32)
|
||||||
|
.apply(widget::container)
|
||||||
|
.max_width(250);
|
||||||
|
|
||||||
row::with_capacity(3)
|
row::with_capacity(3)
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
.spacing(theme::spacing().space_s)
|
.spacing(theme::spacing().space_s)
|
||||||
.push(widget::text::body(&descriptions[slow]))
|
.push(widget::text::body(&descriptions[slow]))
|
||||||
.push(rate_slider)
|
.push(rate_slider)
|
||||||
.push(widget::text::body(&descriptions[fast]))
|
.push(widget::text::body(&descriptions[fast]))
|
||||||
}))
|
})
|
||||||
|
.align_items(Alignment::Center),
|
||||||
|
)
|
||||||
.apply(cosmic::Element::from)
|
.apply(cosmic::Element::from)
|
||||||
.map(crate::pages::Message::Keyboard)
|
.map(crate::pages::Message::Keyboard)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn keyboard_num_lock() -> Section<crate::pages::Message> {
|
fn keyboard_num_lock() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
boot_state = fl!("keyboard-numlock-boot", "boot-state");
|
||||||
let boot_state = descriptions.insert(fl!("keyboard-numlock-boot", "boot-state"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("keyboard-numlock-boot"))
|
.title(fl!("keyboard-numlock-boot"))
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
use super::{ShortcutMessage, ShortcutModel};
|
use super::{ShortcutMessage, ShortcutModel};
|
||||||
use cosmic::app::ContextDrawer;
|
use cosmic::app::ContextDrawer;
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
|
||||||
use cosmic::{Element, Task};
|
use cosmic::{Element, Task};
|
||||||
use cosmic_settings_config::shortcuts::Action;
|
use cosmic_settings_config::shortcuts::Action;
|
||||||
use cosmic_settings_config::shortcuts::action::System as SystemAction;
|
use cosmic_settings_config::shortcuts::action::System as SystemAction;
|
||||||
|
|
@ -17,10 +18,13 @@ impl Default for Page {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
model: super::Model::default().actions(|defaults, keybindings| {
|
model: super::Model::default().actions(|defaults, keybindings| {
|
||||||
actions().iter().fold(Slab::new(), |mut slab, action| {
|
actions().iter().cloned().fold(
|
||||||
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
|
Slab::with_capacity(actions().len()),
|
||||||
slab
|
|mut slab, action| {
|
||||||
})
|
slab.insert(ShortcutModel::new(defaults, keybindings, action));
|
||||||
|
slab
|
||||||
|
},
|
||||||
|
)
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -72,10 +76,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
||||||
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
||||||
self.model.on_clear();
|
self.model.on_clear();
|
||||||
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
||||||
false,
|
|
||||||
)
|
|
||||||
.discard()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
|
|
@ -101,7 +102,7 @@ pub const fn actions() -> &'static [Action] {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shortcuts() -> Section<crate::pages::Message> {
|
fn shortcuts() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
let mut descriptions = Slab::with_capacity(actions().len());
|
||||||
|
|
||||||
// Make these searchable in the global settings search.
|
// Make these searchable in the global settings search.
|
||||||
for action in actions() {
|
for action in actions() {
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,15 @@ use cosmic::app::ContextDrawer;
|
||||||
use cosmic::iced::event::listen_with;
|
use cosmic::iced::event::listen_with;
|
||||||
use cosmic::iced::keyboard::key::Named;
|
use cosmic::iced::keyboard::key::Named;
|
||||||
use cosmic::iced::keyboard::{Key, Location, Modifiers};
|
use cosmic::iced::keyboard::{Key, Location, Modifiers};
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::keymap;
|
||||||
use cosmic::iced::{self, Alignment, Length};
|
use cosmic::iced::{self, Alignment, Length};
|
||||||
use cosmic::widget::{self, button, icon, settings, text};
|
use cosmic::widget::{self, button, icon, settings, text};
|
||||||
use cosmic::{Apply, Element, Task, iced_winit, theme};
|
use cosmic::{Apply, Element, Task, theme};
|
||||||
use cosmic_config::{ConfigGet, ConfigSet};
|
use cosmic_config::{ConfigGet, ConfigSet};
|
||||||
use cosmic_settings_config::shortcuts::{self, Action, Binding, Shortcuts};
|
use cosmic_settings_config::shortcuts::{self, Action, Binding, Shortcuts};
|
||||||
use cosmic_settings_page as page;
|
use cosmic_settings_page as page;
|
||||||
|
use iced_winit::conversion;
|
||||||
use slab::Slab;
|
use slab::Slab;
|
||||||
use slotmap::Key as SlotmapKey;
|
use slotmap::Key as SlotmapKey;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
@ -29,6 +32,7 @@ pub enum ShortcutMessage {
|
||||||
ResetBindings,
|
ResetBindings,
|
||||||
ShowShortcut(usize, String),
|
ShowShortcut(usize, String),
|
||||||
SubmitBinding(usize),
|
SubmitBinding(usize),
|
||||||
|
TabPressed,
|
||||||
Inhibited(bool),
|
Inhibited(bool),
|
||||||
ProtocolUnavailable,
|
ProtocolUnavailable,
|
||||||
ModifiersChanged(Modifiers),
|
ModifiersChanged(Modifiers),
|
||||||
|
|
@ -48,6 +52,7 @@ pub struct ShortcutBinding {
|
||||||
|
|
||||||
impl ShortcutBinding {
|
impl ShortcutBinding {
|
||||||
pub fn reset(&mut self) {
|
pub fn reset(&mut self) {
|
||||||
|
self.pending = self.binding.clone();
|
||||||
self.input = self.binding.to_string();
|
self.input = self.binding.to_string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -323,10 +328,10 @@ impl Model {
|
||||||
shortcut.reset();
|
shortcut.reset();
|
||||||
|
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
||||||
widget::text_input::focus(shortcut.id.clone()),
|
widget::text_input::focus(shortcut.id.clone()),
|
||||||
widget::text_input::select_all(shortcut.id.clone())
|
widget::text_input::select_all(shortcut.id.clone()),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new input and focus it.
|
// Create a new input and focus it.
|
||||||
|
|
@ -341,10 +346,10 @@ impl Model {
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
||||||
widget::text_input::focus(id.clone()),
|
widget::text_input::focus(id.clone()),
|
||||||
widget::text_input::select_all(id)
|
widget::text_input::select_all(id),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ShortcutMessage::ApplyReplace => {
|
ShortcutMessage::ApplyReplace => {
|
||||||
|
|
@ -428,7 +433,7 @@ impl Model {
|
||||||
}
|
}
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
|
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
if let Some(short_id) = self.shortcut_context
|
if let Some(short_id) = self.shortcut_context
|
||||||
|
|
@ -439,12 +444,12 @@ impl Model {
|
||||||
self.editing = Some(id);
|
self.editing = Some(id);
|
||||||
shortcut.input = shortcut.binding.to_string();
|
shortcut.input = shortcut.binding.to_string();
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
||||||
widget::text_input::select_all(shortcut.id.clone())
|
widget::text_input::select_all(shortcut.id.clone()),
|
||||||
]);
|
]);
|
||||||
} else if self.editing == Some(id) {
|
} else if self.editing == Some(id) {
|
||||||
self.editing = None;
|
self.editing = None;
|
||||||
return iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard();
|
return keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -528,22 +533,43 @@ impl Model {
|
||||||
// XX for now avoid applying the keycode
|
// XX for now avoid applying the keycode
|
||||||
shortcut.binding.keycode = None;
|
shortcut.binding.keycode = None;
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
self.submit_binding(id),
|
self.submit_binding(id),
|
||||||
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
|
cosmic::widget::text_input::focus(
|
||||||
]);
|
self.add_keybindings_button_id.clone(),
|
||||||
|
),
|
||||||
|
]);
|
||||||
} else if old.alt || old.ctrl || old.shift {
|
} else if old.alt || old.ctrl || old.shift {
|
||||||
self.editing = None;
|
self.editing = None;
|
||||||
shortcut.reset();
|
shortcut.reset();
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
|
cosmic::widget::text_input::focus(
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
self.add_keybindings_button_id.clone(),
|
||||||
]);
|
),
|
||||||
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
shortcut.input = shortcut.pending.to_string();
|
shortcut.input = shortcut.pending.to_string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// libcosmic requires we set on_tab() and manually process here
|
||||||
|
// otherwise it'll consume the tab key event for navigation
|
||||||
|
ShortcutMessage::TabPressed => {
|
||||||
|
if let Some((short_id, id)) = self.shortcut_context.zip(self.editing)
|
||||||
|
&& let Some(model) = self.shortcut_models.get_mut(short_id)
|
||||||
|
&& let Some(shortcut) = model.bindings.get_mut(id)
|
||||||
|
{
|
||||||
|
shortcut.pending.key = Some(xkeysym::Keysym::Tab);
|
||||||
|
shortcut.pending.keycode = None;
|
||||||
|
shortcut.input = shortcut.pending.to_string();
|
||||||
|
return Task::batch(vec![
|
||||||
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
|
self.submit_binding(id),
|
||||||
|
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
ShortcutMessage::KeyReleased(keycode, _, _) => {
|
ShortcutMessage::KeyReleased(keycode, _, _) => {
|
||||||
if let Some((short_id, id)) = self.shortcut_context.zip(self.editing)
|
if let Some((short_id, id)) = self.shortcut_context.zip(self.editing)
|
||||||
&& let Some(model) = self.shortcut_models.get_mut(short_id)
|
&& let Some(model) = self.shortcut_models.get_mut(short_id)
|
||||||
|
|
@ -556,24 +582,29 @@ impl Model {
|
||||||
if shortcut.pending.modifiers
|
if shortcut.pending.modifiers
|
||||||
!= cosmic_settings_config::shortcuts::Modifiers::new()
|
!= cosmic_settings_config::shortcuts::Modifiers::new()
|
||||||
|| shortcut.pending.key.is_some_and(|key| {
|
|| shortcut.pending.key.is_some_and(|key| {
|
||||||
key.is_misc_function_key()
|
!cosmic_settings_config::shortcuts::is_forbidden_unmodified_keysym(
|
||||||
|| matches!(key.raw(), 0x10080001..=0x1008FFFF)
|
key,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
shortcut.input = shortcut.pending.to_string();
|
shortcut.input = shortcut.pending.to_string();
|
||||||
// XX for now avoid applying the keycode
|
// XX for now avoid applying the keycode
|
||||||
shortcut.binding.keycode = None;
|
shortcut.binding.keycode = None;
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
self.submit_binding(id),
|
self.submit_binding(id),
|
||||||
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
|
cosmic::widget::text_input::focus(
|
||||||
]);
|
self.add_keybindings_button_id.clone(),
|
||||||
|
),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
|
cosmic::widget::text_input::focus(
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
self.add_keybindings_button_id.clone(),
|
||||||
]);
|
),
|
||||||
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -586,9 +617,11 @@ impl Model {
|
||||||
binding.reset();
|
binding.reset();
|
||||||
self.editing = None;
|
self.editing = None;
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
|
cosmic::widget::text_input::focus(
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
self.add_keybindings_button_id.clone(),
|
||||||
]);
|
),
|
||||||
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
return Task::none();
|
return Task::none();
|
||||||
}
|
}
|
||||||
|
|
@ -597,11 +630,7 @@ impl Model {
|
||||||
&& let Some(shortcut) = model.bindings.get_mut(id)
|
&& let Some(shortcut) = model.bindings.get_mut(id)
|
||||||
{
|
{
|
||||||
shortcut.pending.keycode = Some(keycode);
|
shortcut.pending.keycode = Some(keycode);
|
||||||
shortcut.pending.key =
|
shortcut.pending.key = keymap::key_to_keysym(unmodified_keysym, location);
|
||||||
iced_winit::platform_specific::wayland::keymap::key_to_keysym(
|
|
||||||
unmodified_keysym,
|
|
||||||
location,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -628,11 +657,10 @@ impl Model {
|
||||||
if matches!(
|
if matches!(
|
||||||
key,
|
key,
|
||||||
Key::Named(Named::Super | Named::Alt | Named::Control | Named::Shift)
|
Key::Named(Named::Super | Named::Alt | Named::Control | Named::Shift)
|
||||||
) || matches!((&key, modifiers), (Key::Named(Named::Tab), modifiers) if modifiers.is_empty() || modifiers == Modifiers::SHIFT)
|
) {
|
||||||
{
|
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
cosmic::iced_winit::conversion::physical_to_scancode(physical_key)
|
conversion::physical_to_scancode(physical_key)
|
||||||
.map(|code| ShortcutMessage::KeyPressed(code, key, location, modifiers))
|
.map(|code| ShortcutMessage::KeyPressed(code, key, location, modifiers))
|
||||||
}
|
}
|
||||||
iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
|
iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
|
||||||
|
|
@ -649,7 +677,7 @@ impl Model {
|
||||||
) {
|
) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
cosmic::iced_winit::conversion::physical_to_scancode(physical_key)
|
conversion::physical_to_scancode(physical_key)
|
||||||
.map(|code| ShortcutMessage::KeyReleased(code, key, location))
|
.map(|code| ShortcutMessage::KeyReleased(code, key, location))
|
||||||
}
|
}
|
||||||
iced::event::Event::Keyboard(iced::keyboard::Event::ModifiersChanged(e)) => {
|
iced::event::Event::Keyboard(iced::keyboard::Event::ModifiersChanged(e)) => {
|
||||||
|
|
@ -751,10 +779,7 @@ fn context_drawer<'a>(
|
||||||
show_action: bool,
|
show_action: bool,
|
||||||
) -> Element<'a, ShortcutMessage> {
|
) -> Element<'a, ShortcutMessage> {
|
||||||
let cosmic::cosmic_theme::Spacing {
|
let cosmic::cosmic_theme::Spacing {
|
||||||
space_xxs,
|
space_xs, space_l, ..
|
||||||
space_xs,
|
|
||||||
space_l,
|
|
||||||
..
|
|
||||||
} = theme::spacing();
|
} = theme::spacing();
|
||||||
|
|
||||||
let model = &shortcuts[id];
|
let model = &shortcuts[id];
|
||||||
|
|
@ -770,7 +795,7 @@ fn context_drawer<'a>(
|
||||||
});
|
});
|
||||||
|
|
||||||
let bindings = model.bindings.iter().enumerate().fold(
|
let bindings = model.bindings.iter().enumerate().fold(
|
||||||
widget::list_column().spacing(space_xxs),
|
widget::list_column(),
|
||||||
|section, (_, (bind_id, shortcut))| {
|
|section, (_, (bind_id, shortcut))| {
|
||||||
let editing = editing == Some(bind_id);
|
let editing = editing == Some(bind_id);
|
||||||
let text: Cow<'_, str> = if !editing && shortcut.binding.is_set() {
|
let text: Cow<'_, str> = if !editing && shortcut.binding.is_set() {
|
||||||
|
|
@ -787,6 +812,7 @@ fn context_drawer<'a>(
|
||||||
.on_input(move |text| ShortcutMessage::InputBinding(bind_id, text))
|
.on_input(move |text| ShortcutMessage::InputBinding(bind_id, text))
|
||||||
.on_unfocus(ShortcutMessage::SubmitBinding(bind_id))
|
.on_unfocus(ShortcutMessage::SubmitBinding(bind_id))
|
||||||
.on_submit(move |_| ShortcutMessage::SubmitBinding(bind_id))
|
.on_submit(move |_| ShortcutMessage::SubmitBinding(bind_id))
|
||||||
|
.on_tab(ShortcutMessage::TabPressed) // capture Tab to prevent focus navigation
|
||||||
.padding([0, space_xs])
|
.padding([0, space_xs])
|
||||||
.id(shortcut.id.clone())
|
.id(shortcut.id.clone())
|
||||||
.into();
|
.into();
|
||||||
|
|
@ -881,6 +907,7 @@ fn shortcut_item(custom: bool, id: usize, data: &ShortcutModel) -> Element<'_, S
|
||||||
|
|
||||||
settings::item::builder(&data.description)
|
settings::item::builder(&data.description)
|
||||||
.flex_control(control)
|
.flex_control(control)
|
||||||
|
.align_items(Alignment::Center)
|
||||||
.spacing(16)
|
.spacing(16)
|
||||||
.apply(widget::container)
|
.apply(widget::container)
|
||||||
.class(theme::Container::List)
|
.class(theme::Container::List)
|
||||||
|
|
|
||||||
|
|
@ -9,13 +9,15 @@ use super::{ShortcutBinding, ShortcutMessage, ShortcutModel};
|
||||||
use cosmic::app::ContextDrawer;
|
use cosmic::app::ContextDrawer;
|
||||||
use cosmic::iced::keyboard::key::Named;
|
use cosmic::iced::keyboard::key::Named;
|
||||||
use cosmic::iced::keyboard::{Key, Location, Modifiers};
|
use cosmic::iced::keyboard::{Key, Location, Modifiers};
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::keymap;
|
||||||
use cosmic::iced::{Alignment, Length};
|
use cosmic::iced::{Alignment, Length};
|
||||||
use cosmic::iced_winit;
|
|
||||||
use cosmic::widget::{self, button, icon};
|
use cosmic::widget::{self, button, icon};
|
||||||
use cosmic::{Apply, Element, Task};
|
use cosmic::{Apply, Element, Task};
|
||||||
use cosmic_settings_config::Binding;
|
use cosmic_settings_config::Binding;
|
||||||
use cosmic_settings_config::shortcuts::{Action, Shortcuts};
|
use cosmic_settings_config::shortcuts::{Action, Shortcuts};
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
|
use iced_winit::conversion;
|
||||||
use slab::Slab;
|
use slab::Slab;
|
||||||
use slotmap::{Key as SlotKey, SlotMap};
|
use slotmap::{Key as SlotKey, SlotMap};
|
||||||
|
|
||||||
|
|
@ -67,6 +69,7 @@ pub enum Message {
|
||||||
Shortcut(ShortcutMessage),
|
Shortcut(ShortcutMessage),
|
||||||
/// Open the add shortcut context drawer
|
/// Open the add shortcut context drawer
|
||||||
ShortcutContext,
|
ShortcutContext,
|
||||||
|
TabPressed,
|
||||||
ModifiersChanged(Modifiers),
|
ModifiersChanged(Modifiers),
|
||||||
KeyReleased(u32, Key, Location),
|
KeyReleased(u32, Key, Location),
|
||||||
KeyPressed(u32, Key, Location, Modifiers),
|
KeyPressed(u32, Key, Location, Modifiers),
|
||||||
|
|
@ -112,13 +115,13 @@ impl Page {
|
||||||
Message::KeyEditing(id, enable) => {
|
Message::KeyEditing(id, enable) => {
|
||||||
if enable {
|
if enable {
|
||||||
self.add_shortcut.editing = Some(id);
|
self.add_shortcut.editing = Some(id);
|
||||||
return iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard();
|
return keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard();
|
||||||
} else if self.add_shortcut.editing == Some(id) {
|
} else if self.add_shortcut.editing == Some(id) {
|
||||||
self.add_shortcut.editing = None;
|
self.add_shortcut.editing = None;
|
||||||
|
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(widget::Id::unique()),
|
widget::text_input::focus(widget::Id::unique()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -151,7 +154,7 @@ impl Page {
|
||||||
self.add_shortcut.editing = Some(*index);
|
self.add_shortcut.editing = Some(*index);
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(binding.clone()),
|
widget::text_input::focus(binding.clone()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
// make a new empty binding if none exist
|
// make a new empty binding if none exist
|
||||||
|
|
@ -163,7 +166,7 @@ impl Page {
|
||||||
);
|
);
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(new_id.clone()),
|
widget::text_input::focus(new_id.clone()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -174,10 +177,7 @@ impl Page {
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(id.clone()),
|
widget::text_input::focus(id.clone()),
|
||||||
widget::text_input::select_all(id.clone()),
|
widget::text_input::select_all(id.clone()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
||||||
true,
|
|
||||||
)
|
|
||||||
.discard()
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -189,10 +189,8 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
Message::ReplaceApply => {
|
Message::ReplaceApply => {
|
||||||
if let Some((mut binding, ..)) = self.replace_dialog.pop() {
|
if let Some((binding, ..)) = self.replace_dialog.pop() {
|
||||||
self.model.config_remove(&binding);
|
self.add_shortcut(binding, true);
|
||||||
binding.keycode = None;
|
|
||||||
self.add_shortcut(binding);
|
|
||||||
|
|
||||||
if self.replace_dialog.is_empty() {
|
if self.replace_dialog.is_empty() {
|
||||||
self.add_shortcut = Default::default();
|
self.add_shortcut = Default::default();
|
||||||
|
|
@ -262,7 +260,8 @@ impl Page {
|
||||||
.keys
|
.keys
|
||||||
.get_mut(self.add_shortcut.editing.unwrap())
|
.get_mut(self.add_shortcut.editing.unwrap())
|
||||||
else {
|
else {
|
||||||
return iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard();
|
return keyboard_shortcuts_inhibit::inhibit_shortcuts(false)
|
||||||
|
.discard();
|
||||||
};
|
};
|
||||||
k.0 = binding.to_string();
|
k.0 = binding.to_string();
|
||||||
|
|
||||||
|
|
@ -271,22 +270,22 @@ impl Page {
|
||||||
{
|
{
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(widget::Id::unique()),
|
widget::text_input::focus(widget::Id::unique()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
self.add_shortcut(binding);
|
self.add_shortcut(binding, false);
|
||||||
_ = self.model.on_enter();
|
_ = self.model.on_enter();
|
||||||
|
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(widget::Id::unique()),
|
widget::text_input::focus(widget::Id::unique()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
]);
|
]);
|
||||||
} else if old.alt || old.ctrl || old.shift {
|
} else if old.alt || old.ctrl || old.shift {
|
||||||
self.add_shortcut = Default::default();
|
self.add_shortcut = Default::default();
|
||||||
_ = self.model.on_enter();
|
_ = self.model.on_enter();
|
||||||
|
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -299,6 +298,26 @@ impl Page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// libcosmic requires we set on_tab() and manually process here
|
||||||
|
// otherwise it'll consume the tab key event for navigation
|
||||||
|
Message::TabPressed => {
|
||||||
|
if self.add_shortcut.editing.is_some() && self.add_shortcut.active {
|
||||||
|
self.add_shortcut.binding.key = Some(xkeysym::Keysym::Tab);
|
||||||
|
self.add_shortcut.binding.keycode = Some(0);
|
||||||
|
if let Some(k) = self
|
||||||
|
.add_shortcut
|
||||||
|
.keys
|
||||||
|
.get_mut(self.add_shortcut.editing.unwrap())
|
||||||
|
{
|
||||||
|
k.0 = self.add_shortcut.binding.to_string();
|
||||||
|
}
|
||||||
|
return self.update(Message::KeyReleased(
|
||||||
|
0,
|
||||||
|
Key::Named(Named::Tab),
|
||||||
|
Location::Standard,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
Message::KeyReleased(keycode, _, _) => {
|
Message::KeyReleased(keycode, _, _) => {
|
||||||
// if the currently selected shortcut matches, finish selecting shortcut
|
// if the currently selected shortcut matches, finish selecting shortcut
|
||||||
if self.add_shortcut.editing.is_some()
|
if self.add_shortcut.editing.is_some()
|
||||||
|
|
@ -312,7 +331,7 @@ impl Page {
|
||||||
&& self.add_shortcut.binding.modifiers
|
&& self.add_shortcut.binding.modifiers
|
||||||
!= cosmic_settings_config::shortcuts::Modifiers::new()
|
!= cosmic_settings_config::shortcuts::Modifiers::new()
|
||||||
|| self.add_shortcut.binding.key.is_some_and(|key| {
|
|| self.add_shortcut.binding.key.is_some_and(|key| {
|
||||||
key.is_misc_function_key() || matches!(key.raw(), 0x10080001..=0x1008FFFF)
|
!cosmic_settings_config::shortcuts::is_forbidden_unmodified_keysym(key)
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
// XX for now avoid applying the keycode
|
// XX for now avoid applying the keycode
|
||||||
|
|
@ -327,7 +346,7 @@ impl Page {
|
||||||
.keys
|
.keys
|
||||||
.get_mut(self.add_shortcut.editing.unwrap())
|
.get_mut(self.add_shortcut.editing.unwrap())
|
||||||
else {
|
else {
|
||||||
return iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard();
|
return keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard();
|
||||||
};
|
};
|
||||||
k.0 = binding.to_string();
|
k.0 = binding.to_string();
|
||||||
|
|
||||||
|
|
@ -336,15 +355,15 @@ impl Page {
|
||||||
{
|
{
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(widget::Id::unique()),
|
widget::text_input::focus(widget::Id::unique()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
self.add_shortcut(binding);
|
self.add_shortcut(binding, false);
|
||||||
_ = self.model.on_enter();
|
_ = self.model.on_enter();
|
||||||
|
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(widget::Id::unique()),
|
widget::text_input::focus(widget::Id::unique()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -353,16 +372,13 @@ impl Page {
|
||||||
self.add_shortcut.editing = None;
|
self.add_shortcut.editing = None;
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(widget::Id::unique()),
|
widget::text_input::focus(widget::Id::unique()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
if self.add_shortcut.active {
|
if self.add_shortcut.active {
|
||||||
self.add_shortcut.binding.keycode = Some(keycode);
|
self.add_shortcut.binding.keycode = Some(keycode);
|
||||||
self.add_shortcut.binding.key =
|
self.add_shortcut.binding.key =
|
||||||
iced_winit::platform_specific::wayland::keymap::key_to_keysym(
|
keymap::key_to_keysym(unmodified_keysym, location);
|
||||||
unmodified_keysym,
|
|
||||||
location,
|
|
||||||
);
|
|
||||||
if let Some(k) = self
|
if let Some(k) = self
|
||||||
.add_shortcut
|
.add_shortcut
|
||||||
.keys
|
.keys
|
||||||
|
|
@ -387,11 +403,8 @@ impl Page {
|
||||||
binding.clear();
|
binding.clear();
|
||||||
|
|
||||||
return Task::batch(vec![
|
return Task::batch(vec![
|
||||||
widget::text_input::focus(id.clone()),
|
widget::text_input::focus(id.clone()),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
||||||
true,
|
|
||||||
)
|
|
||||||
.discard(),
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -405,10 +418,7 @@ impl Page {
|
||||||
Task::batch(vec![
|
Task::batch(vec![
|
||||||
widget::text_input::focus(new_id.clone()),
|
widget::text_input::focus(new_id.clone()),
|
||||||
widget::text_input::select_all(new_id),
|
widget::text_input::select_all(new_id),
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
|
||||||
true,
|
|
||||||
)
|
|
||||||
.discard(),
|
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -425,24 +435,24 @@ impl Page {
|
||||||
.on_submit(|_| Message::EditCombination)
|
.on_submit(|_| Message::EditCombination)
|
||||||
.id(self.task_id.clone());
|
.id(self.task_id.clone());
|
||||||
|
|
||||||
let name_control = widget::column()
|
let name_control = widget::column::with_capacity(2)
|
||||||
.spacing(4)
|
.spacing(4)
|
||||||
.push(widget::text::body(fl!("shortcut-name")))
|
.push(widget::text::body(fl!("shortcut-name")))
|
||||||
.push(name_input);
|
.push(name_input);
|
||||||
|
|
||||||
let command_control = widget::column()
|
let command_control = widget::column::with_capacity(2)
|
||||||
.spacing(4)
|
.spacing(4)
|
||||||
.push(widget::text::body(fl!("command")))
|
.push(widget::text::body(fl!("command")))
|
||||||
.push(task_input);
|
.push(task_input);
|
||||||
|
|
||||||
let input_fields = widget::column()
|
let input_fields = widget::column::with_capacity(2)
|
||||||
.spacing(12)
|
.spacing(12)
|
||||||
.push(name_control)
|
.push(name_control)
|
||||||
.push(command_control)
|
.push(command_control)
|
||||||
.padding([16, 24]);
|
.padding([16, 24]);
|
||||||
|
|
||||||
let keys = self.add_shortcut.keys.iter().fold(
|
let keys = self.add_shortcut.keys.iter().fold(
|
||||||
widget::list_column().spacing(0),
|
widget::list_column(),
|
||||||
|column, (id, (text, widget_id))| {
|
|column, (id, (text, widget_id))| {
|
||||||
let key_combination = widget::editable_input(
|
let key_combination = widget::editable_input(
|
||||||
fl!("type-key-combination"),
|
fl!("type-key-combination"),
|
||||||
|
|
@ -454,6 +464,7 @@ impl Page {
|
||||||
.select_on_focus(true)
|
.select_on_focus(true)
|
||||||
.on_input(move |input| Message::KeyInput(id, input))
|
.on_input(move |input| Message::KeyInput(id, input))
|
||||||
.on_submit(|_| Message::AddKeybinding)
|
.on_submit(|_| Message::AddKeybinding)
|
||||||
|
.on_tab(Message::TabPressed) // capture Tab to prevent focus navigation
|
||||||
.padding([0, 12])
|
.padding([0, 12])
|
||||||
.id(widget_id.clone())
|
.id(widget_id.clone())
|
||||||
.apply(widget::container)
|
.apply(widget::container)
|
||||||
|
|
@ -463,7 +474,7 @@ impl Page {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
let controls = widget::list_column().add(input_fields).add(keys).spacing(0);
|
let controls = widget::list_column().add(input_fields).add(keys);
|
||||||
|
|
||||||
let add_keybinding_button = widget::button::standard(fl!("add-another-keybinding"))
|
let add_keybinding_button = widget::button::standard(fl!("add-another-keybinding"))
|
||||||
.on_press(Message::AddShortcut)
|
.on_press(Message::AddShortcut)
|
||||||
|
|
@ -471,19 +482,22 @@ impl Page {
|
||||||
.width(Length::Fill)
|
.width(Length::Fill)
|
||||||
.align_x(Alignment::End);
|
.align_x(Alignment::End);
|
||||||
|
|
||||||
widget::column()
|
widget::column::with_capacity(2)
|
||||||
.spacing(32)
|
.spacing(32)
|
||||||
.push(controls)
|
.push(controls)
|
||||||
.push(add_keybinding_button)
|
.push(add_keybinding_button)
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_shortcut(&mut self, mut binding: Binding) {
|
fn add_shortcut(&mut self, mut binding: Binding, replace: bool) {
|
||||||
if let Some(action) = self.model.config_contains(&binding) {
|
if replace {
|
||||||
|
self.model.config_remove(&binding);
|
||||||
|
} else if let Some(action) = self.model.config_contains(&binding) {
|
||||||
let action_str = super::localize_action(&action);
|
let action_str = super::localize_action(&action);
|
||||||
self.replace_dialog.push((binding, action, action_str));
|
self.replace_dialog.push((binding, action, action_str));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
binding.keycode = None;
|
||||||
binding.description = Some(self.add_shortcut.name.clone());
|
binding.description = Some(self.add_shortcut.name.clone());
|
||||||
let new_action = Action::Spawn(self.add_shortcut.task.clone());
|
let new_action = Action::Spawn(self.add_shortcut.task.clone());
|
||||||
self.model.config_add(new_action, binding);
|
self.model.config_add(new_action, binding);
|
||||||
|
|
@ -568,10 +582,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
||||||
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
||||||
self.model.on_clear();
|
self.model.on_clear();
|
||||||
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
||||||
false,
|
|
||||||
)
|
|
||||||
.discard()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
|
|
@ -598,17 +609,14 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
if matches!(
|
if matches!(
|
||||||
key,
|
key,
|
||||||
Key::Named(Named::Super | Named::Alt | Named::Control | Named::Shift)
|
Key::Named(Named::Super | Named::Alt | Named::Control | Named::Shift)
|
||||||
) || matches!((&key, modifiers), (Key::Named(Named::Tab), modifiers) if modifiers.is_empty() || modifiers == Modifiers::SHIFT)
|
) {
|
||||||
{
|
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
cosmic::iced_winit::conversion::physical_to_scancode(physical_key).map(
|
conversion::physical_to_scancode(physical_key).map(|code| {
|
||||||
|code| {
|
crate::pages::Message::CustomShortcuts(Message::KeyPressed(
|
||||||
crate::pages::Message::CustomShortcuts(Message::KeyPressed(
|
code, key, location, modifiers,
|
||||||
code, key, location, modifiers,
|
))
|
||||||
))
|
})
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
|
iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
|
||||||
key,
|
key,
|
||||||
|
|
@ -623,13 +631,11 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
) {
|
) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
cosmic::iced_winit::conversion::physical_to_scancode(physical_key).map(
|
conversion::physical_to_scancode(physical_key).map(|code| {
|
||||||
|code| {
|
crate::pages::Message::CustomShortcuts(Message::KeyReleased(
|
||||||
crate::pages::Message::CustomShortcuts(Message::KeyReleased(
|
code, key, location,
|
||||||
code, key, location,
|
))
|
||||||
))
|
})
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
iced::event::Event::Keyboard(iced::keyboard::Event::ModifiersChanged(e)) => {
|
iced::event::Event::Keyboard(iced::keyboard::Event::ModifiersChanged(e)) => {
|
||||||
Some(crate::pages::Message::CustomShortcuts(
|
Some(crate::pages::Message::CustomShortcuts(
|
||||||
|
|
@ -717,7 +723,7 @@ fn shortcuts() -> Section<crate::pages::Message> {
|
||||||
.width(Length::Fill)
|
.width(Length::Fill)
|
||||||
.align_x(Alignment::End);
|
.align_x(Alignment::End);
|
||||||
|
|
||||||
widget::column()
|
widget::column::with_capacity(2)
|
||||||
.push(content)
|
.push(content)
|
||||||
.push(add_shortcut)
|
.push(add_shortcut)
|
||||||
.spacing(24)
|
.spacing(24)
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use super::{ShortcutMessage, ShortcutModel};
|
use super::{ShortcutMessage, ShortcutModel};
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
|
||||||
use cosmic::{Element, Task, app::ContextDrawer};
|
use cosmic::{Element, Task, app::ContextDrawer};
|
||||||
use cosmic_settings_config::shortcuts::Action;
|
use cosmic_settings_config::shortcuts::Action;
|
||||||
use cosmic_settings_config::shortcuts::action::ResizeDirection;
|
use cosmic_settings_config::shortcuts::action::ResizeDirection;
|
||||||
|
|
@ -70,10 +71,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
||||||
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
||||||
self.model.on_clear();
|
self.model.on_clear();
|
||||||
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
||||||
false,
|
|
||||||
)
|
|
||||||
.discard()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
|
|
@ -102,7 +100,7 @@ pub const fn actions() -> &'static [Action] {
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
fn shortcuts() -> Section<crate::pages::Message> {
|
fn shortcuts() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
let mut descriptions = Slab::with_capacity(actions().len());
|
||||||
|
|
||||||
// Make these searchable in the global settings search.
|
// Make these searchable in the global settings search.
|
||||||
for action in actions() {
|
for action in actions() {
|
||||||
|
|
|
||||||
|
|
@ -405,28 +405,31 @@ impl Search {
|
||||||
self.localized[*id].to_lowercase().contains(&input)
|
self.localized[*id].to_lowercase().contains(&input)
|
||||||
|| shortcut_search_actions.contains(action)
|
|| shortcut_search_actions.contains(action)
|
||||||
})
|
})
|
||||||
.fold(Slab::new(), |mut slab, (_, action)| {
|
.fold(
|
||||||
slab.insert(ShortcutModel::new(
|
Slab::with_capacity(self.actions.len()),
|
||||||
&self.defaults,
|
|mut slab, (_, action)| {
|
||||||
&self.shortcuts,
|
slab.insert(ShortcutModel::new(
|
||||||
action.clone(),
|
&self.defaults,
|
||||||
));
|
&self.shortcuts,
|
||||||
|
action.clone(),
|
||||||
|
));
|
||||||
|
|
||||||
slab
|
slab
|
||||||
})
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shortcuts() -> Section<crate::pages::Message> {
|
fn shortcuts() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
accessibility = fl!("accessibility");
|
||||||
let accessibility = descriptions.insert(fl!("accessibility"));
|
custom_label = fl!("custom");
|
||||||
let custom_label = descriptions.insert(fl!("custom"));
|
manage_window_label = fl!("manage-windows");
|
||||||
let manage_window_label = descriptions.insert(fl!("manage-windows"));
|
move_window_label = fl!("move-windows");
|
||||||
let move_window_label = descriptions.insert(fl!("move-windows"));
|
nav_label = fl!("nav-shortcuts");
|
||||||
let nav_label = descriptions.insert(fl!("nav-shortcuts"));
|
system_label = fl!("system-shortcut");
|
||||||
let system_label = descriptions.insert(fl!("system-shortcut"));
|
window_tiling_label = fl!("window-tiling");
|
||||||
let window_tiling_label = descriptions.insert(fl!("window-tiling"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -434,7 +437,7 @@ fn shortcuts() -> Section<crate::pages::Message> {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
|
|
||||||
let search = widget::search_input("", &page.search.input)
|
let search = widget::search_input("", &page.search.input)
|
||||||
.width(314)
|
.width(314.)
|
||||||
.on_clear(Message::Search(String::new()))
|
.on_clear(Message::Search(String::new()))
|
||||||
.on_input(Message::Search)
|
.on_input(Message::Search)
|
||||||
.apply(widget::container)
|
.apply(widget::container)
|
||||||
|
|
@ -500,7 +503,7 @@ fn category_item(category: Category, name: &str, modified: u16) -> Element<'_, M
|
||||||
let control = if modified == 0 {
|
let control = if modified == 0 {
|
||||||
Element::from(icon)
|
Element::from(icon)
|
||||||
} else {
|
} else {
|
||||||
widget::row()
|
widget::row::with_capacity(2)
|
||||||
.push(text::body(fl!("modified", count = modified)))
|
.push(text::body(fl!("modified", count = modified)))
|
||||||
.push(icon)
|
.push(icon)
|
||||||
.into()
|
.into()
|
||||||
|
|
@ -513,6 +516,7 @@ fn category_item(category: Category, name: &str, modified: u16) -> Element<'_, M
|
||||||
.class(theme::Container::List)
|
.class(theme::Container::List)
|
||||||
.apply(widget::button::custom)
|
.apply(widget::button::custom)
|
||||||
.class(theme::Button::Transparent)
|
.class(theme::Button::Transparent)
|
||||||
|
.width(Length::Fill)
|
||||||
.on_press(Message::Category(category))
|
.on_press(Message::Category(category))
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
//
|
//
|
||||||
use super::{ShortcutMessage, ShortcutModel};
|
use super::{ShortcutMessage, ShortcutModel};
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
|
||||||
use cosmic::{Element, Task, app::ContextDrawer};
|
use cosmic::{Element, Task, app::ContextDrawer};
|
||||||
use cosmic_settings_config::shortcuts::Action;
|
use cosmic_settings_config::shortcuts::Action;
|
||||||
use cosmic_settings_config::shortcuts::action::Direction;
|
use cosmic_settings_config::shortcuts::action::Direction;
|
||||||
|
|
@ -16,10 +17,13 @@ impl Default for Page {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
model: super::Model::default().actions(|defaults, keybindings| {
|
model: super::Model::default().actions(|defaults, keybindings| {
|
||||||
actions().iter().fold(Slab::new(), |mut slab, action| {
|
actions().iter().cloned().fold(
|
||||||
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
|
Slab::with_capacity(actions().len()),
|
||||||
slab
|
|mut slab, action| {
|
||||||
})
|
slab.insert(ShortcutModel::new(defaults, keybindings, action));
|
||||||
|
slab
|
||||||
|
},
|
||||||
|
)
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -70,10 +74,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
||||||
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
||||||
self.model.on_clear();
|
self.model.on_clear();
|
||||||
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
||||||
false,
|
|
||||||
)
|
|
||||||
.discard()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
|
|
@ -116,7 +117,7 @@ pub const fn actions() -> &'static [Action] {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shortcuts() -> Section<crate::pages::Message> {
|
fn shortcuts() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
let mut descriptions = Slab::with_capacity(actions().len());
|
||||||
|
|
||||||
// Make these searchable in the global settings search.
|
// Make these searchable in the global settings search.
|
||||||
for action in actions() {
|
for action in actions() {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
use super::{ShortcutMessage, ShortcutModel};
|
use super::{ShortcutMessage, ShortcutModel};
|
||||||
use cosmic::app::ContextDrawer;
|
use cosmic::app::ContextDrawer;
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
|
||||||
use cosmic::{Element, Task};
|
use cosmic::{Element, Task};
|
||||||
use cosmic_settings_config::shortcuts::Action;
|
use cosmic_settings_config::shortcuts::Action;
|
||||||
use cosmic_settings_config::shortcuts::action::{Direction, FocusDirection};
|
use cosmic_settings_config::shortcuts::action::{Direction, FocusDirection};
|
||||||
|
|
@ -17,10 +18,13 @@ impl Default for Page {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
model: super::Model::default().actions(|defaults, keybindings| {
|
model: super::Model::default().actions(|defaults, keybindings| {
|
||||||
actions().iter().fold(Slab::new(), |mut slab, action| {
|
actions().iter().cloned().fold(
|
||||||
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
|
Slab::with_capacity(actions().len()),
|
||||||
slab
|
|mut slab, action| {
|
||||||
})
|
slab.insert(ShortcutModel::new(defaults, keybindings, action));
|
||||||
|
slab
|
||||||
|
},
|
||||||
|
)
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -71,10 +75,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
||||||
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
||||||
self.model.on_clear();
|
self.model.on_clear();
|
||||||
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
||||||
false,
|
|
||||||
)
|
|
||||||
.discard()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
|
|
@ -119,7 +120,7 @@ pub const fn actions() -> &'static [Action] {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shortcuts() -> Section<crate::pages::Message> {
|
fn shortcuts() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
let mut descriptions = Slab::with_capacity(actions().len());
|
||||||
|
|
||||||
// Make these searchable in the global settings search.
|
// Make these searchable in the global settings search.
|
||||||
for action in actions() {
|
for action in actions() {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use super::{ShortcutMessage, ShortcutModel};
|
use super::{ShortcutMessage, ShortcutModel};
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
|
||||||
use cosmic::{Element, Task, app::ContextDrawer};
|
use cosmic::{Element, Task, app::ContextDrawer};
|
||||||
use cosmic_settings_config::shortcuts::Action;
|
use cosmic_settings_config::shortcuts::Action;
|
||||||
use cosmic_settings_config::shortcuts::action::System as SystemAction;
|
use cosmic_settings_config::shortcuts::action::System as SystemAction;
|
||||||
|
|
@ -16,10 +17,13 @@ impl Default for Page {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
model: super::Model::default().actions(|defaults, keybindings| {
|
model: super::Model::default().actions(|defaults, keybindings| {
|
||||||
actions().iter().fold(Slab::new(), |mut slab, action| {
|
actions().iter().cloned().fold(
|
||||||
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
|
Slab::with_capacity(actions().len()),
|
||||||
slab
|
|mut slab, action| {
|
||||||
})
|
slab.insert(ShortcutModel::new(defaults, keybindings, action));
|
||||||
|
slab
|
||||||
|
},
|
||||||
|
)
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -70,10 +74,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
||||||
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
||||||
self.model.on_clear();
|
self.model.on_clear();
|
||||||
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
||||||
false,
|
|
||||||
)
|
|
||||||
.discard()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
|
|
@ -122,7 +123,7 @@ pub const fn actions() -> &'static [Action] {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shortcuts() -> Section<crate::pages::Message> {
|
fn shortcuts() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
let mut descriptions = Slab::with_capacity(actions().len());
|
||||||
|
|
||||||
// Make these searchable in the global settings search.
|
// Make these searchable in the global settings search.
|
||||||
for action in actions() {
|
for action in actions() {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use super::{ShortcutMessage, ShortcutModel};
|
use super::{ShortcutMessage, ShortcutModel};
|
||||||
|
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
|
||||||
use cosmic::{Element, Task, app::ContextDrawer};
|
use cosmic::{Element, Task, app::ContextDrawer};
|
||||||
use cosmic_settings_config::shortcuts::Action;
|
use cosmic_settings_config::shortcuts::Action;
|
||||||
use cosmic_settings_config::shortcuts::action::Orientation;
|
use cosmic_settings_config::shortcuts::action::Orientation;
|
||||||
|
|
@ -16,10 +17,13 @@ impl Default for Page {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
model: super::Model::default().actions(|defaults, keybindings| {
|
model: super::Model::default().actions(|defaults, keybindings| {
|
||||||
actions().iter().fold(Slab::new(), |mut slab, action| {
|
actions().iter().cloned().fold(
|
||||||
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
|
Slab::with_capacity(actions().len()),
|
||||||
slab
|
|mut slab, action| {
|
||||||
})
|
slab.insert(ShortcutModel::new(defaults, keybindings, action));
|
||||||
|
slab
|
||||||
|
},
|
||||||
|
)
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -70,10 +74,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
||||||
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
fn on_leave(&mut self) -> Task<crate::pages::Message> {
|
||||||
self.model.on_clear();
|
self.model.on_clear();
|
||||||
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
|
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
|
||||||
false,
|
|
||||||
)
|
|
||||||
.discard()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
|
|
@ -103,7 +104,7 @@ pub fn actions() -> &'static [Action] {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shortcuts() -> Section<crate::pages::Message> {
|
fn shortcuts() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
let mut descriptions = Slab::with_capacity(actions().len());
|
||||||
|
|
||||||
// Make these searchable in the global settings search.
|
// Make these searchable in the global settings search.
|
||||||
for action in actions() {
|
for action in actions() {
|
||||||
|
|
|
||||||
|
|
@ -188,7 +188,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
// XXX icon?
|
// XXX icon?
|
||||||
page::Info::new("input-devices", "preferences-input-devices-symbolic")
|
page::Info::new("input-devices", "preferences-input-devices-symbolic")
|
||||||
.title(fl!("input-devices"))
|
.title(fl!("input-devices"))
|
||||||
.description(fl!("input-devices", "desc"))
|
.description(fl!("xdg-entry-input-comment"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ use cosmic::{Apply, Element};
|
||||||
use cosmic_comp_config::input::AccelProfile;
|
use cosmic_comp_config::input::AccelProfile;
|
||||||
use cosmic_settings_page::Section;
|
use cosmic_settings_page::Section;
|
||||||
use cosmic_settings_page::{self as page, section};
|
use cosmic_settings_page::{self as page, section};
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
|
|
||||||
use super::Message;
|
use super::Message;
|
||||||
|
|
@ -41,19 +40,19 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("mouse", "input-mouse-symbolic")
|
page::Info::new("mouse", "input-mouse-symbolic")
|
||||||
.title(fl!("mouse"))
|
.title(fl!("mouse"))
|
||||||
.description(fl!("mouse", "desc"))
|
.description(fl!("xdg-entry-mouse-comment"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl page::AutoBind<crate::pages::Message> for Page {}
|
impl page::AutoBind<crate::pages::Message> for Page {}
|
||||||
|
|
||||||
fn mouse() -> Section<crate::pages::Message> {
|
fn mouse() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
mouse_acceleration = fl!("mouse", "acceleration");
|
||||||
let mouse_acceleration = descriptions.insert(fl!("mouse", "acceleration"));
|
mouse_speed = fl!("mouse", "speed");
|
||||||
let mouse_speed = descriptions.insert(fl!("mouse", "speed"));
|
primary_button = fl!("primary-button");
|
||||||
let primary_button = descriptions.insert(fl!("primary-button"));
|
acceleration_desc = fl!("acceleration-desc");
|
||||||
let acceleration_desc = descriptions.insert(fl!("acceleration-desc"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -63,12 +62,15 @@ fn mouse() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&descriptions[primary_button],
|
settings::flex_item(
|
||||||
cosmic::widget::segmented_control::horizontal(&input.primary_button)
|
&descriptions[primary_button],
|
||||||
.minimum_button_width(0)
|
cosmic::widget::segmented_control::horizontal(&input.primary_button)
|
||||||
.on_activate(|x| Message::PrimaryButtonSelected(x, false)),
|
.minimum_button_width(0)
|
||||||
))
|
.on_activate(|x| Message::PrimaryButtonSelected(x, false)),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center),
|
||||||
|
)
|
||||||
.add(
|
.add(
|
||||||
settings::item::builder(&descriptions[mouse_speed]).flex_control({
|
settings::item::builder(&descriptions[mouse_speed]).flex_control({
|
||||||
let value = (input
|
let value = (input
|
||||||
|
|
@ -116,11 +118,11 @@ fn mouse() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scrolling() -> Section<crate::pages::Message> {
|
fn scrolling() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
natural = fl!("scrolling", "natural");
|
||||||
let natural = descriptions.insert(fl!("scrolling", "natural"));
|
natural_desc = fl!("scrolling", "natural-desc");
|
||||||
let natural_desc = descriptions.insert(fl!("scrolling", "natural-desc"));
|
scroll_speed = fl!("scrolling", "speed");
|
||||||
let scroll_speed = descriptions.insert(fl!("scrolling", "speed"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("scrolling"))
|
.title(fl!("scrolling"))
|
||||||
|
|
@ -131,35 +133,39 @@ fn scrolling() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::flex_item(&descriptions[scroll_speed], {
|
.add(
|
||||||
let value = input
|
settings::item::builder(&descriptions[scroll_speed])
|
||||||
.input_default
|
.flex_control({
|
||||||
.scroll_config
|
let value = input
|
||||||
.as_ref()
|
.input_default
|
||||||
.and_then(|x| x.scroll_factor)
|
.scroll_config
|
||||||
.unwrap_or(1.)
|
.as_ref()
|
||||||
.log(2.)
|
.and_then(|x| x.scroll_factor)
|
||||||
* 10.0
|
.unwrap_or(1.)
|
||||||
+ 50.0;
|
.log(2.)
|
||||||
|
* 10.0
|
||||||
|
+ 50.0;
|
||||||
|
|
||||||
let slider = widget::slider(1.0..=100.0, value, |value| {
|
let slider = widget::slider(1.0..=100.0, value, |value| {
|
||||||
Message::SetScrollFactor(2f64.powf((value - 50.0) / 10.0), false)
|
Message::SetScrollFactor(2f64.powf((value - 50.0) / 10.0), false)
|
||||||
})
|
})
|
||||||
.width(Length::Fill)
|
.width(Length::Fill)
|
||||||
.breakpoints(&[50.0])
|
.breakpoints(&[50.0])
|
||||||
.apply(widget::container)
|
.apply(widget::container)
|
||||||
.max_width(250);
|
.max_width(250);
|
||||||
|
|
||||||
row::with_capacity(2)
|
row::with_capacity(2)
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
.spacing(8)
|
.spacing(8)
|
||||||
.push(
|
.push(
|
||||||
text::body(format!("{:.0}", value.round()))
|
text::body(format!("{:.0}", value.round()))
|
||||||
.width(Length::Fixed(22.0))
|
.width(Length::Fixed(22.0))
|
||||||
.align_x(Alignment::Center),
|
.align_x(Alignment::Center),
|
||||||
)
|
)
|
||||||
.push(slider)
|
.push(slider)
|
||||||
}))
|
})
|
||||||
|
.align_items(Alignment::Center),
|
||||||
|
)
|
||||||
.add(
|
.add(
|
||||||
settings::item::builder(&descriptions[natural])
|
settings::item::builder(&descriptions[natural])
|
||||||
.description(&descriptions[natural_desc])
|
.description(&descriptions[natural_desc])
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ use cosmic_comp_config::input::{AccelProfile, ClickMethod, ScrollMethod};
|
||||||
use cosmic_comp_config::workspace::{WorkspaceConfig, WorkspaceLayout};
|
use cosmic_comp_config::workspace::{WorkspaceConfig, WorkspaceLayout};
|
||||||
use cosmic_settings_page::Section;
|
use cosmic_settings_page::Section;
|
||||||
use cosmic_settings_page::{self as page, section};
|
use cosmic_settings_page::{self as page, section};
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
||||||
|
|
@ -52,21 +51,21 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("touchpad", "input-touchpad-symbolic")
|
page::Info::new("touchpad", "input-touchpad-symbolic")
|
||||||
.title(fl!("touchpad"))
|
.title(fl!("touchpad"))
|
||||||
.description(fl!("touchpad", "desc"))
|
.description(fl!("xdg-entry-touchpad-comment"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl page::AutoBind<crate::pages::Message> for Page {}
|
impl page::AutoBind<crate::pages::Message> for Page {}
|
||||||
|
|
||||||
fn touchpad() -> Section<crate::pages::Message> {
|
fn touchpad() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
primary_button = fl!("primary-button");
|
||||||
let primary_button = descriptions.insert(fl!("primary-button"));
|
primary_button_desc = fl!("primary-button", "desc");
|
||||||
let primary_button_desc = descriptions.insert(fl!("primary-button", "desc"));
|
touchpad_speed = fl!("touchpad", "speed");
|
||||||
let touchpad_speed = descriptions.insert(fl!("touchpad", "speed"));
|
acceleration = fl!("touchpad", "acceleration");
|
||||||
let acceleration = descriptions.insert(fl!("touchpad", "acceleration"));
|
acceleration_desc = fl!("acceleration-desc");
|
||||||
let acceleration_desc = descriptions.insert(fl!("acceleration-desc"));
|
disable_while_typing = fl!("disable-while-typing");
|
||||||
let disable_while_typing = descriptions.insert(fl!("disable-while-typing"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -148,12 +147,12 @@ fn touchpad() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn click_behavior() -> Section<crate::pages::Message> {
|
fn click_behavior() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
click_finger = fl!("click-behavior", "click-finger");
|
||||||
let click_finger = descriptions.insert(fl!("click-behavior", "click-finger"));
|
button_areas = fl!("click-behavior", "button-areas");
|
||||||
let button_areas = descriptions.insert(fl!("click-behavior", "button-areas"));
|
tap_to_click = fl!("tap-to-click");
|
||||||
let tap_to_click = descriptions.insert(fl!("tap-to-click"));
|
_tap_to_click_desc = fl!("tap-to-click", "desc");
|
||||||
let _tap_to_click_desc = descriptions.insert(fl!("tap-to-click", "desc"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("click-behavior"))
|
.title(fl!("click-behavior"))
|
||||||
|
|
@ -167,27 +166,17 @@ fn click_behavior() -> Section<crate::pages::Message> {
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(&*section.title)
|
.title(&*section.title)
|
||||||
// Secondary click via two fingers, and middle-click via three fingers
|
// Secondary click via two fingers, and middle-click via three fingers
|
||||||
.add(settings::item_row(vec![
|
.add(settings::item::builder(&descriptions[click_finger]).radio(
|
||||||
widget::radio(
|
ClickMethod::Clickfinger,
|
||||||
text::body(&descriptions[click_finger]),
|
page.input_touchpad.click_method,
|
||||||
ClickMethod::Clickfinger,
|
|option| Message::SetSecondaryClickBehavior(Some(option), true),
|
||||||
page.input_touchpad.click_method,
|
))
|
||||||
|option| Message::SetSecondaryClickBehavior(Some(option), true),
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
// Secondary and middle-click via button areas.
|
// Secondary and middle-click via button areas.
|
||||||
.add(settings::item_row(vec![
|
.add(settings::item::builder(&descriptions[button_areas]).radio(
|
||||||
widget::radio(
|
ClickMethod::ButtonAreas,
|
||||||
text::body(&descriptions[button_areas]),
|
page.input_touchpad.click_method,
|
||||||
ClickMethod::ButtonAreas,
|
|option| Message::SetSecondaryClickBehavior(Some(option), true),
|
||||||
page.input_touchpad.click_method,
|
))
|
||||||
|option| Message::SetSecondaryClickBehavior(Some(option), true),
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
.add(
|
.add(
|
||||||
settings::item::builder(&descriptions[tap_to_click]).toggler(
|
settings::item::builder(&descriptions[tap_to_click]).toggler(
|
||||||
page.input_touchpad
|
page.input_touchpad
|
||||||
|
|
@ -203,13 +192,13 @@ fn click_behavior() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scrolling() -> Section<crate::pages::Message> {
|
fn scrolling() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
edge = fl!("scrolling", "edge");
|
||||||
let edge = descriptions.insert(fl!("scrolling", "edge"));
|
natural = fl!("scrolling", "natural");
|
||||||
let natural = descriptions.insert(fl!("scrolling", "natural"));
|
natural_desc = fl!("scrolling", "natural-desc");
|
||||||
let natural_desc = descriptions.insert(fl!("scrolling", "natural-desc"));
|
scroll_speed = fl!("scrolling", "speed");
|
||||||
let scroll_speed = descriptions.insert(fl!("scrolling", "speed"));
|
two_finger = fl!("scrolling", "two-finger");
|
||||||
let two_finger = descriptions.insert(fl!("scrolling", "two-finger"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("scrolling"))
|
.title(fl!("scrolling"))
|
||||||
|
|
@ -223,33 +212,27 @@ fn scrolling() -> Section<crate::pages::Message> {
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
// Two-finger scrolling toggle
|
// Two-finger scrolling toggle
|
||||||
.add(settings::item_row(vec![
|
.add(
|
||||||
widget::radio(
|
settings::item::builder(&descriptions[two_finger]).radio(
|
||||||
text::body(&descriptions[two_finger]),
|
|
||||||
ScrollMethod::TwoFinger,
|
ScrollMethod::TwoFinger,
|
||||||
page.input_touchpad
|
page.input_touchpad
|
||||||
.scroll_config
|
.scroll_config
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|x| x.method),
|
.and_then(|x| x.method),
|
||||||
|option| Message::SetScrollMethod(Some(option), true),
|
|option| Message::SetScrollMethod(Some(option), true),
|
||||||
)
|
),
|
||||||
.width(Length::Fill)
|
)
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
// Edge scrolling toggle
|
// Edge scrolling toggle
|
||||||
.add(settings::item_row(vec![
|
.add(
|
||||||
widget::radio(
|
settings::item::builder(&descriptions[edge]).radio(
|
||||||
text::body(&descriptions[edge]),
|
|
||||||
ScrollMethod::Edge,
|
ScrollMethod::Edge,
|
||||||
page.input_touchpad
|
page.input_touchpad
|
||||||
.scroll_config
|
.scroll_config
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|x| x.method),
|
.and_then(|x| x.method),
|
||||||
|option| Message::SetScrollMethod(Some(option), true),
|
|option| Message::SetScrollMethod(Some(option), true),
|
||||||
)
|
),
|
||||||
.width(Length::Fill)
|
)
|
||||||
.into(),
|
|
||||||
]))
|
|
||||||
// Scroll speed slider
|
// Scroll speed slider
|
||||||
.add(settings::item(&descriptions[scroll_speed], {
|
.add(settings::item(&descriptions[scroll_speed], {
|
||||||
let value = page
|
let value = page
|
||||||
|
|
@ -298,7 +281,11 @@ fn scrolling() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn gestures() -> Section<crate::pages::Message> {
|
fn gestures() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
switch_workspaces = fl!("switch-workspaces");
|
||||||
|
switch_workspaces_horizontal = fl!("switch-workspaces", "horizontal");
|
||||||
|
switch_workspaces_vertical = fl!("switch-workspaces", "vertical");
|
||||||
|
});
|
||||||
|
|
||||||
// let four_finger_down = descriptions.insert(fl!("gestures", "four-finger-down"));
|
// let four_finger_down = descriptions.insert(fl!("gestures", "four-finger-down"));
|
||||||
// let four_finger_left = descriptions.insert(fl!("gestures", "four-finger-left"));
|
// let four_finger_left = descriptions.insert(fl!("gestures", "four-finger-left"));
|
||||||
|
|
@ -310,10 +297,6 @@ fn gestures() -> Section<crate::pages::Message> {
|
||||||
// let open_workspaces_view = descriptions.insert(fl!("open-workspaces-view"));
|
// let open_workspaces_view = descriptions.insert(fl!("open-workspaces-view"));
|
||||||
// let switch_between_windows = descriptions.insert(fl!("switch-between-windows"));
|
// let switch_between_windows = descriptions.insert(fl!("switch-between-windows"));
|
||||||
|
|
||||||
let switch_workspaces = descriptions.insert(fl!("switch-workspaces"));
|
|
||||||
let switch_workspaces_horizontal = descriptions.insert(fl!("switch-workspaces", "horizontal"));
|
|
||||||
let switch_workspaces_vertical = descriptions.insert(fl!("switch-workspaces", "vertical"));
|
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("gestures"))
|
.title(fl!("gestures"))
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
|
||||||
|
|
@ -103,6 +103,8 @@ pub enum Message {
|
||||||
WindowManagement(desktop::window_management::Message),
|
WindowManagement(desktop::window_management::Message),
|
||||||
#[cfg(feature = "page-networking")]
|
#[cfg(feature = "page-networking")]
|
||||||
Wired(networking::wired::Message),
|
Wired(networking::wired::Message),
|
||||||
|
#[cfg(feature = "page-workspaces")]
|
||||||
|
Workspaces(desktop::workspaces::Message),
|
||||||
|
|
||||||
// Common page functionality
|
// Common page functionality
|
||||||
CloseContextDrawer,
|
CloseContextDrawer,
|
||||||
|
|
|
||||||
|
|
@ -84,9 +84,9 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
|
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
|
||||||
) -> Option<page::Content> {
|
) -> Option<page::Content> {
|
||||||
crate::slab!(descriptions {
|
crate::slab!(descriptions {
|
||||||
wifi_desc = fl!("connections-and-profiles", variant = "wifi");
|
wifi_desc = fl!("xdg-entry-wireless-comment");
|
||||||
wired_desc = fl!("connections-and-profiles", variant = "wired");
|
wired_desc = fl!("xdg-entry-wired-comment");
|
||||||
vpn_desc = fl!("connections-and-profiles", variant = "vpn");
|
vpn_desc = fl!("xdg-entry-vpn-comment");
|
||||||
});
|
});
|
||||||
|
|
||||||
let device_list = Section::default().descriptions(descriptions).view::<Self>(
|
let device_list = Section::default().descriptions(descriptions).view::<Self>(
|
||||||
|
|
@ -202,7 +202,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
||||||
let device_list = wifi_devices
|
let device_list = wifi_devices
|
||||||
.chain(wired_devices)
|
.chain(wired_devices)
|
||||||
.fold(widget::column(), |column, device| column.push(device))
|
.fold(widget::column([]), |column, device| column.push(device))
|
||||||
.push(crate::widget::page_list_item(
|
.push(crate::widget::page_list_item(
|
||||||
fl!("vpn"),
|
fl!("vpn"),
|
||||||
&descs[vpn_desc],
|
&descs[vpn_desc],
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,11 @@ use std::sync::{Arc, LazyLock};
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use cosmic::dialog::file_chooser::FileFilter;
|
use cosmic::dialog::file_chooser::FileFilter;
|
||||||
use cosmic::task;
|
use cosmic::task;
|
||||||
use cosmic::widget::text_input::focus;
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element, Task,
|
Apply, Element, Task,
|
||||||
|
iced::core::text::Wrapping,
|
||||||
iced::{Alignment, Length},
|
iced::{Alignment, Length},
|
||||||
iced_core::text::Wrapping,
|
widget::{self, icon, space::horizontal as horizontal_space, text_input::focus},
|
||||||
widget::{self, icon},
|
|
||||||
};
|
};
|
||||||
use cosmic_settings_network_manager_subscription::nm_secret_agent::{self, PasswordFlag};
|
use cosmic_settings_network_manager_subscription::nm_secret_agent::{self, PasswordFlag};
|
||||||
use cosmic_settings_network_manager_subscription::{
|
use cosmic_settings_network_manager_subscription::{
|
||||||
|
|
@ -211,7 +210,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> cosmic_settings_page::Info {
|
fn info(&self) -> cosmic_settings_page::Info {
|
||||||
page::Info::new("vpn", "preferences-vpn-symbolic")
|
page::Info::new("vpn", "preferences-vpn-symbolic")
|
||||||
.title(fl!("vpn"))
|
.title(fl!("vpn"))
|
||||||
.description(fl!("connections-and-profiles", variant = "vpn"))
|
.description(fl!("xdg-entry-vpn-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn content(
|
fn content(
|
||||||
|
|
@ -841,12 +840,12 @@ impl Page {
|
||||||
Message::FocusSecureInput => {
|
Message::FocusSecureInput => {
|
||||||
// retry until the widget is in the tree and focused or the dialog is removed.
|
// retry until the widget is in the tree and focused or the dialog is removed.
|
||||||
if matches!(self.dialog, Some(VpnDialog::Password { .. })) {
|
if matches!(self.dialog, Some(VpnDialog::Password { .. })) {
|
||||||
return cosmic::iced_runtime::task::widget(
|
return cosmic::iced::runtime::task::widget(
|
||||||
cosmic::iced_core::widget::operation::focusable::find_focused(),
|
cosmic::iced::core::widget::operation::focusable::find_focused(),
|
||||||
)
|
)
|
||||||
.collect()
|
.collect()
|
||||||
.then(|id| {
|
.then(|id| {
|
||||||
if id.get(0).is_some_and(|id| *id == SECURE_INPUT_VPN.clone()) {
|
if id.first().is_some_and(|id| *id == SECURE_INPUT_VPN.clone()) {
|
||||||
Task::none()
|
Task::none()
|
||||||
} else {
|
} else {
|
||||||
focus(SECURE_INPUT_VPN.clone())
|
focus(SECURE_INPUT_VPN.clone())
|
||||||
|
|
@ -991,7 +990,7 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
ref active_conns, ..
|
ref active_conns, ..
|
||||||
}) = page.nm_state
|
}) = page.nm_state
|
||||||
else {
|
else {
|
||||||
return cosmic::widget::column().into();
|
return cosmic::widget::space().into();
|
||||||
};
|
};
|
||||||
|
|
||||||
let spacing = cosmic::theme::spacing();
|
let spacing = cosmic::theme::spacing();
|
||||||
|
|
@ -1051,7 +1050,7 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
.position(widget::popover::Position::Bottom)
|
.position(widget::popover::Position::Bottom)
|
||||||
.on_close(Message::ViewMore(None))
|
.on_close(Message::ViewMore(None))
|
||||||
.popup(
|
.popup(
|
||||||
widget::column()
|
widget::column::with_capacity(3)
|
||||||
.push_maybe(is_connected.then(|| {
|
.push_maybe(is_connected.then(|| {
|
||||||
popup_button(
|
popup_button(
|
||||||
Message::Deactivate(uuid.clone()),
|
Message::Deactivate(uuid.clone()),
|
||||||
|
|
@ -1086,7 +1085,7 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
let widget = widget::settings::item_row(vec![
|
let widget = widget::settings::item_row(vec![
|
||||||
identifier.into(),
|
identifier.into(),
|
||||||
widget::horizontal_space().into(),
|
horizontal_space().into(),
|
||||||
controls.into(),
|
controls.into(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,17 +10,15 @@ use anyhow::Context;
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element, Task,
|
Apply, Element, Task,
|
||||||
app::ContextDrawer,
|
app::ContextDrawer,
|
||||||
iced::{Alignment, Length},
|
iced::core::text::Wrapping,
|
||||||
iced_core::text::Wrapping,
|
iced::{Alignment, Length, widget::operation::focus_next},
|
||||||
iced_widget::focus_next,
|
|
||||||
task,
|
task,
|
||||||
widget::{self, column, icon, text_input::focus},
|
widget::{self, column, icon, space::horizontal, text_input::focus},
|
||||||
};
|
};
|
||||||
use cosmic_settings_network_manager_subscription::{
|
use cosmic_settings_network_manager_subscription::{
|
||||||
self as network_manager, NetworkManagerState,
|
self as network_manager, NetworkManagerState,
|
||||||
available_wifi::{AccessPoint, NetworkType},
|
available_wifi::{AccessPoint, NetworkType},
|
||||||
current_networks::ActiveConnectionInfo,
|
current_networks::ActiveConnectionInfo,
|
||||||
hw_address::HwAddress,
|
|
||||||
nm_secret_agent,
|
nm_secret_agent,
|
||||||
};
|
};
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
|
|
@ -84,6 +82,8 @@ pub enum Message {
|
||||||
ViewMore(Option<network_manager::SSID>),
|
ViewMore(Option<network_manager::SSID>),
|
||||||
/// Toggle WiFi access
|
/// Toggle WiFi access
|
||||||
WiFiEnable(bool),
|
WiFiEnable(bool),
|
||||||
|
/// Update search query for filtering networks
|
||||||
|
SearchQuery(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Message> for crate::app::Message {
|
impl From<Message> for crate::app::Message {
|
||||||
|
|
@ -103,7 +103,6 @@ enum WiFiDialog {
|
||||||
Forget(network_manager::SSID),
|
Forget(network_manager::SSID),
|
||||||
Password {
|
Password {
|
||||||
ssid: network_manager::SSID,
|
ssid: network_manager::SSID,
|
||||||
hw_address: HwAddress,
|
|
||||||
identity: Option<String>,
|
identity: Option<String>,
|
||||||
password: SecureString,
|
password: SecureString,
|
||||||
password_hidden: bool,
|
password_hidden: bool,
|
||||||
|
|
@ -139,6 +138,8 @@ pub struct Page {
|
||||||
qr_code_data: Option<widget::qr_code::Data>,
|
qr_code_data: Option<widget::qr_code::Data>,
|
||||||
/// QR code context drawer state
|
/// QR code context drawer state
|
||||||
qr_drawer: Option<QRCodeDrawer>,
|
qr_drawer: Option<QRCodeDrawer>,
|
||||||
|
/// Search query for filtering WiFi networks
|
||||||
|
search_query: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -159,7 +160,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> cosmic_settings_page::Info {
|
fn info(&self) -> cosmic_settings_page::Info {
|
||||||
page::Info::new("wifi", "preferences-wireless-symbolic")
|
page::Info::new("wifi", "preferences-wireless-symbolic")
|
||||||
.title(fl!("wifi"))
|
.title(fl!("wifi"))
|
||||||
.description(fl!("connections-and-profiles", variant = "wifi"))
|
.description(fl!("xdg-entry-wireless-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn content(
|
fn content(
|
||||||
|
|
@ -194,7 +195,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
widget::button::standard(fl!("cancel")).on_press(Message::CancelDialog);
|
widget::button::standard(fl!("cancel")).on_press(Message::CancelDialog);
|
||||||
|
|
||||||
let control: Element<_> = if let Some(identity) = identity {
|
let control: Element<_> = if let Some(identity) = identity {
|
||||||
column::column()
|
column::with_capacity(2)
|
||||||
.spacing(8)
|
.spacing(8)
|
||||||
.push(
|
.push(
|
||||||
widget::text_input::text_input(fl!("identity"), identity)
|
widget::text_input::text_input(fl!("identity"), identity)
|
||||||
|
|
@ -262,7 +263,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
info_items = info_items.add(widget::settings::item(fl!("password"), pass.unsecure()));
|
info_items = info_items.add(widget::settings::item(fl!("password"), pass.unsecure()));
|
||||||
}
|
}
|
||||||
|
|
||||||
let content = column::column()
|
let content = column::with_capacity(3)
|
||||||
.spacing(spacing.space_s)
|
.spacing(spacing.space_s)
|
||||||
.push(qr_section)
|
.push(qr_section)
|
||||||
.push(description)
|
.push(description)
|
||||||
|
|
@ -322,6 +323,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
self.connecting.clear();
|
self.connecting.clear();
|
||||||
self.withheld_state = None;
|
self.withheld_state = None;
|
||||||
self.withheld_devices = None;
|
self.withheld_devices = None;
|
||||||
|
self.search_query.clear();
|
||||||
|
|
||||||
if let Some(cancel) = self.nm_task.take() {
|
if let Some(cancel) = self.nm_task.take() {
|
||||||
_ = cancel.send(());
|
_ = cancel.send(());
|
||||||
|
|
@ -353,12 +355,7 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
match req {
|
match req {
|
||||||
network_manager::Request::Authenticate {
|
network_manager::Request::Authenticate { ssid, identity, .. } => {
|
||||||
ssid,
|
|
||||||
identity,
|
|
||||||
hw_address,
|
|
||||||
..
|
|
||||||
} => {
|
|
||||||
if success {
|
if success {
|
||||||
self.connecting.remove(ssid.as_str());
|
self.connecting.remove(ssid.as_str());
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -366,7 +363,6 @@ impl Page {
|
||||||
self.dialog = Some(WiFiDialog::Password {
|
self.dialog = Some(WiFiDialog::Password {
|
||||||
ssid: ssid.into(),
|
ssid: ssid.into(),
|
||||||
identity,
|
identity,
|
||||||
hw_address,
|
|
||||||
password: SecureString::from(""),
|
password: SecureString::from(""),
|
||||||
password_hidden: true,
|
password_hidden: true,
|
||||||
tx: Arc::new(Mutex::new(None)),
|
tx: Arc::new(Mutex::new(None)),
|
||||||
|
|
@ -377,9 +373,9 @@ impl Page {
|
||||||
|
|
||||||
network_manager::Request::SelectAccessPoint(
|
network_manager::Request::SelectAccessPoint(
|
||||||
ssid,
|
ssid,
|
||||||
hw_address,
|
|
||||||
network_type,
|
network_type,
|
||||||
_tx,
|
_tx,
|
||||||
|
_interface,
|
||||||
) => {
|
) => {
|
||||||
if success || matches!(network_type, NetworkType::Open) {
|
if success || matches!(network_type, NetworkType::Open) {
|
||||||
self.connecting.remove(ssid.as_ref());
|
self.connecting.remove(ssid.as_ref());
|
||||||
|
|
@ -388,7 +384,6 @@ impl Page {
|
||||||
ssid,
|
ssid,
|
||||||
identity: matches!(network_type, NetworkType::EAP)
|
identity: matches!(network_type, NetworkType::EAP)
|
||||||
.then(String::new),
|
.then(String::new),
|
||||||
hw_address,
|
|
||||||
password: SecureString::from(""),
|
password: SecureString::from(""),
|
||||||
password_hidden: true,
|
password_hidden: true,
|
||||||
tx: Arc::new(Mutex::new(None)),
|
tx: Arc::new(Mutex::new(None)),
|
||||||
|
|
@ -456,7 +451,7 @@ impl Page {
|
||||||
let escaped_ssid = escape_wifi_qr_string(ssid.as_ref());
|
let escaped_ssid = escape_wifi_qr_string(ssid.as_ref());
|
||||||
let qr_string = if let Some(ref pass) = password {
|
let qr_string = if let Some(ref pass) = password {
|
||||||
let security = match security_type {
|
let security = match security_type {
|
||||||
NetworkType::PSK => "WPA",
|
NetworkType::PskOrSae => "WPA",
|
||||||
NetworkType::EAP => "WPA",
|
NetworkType::EAP => "WPA",
|
||||||
NetworkType::Open => "",
|
NetworkType::Open => "",
|
||||||
};
|
};
|
||||||
|
|
@ -499,9 +494,9 @@ impl Page {
|
||||||
.sender
|
.sender
|
||||||
.unbounded_send(network_manager::Request::SelectAccessPoint(
|
.unbounded_send(network_manager::Request::SelectAccessPoint(
|
||||||
ssid,
|
ssid,
|
||||||
ap.hw_address,
|
|
||||||
ap.network_type,
|
ap.network_type,
|
||||||
self.secret_tx.clone(),
|
self.secret_tx.clone(),
|
||||||
|
self.active_device.as_ref().map(|d| d.interface.clone()),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -528,7 +523,6 @@ impl Page {
|
||||||
self.dialog = Some(WiFiDialog::Password {
|
self.dialog = Some(WiFiDialog::Password {
|
||||||
ssid,
|
ssid,
|
||||||
identity: matches!(ap.network_type, NetworkType::EAP).then(String::new),
|
identity: matches!(ap.network_type, NetworkType::EAP).then(String::new),
|
||||||
hw_address: ap.hw_address,
|
|
||||||
password: SecureString::from(""),
|
password: SecureString::from(""),
|
||||||
password_hidden: true,
|
password_hidden: true,
|
||||||
tx: Arc::new(Mutex::new(None)),
|
tx: Arc::new(Mutex::new(None)),
|
||||||
|
|
@ -553,7 +547,6 @@ impl Page {
|
||||||
ssid,
|
ssid,
|
||||||
identity,
|
identity,
|
||||||
password,
|
password,
|
||||||
hw_address,
|
|
||||||
tx,
|
tx,
|
||||||
..
|
..
|
||||||
} = dialog
|
} = dialog
|
||||||
|
|
@ -562,6 +555,7 @@ impl Page {
|
||||||
self.connecting.insert(ssid.clone());
|
self.connecting.insert(ssid.clone());
|
||||||
let nm_sender = nm.sender.clone();
|
let nm_sender = nm.sender.clone();
|
||||||
let secret_tx = self.secret_tx.clone();
|
let secret_tx = self.secret_tx.clone();
|
||||||
|
let interface = self.active_device.as_ref().map(|d| d.interface.clone());
|
||||||
return Task::future(async move {
|
return Task::future(async move {
|
||||||
let mut guard = tx.lock().await;
|
let mut guard = tx.lock().await;
|
||||||
if let Some(tx) = guard.take() {
|
if let Some(tx) = guard.take() {
|
||||||
|
|
@ -570,9 +564,9 @@ impl Page {
|
||||||
_ = nm_sender.unbounded_send(network_manager::Request::Authenticate {
|
_ = nm_sender.unbounded_send(network_manager::Request::Authenticate {
|
||||||
ssid: ssid.to_string(),
|
ssid: ssid.to_string(),
|
||||||
identity,
|
identity,
|
||||||
hw_address,
|
|
||||||
password,
|
password,
|
||||||
secret_tx,
|
secret_tx,
|
||||||
|
interface,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -674,6 +668,11 @@ impl Page {
|
||||||
// TODO: Per-device wifi connection handling.
|
// TODO: Per-device wifi connection handling.
|
||||||
self.active_device = Some(device);
|
self.active_device = Some(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Message::SearchQuery(query) => {
|
||||||
|
self.search_query = query;
|
||||||
|
}
|
||||||
|
|
||||||
Message::NetworkManagerConnect(conn) => {
|
Message::NetworkManagerConnect(conn) => {
|
||||||
return cosmic::task::batch(vec![
|
return cosmic::task::batch(vec![
|
||||||
self.connect(conn.clone()),
|
self.connect(conn.clone()),
|
||||||
|
|
@ -718,7 +717,6 @@ impl Page {
|
||||||
ssid,
|
ssid,
|
||||||
password: previous,
|
password: previous,
|
||||||
password_hidden: true,
|
password_hidden: true,
|
||||||
hw_address: ap.hw_address,
|
|
||||||
identity: matches!(ap.network_type, NetworkType::EAP).then(String::new),
|
identity: matches!(ap.network_type, NetworkType::EAP).then(String::new),
|
||||||
tx,
|
tx,
|
||||||
});
|
});
|
||||||
|
|
@ -736,7 +734,6 @@ impl Page {
|
||||||
ssid,
|
ssid,
|
||||||
password,
|
password,
|
||||||
identity,
|
identity,
|
||||||
hw_address,
|
|
||||||
..
|
..
|
||||||
}) = self.dialog.take()
|
}) = self.dialog.take()
|
||||||
{
|
{
|
||||||
|
|
@ -746,7 +743,6 @@ impl Page {
|
||||||
tx: Arc::new(Mutex::new(None)),
|
tx: Arc::new(Mutex::new(None)),
|
||||||
ssid,
|
ssid,
|
||||||
identity,
|
identity,
|
||||||
hw_address,
|
|
||||||
});
|
});
|
||||||
return task::message(Message::FocusSecureInput);
|
return task::message(Message::FocusSecureInput);
|
||||||
}
|
}
|
||||||
|
|
@ -755,12 +751,15 @@ impl Page {
|
||||||
Message::FocusSecureInput => {
|
Message::FocusSecureInput => {
|
||||||
// retry until the widget is in the tree and focused or the dialog is removed.
|
// retry until the widget is in the tree and focused or the dialog is removed.
|
||||||
if matches!(self.dialog, Some(WiFiDialog::Password { .. })) {
|
if matches!(self.dialog, Some(WiFiDialog::Password { .. })) {
|
||||||
return cosmic::iced_runtime::task::widget(
|
return cosmic::iced::runtime::task::widget(
|
||||||
cosmic::iced_core::widget::operation::focusable::find_focused(),
|
cosmic::iced::core::widget::operation::focusable::find_focused(),
|
||||||
)
|
)
|
||||||
.collect()
|
.collect()
|
||||||
.then(|id| {
|
.then(|id| {
|
||||||
if id.get(0).is_some_and(|id| *id == SECURE_INPUT_WIFI.clone()) {
|
if id
|
||||||
|
.first()
|
||||||
|
.is_some_and(|id| *id == SECURE_INPUT_WIFI.clone())
|
||||||
|
{
|
||||||
Task::none()
|
Task::none()
|
||||||
} else {
|
} else {
|
||||||
focus(SECURE_INPUT_WIFI.clone())
|
focus(SECURE_INPUT_WIFI.clone())
|
||||||
|
|
@ -867,6 +866,7 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
forget_txt = fl!("wifi", "forget");
|
forget_txt = fl!("wifi", "forget");
|
||||||
known_networks_txt = fl!("known-networks");
|
known_networks_txt = fl!("known-networks");
|
||||||
no_networks_txt = fl!("no-networks");
|
no_networks_txt = fl!("no-networks");
|
||||||
|
no_search_results_txt = fl!("no-search-results");
|
||||||
settings_txt = fl!("settings");
|
settings_txt = fl!("settings");
|
||||||
share_txt = fl!("share");
|
share_txt = fl!("share");
|
||||||
visible_networks_txt = fl!("visible-networks");
|
visible_networks_txt = fl!("visible-networks");
|
||||||
|
|
@ -877,13 +877,13 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
.view::<Page>(move |_binder, page, section| {
|
.view::<Page>(move |_binder, page, section| {
|
||||||
let Some(NmState { ref state, .. }) = page.nm_state else {
|
let Some(NmState { ref state, .. }) = page.nm_state else {
|
||||||
return cosmic::widget::column().into();
|
return cosmic::widget::space().into();
|
||||||
};
|
};
|
||||||
|
|
||||||
let spacing = cosmic::theme::spacing();
|
let spacing = cosmic::theme::spacing();
|
||||||
|
|
||||||
let wifi_enable = widget::settings::item::builder(§ion.descriptions[wifi_txt])
|
let wifi_enable = widget::settings::item::builder(§ion.descriptions[wifi_txt])
|
||||||
.control(widget::toggler(state.wifi_enabled).on_toggle(Message::WiFiEnable));
|
.toggler(state.wifi_enabled, Message::WiFiEnable);
|
||||||
|
|
||||||
let mut view = widget::column::with_capacity(4)
|
let mut view = widget::column::with_capacity(4)
|
||||||
.push(widget::list_column().add(wifi_enable))
|
.push(widget::list_column().add(wifi_enable))
|
||||||
|
|
@ -907,54 +907,48 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
view = view.push(no_networks_found);
|
view = view.push(no_networks_found);
|
||||||
} else {
|
} else {
|
||||||
|
// Collect known SSIDs for deduplication
|
||||||
|
let known_ssids: BTreeSet<&str> = state
|
||||||
|
.known_access_points
|
||||||
|
.iter()
|
||||||
|
.map(|ap| ap.ssid.as_ref())
|
||||||
|
.chain(state.active_conns.iter().filter_map(|active| {
|
||||||
|
if let ActiveConnectionInfo::WiFi { name, .. } = active {
|
||||||
|
Some(name.as_str())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
// Build Known Networks section (always unfiltered)
|
||||||
|
let mut known_networks =
|
||||||
|
widget::settings::section().title(§ion.descriptions[known_networks_txt]);
|
||||||
let mut has_known = false;
|
let mut has_known = false;
|
||||||
let mut has_visible = false;
|
|
||||||
|
|
||||||
// Create separate sections for known and visible networks.
|
// Add visible networks that are known
|
||||||
let (known_networks, visible_networks) = state.wireless_access_points.iter().fold(
|
for network in &state.wireless_access_points {
|
||||||
(
|
if known_ssids.contains(network.ssid.as_ref()) {
|
||||||
widget::settings::section()
|
has_known = true;
|
||||||
.title(§ion.descriptions[known_networks_txt]),
|
|
||||||
widget::settings::section()
|
|
||||||
.title(§ion.descriptions[visible_networks_txt]),
|
|
||||||
),
|
|
||||||
|(mut known_networks, mut visible_networks), network| {
|
|
||||||
let is_connected = is_connected(state, network);
|
let is_connected = is_connected(state, network);
|
||||||
|
let is_known = known_ssids.contains(network.ssid.as_ref());
|
||||||
|
let needs_password = network.network_type != NetworkType::Open;
|
||||||
|
|
||||||
let is_known = state
|
let (connect_label, connect_msg) = if is_connected {
|
||||||
.known_access_points
|
|
||||||
.iter()
|
|
||||||
.map(|known| known.ssid.as_ref())
|
|
||||||
.chain(state.active_conns.iter().filter_map(|active| {
|
|
||||||
if let ActiveConnectionInfo::WiFi { name, .. } = active {
|
|
||||||
Some(name.as_str())
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
.any(|known| known == network.ssid.as_ref());
|
|
||||||
|
|
||||||
let is_encrypted = network.network_type != NetworkType::Open;
|
|
||||||
|
|
||||||
let (connect_txt, connect_msg) = if is_connected {
|
|
||||||
(§ion.descriptions[connected_txt], None)
|
(§ion.descriptions[connected_txt], None)
|
||||||
} else if page.connecting.contains(&network.ssid) {
|
} else if page.connecting.contains(&network.ssid) {
|
||||||
(§ion.descriptions[connecting_txt], None)
|
(§ion.descriptions[connecting_txt], None)
|
||||||
} else {
|
} else {
|
||||||
(
|
(
|
||||||
§ion.descriptions[connect_txt],
|
§ion.descriptions[connect_txt],
|
||||||
Some(if is_known || !is_encrypted {
|
Some(Message::Connect(network.ssid.clone())),
|
||||||
Message::Connect(network.ssid.clone())
|
|
||||||
} else {
|
|
||||||
Message::PasswordRequest(network.ssid.clone())
|
|
||||||
}),
|
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
let identifier = widget::row::with_capacity(3)
|
let identifier = widget::row::with_capacity(3)
|
||||||
.push(widget::icon::from_name(wifi_icon(network.strength)))
|
.push(widget::icon::from_name(wifi_icon(network.strength)))
|
||||||
.push_maybe(
|
.push_maybe(
|
||||||
is_encrypted
|
needs_password
|
||||||
.then(|| widget::icon::from_name("connection-secure-symbolic")),
|
.then(|| widget::icon::from_name("connection-secure-symbolic")),
|
||||||
)
|
)
|
||||||
.push(
|
.push(
|
||||||
|
|
@ -963,9 +957,9 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
.spacing(spacing.space_xxs);
|
.spacing(spacing.space_xxs);
|
||||||
|
|
||||||
let connect: Element<'_, Message> = if let Some(msg) = connect_msg {
|
let connect: Element<'_, Message> = if let Some(msg) = connect_msg {
|
||||||
widget::button::text(connect_txt).on_press(msg).into()
|
widget::button::text(connect_label).on_press(msg).into()
|
||||||
} else {
|
} else {
|
||||||
widget::text::body(connect_txt)
|
widget::text::body(connect_label)
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
.into()
|
.into()
|
||||||
};
|
};
|
||||||
|
|
@ -982,7 +976,7 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
.position(widget::popover::Position::Bottom)
|
.position(widget::popover::Position::Bottom)
|
||||||
.on_close(Message::ViewMore(None))
|
.on_close(Message::ViewMore(None))
|
||||||
.popup(
|
.popup(
|
||||||
widget::column()
|
widget::column::with_capacity(4)
|
||||||
.push_maybe(is_connected.then(|| {
|
.push_maybe(is_connected.then(|| {
|
||||||
popup_button(
|
popup_button(
|
||||||
Message::Disconnect(network.ssid.clone()),
|
Message::Disconnect(network.ssid.clone()),
|
||||||
|
|
@ -1011,12 +1005,10 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
.class(cosmic::theme::Container::Dropdown),
|
.class(cosmic::theme::Container::Dropdown),
|
||||||
)
|
)
|
||||||
.apply(|e| Some(Element::from(e)))
|
.apply(|e| Some(Element::from(e)))
|
||||||
} else if is_known {
|
} else {
|
||||||
view_more_button
|
view_more_button
|
||||||
.on_press(Message::ViewMore(Some(network.ssid.clone())))
|
.on_press(Message::ViewMore(Some(network.ssid.clone())))
|
||||||
.apply(|e| Some(Element::from(e)))
|
.apply(|e| Some(Element::from(e)))
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let controls = widget::row::with_capacity(2)
|
let controls = widget::row::with_capacity(2)
|
||||||
|
|
@ -1025,30 +1017,233 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
.spacing(spacing.space_xxs);
|
.spacing(spacing.space_xxs);
|
||||||
|
|
||||||
let widget = widget::settings::item_row(vec![
|
let item = widget::settings::item_row(vec![
|
||||||
identifier.into(),
|
identifier.into(),
|
||||||
widget::horizontal_space().into(),
|
horizontal().into(),
|
||||||
controls.into(),
|
controls.into(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if is_known {
|
known_networks = known_networks.add(item);
|
||||||
has_known = true;
|
}
|
||||||
known_networks = known_networks.add(widget);
|
}
|
||||||
} else {
|
|
||||||
has_visible = true;
|
|
||||||
visible_networks = visible_networks.add(widget);
|
|
||||||
}
|
|
||||||
|
|
||||||
(known_networks, visible_networks)
|
// Also add known networks that are not currently visible
|
||||||
},
|
for network in &state.known_access_points {
|
||||||
);
|
let already_added = state
|
||||||
|
.wireless_access_points
|
||||||
|
.iter()
|
||||||
|
.any(|ap| ap.ssid == network.ssid);
|
||||||
|
if !already_added {
|
||||||
|
has_known = true;
|
||||||
|
let is_connected = is_connected(state, network);
|
||||||
|
let is_encrypted = network.network_type != NetworkType::Open;
|
||||||
|
let is_known = known_ssids.contains(network.ssid.as_ref());
|
||||||
|
|
||||||
|
let (connect_label, connect_msg) = if is_connected {
|
||||||
|
(§ion.descriptions[connected_txt], None)
|
||||||
|
} else if page.connecting.contains(&network.ssid) {
|
||||||
|
(§ion.descriptions[connecting_txt], None)
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
§ion.descriptions[connect_txt],
|
||||||
|
Some(Message::Connect(network.ssid.clone())),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
let identifier = widget::row::with_capacity(3)
|
||||||
|
.push(widget::icon::from_name(wifi_icon(network.strength)))
|
||||||
|
.push_maybe(
|
||||||
|
is_encrypted
|
||||||
|
.then(|| widget::icon::from_name("connection-secure-symbolic")),
|
||||||
|
)
|
||||||
|
.push(
|
||||||
|
widget::text::body(network.ssid.as_ref()).wrapping(Wrapping::Glyph),
|
||||||
|
)
|
||||||
|
.spacing(spacing.space_xxs);
|
||||||
|
|
||||||
|
let connect: Element<'_, Message> = if let Some(msg) = connect_msg {
|
||||||
|
widget::button::text(connect_label).on_press(msg).into()
|
||||||
|
} else {
|
||||||
|
widget::text::body(connect_label)
|
||||||
|
.align_y(Alignment::Center)
|
||||||
|
.into()
|
||||||
|
};
|
||||||
|
|
||||||
|
let view_more_button =
|
||||||
|
widget::button::icon(widget::icon::from_name("view-more-symbolic"));
|
||||||
|
|
||||||
|
let view_more: Element<_> = if page
|
||||||
|
.view_more_popup
|
||||||
|
.as_deref()
|
||||||
|
.is_some_and(|id| id == network.ssid.as_ref())
|
||||||
|
{
|
||||||
|
widget::popover(view_more_button.on_press(Message::ViewMore(None)))
|
||||||
|
.position(widget::popover::Position::Bottom)
|
||||||
|
.on_close(Message::ViewMore(None))
|
||||||
|
.popup(
|
||||||
|
widget::column::with_capacity(4)
|
||||||
|
.push_maybe(is_connected.then(|| {
|
||||||
|
popup_button(
|
||||||
|
Message::Disconnect(network.ssid.clone()),
|
||||||
|
§ion.descriptions[disconnect_txt],
|
||||||
|
)
|
||||||
|
}))
|
||||||
|
.push(popup_button(
|
||||||
|
Message::Settings(network.ssid.clone()),
|
||||||
|
§ion.descriptions[settings_txt],
|
||||||
|
))
|
||||||
|
.push_maybe(is_known.then(|| {
|
||||||
|
popup_button(
|
||||||
|
Message::QRCodeRequest(network.ssid.clone()),
|
||||||
|
§ion.descriptions[share_txt],
|
||||||
|
)
|
||||||
|
}))
|
||||||
|
.push_maybe(is_known.then(|| {
|
||||||
|
popup_button(
|
||||||
|
Message::ForgetRequest(network.ssid.clone()),
|
||||||
|
§ion.descriptions[forget_txt],
|
||||||
|
)
|
||||||
|
}))
|
||||||
|
.width(Length::Fixed(200.0))
|
||||||
|
.apply(widget::container)
|
||||||
|
.padding(cosmic::theme::spacing().space_xxs)
|
||||||
|
.class(cosmic::theme::Container::Dropdown),
|
||||||
|
)
|
||||||
|
.into()
|
||||||
|
} else {
|
||||||
|
view_more_button
|
||||||
|
.on_press(Message::ViewMore(Some(network.ssid.clone())))
|
||||||
|
.into()
|
||||||
|
};
|
||||||
|
|
||||||
|
let controls = widget::row::with_capacity(2)
|
||||||
|
.push(connect)
|
||||||
|
.push(view_more)
|
||||||
|
.align_y(Alignment::Center)
|
||||||
|
.spacing(spacing.space_xxs);
|
||||||
|
|
||||||
|
let item = widget::settings::item_row(vec![
|
||||||
|
identifier.into(),
|
||||||
|
horizontal().into(),
|
||||||
|
controls.into(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
known_networks = known_networks.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if has_known {
|
if has_known {
|
||||||
view = view.push(known_networks);
|
view = view.push(known_networks);
|
||||||
}
|
}
|
||||||
|
|
||||||
if has_visible {
|
// Build Visible Networks section (searchable when 15+ networks, filtered when user types)
|
||||||
view = view.push(visible_networks);
|
let show_search = state.wireless_access_points.len() >= 15;
|
||||||
|
let search_query_lower = page.search_query.trim().to_lowercase();
|
||||||
|
|
||||||
|
// Filter visible networks (exclude known networks, apply search filter)
|
||||||
|
let filtered_visible: Vec<_> = state
|
||||||
|
.wireless_access_points
|
||||||
|
.iter()
|
||||||
|
.filter(|network| !known_ssids.contains(network.ssid.as_ref()))
|
||||||
|
.filter(|network| {
|
||||||
|
if show_search && !search_query_lower.is_empty() {
|
||||||
|
network
|
||||||
|
.ssid
|
||||||
|
.as_ref()
|
||||||
|
.to_lowercase()
|
||||||
|
.contains(&search_query_lower)
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
// Check if we have any visible (non-known) networks at all
|
||||||
|
let has_any_visible = state
|
||||||
|
.wireless_access_points
|
||||||
|
.iter()
|
||||||
|
.any(|network| !known_ssids.contains(network.ssid.as_ref()));
|
||||||
|
|
||||||
|
// Only show visible networks section if there are non-known networks
|
||||||
|
if has_any_visible {
|
||||||
|
// Build visible networks section with optional search
|
||||||
|
let mut visible_section = widget::column::with_capacity(3);
|
||||||
|
|
||||||
|
// Section title
|
||||||
|
visible_section = visible_section.push(widget::text::title4(
|
||||||
|
§ion.descriptions[visible_networks_txt],
|
||||||
|
));
|
||||||
|
|
||||||
|
// Search input (only shown when 15+ networks)
|
||||||
|
if show_search {
|
||||||
|
let search_input =
|
||||||
|
widget::search_input(fl!("type-to-search"), &page.search_query)
|
||||||
|
.on_input(Message::SearchQuery)
|
||||||
|
.on_clear(Message::SearchQuery(String::new()));
|
||||||
|
visible_section = visible_section.push(search_input);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Network list or "no results" message
|
||||||
|
if filtered_visible.is_empty() && show_search && !search_query_lower.is_empty()
|
||||||
|
{
|
||||||
|
// Show "no search results" message only when search is active and returns no results
|
||||||
|
visible_section = visible_section.push(
|
||||||
|
widget::container(widget::text::body(
|
||||||
|
§ion.descriptions[no_search_results_txt],
|
||||||
|
))
|
||||||
|
.center_x(Length::Fill),
|
||||||
|
);
|
||||||
|
} else if !filtered_visible.is_empty() {
|
||||||
|
let mut visible_networks_list = widget::list_column();
|
||||||
|
for network in filtered_visible {
|
||||||
|
let is_encrypted = network.network_type != NetworkType::Open;
|
||||||
|
|
||||||
|
let (connect_label, connect_msg) =
|
||||||
|
if page.connecting.contains(&network.ssid) {
|
||||||
|
(§ion.descriptions[connecting_txt], None)
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
§ion.descriptions[connect_txt],
|
||||||
|
Some(if is_encrypted {
|
||||||
|
Message::PasswordRequest(network.ssid.clone())
|
||||||
|
} else {
|
||||||
|
Message::Connect(network.ssid.clone())
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
let identifier =
|
||||||
|
widget::row::with_capacity(3)
|
||||||
|
.push(widget::icon::from_name(wifi_icon(network.strength)))
|
||||||
|
.push_maybe(is_encrypted.then(|| {
|
||||||
|
widget::icon::from_name("connection-secure-symbolic")
|
||||||
|
}))
|
||||||
|
.push(
|
||||||
|
widget::text::body(network.ssid.as_ref())
|
||||||
|
.wrapping(Wrapping::Glyph),
|
||||||
|
)
|
||||||
|
.spacing(spacing.space_xxs);
|
||||||
|
|
||||||
|
let connect: Element<'_, Message> = if let Some(msg) = connect_msg {
|
||||||
|
widget::button::text(connect_label).on_press(msg).into()
|
||||||
|
} else {
|
||||||
|
widget::text::body(connect_label)
|
||||||
|
.align_y(Alignment::Center)
|
||||||
|
.into()
|
||||||
|
};
|
||||||
|
|
||||||
|
let item = widget::settings::item_row(vec![
|
||||||
|
identifier.into(),
|
||||||
|
horizontal().into(),
|
||||||
|
connect,
|
||||||
|
]);
|
||||||
|
|
||||||
|
visible_networks_list = visible_networks_list.add(item);
|
||||||
|
}
|
||||||
|
visible_section = visible_section.push(visible_networks_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
view = view.push(visible_section.spacing(spacing.space_xs));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ use std::{collections::BTreeSet, sync::Arc};
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element, Task,
|
Apply, Element, Task,
|
||||||
|
iced::core::text::Wrapping,
|
||||||
iced::{Alignment, Length},
|
iced::{Alignment, Length},
|
||||||
iced_core::text::Wrapping,
|
widget::{self, icon, space::horizontal as horizontal_space},
|
||||||
widget::{self, icon},
|
|
||||||
};
|
};
|
||||||
use cosmic_dbus_networkmanager::interface::enums::DeviceState;
|
use cosmic_dbus_networkmanager::interface::enums::DeviceState;
|
||||||
use cosmic_settings_network_manager_subscription::{
|
use cosmic_settings_network_manager_subscription::{
|
||||||
|
|
@ -108,7 +108,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> cosmic_settings_page::Info {
|
fn info(&self) -> cosmic_settings_page::Info {
|
||||||
page::Info::new("wired", "preferences-wired-symbolic")
|
page::Info::new("wired", "preferences-wired-symbolic")
|
||||||
.title(fl!("wired"))
|
.title(fl!("wired"))
|
||||||
.description(fl!("connections-and-profiles", variant = "wired"))
|
.description(fl!("xdg-entry-wired-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn content(
|
fn content(
|
||||||
|
|
@ -512,7 +512,7 @@ impl Page {
|
||||||
.position(widget::popover::Position::Bottom)
|
.position(widget::popover::Position::Bottom)
|
||||||
.on_close(Message::ViewMore(None))
|
.on_close(Message::ViewMore(None))
|
||||||
.popup(
|
.popup(
|
||||||
widget::column()
|
widget::column::with_capacity(3)
|
||||||
.push_maybe(is_connected.then(|| {
|
.push_maybe(is_connected.then(|| {
|
||||||
popup_button(
|
popup_button(
|
||||||
Message::Deactivate(connection.uuid.clone()),
|
Message::Deactivate(connection.uuid.clone()),
|
||||||
|
|
@ -549,7 +549,7 @@ impl Page {
|
||||||
|
|
||||||
let widget = widget::settings::item_row(vec![
|
let widget = widget::settings::item_row(vec![
|
||||||
identifier.into(),
|
identifier.into(),
|
||||||
widget::horizontal_space().into(),
|
horizontal_space().into(),
|
||||||
controls.into(),
|
controls.into(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
@ -575,7 +575,7 @@ fn devices_view() -> Section<crate::pages::Message> {
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
.view::<Page>(move |_binder, page, section| {
|
.view::<Page>(move |_binder, page, section| {
|
||||||
let Some(ref nm_state) = page.nm_state else {
|
let Some(ref nm_state) = page.nm_state else {
|
||||||
return cosmic::widget::column().into();
|
return cosmic::widget::space().into();
|
||||||
};
|
};
|
||||||
|
|
||||||
let spacing = cosmic::theme::spacing();
|
let spacing = cosmic::theme::spacing();
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use chrono::{Duration, TimeDelta};
|
|
||||||
use futures::{FutureExt, Stream, StreamExt, future::join_all};
|
use futures::{FutureExt, Stream, StreamExt, future::join_all};
|
||||||
|
use jiff::{Span, SpanRelativeTo, SpanRound, ToSpan, Unit};
|
||||||
use upower_dbus::{BatteryState, BatteryType, DeviceProxy};
|
use upower_dbus::{BatteryState, BatteryType, DeviceProxy};
|
||||||
use zbus::{Connection, zvariant::ObjectPath};
|
use zbus::{Connection, zvariant::ObjectPath};
|
||||||
|
|
||||||
|
|
@ -233,7 +233,7 @@ pub struct Battery {
|
||||||
pub is_present: bool,
|
pub is_present: bool,
|
||||||
pub percent: f64,
|
pub percent: f64,
|
||||||
pub is_charging: bool,
|
pub is_charging: bool,
|
||||||
pub remaining_duration: Duration,
|
pub remaining_duration: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug, Clone)]
|
#[derive(Default, Debug, Clone)]
|
||||||
|
|
@ -302,7 +302,7 @@ async fn enumerate_devices<'a>() -> Result<Vec<upower_dbus::DeviceProxy<'a>>, zb
|
||||||
|
|
||||||
impl Battery {
|
impl Battery {
|
||||||
pub async fn from_device(proxy: &DeviceProxy<'_>) -> Self {
|
pub async fn from_device(proxy: &DeviceProxy<'_>) -> Self {
|
||||||
let mut remaining_duration: Duration = Duration::default();
|
let mut remaining_duration = Span::default();
|
||||||
|
|
||||||
let (is_present, percentage, battery_state) = futures::join!(
|
let (is_present, percentage, battery_state) = futures::join!(
|
||||||
proxy.is_present().map(Result::unwrap_or_default),
|
proxy.is_present().map(Result::unwrap_or_default),
|
||||||
|
|
@ -319,15 +319,11 @@ impl Battery {
|
||||||
&& (percent - 100.0_f64).abs() < f64::EPSILON;
|
&& (percent - 100.0_f64).abs() < f64::EPSILON;
|
||||||
|
|
||||||
if !is_charging {
|
if !is_charging {
|
||||||
if let Ok(time) = proxy.time_to_empty().await
|
if let Ok(time) = proxy.time_to_empty().await {
|
||||||
&& let Ok(dur) = Duration::from_std(std::time::Duration::from_secs(time as u64))
|
remaining_duration = time.seconds();
|
||||||
{
|
|
||||||
remaining_duration = dur;
|
|
||||||
}
|
}
|
||||||
} else if let Ok(time) = proxy.time_to_full().await
|
} else if let Ok(time) = proxy.time_to_full().await {
|
||||||
&& let Ok(dur) = Duration::from_std(std::time::Duration::from_secs(time as u64))
|
remaining_duration = time.seconds();
|
||||||
{
|
|
||||||
remaining_duration = dur;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let battery_percent = if percent > 95.0 {
|
let battery_percent = if percent > 95.0 {
|
||||||
|
|
@ -378,15 +374,22 @@ impl Battery {
|
||||||
Battery::default()
|
Battery::default()
|
||||||
}
|
}
|
||||||
pub fn remaining_time(&self) -> String {
|
pub fn remaining_time(&self) -> String {
|
||||||
if self.remaining_duration <= TimeDelta::zero() {
|
if !self.remaining_duration.is_positive() {
|
||||||
return String::new();
|
return String::new();
|
||||||
}
|
}
|
||||||
|
|
||||||
let total_seconds = self.remaining_duration.num_seconds();
|
let balanced = self
|
||||||
|
.remaining_duration
|
||||||
|
.round(
|
||||||
|
SpanRound::new()
|
||||||
|
.largest(Unit::Day)
|
||||||
|
.relative(SpanRelativeTo::days_are_24_hours()),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let days = total_seconds / 86400;
|
let days = balanced.get_days();
|
||||||
let hours = total_seconds % 86400 / 3600;
|
let hours = balanced.get_hours();
|
||||||
let minutes = (total_seconds % 3600) / 60;
|
let minutes = balanced.get_minutes();
|
||||||
|
|
||||||
let mut time: Vec<String> = Vec::new();
|
let mut time: Vec<String> = Vec::new();
|
||||||
if days > 0 {
|
if days > 0 {
|
||||||
|
|
@ -546,7 +549,7 @@ mod tests {
|
||||||
for case in cases {
|
for case in cases {
|
||||||
let (actual, expected) = case;
|
let (actual, expected) = case;
|
||||||
let battery = Battery {
|
let battery = Battery {
|
||||||
remaining_duration: Duration::new(actual, 0).unwrap(),
|
remaining_duration: actual.seconds(),
|
||||||
is_charging: false,
|
is_charging: false,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ mod backend;
|
||||||
use self::backend::{GetCurrentPowerProfile, SetPowerProfile};
|
use self::backend::{GetCurrentPowerProfile, SetPowerProfile};
|
||||||
use backend::{Battery, ConnectedDevice, PowerProfile};
|
use backend::{Battery, ConnectedDevice, PowerProfile};
|
||||||
|
|
||||||
use chrono::TimeDelta;
|
use cosmic::Task;
|
||||||
use cosmic::iced::{self, Alignment, Length};
|
use cosmic::iced::core::text::{Ellipsize, EllipsizeHeightLimit};
|
||||||
use cosmic::iced_widget::{column, row};
|
use cosmic::iced::widget::{column, row};
|
||||||
use cosmic::widget::{self, radio, settings, text};
|
use cosmic::iced::{self, Alignment, Length, stream};
|
||||||
|
use cosmic::widget::{self, settings, space, text};
|
||||||
use cosmic::{Apply, surface};
|
use cosmic::{Apply, surface};
|
||||||
use cosmic::{Task, iced_futures};
|
|
||||||
use cosmic_config::{Config, CosmicConfigEntry};
|
use cosmic_config::{Config, CosmicConfigEntry};
|
||||||
use cosmic_idle_config::CosmicIdleConfig;
|
use cosmic_idle_config::CosmicIdleConfig;
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
|
|
@ -16,6 +16,7 @@ use futures::{SinkExt, StreamExt};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use slab::Slab;
|
use slab::Slab;
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
|
use std::hash::Hash;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use upower_dbus::DeviceProxy;
|
use upower_dbus::DeviceProxy;
|
||||||
|
|
@ -101,7 +102,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("power", "preferences-power-and-battery-symbolic")
|
page::Info::new("power", "preferences-power-and-battery-symbolic")
|
||||||
.title(fl!("power"))
|
.title(fl!("power"))
|
||||||
.description(fl!("power", "desc"))
|
.description(fl!("xdg-entry-power-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn content(
|
fn content(
|
||||||
|
|
@ -143,7 +144,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
|
|
||||||
// A subscription for the system battery.
|
// A subscription for the system battery.
|
||||||
let system_battery = iced::Subscription::run(|| {
|
let system_battery = iced::Subscription::run(|| {
|
||||||
iced_futures::stream::channel(1, |sender| async move {
|
stream::channel(1, |sender| async move {
|
||||||
if let Ok(proxy) = backend::get_device_proxy().await {
|
if let Ok(proxy) = backend::get_device_proxy().await {
|
||||||
receive_battery_changes(proxy, String::new(), sender, |_, b| {
|
receive_battery_changes(proxy, String::new(), sender, |_, b| {
|
||||||
Message::UpdateBattery(b)
|
Message::UpdateBattery(b)
|
||||||
|
|
@ -154,24 +155,50 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Subscriptions for all connected device batteries.
|
// Subscriptions for all connected device batteries.
|
||||||
let device_batteries = self
|
let device_batteries =
|
||||||
.connected_devices
|
self.connected_devices
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|device| {
|
.filter_map(|device| {
|
||||||
device
|
device
|
||||||
.proxy
|
.proxy
|
||||||
.clone()
|
.clone()
|
||||||
.map(|p| (device.device_path.clone(), p))
|
.map(|p| (device.device_path.clone(), p))
|
||||||
})
|
})
|
||||||
.map(|(path, proxy)| {
|
.map(|(path, proxy)| {
|
||||||
iced::Subscription::run_with_id(
|
#[derive(Clone)]
|
||||||
path.clone(),
|
struct DeviceBatterySubscriptionData {
|
||||||
iced_futures::stream::channel(1, |sender| async move {
|
proxy: DeviceProxy<'static>,
|
||||||
receive_battery_changes(proxy, path, sender, Message::UpdateDeviceBattery)
|
path: String,
|
||||||
.await
|
}
|
||||||
}),
|
|
||||||
)
|
impl Hash for DeviceBatterySubscriptionData {
|
||||||
});
|
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.path.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iced::Subscription::run_with(
|
||||||
|
DeviceBatterySubscriptionData { proxy, path },
|
||||||
|
|DeviceBatterySubscriptionData { proxy, path }| {
|
||||||
|
let path = path.clone();
|
||||||
|
let proxy = proxy.clone();
|
||||||
|
stream::channel(
|
||||||
|
1,
|
||||||
|
move |sender: futures::channel::mpsc::Sender<
|
||||||
|
crate::pages::Message,
|
||||||
|
>| async move {
|
||||||
|
receive_battery_changes(
|
||||||
|
proxy,
|
||||||
|
path,
|
||||||
|
sender,
|
||||||
|
Message::UpdateDeviceBattery,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
},
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
iced::Subscription::batch(std::iter::once(system_battery).chain(device_batteries))
|
iced::Subscription::batch(std::iter::once(system_battery).chain(device_batteries))
|
||||||
}
|
}
|
||||||
|
|
@ -200,47 +227,56 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
cosmic::Task::run(
|
cosmic::Task::run(
|
||||||
iced_futures::stream::channel(1, |mut emitter| async move {
|
stream::channel(
|
||||||
let span = tracing::span!(tracing::Level::INFO, "power::device_stream task");
|
1,
|
||||||
let _span_handle = span.enter();
|
|mut emitter: futures::channel::mpsc::Sender<Message>| async move {
|
||||||
|
let span =
|
||||||
|
tracing::span!(tracing::Level::INFO, "power::device_stream task");
|
||||||
|
let _span_handle = span.enter();
|
||||||
|
|
||||||
let Ok(connection) = zbus::Connection::system().await else {
|
let Ok(connection) = zbus::Connection::system().await else {
|
||||||
tracing::error!("could not established zbus connection to system");
|
tracing::error!("could not established zbus connection to system");
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
let added_stream = ConnectedDevice::device_added_stream(&connection).await;
|
let added_stream = ConnectedDevice::device_added_stream(&connection).await;
|
||||||
let removed_stream = ConnectedDevice::device_removed_stream(&connection).await;
|
let removed_stream =
|
||||||
|
ConnectedDevice::device_removed_stream(&connection).await;
|
||||||
|
|
||||||
let mut sender = emitter.clone();
|
let mut sender = emitter.clone();
|
||||||
let added_future = std::pin::pin!(async {
|
let added_future = std::pin::pin!(async {
|
||||||
match added_stream {
|
match added_stream {
|
||||||
Ok(stream) => {
|
Ok(stream) => {
|
||||||
let mut stream = std::pin::pin!(stream);
|
let mut stream = std::pin::pin!(stream);
|
||||||
while let Some(device) = stream.next().await {
|
while let Some(device) = stream.next().await {
|
||||||
tracing::debug!(device = device.model, "device added");
|
tracing::debug!(device = device.model, "device added");
|
||||||
_ = sender.send(Message::DeviceConnect(device)).await;
|
_ = sender.send(Message::DeviceConnect(device)).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => tracing::error!(?err, "cannot establish added stream"),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let removed_future = std::pin::pin!(async {
|
||||||
|
match removed_stream {
|
||||||
|
Ok(stream) => {
|
||||||
|
let mut stream = std::pin::pin!(stream);
|
||||||
|
while let Some(device_path) = stream.next().await {
|
||||||
|
tracing::debug!(device_path, "device removed");
|
||||||
|
_ = emitter
|
||||||
|
.send(Message::DeviceDisconnect(device_path))
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
tracing::error!(?err, "cannot establish removed stream")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(err) => tracing::error!(?err, "cannot establish added stream"),
|
});
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let removed_future = std::pin::pin!(async {
|
futures::future::select(added_future, removed_future).await;
|
||||||
match removed_stream {
|
},
|
||||||
Ok(stream) => {
|
),
|
||||||
let mut stream = std::pin::pin!(stream);
|
|
||||||
while let Some(device_path) = stream.next().await {
|
|
||||||
tracing::debug!(device_path, "device removed");
|
|
||||||
_ = emitter.send(Message::DeviceDisconnect(device_path)).await;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(err) => tracing::error!(?err, "cannot establish removed stream"),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
futures::future::select(added_future, removed_future).await;
|
|
||||||
}),
|
|
||||||
|msg| msg,
|
|msg| msg,
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
@ -423,7 +459,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
widget::icon::from_name(connected_device.battery.icon_name.clone());
|
widget::icon::from_name(connected_device.battery.icon_name.clone());
|
||||||
|
|
||||||
let battery_percent_and_time = widget::text(
|
let battery_percent_and_time = widget::text(
|
||||||
if connected_device.battery.remaining_duration > TimeDelta::zero() {
|
if connected_device.battery.remaining_duration.is_positive() {
|
||||||
format!(
|
format!(
|
||||||
"{}% - {}",
|
"{}% - {}",
|
||||||
connected_device.battery.percent,
|
connected_device.battery.percent,
|
||||||
|
|
@ -437,7 +473,10 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
row!(
|
row!(
|
||||||
widget::icon::from_name(connected_device.device_icon).size(48),
|
widget::icon::from_name(connected_device.device_icon).size(48),
|
||||||
column!(
|
column!(
|
||||||
text::heading(&connected_device.model).height(20.0),
|
text::heading(&connected_device.model)
|
||||||
|
.ellipsize(Ellipsize::End(EllipsizeHeightLimit::Lines(1)))
|
||||||
|
.height(20.0)
|
||||||
|
.width(Length::Fill),
|
||||||
row!(battery_icon, battery_percent_and_time)
|
row!(battery_icon, battery_percent_and_time)
|
||||||
.spacing(4)
|
.spacing(4)
|
||||||
.align_y(Alignment::Center),
|
.align_y(Alignment::Center),
|
||||||
|
|
@ -450,7 +489,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
.width(Length::Fill)
|
.width(Length::Fill)
|
||||||
.height(Length::Fill),
|
.height(Length::Fill),
|
||||||
)
|
)
|
||||||
.height(64)
|
.height(64.)
|
||||||
.class(cosmic::theme::Container::List)
|
.class(cosmic::theme::Container::List)
|
||||||
.into()
|
.into()
|
||||||
})
|
})
|
||||||
|
|
@ -460,7 +499,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
.spacing(8)
|
.spacing(8)
|
||||||
.push(text::heading(§ion.title))
|
.push(text::heading(§ion.title))
|
||||||
.push(
|
.push(
|
||||||
widget::column()
|
widget::column::with_capacity(devices.len())
|
||||||
.extend(
|
.extend(
|
||||||
devices
|
devices
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|
@ -469,16 +508,8 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
.map(|mut device_row| {
|
.map(|mut device_row| {
|
||||||
cosmic::Element::from(
|
cosmic::Element::from(
|
||||||
row!(
|
row!(
|
||||||
device_row.next().unwrap_or(
|
device_row.next().unwrap_or(space::horizontal().into()),
|
||||||
widget::horizontal_space()
|
device_row.next().unwrap_or(space::horizontal().into()),
|
||||||
.width(Length::Fill)
|
|
||||||
.into()
|
|
||||||
),
|
|
||||||
device_row.next().unwrap_or(
|
|
||||||
widget::horizontal_space()
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into()
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
.spacing(8),
|
.spacing(8),
|
||||||
)
|
)
|
||||||
|
|
@ -491,9 +522,9 @@ fn connected_devices() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn profiles() -> Section<crate::pages::Message> {
|
fn profiles() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
_power_desc = fl!("xdg-entry-power-comment");
|
||||||
let _power_desc = descriptions.insert(fl!("power", "desc"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("power-mode"))
|
.title(fl!("power-mode"))
|
||||||
|
|
@ -508,18 +539,9 @@ fn profiles() -> Section<crate::pages::Message> {
|
||||||
section = profiles
|
section = profiles
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|profile| {
|
.map(|profile| {
|
||||||
settings::item_row(vec![
|
settings::item::builder(profile.title())
|
||||||
radio(
|
.description(profile.description())
|
||||||
widget::column::with_capacity(2)
|
.radio(profile, Some(current_profile), Message::PowerProfileChange)
|
||||||
.push(text::body(profile.title()))
|
|
||||||
.push(text::caption(profile.description())),
|
|
||||||
profile,
|
|
||||||
Some(current_profile),
|
|
||||||
Message::PowerProfileChange,
|
|
||||||
)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
])
|
|
||||||
})
|
})
|
||||||
.fold(section, settings::Section::add);
|
.fold(section, settings::Section::add);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,11 @@ use cosmic::{
|
||||||
Apply, Element, Task,
|
Apply, Element, Task,
|
||||||
iced::{Alignment, Length, window},
|
iced::{Alignment, Length, window},
|
||||||
surface,
|
surface,
|
||||||
widget::{self, settings},
|
widget::{self, settings, space::horizontal as horizontal_space},
|
||||||
};
|
};
|
||||||
use cosmic_config::{Config, ConfigGet, ConfigSet};
|
use cosmic_config::{Config, ConfigGet, ConfigSet};
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
use cosmic_settings_sound_subscription as subscription;
|
use cosmic_settings_sound_subscription as subscription;
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
|
|
||||||
const AUDIO_CONFIG: &str = "com.system76.CosmicAudio";
|
const AUDIO_CONFIG: &str = "com.system76.CosmicAudio";
|
||||||
|
|
@ -125,7 +124,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("sound", "preferences-sound-symbolic")
|
page::Info::new("sound", "preferences-sound-symbolic")
|
||||||
.title(fl!("sound"))
|
.title(fl!("sound"))
|
||||||
.description(fl!("sound", "desc"))
|
.description(fl!("xdg-entry-sound-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_id(&mut self, entity: page::Entity) {
|
fn set_id(&mut self, entity: page::Entity) {
|
||||||
|
|
@ -251,20 +250,20 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn input() -> Section<crate::pages::Message> {
|
fn input() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
volume = fl!("sound-input", "volume");
|
||||||
let volume = descriptions.insert(fl!("sound-input", "volume"));
|
device = fl!("sound-input", "device");
|
||||||
let device = descriptions.insert(fl!("sound-input", "device"));
|
_level = fl!("sound-input", "level");
|
||||||
let _level = descriptions.insert(fl!("sound-input", "level"));
|
amplification = fl!("amplification");
|
||||||
let amplification = descriptions.insert(fl!("amplification"));
|
amplification_desc = fl!("amplification", "desc");
|
||||||
let amplification_desc = descriptions.insert(fl!("amplification", "desc"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("sound-input"))
|
.title(fl!("sound-input"))
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
.view::<Page>(move |_binder, page, section| {
|
.view::<Page>(move |_binder, page, section| {
|
||||||
if page.model.sources().is_empty() {
|
if page.model.sources().is_empty() {
|
||||||
return widget::row().into();
|
return widget::space().into();
|
||||||
}
|
}
|
||||||
|
|
||||||
let slider = if page.amplification_source {
|
let slider = if page.amplification_source {
|
||||||
|
|
@ -276,7 +275,10 @@ fn input() -> Section<crate::pages::Message> {
|
||||||
widget::slider(0..=100, page.model.source_volume, |change| {
|
widget::slider(0..=100, page.model.source_volume, |change| {
|
||||||
Message::SetSourceVolume(change).into()
|
Message::SetSourceVolume(change).into()
|
||||||
})
|
})
|
||||||
};
|
}
|
||||||
|
.width(Length::Fill)
|
||||||
|
.apply(widget::container)
|
||||||
|
.max_width(250.);
|
||||||
|
|
||||||
let volume_control = widget::row::with_capacity(4)
|
let volume_control = widget::row::with_capacity(4)
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
|
|
@ -293,7 +295,7 @@ fn input() -> Section<crate::pages::Message> {
|
||||||
.width(Length::Fixed(22.0))
|
.width(Length::Fixed(22.0))
|
||||||
.align_x(Alignment::Center),
|
.align_x(Alignment::Center),
|
||||||
)
|
)
|
||||||
.push(widget::horizontal_space().width(8))
|
.push(horizontal_space().width(8.))
|
||||||
.push(slider);
|
.push(slider);
|
||||||
let devices = widget::dropdown::popup_dropdown(
|
let devices = widget::dropdown::popup_dropdown(
|
||||||
page.model.sources(),
|
page.model.sources(),
|
||||||
|
|
@ -308,19 +310,19 @@ fn input() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
let mut controls = settings::section()
|
let mut controls = settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*section.descriptions[volume],
|
settings::item::builder(&*section.descriptions[volume])
|
||||||
volume_control,
|
.flex_control(volume_control)
|
||||||
))
|
.align_items(Alignment::Center),
|
||||||
|
)
|
||||||
.add(settings::item(&*section.descriptions[device], devices));
|
.add(settings::item(&*section.descriptions[device], devices));
|
||||||
|
|
||||||
controls = controls.add(
|
controls = controls.add(
|
||||||
settings::item::builder(&*section.descriptions[amplification])
|
settings::item::builder(&*section.descriptions[amplification])
|
||||||
.description(&*section.descriptions[amplification_desc])
|
.description(&*section.descriptions[amplification_desc])
|
||||||
.control(
|
.toggler(page.amplification_source, |t| {
|
||||||
widget::toggler(page.amplification_source)
|
Message::ToggleOverAmplificationSource(t).into()
|
||||||
.on_toggle(|t| Message::ToggleOverAmplificationSource(t).into()),
|
}),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
Element::from(controls)
|
Element::from(controls)
|
||||||
|
|
@ -328,17 +330,16 @@ fn input() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn output() -> Section<crate::pages::Message> {
|
fn output() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
volume = fl!("sound-output", "volume");
|
||||||
let volume = descriptions.insert(fl!("sound-output", "volume"));
|
device = fl!("sound-output", "device");
|
||||||
let device = descriptions.insert(fl!("sound-output", "device"));
|
_level = fl!("sound-output", "level");
|
||||||
let _level = descriptions.insert(fl!("sound-output", "level"));
|
balance = fl!("sound-output", "balance");
|
||||||
let balance = descriptions.insert(fl!("sound-output", "balance"));
|
left = fl!("sound-output", "left");
|
||||||
let left = descriptions.insert(fl!("sound-output", "left"));
|
right = fl!("sound-output", "right");
|
||||||
let right = descriptions.insert(fl!("sound-output", "right"));
|
amplification = fl!("amplification");
|
||||||
// let balance = descriptions.insert(fl!("sound-output", "balance"));
|
amplification_desc = fl!("amplification", "desc");
|
||||||
let amplification = descriptions.insert(fl!("amplification"));
|
});
|
||||||
let amplification_desc = descriptions.insert(fl!("amplification", "desc"));
|
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("sound-output"))
|
.title(fl!("sound-output"))
|
||||||
|
|
@ -353,7 +354,10 @@ fn output() -> Section<crate::pages::Message> {
|
||||||
widget::slider(0..=100, page.model.sink_volume, |change| {
|
widget::slider(0..=100, page.model.sink_volume, |change| {
|
||||||
Message::SetSinkVolume(change).into()
|
Message::SetSinkVolume(change).into()
|
||||||
})
|
})
|
||||||
};
|
}
|
||||||
|
.width(Length::Fill)
|
||||||
|
.apply(widget::container)
|
||||||
|
.max_width(250.);
|
||||||
|
|
||||||
let volume_control = widget::row::with_capacity(4)
|
let volume_control = widget::row::with_capacity(4)
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
|
|
@ -370,7 +374,7 @@ fn output() -> Section<crate::pages::Message> {
|
||||||
.width(Length::Fixed(22.0))
|
.width(Length::Fixed(22.0))
|
||||||
.align_x(Alignment::Center),
|
.align_x(Alignment::Center),
|
||||||
)
|
)
|
||||||
.push(widget::horizontal_space().width(8))
|
.push(horizontal_space().width(8.))
|
||||||
.push(slider);
|
.push(slider);
|
||||||
|
|
||||||
let devices = widget::dropdown::popup_dropdown(
|
let devices = widget::dropdown::popup_dropdown(
|
||||||
|
|
@ -386,21 +390,26 @@ fn output() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
let mut controls = settings::section()
|
let mut controls = settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*section.descriptions[volume],
|
settings::item::builder(&*section.descriptions[volume])
|
||||||
volume_control,
|
.flex_control(volume_control)
|
||||||
))
|
.align_items(Alignment::Center),
|
||||||
|
)
|
||||||
.add(settings::item(&*section.descriptions[device], devices))
|
.add(settings::item(&*section.descriptions[device], devices))
|
||||||
.add(settings::item(
|
.add(settings::item(
|
||||||
&*section.descriptions[balance],
|
&*section.descriptions[balance],
|
||||||
widget::row::with_capacity(4)
|
widget::row::with_capacity(5)
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
.push(
|
.push(
|
||||||
widget::text::body(&*section.descriptions[left])
|
widget::column::with_capacity(2)
|
||||||
.width(Length::Fixed(22.0))
|
.align_x(Alignment::Center)
|
||||||
.align_x(Alignment::Center),
|
.push(
|
||||||
|
widget::text::body(&*section.descriptions[left])
|
||||||
|
.align_x(Alignment::Center),
|
||||||
|
)
|
||||||
|
.push(horizontal_space().width(22.)),
|
||||||
)
|
)
|
||||||
.push(widget::horizontal_space().width(8))
|
.push(horizontal_space().width(8.))
|
||||||
.push(
|
.push(
|
||||||
widget::slider(
|
widget::slider(
|
||||||
0..=200,
|
0..=200,
|
||||||
|
|
@ -410,21 +419,24 @@ fn output() -> Section<crate::pages::Message> {
|
||||||
)
|
)
|
||||||
.breakpoints(&[100]),
|
.breakpoints(&[100]),
|
||||||
)
|
)
|
||||||
.push(widget::horizontal_space().width(8))
|
.push(horizontal_space().width(8.))
|
||||||
.push(
|
.push(
|
||||||
widget::text::body(&*section.descriptions[right])
|
widget::column::with_capacity(2)
|
||||||
.width(Length::Fixed(22.0))
|
.align_x(Alignment::Center)
|
||||||
.align_x(Alignment::Center),
|
.push(
|
||||||
|
widget::text::body(&*section.descriptions[right])
|
||||||
|
.align_x(Alignment::Center),
|
||||||
|
)
|
||||||
|
.push(horizontal_space().width(22.0)),
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
controls = controls.add(
|
controls = controls.add(
|
||||||
settings::item::builder(&*section.descriptions[amplification])
|
settings::item::builder(&*section.descriptions[amplification])
|
||||||
.description(&*section.descriptions[amplification_desc])
|
.description(&*section.descriptions[amplification_desc])
|
||||||
.control(
|
.toggler(page.amplification_sink, |t| {
|
||||||
widget::toggler(page.amplification_sink)
|
Message::ToggleOverAmplificationSink(t).into()
|
||||||
.on_toggle(|t| Message::ToggleOverAmplificationSink(t).into()),
|
}),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
Element::from(controls)
|
Element::from(controls)
|
||||||
|
|
@ -442,7 +454,7 @@ fn device_profiles() -> Section<crate::pages::Message> {
|
||||||
.view::<Page>(move |_binder, page, section| {
|
.view::<Page>(move |_binder, page, section| {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
let button = widget::row::with_children(vec![
|
let button = widget::row::with_children(vec![
|
||||||
widget::horizontal_space().into(),
|
horizontal_space().into(),
|
||||||
widget::icon::from_name("go-next-symbolic").size(16).into(),
|
widget::icon::from_name("go-next-symbolic").size(16).into(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
@ -450,10 +462,13 @@ fn device_profiles() -> Section<crate::pages::Message> {
|
||||||
.control(button)
|
.control(button)
|
||||||
.spacing(16)
|
.spacing(16)
|
||||||
.apply(widget::container)
|
.apply(widget::container)
|
||||||
|
.width(Length::Fill)
|
||||||
.class(cosmic::theme::Container::List)
|
.class(cosmic::theme::Container::List)
|
||||||
.apply(widget::button::custom)
|
.apply(widget::button::custom)
|
||||||
|
.width(Length::Fill)
|
||||||
.class(cosmic::theme::Button::Transparent)
|
.class(cosmic::theme::Button::Transparent)
|
||||||
.on_press(crate::pages::Message::Page(page.device_profiles));
|
.on_press(crate::pages::Message::Page(page.device_profiles))
|
||||||
|
.width(Length::Fill);
|
||||||
|
|
||||||
settings::section().add(device_profiles).into()
|
settings::section().add(device_profiles).into()
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
// Copyright 2023 System76 <info@system76.com>
|
// Copyright 2023 System76 <info@system76.com>
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
|
use cosmic::iced::Alignment;
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
|
|
||||||
use super::info::Info;
|
use super::info::Info;
|
||||||
use cosmic::widget::{editable_input, list_column, settings, text};
|
use cosmic::widget::{editable_input, list_column, settings, text};
|
||||||
use cosmic::{Apply, Task};
|
use cosmic::{Apply, Task};
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
|
@ -61,7 +61,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("about", "help-about-symbolic")
|
page::Info::new("about", "help-about-symbolic")
|
||||||
.title(fl!("about"))
|
.title(fl!("about"))
|
||||||
.description(fl!("about", "desc"))
|
.description(fl!("xdg-entry-about-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
||||||
|
|
@ -162,10 +162,10 @@ async fn set_hostname_impl(hostname: &str) -> Result<(), String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn device() -> Section<crate::pages::Message> {
|
fn device() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
device = fl!("about-device");
|
||||||
let device = descriptions.insert(fl!("about-device"));
|
device_desc = fl!("about-device", "desc");
|
||||||
let device_desc = descriptions.insert(fl!("about-device", "desc"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
|
|
@ -178,7 +178,7 @@ fn device() -> Section<crate::pages::Message> {
|
||||||
page.editing_device_name,
|
page.editing_device_name,
|
||||||
Message::HostnameEdit,
|
Message::HostnameEdit,
|
||||||
)
|
)
|
||||||
.width(250)
|
.width(250.)
|
||||||
.on_input(Message::HostnameInput)
|
.on_input(Message::HostnameInput)
|
||||||
.on_unfocus(Message::HostnameSubmit)
|
.on_unfocus(Message::HostnameSubmit)
|
||||||
.on_submit(|_| Message::HostnameSubmit);
|
.on_submit(|_| Message::HostnameSubmit);
|
||||||
|
|
@ -195,13 +195,13 @@ fn device() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn hardware() -> Section<crate::pages::Message> {
|
fn hardware() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
model = fl!("about-hardware", "model");
|
||||||
let model = descriptions.insert(fl!("about-hardware", "model"));
|
memory = fl!("about-hardware", "memory");
|
||||||
let memory = descriptions.insert(fl!("about-hardware", "memory"));
|
processor = fl!("about-hardware", "processor");
|
||||||
let processor = descriptions.insert(fl!("about-hardware", "processor"));
|
graphics = fl!("about-hardware", "graphics");
|
||||||
let graphics = descriptions.insert(fl!("about-hardware", "graphics"));
|
disk_capacity = fl!("about-hardware", "disk-capacity");
|
||||||
let disk_capacity = descriptions.insert(fl!("about-hardware", "disk-capacity"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("about-hardware"))
|
.title(fl!("about-hardware"))
|
||||||
|
|
@ -211,43 +211,46 @@ fn hardware() -> Section<crate::pages::Message> {
|
||||||
|
|
||||||
let mut section_builder = settings::section()
|
let mut section_builder = settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*desc[model],
|
settings::flex_item(&*desc[model], text::body(&page.info.hardware_model))
|
||||||
text::body(&page.info.hardware_model),
|
.align_items(Alignment::Center),
|
||||||
))
|
)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*desc[memory],
|
settings::flex_item(&*desc[memory], text::body(&page.info.memory))
|
||||||
text::body(&page.info.memory),
|
.align_items(Alignment::Center),
|
||||||
))
|
)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*desc[processor],
|
settings::flex_item(&*desc[processor], text::body(&page.info.processor))
|
||||||
text::body(&page.info.processor),
|
.align_items(Alignment::Center),
|
||||||
));
|
);
|
||||||
|
|
||||||
for card in &page.info.graphics {
|
for card in &page.info.graphics {
|
||||||
section_builder = section_builder.add(settings::flex_item(
|
section_builder = section_builder.add(
|
||||||
&*desc[graphics],
|
settings::flex_item(&*desc[graphics], text::body(card.as_str()))
|
||||||
text::body(card.as_str()),
|
.align_items(Alignment::Center),
|
||||||
));
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
section_builder
|
section_builder
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*desc[disk_capacity],
|
settings::flex_item(
|
||||||
text::body(&page.info.disk_capacity),
|
&*desc[disk_capacity],
|
||||||
))
|
text::body(&page.info.disk_capacity),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center),
|
||||||
|
)
|
||||||
.into()
|
.into()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn os() -> Section<crate::pages::Message> {
|
fn os() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
os = fl!("about-os", "os");
|
||||||
let os = descriptions.insert(fl!("about-os", "os"));
|
os_arch = fl!("about-os", "os-architecture");
|
||||||
let os_arch = descriptions.insert(fl!("about-os", "os-architecture"));
|
kernel = fl!("about-os", "kernel");
|
||||||
let kernel = descriptions.insert(fl!("about-os", "kernel"));
|
desktop = fl!("about-os", "desktop-environment");
|
||||||
let desktop = descriptions.insert(fl!("about-os", "desktop-environment"));
|
windowing_system = fl!("about-os", "windowing-system");
|
||||||
let windowing_system = descriptions.insert(fl!("about-os", "windowing-system"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("about-os"))
|
.title(fl!("about-os"))
|
||||||
|
|
@ -256,26 +259,32 @@ fn os() -> Section<crate::pages::Message> {
|
||||||
let desc = §ion.descriptions;
|
let desc = §ion.descriptions;
|
||||||
settings::section()
|
settings::section()
|
||||||
.title(§ion.title)
|
.title(§ion.title)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*desc[os],
|
settings::flex_item(&*desc[os], text::body(&page.info.operating_system))
|
||||||
text::body(&page.info.operating_system),
|
.align_items(Alignment::Center),
|
||||||
))
|
)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*desc[os_arch],
|
settings::flex_item(&*desc[os_arch], text::body(&page.info.os_architecture))
|
||||||
text::body(&page.info.os_architecture),
|
.align_items(Alignment::Center),
|
||||||
))
|
)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*desc[kernel],
|
settings::flex_item(&*desc[kernel], text::body(&page.info.kernel_version))
|
||||||
text::body(&page.info.kernel_version),
|
.align_items(Alignment::Center),
|
||||||
))
|
)
|
||||||
.add(settings::flex_item(
|
.add(
|
||||||
&*desc[desktop],
|
settings::flex_item(
|
||||||
text::body(&page.info.desktop_environment),
|
&*desc[desktop],
|
||||||
))
|
text::body(&page.info.desktop_environment),
|
||||||
.add(settings::flex_item(
|
)
|
||||||
&*desc[windowing_system],
|
.align_items(Alignment::Center),
|
||||||
text::body(&page.info.windowing_system),
|
)
|
||||||
))
|
.add(
|
||||||
|
settings::flex_item(
|
||||||
|
&*desc[windowing_system],
|
||||||
|
text::body(&page.info.windowing_system),
|
||||||
|
)
|
||||||
|
.align_items(Alignment::Center),
|
||||||
|
)
|
||||||
.into()
|
.into()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
// Copyright 2023 System76 <info@system76.com>
|
// Copyright 2023 System76 <info@system76.com>
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use cosmic::iced_wgpu::wgpu;
|
#[cfg(feature = "wgpu")]
|
||||||
|
use cosmic::iced::wgpu;
|
||||||
use std::{collections::HashMap, collections::HashSet, ffi::OsStr, process::Command};
|
use std::{collections::HashMap, collections::HashSet, ffi::OsStr, process::Command};
|
||||||
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
|
|
@ -21,55 +22,15 @@ pub struct Info {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Info {
|
impl Info {
|
||||||
pub fn load() -> Info {
|
/// OpenGL backend reports GPU names with renderer suffixes like "/PCIe/SSE2".
|
||||||
let mut info = Info {
|
/// We strip these to match against Vulkan backend's clean name.
|
||||||
os_architecture: architecture(),
|
fn normalize_gpu_name(name: &str) -> String {
|
||||||
kernel_version: kernel_version(),
|
name.split('/').next().unwrap_or(name).trim().to_string()
|
||||||
hardware_model: hardware_model(),
|
}
|
||||||
operating_system: operating_system(),
|
|
||||||
processor: processor_name(),
|
|
||||||
..Default::default()
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut sys = sysinfo::System::new();
|
#[cfg(feature = "wgpu")]
|
||||||
let disks = sysinfo::Disks::new_with_refreshed_list();
|
fn wgpu_graphics() -> Vec<String> {
|
||||||
sys.refresh_memory();
|
let mut graphics = Vec::new();
|
||||||
|
|
||||||
let mut total_capacity = 0;
|
|
||||||
let mut disk_set = HashSet::new();
|
|
||||||
for disk in disks.list() {
|
|
||||||
if disk_set.contains(disk.name()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
disk_set.insert(disk.name());
|
|
||||||
total_capacity += disk.total_space();
|
|
||||||
}
|
|
||||||
|
|
||||||
info.disk_capacity = format_size(total_capacity);
|
|
||||||
|
|
||||||
if let Some(name) = sysinfo::System::host_name() {
|
|
||||||
info.device_name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
info.memory = format_size(sys.total_memory());
|
|
||||||
|
|
||||||
if let Ok(mut session) = std::env::var("XDG_SESSION_TYPE") {
|
|
||||||
if let Some(first) = session.get_mut(0..1) {
|
|
||||||
first.make_ascii_uppercase();
|
|
||||||
}
|
|
||||||
info.windowing_system = session;
|
|
||||||
}
|
|
||||||
|
|
||||||
// prefer XDG_SESSION_DESKTOP because the value is singular
|
|
||||||
if let Ok(mut session) = std::env::var("XDG_SESSION_DESKTOP")
|
|
||||||
.or_else(|_| std::env::var("XDG_CURRENT_DESKTOP"))
|
|
||||||
.or_else(|_| std::env::var("DESKTOP_SESSION"))
|
|
||||||
{
|
|
||||||
if let Some(first) = session.get_mut(0..1) {
|
|
||||||
first.make_ascii_uppercase();
|
|
||||||
}
|
|
||||||
info.desktop_environment = session;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use wgpu to enumerate GPUs. Works cross-platform and doesn't require external tools
|
// Use wgpu to enumerate GPUs. Works cross-platform and doesn't require external tools
|
||||||
let instance = wgpu::Instance::default();
|
let instance = wgpu::Instance::default();
|
||||||
|
|
@ -149,15 +110,17 @@ impl Info {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if adapter_info.device == 0 && seen_names.contains(&gpu_name) {
|
let normalized_gpu_name = Self::normalize_gpu_name(&gpu_name);
|
||||||
|
|
||||||
|
if adapter_info.device == 0 && seen_names.contains(&normalized_gpu_name) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if adapter_info.device != 0 {
|
if adapter_info.device != 0 {
|
||||||
seen_devices.insert(device_key);
|
seen_devices.insert(device_key);
|
||||||
}
|
}
|
||||||
seen_names.insert(gpu_name.clone());
|
seen_names.insert(normalized_gpu_name);
|
||||||
info.graphics.push(gpu_name);
|
graphics.push(gpu_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NVIDIA Optimus quirk: On laptops with NVIDIA Optimus (switchable graphics),
|
// NVIDIA Optimus quirk: On laptops with NVIDIA Optimus (switchable graphics),
|
||||||
|
|
@ -170,10 +133,68 @@ impl Info {
|
||||||
let device_key = (vendor, device);
|
let device_key = (vendor, device);
|
||||||
if !seen_devices.contains(&device_key) {
|
if !seen_devices.contains(&device_key) {
|
||||||
seen_devices.insert(device_key);
|
seen_devices.insert(device_key);
|
||||||
info.graphics.push(name);
|
graphics.push(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
graphics
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn load() -> Info {
|
||||||
|
let mut info = Info {
|
||||||
|
os_architecture: architecture(),
|
||||||
|
kernel_version: kernel_version(),
|
||||||
|
hardware_model: hardware_model(),
|
||||||
|
operating_system: operating_system(),
|
||||||
|
processor: processor_name(),
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut sys = sysinfo::System::new();
|
||||||
|
let disks = sysinfo::Disks::new_with_refreshed_list();
|
||||||
|
sys.refresh_memory();
|
||||||
|
|
||||||
|
let mut total_capacity = 0;
|
||||||
|
let mut disk_set = HashSet::new();
|
||||||
|
for disk in disks.list() {
|
||||||
|
if disk_set.contains(disk.name()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
disk_set.insert(disk.name());
|
||||||
|
total_capacity += disk.total_space();
|
||||||
|
}
|
||||||
|
|
||||||
|
info.disk_capacity = format_size(total_capacity);
|
||||||
|
|
||||||
|
if let Some(name) = sysinfo::System::host_name() {
|
||||||
|
info.device_name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.memory = format_size(sys.total_memory());
|
||||||
|
|
||||||
|
if let Ok(mut session) = std::env::var("XDG_SESSION_TYPE") {
|
||||||
|
if let Some(first) = session.get_mut(0..1) {
|
||||||
|
first.make_ascii_uppercase();
|
||||||
|
}
|
||||||
|
info.windowing_system = session;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefer XDG_SESSION_DESKTOP because the value is singular
|
||||||
|
if let Ok(mut session) = std::env::var("XDG_SESSION_DESKTOP")
|
||||||
|
.or_else(|_| std::env::var("XDG_CURRENT_DESKTOP"))
|
||||||
|
.or_else(|_| std::env::var("DESKTOP_SESSION"))
|
||||||
|
{
|
||||||
|
if let Some(first) = session.get_mut(0..1) {
|
||||||
|
first.make_ascii_uppercase();
|
||||||
|
}
|
||||||
|
info.desktop_environment = session;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "wgpu")]
|
||||||
|
{
|
||||||
|
info.graphics = Self::wgpu_graphics();
|
||||||
|
}
|
||||||
|
|
||||||
info
|
info
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,12 @@ use cosmic::{
|
||||||
Apply, Element,
|
Apply, Element,
|
||||||
dialog::file_chooser,
|
dialog::file_chooser,
|
||||||
iced::{Alignment, Length},
|
iced::{Alignment, Length},
|
||||||
widget::{self, Space, column, icon, row, settings, text},
|
widget::{self, column, icon, list, row, settings, space::horizontal, text},
|
||||||
};
|
};
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
use image::GenericImageView;
|
use image::GenericImageView;
|
||||||
use pwhash::{bcrypt, md5_crypt, sha256_crypt, sha512_crypt};
|
use pwhash::{bcrypt, md5_crypt, sha256_crypt, sha512_crypt};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
|
|
@ -200,7 +199,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("users", "system-users-symbolic")
|
page::Info::new("users", "system-users-symbolic")
|
||||||
.title(fl!("users"))
|
.title(fl!("users"))
|
||||||
.description(fl!("users", "desc"))
|
.description(fl!("xdg-entry-users-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dialog(&self) -> Option<Element<'_, pages::Message>> {
|
fn dialog(&self) -> Option<Element<'_, pages::Message>> {
|
||||||
|
|
@ -323,7 +322,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
)))
|
)))
|
||||||
.width(Length::Fill),
|
.width(Length::Fill),
|
||||||
)
|
)
|
||||||
.push(Space::new(5, 0))
|
.push(horizontal().width(5.))
|
||||||
.push(admin_toggler)
|
.push(admin_toggler)
|
||||||
.align_y(Alignment::Center),
|
.align_y(Alignment::Center),
|
||||||
),
|
),
|
||||||
|
|
@ -777,25 +776,22 @@ impl Page {
|
||||||
impl page::AutoBind<crate::pages::Message> for Page {}
|
impl page::AutoBind<crate::pages::Message> for Page {}
|
||||||
|
|
||||||
fn user_list() -> Section<crate::pages::Message> {
|
fn user_list() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
user_type_standard = fl!("users", "standard");
|
||||||
let user_type_standard = descriptions.insert(fl!("users", "standard"));
|
user_type_admin = fl!("users", "admin");
|
||||||
let user_type_admin = descriptions.insert(fl!("users", "admin"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
.view::<Page>(move |_binder, page, section| {
|
.view::<Page>(move |_binder, page, section| {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
|
let space_xxs = cosmic::theme::spacing().space_xxs;
|
||||||
let cosmic::cosmic_theme::Spacing {
|
|
||||||
space_xxs, space_m, ..
|
|
||||||
} = cosmic::theme::active().cosmic().spacing;
|
|
||||||
|
|
||||||
let users_list = page
|
let users_list = page
|
||||||
.users
|
.users
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.flat_map(|(idx, user)| {
|
.map(|(idx, user)| {
|
||||||
let expanded =
|
let expanded =
|
||||||
matches!(page.selected_user_idx, Some(user_idx) if user_idx == idx);
|
matches!(page.selected_user_idx, Some(user_idx) if user_idx == idx);
|
||||||
|
|
||||||
|
|
@ -833,37 +829,6 @@ fn user_list() -> Section<crate::pages::Message> {
|
||||||
&descriptions[user_type_standard]
|
&descriptions[user_type_standard]
|
||||||
});
|
});
|
||||||
|
|
||||||
let expanded_details = expanded.then(|| {
|
|
||||||
let mut details_list = widget::list_column()
|
|
||||||
.add(settings::item(&page.fullname_label, fullname))
|
|
||||||
.add(settings::item(&page.username_label, username))
|
|
||||||
.add(settings::item(&page.password_label, password))
|
|
||||||
.add(settings::item_row(vec![
|
|
||||||
column::with_capacity(2)
|
|
||||||
.push(text::body(crate::fl!("administrator")))
|
|
||||||
.push(text::caption(crate::fl!("administrator", "desc")))
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
Space::new(5, 0).into(),
|
|
||||||
widget::toggler(user.is_admin)
|
|
||||||
.on_toggle(|enabled| {
|
|
||||||
Message::SelectedUserSetAdmin(user.id, enabled)
|
|
||||||
})
|
|
||||||
.into(),
|
|
||||||
]));
|
|
||||||
|
|
||||||
if page.users.len() > 1 {
|
|
||||||
details_list = details_list.add(settings::item_row(vec![
|
|
||||||
widget::horizontal_space().width(Length::Fill).into(),
|
|
||||||
widget::button::destructive(crate::fl!("remove-user"))
|
|
||||||
.on_press(Message::SelectedUserDelete(user.id))
|
|
||||||
.into(),
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
|
|
||||||
details_list.apply(Element::from)
|
|
||||||
});
|
|
||||||
|
|
||||||
let profile_icon_handle = user
|
let profile_icon_handle = user
|
||||||
.profile_icon
|
.profile_icon
|
||||||
.clone()
|
.clone()
|
||||||
|
|
@ -885,8 +850,8 @@ fn user_list() -> Section<crate::pages::Message> {
|
||||||
)
|
)
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
.spacing(space_xxs)
|
.spacing(space_xxs)
|
||||||
|
.width(Length::Fill)
|
||||||
.into(),
|
.into(),
|
||||||
widget::horizontal_space().width(Length::Fill).into(),
|
|
||||||
icon::from_name(if expanded {
|
icon::from_name(if expanded {
|
||||||
"go-up-symbolic"
|
"go-up-symbolic"
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -897,27 +862,49 @@ fn user_list() -> Section<crate::pages::Message> {
|
||||||
.into(),
|
.into(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
let account_details = Some(
|
let mut user_list = widget::list_column().add(
|
||||||
widget::button::custom(account_details_content)
|
list::button(account_details_content)
|
||||||
.padding([space_xxs, space_m])
|
|
||||||
.on_press(Message::SelectUser(idx))
|
|
||||||
.class(cosmic::theme::Button::ListItem)
|
|
||||||
.selected(expanded)
|
.selected(expanded)
|
||||||
.apply(Element::from),
|
.on_press(Message::SelectUser(idx)),
|
||||||
);
|
);
|
||||||
|
|
||||||
vec![account_details, expanded_details]
|
if expanded {
|
||||||
|
user_list = user_list
|
||||||
|
.add(settings::item(&page.fullname_label, fullname))
|
||||||
|
.add(settings::item(&page.username_label, username))
|
||||||
|
.add(settings::item(&page.password_label, password))
|
||||||
|
.add(settings::item_row(vec![
|
||||||
|
column::with_capacity(2)
|
||||||
|
.push(text::body(crate::fl!("administrator")))
|
||||||
|
.push(text::caption(crate::fl!("administrator", "desc")))
|
||||||
|
.width(Length::Fill)
|
||||||
|
.into(),
|
||||||
|
horizontal().width(5.).into(),
|
||||||
|
widget::toggler(user.is_admin)
|
||||||
|
.on_toggle(|enabled| {
|
||||||
|
Message::SelectedUserSetAdmin(user.id, enabled)
|
||||||
|
})
|
||||||
|
.into(),
|
||||||
|
]));
|
||||||
|
|
||||||
|
if page.users.len() > 1 {
|
||||||
|
user_list = user_list.add(settings::item_row(vec![
|
||||||
|
horizontal().width(Length::Fill).into(),
|
||||||
|
widget::button::destructive(crate::fl!("remove-user"))
|
||||||
|
.on_press(Message::SelectedUserDelete(user.id))
|
||||||
|
.into(),
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Element::from(user_list)
|
||||||
})
|
})
|
||||||
.flatten()
|
|
||||||
.fold(
|
.fold(
|
||||||
widget::list_column()
|
widget::column::with_capacity(page.users.len()),
|
||||||
.spacing(0)
|
|col, user| col.push(user),
|
||||||
.padding([8, 0])
|
|
||||||
.divider_padding(0)
|
|
||||||
.list_item_padding(0),
|
|
||||||
widget::ListColumn::add,
|
|
||||||
)
|
)
|
||||||
.apply(|list| Element::from(settings::section::with_column(list)));
|
.spacing(space_xxs)
|
||||||
|
.width(Length::Fill);
|
||||||
|
|
||||||
let add_user = widget::button::standard(crate::fl!("add-user"))
|
let add_user = widget::button::standard(crate::fl!("add-user"))
|
||||||
.on_press(Message::Dialog(Some(Dialog::AddNewUser(User::default()))))
|
.on_press(Message::Dialog(Some(Dialog::AddNewUser(User::default()))))
|
||||||
|
|
@ -928,7 +915,7 @@ fn user_list() -> Section<crate::pages::Message> {
|
||||||
widget::column::with_capacity(2)
|
widget::column::with_capacity(2)
|
||||||
.push(users_list)
|
.push(users_list)
|
||||||
.push(add_user)
|
.push(add_user)
|
||||||
.spacing(space_m)
|
.spacing(space_xxs)
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::User)
|
.map(crate::pages::Message::User)
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
// Copyright 2023 System76 <info@system76.com>
|
// Copyright 2023 System76 <info@system76.com>
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use chrono::{Datelike, Timelike};
|
use crate::widget::selection_context_item;
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
Apply, Element, Task,
|
Apply, Element, Task,
|
||||||
app::ContextDrawer,
|
app::ContextDrawer,
|
||||||
cosmic_config::{self, ConfigGet, ConfigSet},
|
cosmic_config::{self, ConfigGet, ConfigSet},
|
||||||
iced_core::text::Wrapping,
|
iced::core::text::Wrapping,
|
||||||
surface,
|
surface,
|
||||||
widget::{self, dropdown, settings},
|
widget::{self, dropdown, list, settings},
|
||||||
};
|
};
|
||||||
use cosmic_settings_page::{self as page, Section, section};
|
use cosmic_settings_page::{self as page, Section, section};
|
||||||
use icu::{
|
use icu::{
|
||||||
|
|
@ -20,9 +20,7 @@ use icu::{
|
||||||
},
|
},
|
||||||
locale::{Locale, preferences::extensions::unicode::keywords::HourCycle},
|
locale::{Locale, preferences::extensions::unicode::keywords::HourCycle},
|
||||||
};
|
};
|
||||||
use slab::Slab;
|
|
||||||
use slotmap::{Key, SlotMap};
|
use slotmap::{Key, SlotMap};
|
||||||
use std::rc::Rc;
|
|
||||||
pub use timedate_zbus::TimeDateProxy;
|
pub use timedate_zbus::TimeDateProxy;
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
||||||
|
|
@ -139,7 +137,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("time-date", "preferences-system-time-symbolic")
|
page::Info::new("time-date", "preferences-system-time-symbolic")
|
||||||
.title(fl!("time-date"))
|
.title(fl!("time-date"))
|
||||||
.description(fl!("time-date", "desc"))
|
.description(fl!("xdg-entry-date-time-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> Task<crate::pages::Message> {
|
||||||
|
|
@ -337,7 +335,11 @@ impl Page {
|
||||||
|
|
||||||
for (id, timezone) in self.timezone_list.iter().enumerate() {
|
for (id, timezone) in self.timezone_list.iter().enumerate() {
|
||||||
if search_input.is_empty() || timezone.to_lowercase().contains(search_input) {
|
if search_input.is_empty() || timezone.to_lowercase().contains(search_input) {
|
||||||
list = list.add(self.timezone_context_item(id, timezone));
|
list = list.add(selection_context_item(
|
||||||
|
timezone,
|
||||||
|
Some(id) == self.timezone,
|
||||||
|
Message::Timezone(id),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -345,40 +347,6 @@ impl Page {
|
||||||
.map(crate::pages::Message::DateAndTime)
|
.map(crate::pages::Message::DateAndTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn timezone_context_item<'a>(&self, id: usize, timezone: &'a str) -> Element<'a, Message> {
|
|
||||||
let svg_accent = Rc::new(|theme: &cosmic::Theme| cosmic::widget::svg::Style {
|
|
||||||
color: Some(theme.cosmic().accent_text_color().into()),
|
|
||||||
});
|
|
||||||
let selected = Some(id) == self.timezone;
|
|
||||||
|
|
||||||
widget::settings::item_row(vec![
|
|
||||||
widget::text::body(timezone)
|
|
||||||
.class(if selected {
|
|
||||||
cosmic::theme::Text::Accent
|
|
||||||
} else {
|
|
||||||
cosmic::theme::Text::Default
|
|
||||||
})
|
|
||||||
.wrapping(Wrapping::Word)
|
|
||||||
.width(cosmic::iced::Length::Fill)
|
|
||||||
.into(),
|
|
||||||
if selected {
|
|
||||||
widget::icon::from_name("object-select-symbolic")
|
|
||||||
.size(16)
|
|
||||||
.icon()
|
|
||||||
.class(cosmic::theme::Svg::Custom(svg_accent.clone()))
|
|
||||||
.into()
|
|
||||||
} else {
|
|
||||||
widget::horizontal_space().width(16).into()
|
|
||||||
},
|
|
||||||
])
|
|
||||||
.apply(widget::container)
|
|
||||||
.class(cosmic::theme::Container::List)
|
|
||||||
.apply(widget::button::custom)
|
|
||||||
.class(cosmic::theme::Button::Transparent)
|
|
||||||
.on_press(Message::Timezone(id))
|
|
||||||
.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn update_local_time(&mut self) {
|
fn update_local_time(&mut self) {
|
||||||
self.local_time = Some(update_local_time());
|
self.local_time = Some(update_local_time());
|
||||||
|
|
||||||
|
|
@ -408,9 +376,9 @@ pub enum Message {
|
||||||
impl page::AutoBind<crate::pages::Message> for Page {}
|
impl page::AutoBind<crate::pages::Message> for Page {}
|
||||||
|
|
||||||
fn date() -> Section<crate::pages::Message> {
|
fn date() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
title = fl!("time-date");
|
||||||
let title = descriptions.insert(fl!("time-date"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("time-date"))
|
.title(fl!("time-date"))
|
||||||
|
|
@ -429,12 +397,12 @@ fn date() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn format() -> Section<crate::pages::Message> {
|
fn format() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
military = fl!("time-format", "twenty-four");
|
||||||
let military = descriptions.insert(fl!("time-format", "twenty-four"));
|
show_seconds = fl!("time-format", "show-seconds");
|
||||||
let show_seconds = descriptions.insert(fl!("time-format", "show-seconds"));
|
first = fl!("time-format", "first");
|
||||||
let first = descriptions.insert(fl!("time-format", "first"));
|
show_date = fl!("time-format", "show-date");
|
||||||
let show_date = descriptions.insert(fl!("time-format", "show-date"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("time-format"))
|
.title(fl!("time-format"))
|
||||||
|
|
@ -492,38 +460,27 @@ fn format() -> Section<crate::pages::Message> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn timezone() -> Section<crate::pages::Message> {
|
fn timezone() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
crate::slab!(descriptions {
|
||||||
|
time_zone = fl!("time-zone");
|
||||||
let time_zone = descriptions.insert(fl!("time-zone"));
|
});
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
.title(fl!("time-zone"))
|
.title(fl!("time-zone"))
|
||||||
.descriptions(descriptions)
|
.descriptions(descriptions)
|
||||||
.view::<Page>(move |_binder, page, section| {
|
.view::<Page>(move |_binder, page, section| {
|
||||||
let timezone_context_button = widget::row::with_capacity(2)
|
settings::section()
|
||||||
.spacing(12)
|
.title(§ion.title)
|
||||||
.push(
|
// Time zone select
|
||||||
|
.add(crate::widget::go_next_with_item(
|
||||||
|
§ion.descriptions[time_zone],
|
||||||
widget::text::body(
|
widget::text::body(
|
||||||
page.timezone
|
page.timezone
|
||||||
.map(|id| &*page.timezone_list[id])
|
.map(|id| &*page.timezone_list[id])
|
||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
)
|
)
|
||||||
.wrapping(Wrapping::Word),
|
.wrapping(Wrapping::Word),
|
||||||
)
|
Message::TimezoneContext,
|
||||||
.push(widget::icon::from_name("go-next-symbolic").size(16).icon())
|
))
|
||||||
.apply(widget::container)
|
|
||||||
.class(cosmic::theme::Container::List)
|
|
||||||
.apply(widget::button::custom)
|
|
||||||
.class(cosmic::theme::Button::Transparent)
|
|
||||||
.on_press(Message::TimezoneContext);
|
|
||||||
|
|
||||||
settings::section()
|
|
||||||
.title(§ion.title)
|
|
||||||
// Time zone select
|
|
||||||
.add(
|
|
||||||
settings::item::builder(&*section.descriptions[time_zone])
|
|
||||||
.control(timezone_context_button),
|
|
||||||
)
|
|
||||||
.apply(cosmic::Element::from)
|
.apply(cosmic::Element::from)
|
||||||
.map(crate::pages::Message::DateAndTime)
|
.map(crate::pages::Message::DateAndTime)
|
||||||
})
|
})
|
||||||
|
|
@ -564,10 +521,11 @@ fn format_date(date: &DateTime<Gregorian>, military: bool, show_seconds: bool) -
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_local_time() -> DateTime<Gregorian> {
|
fn update_local_time() -> DateTime<Gregorian> {
|
||||||
let now = chrono::Local::now();
|
let now = jiff::Zoned::now();
|
||||||
|
|
||||||
DateTime {
|
DateTime {
|
||||||
date: Date::try_new_gregorian(now.year(), now.month() as u8, now.day() as u8).unwrap(),
|
date: Date::try_new_gregorian(now.year() as i32, now.month() as u8, now.day() as u8)
|
||||||
|
.unwrap(),
|
||||||
time: Time::try_new(now.hour() as u8, now.minute() as u8, now.second() as u8, 0).unwrap(),
|
time: Time::try_new(now.hour() as u8, now.minute() as u8, now.second() as u8, 0).unwrap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("time", "preferences-time-and-language-symbolic")
|
page::Info::new("time", "preferences-time-and-language-symbolic")
|
||||||
.title(fl!("time"))
|
.title(fl!("time"))
|
||||||
.description(fl!("time", "desc"))
|
.description(fl!("xdg-entry-time-language-comment"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,12 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use std::collections::{BTreeMap, BTreeSet};
|
use std::collections::{BTreeMap, BTreeSet};
|
||||||
use std::rc::Rc;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use crate::widget::selection_context_item;
|
||||||
use cosmic::app::{ContextDrawer, context_drawer};
|
use cosmic::app::{ContextDrawer, context_drawer};
|
||||||
use cosmic::iced::{Alignment, Length};
|
use cosmic::iced::{Alignment, Length};
|
||||||
use cosmic::iced_core::text::Wrapping;
|
use cosmic::widget::{self, button, list};
|
||||||
use cosmic::widget::{self, button};
|
|
||||||
use cosmic::{Apply, Element};
|
use cosmic::{Apply, Element};
|
||||||
use cosmic_config::{ConfigGet, ConfigSet};
|
use cosmic_config::{ConfigGet, ConfigSet};
|
||||||
use cosmic_settings_page::Section;
|
use cosmic_settings_page::Section;
|
||||||
|
|
@ -26,6 +25,8 @@ use icu::{
|
||||||
use locales_rs as locale;
|
use locales_rs as locale;
|
||||||
use slotmap::{DefaultKey, SlotMap};
|
use slotmap::{DefaultKey, SlotMap};
|
||||||
|
|
||||||
|
static GNOME_LANGUAGE_SELECTOR: &str = "gnome-language-selector";
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum Message {
|
pub enum Message {
|
||||||
AddLanguage(DefaultKey),
|
AddLanguage(DefaultKey),
|
||||||
|
|
@ -99,6 +100,7 @@ pub struct PageRefresh {
|
||||||
region: Option<SystemLocale>,
|
region: Option<SystemLocale>,
|
||||||
available_languages: SlotMap<DefaultKey, SystemLocale>,
|
available_languages: SlotMap<DefaultKey, SystemLocale>,
|
||||||
system_locales: BTreeMap<String, SystemLocale>,
|
system_locales: BTreeMap<String, SystemLocale>,
|
||||||
|
language_selector_available: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
|
@ -113,6 +115,8 @@ pub struct Page {
|
||||||
registry: Option<locale::Registry>,
|
registry: Option<locale::Registry>,
|
||||||
expanded_source_popover: Option<usize>,
|
expanded_source_popover: Option<usize>,
|
||||||
add_language_search: String,
|
add_language_search: String,
|
||||||
|
/// Whether gnome-language-selector is in the path.
|
||||||
|
language_selector_available: bool,
|
||||||
/// Cached LC_NUMERIC locale in icu locale format.
|
/// Cached LC_NUMERIC locale in icu locale format.
|
||||||
numeric_locale: Option<Locale>,
|
numeric_locale: Option<Locale>,
|
||||||
/// Cached LC_TIME locale in icu locale format.
|
/// Cached LC_TIME locale in icu locale format.
|
||||||
|
|
@ -137,7 +141,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
fn info(&self) -> page::Info {
|
fn info(&self) -> page::Info {
|
||||||
page::Info::new("time-region", "preferences-region-and-language-symbolic")
|
page::Info::new("time-region", "preferences-region-and-language-symbolic")
|
||||||
.title(fl!("time-region"))
|
.title(fl!("time-region"))
|
||||||
.description(fl!("time-region", "desc"))
|
.description(fl!("xdg-entry-region-language-comment"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> cosmic::Task<crate::pages::Message> {
|
fn on_enter(&mut self) -> cosmic::Task<crate::pages::Message> {
|
||||||
|
|
@ -165,22 +169,27 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
.on_clear(Message::AddLanguageSearch(String::new()))
|
.on_clear(Message::AddLanguageSearch(String::new()))
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::from);
|
.map(crate::pages::Message::from);
|
||||||
let install_additional_button =
|
let drawer = context_drawer(
|
||||||
widget::button::standard(fl!("install-additional-languages"))
|
|
||||||
.on_press(Message::InstallAdditionalLanguages)
|
|
||||||
.apply(widget::container)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.align_x(Alignment::End)
|
|
||||||
.apply(Element::from)
|
|
||||||
.map(crate::pages::Message::from);
|
|
||||||
|
|
||||||
context_drawer(
|
|
||||||
self.add_language_view().map(crate::pages::Message::from),
|
self.add_language_view().map(crate::pages::Message::from),
|
||||||
crate::pages::Message::CloseContextDrawer,
|
crate::pages::Message::CloseContextDrawer,
|
||||||
)
|
)
|
||||||
.title(fl!("add-language", "context"))
|
.title(fl!("add-language", "context"))
|
||||||
.header(search)
|
.header(search);
|
||||||
.footer(install_additional_button)
|
|
||||||
|
if self.language_selector_available {
|
||||||
|
let install_additional_button =
|
||||||
|
widget::button::standard(fl!("install-additional-languages"))
|
||||||
|
.on_press(Message::InstallAdditionalLanguages)
|
||||||
|
.apply(widget::container)
|
||||||
|
.width(Length::Fill)
|
||||||
|
.align_x(Alignment::End)
|
||||||
|
.apply(Element::from)
|
||||||
|
.map(crate::pages::Message::from);
|
||||||
|
|
||||||
|
drawer.footer(install_additional_button)
|
||||||
|
} else {
|
||||||
|
drawer
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ContextView::Region => {
|
ContextView::Region => {
|
||||||
let search = widget::search_input("", &self.add_language_search)
|
let search = widget::search_input("", &self.add_language_search)
|
||||||
|
|
@ -259,7 +268,7 @@ impl Page {
|
||||||
|
|
||||||
Message::InstallAdditionalLanguages => {
|
Message::InstallAdditionalLanguages => {
|
||||||
return cosmic::task::future(async move {
|
return cosmic::task::future(async move {
|
||||||
_ = tokio::process::Command::new("gnome-language-selector")
|
_ = tokio::process::Command::new(GNOME_LANGUAGE_SELECTOR)
|
||||||
.status()
|
.status()
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
|
|
@ -275,6 +284,7 @@ impl Page {
|
||||||
self.language = page_refresh.language;
|
self.language = page_refresh.language;
|
||||||
self.region = page_refresh.region;
|
self.region = page_refresh.region;
|
||||||
self.registry = Some(page_refresh.registry.0);
|
self.registry = Some(page_refresh.registry.0);
|
||||||
|
self.language_selector_available = page_refresh.language_selector_available;
|
||||||
self.numeric_locale = self.icu_locale_from_env("LC_NUMERIC");
|
self.numeric_locale = self.icu_locale_from_env("LC_NUMERIC");
|
||||||
self.time_locale = self.icu_locale_from_env("LC_TIME");
|
self.time_locale = self.icu_locale_from_env("LC_TIME");
|
||||||
}
|
}
|
||||||
|
|
@ -313,6 +323,9 @@ impl Page {
|
||||||
|
|
||||||
_ = config.set("system_locales", &locales);
|
_ = config.set("system_locales", &locales);
|
||||||
|
|
||||||
|
// Build the LANGUAGE string for AccountsService (colon-separated locales)
|
||||||
|
let language_list = build_language_list(locales);
|
||||||
|
|
||||||
if let Some(language_code) = locales.first()
|
if let Some(language_code) = locales.first()
|
||||||
&& let Some(language) = self
|
&& let Some(language) = self
|
||||||
.available_languages
|
.available_languages
|
||||||
|
|
@ -329,6 +342,14 @@ impl Page {
|
||||||
region.unwrap_or(language).lang_code.clone(),
|
region.unwrap_or(language).lang_code.clone(),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
|
// Set the LANGUAGE variable via AccountsService
|
||||||
|
if let Err(why) = set_user_language(language_list).await {
|
||||||
|
tracing::error!(
|
||||||
|
?why,
|
||||||
|
"failed to set user language via AccountsService"
|
||||||
|
);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -339,14 +360,9 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_language_view(&self) -> cosmic::Element<'_, crate::pages::Message> {
|
fn add_language_view(&self) -> cosmic::Element<'_, crate::pages::Message> {
|
||||||
let mut list = widget::list_column();
|
let mut list = widget::list_column::with_capacity(self.available_languages.len());
|
||||||
|
|
||||||
let search_input = &self.add_language_search.trim().to_lowercase();
|
let search_input = &self.add_language_search.trim().to_lowercase();
|
||||||
|
|
||||||
let svg_accent = Rc::new(|theme: &cosmic::Theme| cosmic::widget::svg::Style {
|
|
||||||
color: Some(theme.cosmic().accent_text_color().into()),
|
|
||||||
});
|
|
||||||
|
|
||||||
for (id, available_language) in &self.available_languages {
|
for (id, available_language) in &self.available_languages {
|
||||||
if search_input.is_empty()
|
if search_input.is_empty()
|
||||||
|| available_language
|
|| available_language
|
||||||
|
|
@ -359,37 +375,15 @@ impl Page {
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.is_some_and(|(_, locales)| locales.contains(&available_language.lang_code));
|
.is_some_and(|(_, locales)| locales.contains(&available_language.lang_code));
|
||||||
|
|
||||||
let button = widget::settings::item_row(vec![
|
list = list.add(selection_context_item(
|
||||||
widget::text::body(&available_language.display_name)
|
&available_language.display_name,
|
||||||
.class(if is_installed {
|
is_installed,
|
||||||
cosmic::theme::Text::Accent
|
|
||||||
} else {
|
|
||||||
cosmic::theme::Text::Default
|
|
||||||
})
|
|
||||||
.wrapping(Wrapping::Word)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
if is_installed {
|
if is_installed {
|
||||||
widget::icon::from_name("object-select-symbolic")
|
Message::RemoveLanguage(id)
|
||||||
.size(16)
|
|
||||||
.icon()
|
|
||||||
.class(cosmic::theme::Svg::Custom(svg_accent.clone()))
|
|
||||||
.into()
|
|
||||||
} else {
|
} else {
|
||||||
widget::horizontal_space().width(16).into()
|
Message::AddLanguage(id)
|
||||||
},
|
},
|
||||||
])
|
))
|
||||||
.apply(widget::container)
|
|
||||||
.class(cosmic::theme::Container::List)
|
|
||||||
.apply(widget::button::custom)
|
|
||||||
.class(cosmic::theme::Button::Transparent)
|
|
||||||
.on_press(if is_installed {
|
|
||||||
Message::RemoveLanguage(id)
|
|
||||||
} else {
|
|
||||||
Message::AddLanguage(id)
|
|
||||||
});
|
|
||||||
|
|
||||||
list = list.add(button)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -470,12 +464,7 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn region_view(&self) -> cosmic::Element<'_, crate::pages::Message> {
|
fn region_view(&self) -> cosmic::Element<'_, crate::pages::Message> {
|
||||||
let svg_accent = Rc::new(|theme: &cosmic::Theme| {
|
let mut list = widget::list_column::with_capacity(self.available_languages.len());
|
||||||
let color = theme.cosmic().accent_text_color().into();
|
|
||||||
cosmic::widget::svg::Style { color: Some(color) }
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut list = widget::list_column();
|
|
||||||
|
|
||||||
let search_input = &self.add_language_search.trim().to_lowercase();
|
let search_input = &self.add_language_search.trim().to_lowercase();
|
||||||
|
|
||||||
|
|
@ -487,37 +476,15 @@ impl Page {
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.is_some_and(|l| l.lang_code == locale.lang_code);
|
.is_some_and(|l| l.lang_code == locale.lang_code);
|
||||||
|
|
||||||
let button = widget::settings::item_row(vec![
|
list = list.add(selection_context_item(
|
||||||
widget::text::body(&locale.region_name)
|
&locale.region_name,
|
||||||
.class(if is_selected {
|
is_selected,
|
||||||
cosmic::theme::Text::Accent
|
|
||||||
} else {
|
|
||||||
cosmic::theme::Text::Default
|
|
||||||
})
|
|
||||||
.wrapping(Wrapping::Word)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.into(),
|
|
||||||
if is_selected {
|
if is_selected {
|
||||||
widget::icon::from_name("object-select-symbolic")
|
None
|
||||||
.size(16)
|
|
||||||
.icon()
|
|
||||||
.class(cosmic::theme::Svg::Custom(svg_accent.clone()))
|
|
||||||
.into()
|
|
||||||
} else {
|
} else {
|
||||||
widget::horizontal_space().width(16).into()
|
Some(Message::SelectRegion(id))
|
||||||
},
|
},
|
||||||
])
|
))
|
||||||
.apply(widget::container)
|
|
||||||
.class(cosmic::theme::Container::List)
|
|
||||||
.apply(widget::button::custom)
|
|
||||||
.class(cosmic::theme::Button::Transparent)
|
|
||||||
.on_press_maybe(if is_selected {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(Message::SelectRegion(id))
|
|
||||||
});
|
|
||||||
|
|
||||||
list = list.add(button)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -765,6 +732,8 @@ pub async fn page_reload() -> eyre::Result<PageRefresh> {
|
||||||
available_languages.insert(language);
|
available_languages.insert(language);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let language_selector_available = which::which(GNOME_LANGUAGE_SELECTOR).is_ok();
|
||||||
|
|
||||||
Ok(PageRefresh {
|
Ok(PageRefresh {
|
||||||
config,
|
config,
|
||||||
registry: Registry(registry),
|
registry: Registry(registry),
|
||||||
|
|
@ -772,6 +741,7 @@ pub async fn page_reload() -> eyre::Result<PageRefresh> {
|
||||||
region,
|
region,
|
||||||
available_languages,
|
available_languages,
|
||||||
system_locales,
|
system_locales,
|
||||||
|
language_selector_available,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -894,6 +864,29 @@ pub async fn set_locale(
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the user's preferred language list via AccountsService D-Bus.
|
||||||
|
/// This updates the LANGUAGE environment variable for gettext-based applications.
|
||||||
|
/// The language_list should be a colon-separated string like "de_DE:de:en_US:en".
|
||||||
|
pub async fn set_user_language(language_list: String) -> eyre::Result<()> {
|
||||||
|
let conn = zbus::Connection::system()
|
||||||
|
.await
|
||||||
|
.wrap_err("zbus system connection error")?;
|
||||||
|
|
||||||
|
let uid = rustix::process::getuid().as_raw() as u64;
|
||||||
|
|
||||||
|
let user_proxy = accounts_zbus::UserProxy::from_uid(&conn, uid)
|
||||||
|
.await
|
||||||
|
.wrap_err("failed to create AccountsService user proxy")?;
|
||||||
|
|
||||||
|
user_proxy
|
||||||
|
.set_language(&language_list)
|
||||||
|
.await
|
||||||
|
.wrap_err("failed to set language via AccountsService")?;
|
||||||
|
|
||||||
|
eprintln!("set user language via AccountsService: {language_list}");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_locale(locale: &str) -> Option<Locale> {
|
fn parse_locale(locale: &str) -> Option<Locale> {
|
||||||
locale
|
locale
|
||||||
.split('.')
|
.split('.')
|
||||||
|
|
@ -973,3 +966,53 @@ fn update_time_settings_after_region_change(region: String) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Builds a colon-separated language list for the LANGUAGE environment variable.
|
||||||
|
/// Converts locales like ["de_DE.UTF-8", "en_US.UTF-8"] to "de_DE:de:en_US:en".
|
||||||
|
///
|
||||||
|
/// Important: The list stops at English locales since English is typically the
|
||||||
|
/// source language and doesn't need translation files. This prevents fallback
|
||||||
|
/// to other languages when English is selected.
|
||||||
|
fn build_language_list(locales: &[String]) -> String {
|
||||||
|
let mut parts = Vec::new();
|
||||||
|
|
||||||
|
for locale in locales {
|
||||||
|
// Parse locale: language_TERRITORY[.CODESET][@MODIFIER]
|
||||||
|
// We want to extract "language_TERRITORY" without codeset or modifier
|
||||||
|
let base = strip_locale_suffix(locale);
|
||||||
|
|
||||||
|
// Get the language-only code (e.g., "de" from "de_DE")
|
||||||
|
let lang = base.split('_').next().unwrap_or(&base);
|
||||||
|
|
||||||
|
// Add the full locale code (e.g., "de_DE")
|
||||||
|
parts.push(base.clone());
|
||||||
|
|
||||||
|
// Add the language-only code as fallback if different
|
||||||
|
if lang != base {
|
||||||
|
parts.push(lang.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop after English - it's the source language and needs no translation
|
||||||
|
// This matches gnome-language-selector's behavior
|
||||||
|
if lang == "en" {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parts.join(":")
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Strips the codeset (.UTF-8) and modifier (@latin) from a locale string.
|
||||||
|
/// "de_DE.UTF-8" -> "de_DE"
|
||||||
|
/// "sr_RS@latin" -> "sr_RS"
|
||||||
|
/// "sr_RS.UTF-8@latin" -> "sr_RS"
|
||||||
|
fn strip_locale_suffix(locale: &str) -> String {
|
||||||
|
// First strip the codeset (everything from '.' onwards)
|
||||||
|
let without_codeset = locale.split('.').next().unwrap_or(locale);
|
||||||
|
// Then strip the modifier (everything from '@' onwards)
|
||||||
|
without_codeset
|
||||||
|
.split('@')
|
||||||
|
.next()
|
||||||
|
.unwrap_or(without_codeset)
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
use std::any::TypeId;
|
use std::any::TypeId;
|
||||||
|
|
||||||
use ashpd::desktop::location::{Location, LocationProxy};
|
use ashpd::desktop::location::{Location, LocationProxy};
|
||||||
|
use chrono::NaiveDate;
|
||||||
use cosmic::iced::{
|
use cosmic::iced::{
|
||||||
Subscription,
|
Subscription,
|
||||||
futures::{SinkExt, StreamExt, channel::mpsc::Sender, future},
|
futures::{SinkExt, StreamExt, channel::mpsc::Sender, future},
|
||||||
|
|
@ -11,15 +12,14 @@ use tokio::select;
|
||||||
|
|
||||||
pub fn daytime() -> cosmic::iced::Subscription<bool> {
|
pub fn daytime() -> cosmic::iced::Subscription<bool> {
|
||||||
struct Sunset;
|
struct Sunset;
|
||||||
Subscription::run_with_id(
|
Subscription::run_with(TypeId::of::<Sunset>(), |_| {
|
||||||
TypeId::of::<Sunset>(),
|
stream::channel(2, |tx: Sender<bool>| async {
|
||||||
stream::channel(2, |tx| async {
|
|
||||||
if let Err(err) = inner(tx).await {
|
if let Err(err) = inner(tx).await {
|
||||||
tracing::error!("Sunset subscription error: {:?}", err);
|
tracing::error!("Sunset subscription error: {:?}", err);
|
||||||
}
|
}
|
||||||
future::pending().await
|
future::pending().await
|
||||||
}),
|
})
|
||||||
)
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Event {
|
enum Event {
|
||||||
|
|
@ -46,28 +46,49 @@ async fn inner(mut tx: Sender<bool>) -> anyhow::Result<()> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let coord = Coordinates::new(loc.latitude(), loc.longitude()).unwrap();
|
let coord = Coordinates::new(loc.latitude(), loc.longitude()).unwrap();
|
||||||
let now = chrono::Local::now();
|
let now = jiff::Zoned::now();
|
||||||
let date = now.date_naive();
|
let now_in_seconds = now.timestamp().as_second();
|
||||||
let now_in_seconds = now.timestamp();
|
// roughly matches the dates of the spring and autumn equinoxes
|
||||||
|
let northern_tilt = (79..=266).contains(&now.day_of_year());
|
||||||
|
let is_north = coord.lat() > 0.0;
|
||||||
|
// TODO: remove chrono if sunrise adds support for jiff - https://github.com/nathan-osman/rust-sunrise/pull/20
|
||||||
|
let date = NaiveDate::from_ymd_opt(now.year() as i32, now.month() as u32, now.day() as u32)
|
||||||
|
.expect("jiff date is valid");
|
||||||
let current_solar_day = SolarDay::new(coord, date);
|
let current_solar_day = SolarDay::new(coord, date);
|
||||||
let sunrise = current_solar_day
|
let sunrise = current_solar_day
|
||||||
.event_time(SolarEvent::Sunrise)
|
.event_time(SolarEvent::Sunrise)
|
||||||
.timestamp();
|
.map(|s| s.timestamp());
|
||||||
let sunset = current_solar_day.event_time(SolarEvent::Sunset).timestamp();
|
let sunset = current_solar_day
|
||||||
let daytime = now_in_seconds >= sunrise && now_in_seconds <= sunset;
|
.event_time(SolarEvent::Sunset)
|
||||||
|
.map(|s| s.timestamp());
|
||||||
|
let daytime = match (sunrise, sunset) {
|
||||||
|
(Some(sunrise), Some(sunset)) => now_in_seconds >= sunrise && now_in_seconds <= sunset,
|
||||||
|
// transition into polar day
|
||||||
|
(Some(sunrise), None) => now_in_seconds >= sunrise,
|
||||||
|
// transition out of polar day
|
||||||
|
(None, Some(sunset)) => now_in_seconds <= sunset,
|
||||||
|
// polar day
|
||||||
|
(None, None) => is_north == northern_tilt,
|
||||||
|
};
|
||||||
tx.send(daytime).await?;
|
tx.send(daytime).await?;
|
||||||
|
|
||||||
let sleep = if daytime {
|
let next_event = if daytime {
|
||||||
sunset - now_in_seconds
|
sunset
|
||||||
} else if now_in_seconds < sunset {
|
} else if now_in_seconds < sunrise.unwrap_or(0) {
|
||||||
sunrise - now_in_seconds
|
sunrise
|
||||||
} else {
|
} else {
|
||||||
let tmrw = now + chrono::Duration::days(1);
|
let tmrw = now.checked_add(jiff::Span::new().days(1))?;
|
||||||
let tmrw_sunrise = SolarDay::new(coord, tmrw.date_naive())
|
let tmrw_sunrise =
|
||||||
|
NaiveDate::from_ymd_opt(tmrw.year() as i32, tmrw.month() as u32, tmrw.day() as u32)
|
||||||
|
.expect("jiff date is valid");
|
||||||
|
|
||||||
|
SolarDay::new(coord, tmrw_sunrise)
|
||||||
.event_time(SolarEvent::Sunrise)
|
.event_time(SolarEvent::Sunrise)
|
||||||
.timestamp();
|
.map(|s| s.timestamp())
|
||||||
tmrw_sunrise - now_in_seconds
|
|
||||||
};
|
};
|
||||||
|
let sleep = next_event
|
||||||
|
.map(|ts| (ts - now_in_seconds).max(60))
|
||||||
|
.unwrap_or(3600);
|
||||||
next = select! {
|
next = select! {
|
||||||
() = tokio::time::sleep(tokio::time::Duration::from_secs(sleep as u64)) => {
|
() = tokio::time::sleep(tokio::time::Duration::from_secs(sleep as u64)) => {
|
||||||
Some(Event::Daytime)
|
Some(Event::Daytime)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
use cosmic::{
|
use cosmic::iced::{
|
||||||
iced::{Subscription, stream},
|
Subscription,
|
||||||
iced_futures::futures::{self, SinkExt},
|
futures::{self, SinkExt},
|
||||||
|
stream,
|
||||||
};
|
};
|
||||||
use notify::{Config, EventKind, RecommendedWatcher, RecursiveMode, Watcher};
|
use notify::{Config, EventKind, RecommendedWatcher, RecursiveMode, Watcher};
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
@ -15,45 +16,49 @@ pub enum Event {
|
||||||
pub fn desktop_files<I: 'static + Hash + Copy + Send + Sync + Debug>(
|
pub fn desktop_files<I: 'static + Hash + Copy + Send + Sync + Debug>(
|
||||||
id: I,
|
id: I,
|
||||||
) -> cosmic::iced::Subscription<Event> {
|
) -> cosmic::iced::Subscription<Event> {
|
||||||
Subscription::run_with_id(
|
Subscription::run_with(id, |_| {
|
||||||
id,
|
stream::channel(
|
||||||
stream::channel(1, move |mut output| async move {
|
1,
|
||||||
let handle = tokio::runtime::Handle::current();
|
move |mut output: futures::channel::mpsc::Sender<Event>| async move {
|
||||||
let (tx, mut rx) = mpsc::channel(4);
|
let handle = tokio::runtime::Handle::current();
|
||||||
let mut last_update = std::time::Instant::now();
|
let (tx, mut rx) = mpsc::channel(4);
|
||||||
|
let mut last_update = std::time::Instant::now();
|
||||||
|
|
||||||
// Automatically select the best implementation for your platform.
|
// Automatically select the best implementation for your platform.
|
||||||
// You can also access each implementation directly e.g. INotifyWatcher.
|
// You can also access each implementation directly e.g. INotifyWatcher.
|
||||||
let watcher = RecommendedWatcher::new(
|
let watcher = RecommendedWatcher::new(
|
||||||
move |res: Result<notify::Event, notify::Error>| {
|
move |res: Result<notify::Event, notify::Error>| {
|
||||||
if let Ok(event) = res {
|
if let Ok(event) = res {
|
||||||
match event.kind {
|
match event.kind {
|
||||||
EventKind::Create(_) | EventKind::Modify(_) | EventKind::Remove(_) => {
|
EventKind::Create(_)
|
||||||
let now = std::time::Instant::now();
|
| EventKind::Modify(_)
|
||||||
if now.duration_since(last_update).as_secs() > 3 {
|
| EventKind::Remove(_) => {
|
||||||
_ = handle.block_on(tx.send(()));
|
let now = std::time::Instant::now();
|
||||||
last_update = now;
|
if now.duration_since(last_update).as_secs() > 3 {
|
||||||
|
_ = handle.block_on(tx.send(()));
|
||||||
|
last_update = now;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => (),
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
Config::default(),
|
||||||
|
);
|
||||||
|
|
||||||
|
if let Ok(mut watcher) = watcher {
|
||||||
|
for path in cosmic::desktop::fde::default_paths() {
|
||||||
|
let _ = watcher.watch(path.as_ref(), RecursiveMode::Recursive);
|
||||||
}
|
}
|
||||||
},
|
|
||||||
Config::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
if let Ok(mut watcher) = watcher {
|
while rx.recv().await.is_some() {
|
||||||
for path in cosmic::desktop::fde::default_paths() {
|
_ = output.send(Event::Changed).await;
|
||||||
let _ = watcher.watch(path.as_ref(), RecursiveMode::Recursive);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while rx.recv().await.is_some() {
|
futures::future::pending().await
|
||||||
_ = output.send(Event::Changed).await;
|
},
|
||||||
}
|
)
|
||||||
}
|
})
|
||||||
|
|
||||||
futures::future::pending().await
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,15 +25,16 @@ pub enum WallpaperEvent {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wallpapers(current_dir: PathBuf) -> cosmic::iced::Subscription<WallpaperEvent> {
|
pub fn wallpapers(current_dir: PathBuf) -> cosmic::iced::Subscription<WallpaperEvent> {
|
||||||
Subscription::run_with_id(
|
Subscription::run_with(current_dir, |current_dir: &PathBuf| {
|
||||||
current_dir.clone(),
|
let current_dir = current_dir.clone();
|
||||||
stream::channel(2, |tx| async {
|
stream::channel(2, move |tx: Sender<WallpaperEvent>| async move {
|
||||||
|
let current_dir = current_dir.clone();
|
||||||
if let Err(err) = inner(tx, current_dir).await {
|
if let Err(err) = inner(tx, current_dir).await {
|
||||||
tracing::error!("Wallpapers subscription error: {:?}", err);
|
tracing::error!("Wallpapers subscription error: {:?}", err);
|
||||||
}
|
}
|
||||||
future::pending().await
|
future::pending().await
|
||||||
}),
|
})
|
||||||
)
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn inner(tx: Sender<WallpaperEvent>, current_dir: PathBuf) -> anyhow::Result<()> {
|
async fn inner(tx: Sender<WallpaperEvent>, current_dir: PathBuf) -> anyhow::Result<()> {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright 2023 System76 <info@system76.com>
|
// Copyright 2023 System76 <info@system76.com>
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use cosmic::{iced_core::Border, theme};
|
use cosmic::{iced::Border, theme};
|
||||||
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn display_container_frame() -> cosmic::theme::Container<'static> {
|
pub fn display_container_frame() -> cosmic::theme::Container<'static> {
|
||||||
|
|
@ -17,6 +17,7 @@ pub fn display_container_frame() -> cosmic::theme::Container<'static> {
|
||||||
width: 3.0,
|
width: 3.0,
|
||||||
},
|
},
|
||||||
shadow: Default::default(),
|
shadow: Default::default(),
|
||||||
|
snap: true,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -35,6 +36,7 @@ pub fn display_container_screen() -> cosmic::theme::Container<'static> {
|
||||||
width: 0.0,
|
width: 0.0,
|
||||||
},
|
},
|
||||||
shadow: Default::default(),
|
shadow: Default::default(),
|
||||||
|
snap: true,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,16 +25,13 @@ pub fn forward_event_loop<M: 'static + Send, T: Future<Output = ()> + Send + 'st
|
||||||
) -> (tokio::sync::oneshot::Sender<()>, cosmic::Task<M>) {
|
) -> (tokio::sync::oneshot::Sender<()>, cosmic::Task<M>) {
|
||||||
let (cancel_tx, cancel_rx) = tokio::sync::oneshot::channel::<()>();
|
let (cancel_tx, cancel_rx) = tokio::sync::oneshot::channel::<()>();
|
||||||
|
|
||||||
let task = cosmic::Task::stream(cosmic::iced_futures::stream::channel(
|
let task = cosmic::Task::stream(cosmic::iced::stream::channel(1, |emitter| async move {
|
||||||
1,
|
select(
|
||||||
|emitter| async move {
|
std::pin::pin!(cancel_rx),
|
||||||
select(
|
std::pin::pin!(event_loop(emitter)),
|
||||||
std::pin::pin!(cancel_rx),
|
)
|
||||||
std::pin::pin!(event_loop(emitter)),
|
.await;
|
||||||
)
|
}));
|
||||||
.await;
|
|
||||||
},
|
|
||||||
));
|
|
||||||
|
|
||||||
(cancel_tx, task)
|
(cancel_tx, task)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,16 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
use cosmic::cosmic_theme::Spacing;
|
use cosmic::cosmic_theme::Spacing;
|
||||||
|
use cosmic::iced::core::text::Wrapping;
|
||||||
use cosmic::iced::{Alignment, Length};
|
use cosmic::iced::{Alignment, Length};
|
||||||
use cosmic::iced_core::text::Wrapping;
|
|
||||||
use cosmic::widget::color_picker::ColorPickerUpdate;
|
use cosmic::widget::color_picker::ColorPickerUpdate;
|
||||||
use cosmic::widget::{
|
use cosmic::widget::{
|
||||||
self, ColorPickerModel, button, column, container, divider, horizontal_space, icon, row,
|
self, ColorPickerModel, button, column, container, divider, icon, list, row, settings,
|
||||||
settings, text, vertical_space,
|
space::{horizontal, vertical},
|
||||||
|
text,
|
||||||
};
|
};
|
||||||
use cosmic::{Apply, Element, theme};
|
use cosmic::{Apply, Element, theme};
|
||||||
use cosmic_settings_page as page;
|
use cosmic_settings_page as page;
|
||||||
|
|
@ -39,7 +41,7 @@ pub fn color_picker_context_view<'a, Message: Clone + 'static>(
|
||||||
.apply(container)
|
.apply(container)
|
||||||
.center_x(Length::Fill);
|
.center_x(Length::Fill);
|
||||||
|
|
||||||
cosmic::widget::column()
|
column::with_capacity(2)
|
||||||
.push_maybe(description)
|
.push_maybe(description)
|
||||||
.push(color_picker)
|
.push(color_picker)
|
||||||
.align_x(Alignment::Center)
|
.align_x(Alignment::Center)
|
||||||
|
|
@ -74,7 +76,7 @@ pub fn search_header<Message>(
|
||||||
.into(),
|
.into(),
|
||||||
);
|
);
|
||||||
|
|
||||||
column_children.push(vertical_space().height(Length::Fixed(8.)).into());
|
column_children.push(vertical().height(Length::Fixed(8.)).into());
|
||||||
column_children.push(divider::horizontal::heavy().into());
|
column_children.push(divider::horizontal::heavy().into());
|
||||||
|
|
||||||
column::with_children(column_children).into()
|
column::with_children(column_children).into()
|
||||||
|
|
@ -88,12 +90,12 @@ pub fn search_page_link<Message: 'static>(title: &str) -> button::TextButton<'_,
|
||||||
pub fn page_title<Message: 'static>(page: &page::Info) -> Element<'_, Message> {
|
pub fn page_title<Message: 'static>(page: &page::Info) -> Element<'_, Message> {
|
||||||
row::with_capacity(2)
|
row::with_capacity(2)
|
||||||
.push(text::title3(page.title.as_str()))
|
.push(text::title3(page.title.as_str()))
|
||||||
.push(horizontal_space())
|
.push(horizontal())
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn unimplemented_page<Message: 'static>() -> Element<'static, Message> {
|
pub fn unimplemented_page<Message: Clone + 'static>() -> Element<'static, Message> {
|
||||||
settings::section().title("")
|
settings::section().title("")
|
||||||
.add(text::body("We haven't created that panel yet, and/or it is using a similar idea as current Pop! designs."))
|
.add(text::body("We haven't created that panel yet, and/or it is using a similar idea as current Pop! designs."))
|
||||||
.into()
|
.into()
|
||||||
|
|
@ -150,10 +152,12 @@ pub fn page_list_item<'a, Message: 'static + Clone>(
|
||||||
.padding([space_s, space_m])
|
.padding([space_s, space_m])
|
||||||
.align_x(Alignment::Center)
|
.align_x(Alignment::Center)
|
||||||
.class(theme::Container::List)
|
.class(theme::Container::List)
|
||||||
|
.width(Length::Fill)
|
||||||
.apply(button::custom)
|
.apply(button::custom)
|
||||||
.padding(0)
|
.padding(0)
|
||||||
.class(theme::Button::Transparent)
|
.class(theme::Button::Transparent)
|
||||||
.on_press(message)
|
.on_press(message)
|
||||||
|
.width(Length::Fill)
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -181,44 +185,69 @@ pub fn sub_page_header<'a, Message: 'static + Clone>(
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn go_next_item<Msg: Clone + 'static>(
|
pub fn go_next_item<Msg: 'static>(
|
||||||
description: &str,
|
description: &str,
|
||||||
msg_opt: impl Into<Option<Msg>>,
|
msg_opt: impl Into<Option<Msg>>,
|
||||||
) -> cosmic::Element<'_, Msg> {
|
) -> list::ListButton<'_, Msg> {
|
||||||
settings::item_row(vec![
|
settings::item_row(vec![
|
||||||
text::body(description).wrapping(Wrapping::Word).into(),
|
text::body(description)
|
||||||
horizontal_space().into(),
|
.width(Length::Fill)
|
||||||
|
.wrapping(Wrapping::Word)
|
||||||
|
.into(),
|
||||||
icon::from_name("go-next-symbolic").size(16).icon().into(),
|
icon::from_name("go-next-symbolic").size(16).icon().into(),
|
||||||
])
|
])
|
||||||
.apply(widget::container)
|
.apply(list::button)
|
||||||
.class(cosmic::theme::Container::List)
|
|
||||||
.apply(button::custom)
|
|
||||||
.padding(0)
|
|
||||||
.class(theme::Button::Transparent)
|
|
||||||
.on_press_maybe(msg_opt.into())
|
.on_press_maybe(msg_opt.into())
|
||||||
.into()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn go_next_with_item<'a, Msg: Clone + 'static>(
|
pub fn go_next_with_item<'a, Msg: 'static>(
|
||||||
description: &'a str,
|
description: &'a str,
|
||||||
item: impl Into<cosmic::Element<'a, Msg>>,
|
item: impl Into<cosmic::Element<'a, Msg>>,
|
||||||
msg_opt: impl Into<Option<Msg>>,
|
msg_opt: impl Into<Option<Msg>>,
|
||||||
) -> cosmic::Element<'a, Msg> {
|
) -> list::ListButton<'a, Msg> {
|
||||||
settings::item_row(vec![
|
settings::item_row(vec![
|
||||||
text::body(description).wrapping(Wrapping::Word).into(),
|
text::body(description).wrapping(Wrapping::Word).into(),
|
||||||
horizontal_space().into(),
|
horizontal().into(),
|
||||||
widget::row::with_capacity(2)
|
row::with_capacity(2)
|
||||||
.push(item)
|
.push(item)
|
||||||
.push(icon::from_name("go-next-symbolic").size(16).icon())
|
.push(icon::from_name("go-next-symbolic").size(16).icon())
|
||||||
.align_y(Alignment::Center)
|
.align_y(Alignment::Center)
|
||||||
.spacing(cosmic::theme::spacing().space_s)
|
.spacing(theme::spacing().space_s)
|
||||||
.into(),
|
.into(),
|
||||||
])
|
])
|
||||||
.apply(widget::container)
|
.apply(list::button)
|
||||||
.class(cosmic::theme::Container::List)
|
.on_press_maybe(msg_opt.into())
|
||||||
.apply(button::custom)
|
}
|
||||||
.padding(0)
|
|
||||||
.class(theme::Button::Transparent)
|
pub fn selection_context_item<'a, Msg: 'static>(
|
||||||
|
name: &'a str,
|
||||||
|
selected: bool,
|
||||||
|
msg_opt: impl Into<Option<Msg>>,
|
||||||
|
) -> list::ListButton<'a, Msg> {
|
||||||
|
let svg_accent = Rc::new(|theme: &cosmic::Theme| widget::svg::Style {
|
||||||
|
color: Some(theme.cosmic().accent_text_color().into()),
|
||||||
|
});
|
||||||
|
|
||||||
|
settings::item_row(vec![
|
||||||
|
text::body(name)
|
||||||
|
.class(if selected {
|
||||||
|
theme::Text::Accent
|
||||||
|
} else {
|
||||||
|
theme::Text::Default
|
||||||
|
})
|
||||||
|
.wrapping(Wrapping::Word)
|
||||||
|
.width(Length::Fill)
|
||||||
|
.into(),
|
||||||
|
if selected {
|
||||||
|
icon::from_name("object-select-symbolic")
|
||||||
|
.size(16)
|
||||||
|
.icon()
|
||||||
|
.class(theme::Svg::Custom(svg_accent.clone()))
|
||||||
|
.into()
|
||||||
|
} else {
|
||||||
|
horizontal().width(16.).into()
|
||||||
|
},
|
||||||
|
])
|
||||||
|
.apply(list::button)
|
||||||
.on_press_maybe(msg_opt.into())
|
.on_press_maybe(msg_opt.into())
|
||||||
.into()
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "cosmic-pipewire"
|
name = "cosmic-pipewire"
|
||||||
version = "1.0.0"
|
version = "1.0.7"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
repository = "https://github.com/pop-os/cosmic-settings"
|
repository = "https://github.com/pop-os/cosmic-settings"
|
||||||
rust-version.workspace = true
|
rust-version.workspace = true
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ use pipewire::{
|
||||||
proxy::{ProxyListener, ProxyT},
|
proxy::{ProxyListener, ProxyT},
|
||||||
types::ObjectType,
|
types::ObjectType,
|
||||||
};
|
};
|
||||||
use std::{cell::RefCell, rc::Rc, u32};
|
use std::{cell::RefCell, rc::Rc};
|
||||||
|
|
||||||
pub type NodeId = u32;
|
pub type NodeId = u32;
|
||||||
pub type RouteId = u32;
|
pub type RouteId = u32;
|
||||||
|
|
@ -66,17 +66,18 @@ fn run_service(
|
||||||
let registry = core.get_registry_rc()?;
|
let registry = core.get_registry_rc()?;
|
||||||
|
|
||||||
let state = Rc::new(RefCell::new(State {
|
let state = Rc::new(RefCell::new(State {
|
||||||
nodes: IntMap::new(),
|
main_loop: main_loop.downgrade(),
|
||||||
proxies: Proxies {
|
proxies: Proxies {
|
||||||
devices: IntMap::new(),
|
devices: IntMap::new(),
|
||||||
metadata: IntMap::new(),
|
metadata: IntMap::new(),
|
||||||
nodes: IntMap::new(),
|
nodes: IntMap::new(),
|
||||||
},
|
},
|
||||||
|
nodes: IntMap::new(),
|
||||||
|
active_routes: IntMap::new(),
|
||||||
routes: IntMap::new(),
|
routes: IntMap::new(),
|
||||||
node_devices: IntMap::new(),
|
node_devices: IntMap::new(),
|
||||||
node_card_profile_device: IntMap::new(),
|
node_card_profile_device: IntMap::new(),
|
||||||
node_props: IntMap::new(),
|
node_props: IntMap::new(),
|
||||||
main_loop: main_loop.downgrade(),
|
|
||||||
on_event,
|
on_event,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
@ -180,10 +181,10 @@ fn run_service(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(device) = Device::from_device(info) {
|
if let Some(device) = Device::from_device(info)
|
||||||
if let Some(state) = state.upgrade() {
|
&& let Some(state) = state.upgrade()
|
||||||
state.borrow_mut().add_device(pw_id, device);
|
{
|
||||||
}
|
state.borrow_mut().add_device(pw_id, device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -207,7 +208,9 @@ fn run_service(
|
||||||
match param_type {
|
match param_type {
|
||||||
ParamType::EnumProfile => {
|
ParamType::EnumProfile => {
|
||||||
if let Some(profile) = Profile::from_pod(pod) {
|
if let Some(profile) = Profile::from_pod(pod) {
|
||||||
state.borrow_mut().add_profile(device_id, profile);
|
state
|
||||||
|
.borrow_mut()
|
||||||
|
.add_profile(device_id, index, profile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -278,10 +281,10 @@ fn run_service(
|
||||||
.info({
|
.info({
|
||||||
let state = Rc::downgrade(&state);
|
let state = Rc::downgrade(&state);
|
||||||
move |info| {
|
move |info| {
|
||||||
if let Some(node) = Node::from_node(info) {
|
if let Some(node) = Node::from_node(info)
|
||||||
if let Some(state) = state.upgrade() {
|
&& let Some(state) = state.upgrade()
|
||||||
state.borrow_mut().add_node(id, node);
|
{
|
||||||
}
|
state.borrow_mut().add_node(id, node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -354,24 +357,18 @@ fn run_service(
|
||||||
"default.audio.sink" => {
|
"default.audio.sink" => {
|
||||||
if let Ok(value) =
|
if let Ok(value) =
|
||||||
serde_json::de::from_str::<DefaultAudio>(value)
|
serde_json::de::from_str::<DefaultAudio>(value)
|
||||||
|
&& let Some(state) = state.upgrade()
|
||||||
{
|
{
|
||||||
if let Some(state) = state.upgrade() {
|
state.borrow_mut().default_sink(value.name.to_owned())
|
||||||
state
|
|
||||||
.borrow_mut()
|
|
||||||
.default_sink(value.name.to_owned())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
"default.audio.source" => {
|
"default.audio.source" => {
|
||||||
if let Ok(value) =
|
if let Ok(value) =
|
||||||
serde_json::de::from_str::<DefaultAudio>(value)
|
serde_json::de::from_str::<DefaultAudio>(value)
|
||||||
|
&& let Some(state) = state.upgrade()
|
||||||
{
|
{
|
||||||
if let Some(state) = state.upgrade() {
|
state.borrow_mut().default_source(value.name.to_owned())
|
||||||
state
|
|
||||||
.borrow_mut()
|
|
||||||
.default_source(value.name.to_owned())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -423,7 +420,7 @@ pub enum Event {
|
||||||
/// A new node was detected.
|
/// A new node was detected.
|
||||||
AddNode(Node),
|
AddNode(Node),
|
||||||
/// A profile was enumerated
|
/// A profile was enumerated
|
||||||
AddProfile(DeviceId, Profile),
|
AddProfile(DeviceId, u32, Profile),
|
||||||
/// A route was enumerated
|
/// A route was enumerated
|
||||||
AddRoute(DeviceId, u32, Route),
|
AddRoute(DeviceId, u32, Route),
|
||||||
/// The default sink was changed.
|
/// The default sink was changed.
|
||||||
|
|
@ -496,13 +493,21 @@ struct Proxies {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
nodes: IntMap<PipewireId, (NodeId, Option<DeviceId>)>,
|
|
||||||
pub(self) proxies: Proxies,
|
|
||||||
routes: IntMap<DeviceId, Vec<Route>>,
|
|
||||||
node_devices: IntMap<NodeId, DeviceId>,
|
|
||||||
node_props: IntMap<NodeId, NodeProps>,
|
|
||||||
node_card_profile_device: IntMap<NodeId, u32>,
|
|
||||||
main_loop: MainLoopWeak,
|
main_loop: MainLoopWeak,
|
||||||
|
/// Stores pipewire objects that we are monitoring.
|
||||||
|
pub(self) proxies: Proxies,
|
||||||
|
/// Associates the pipewire ID of a node to its node and device IDs.
|
||||||
|
nodes: IntMap<PipewireId, (NodeId, Option<DeviceId>)>,
|
||||||
|
/// Routes which are currently in use by devices.
|
||||||
|
active_routes: IntMap<DeviceId, Vec<Route>>,
|
||||||
|
/// Routes which are supported by devices.
|
||||||
|
routes: IntMap<DeviceId, Vec<Route>>,
|
||||||
|
/// Associates node objects to their device objects.
|
||||||
|
node_devices: IntMap<NodeId, DeviceId>,
|
||||||
|
/// Additional properties of nodes for managing volume, mute, etc.
|
||||||
|
node_props: IntMap<NodeId, NodeProps>,
|
||||||
|
/// Associates a node with a card profile device for matching nodes to routes.
|
||||||
|
node_card_profile_device: IntMap<NodeId, u32>,
|
||||||
/// Handle events and exit the loop when `true` is returned.
|
/// Handle events and exit the loop when `true` is returned.
|
||||||
on_event: Box<dyn FnMut(Event)>,
|
on_event: Box<dyn FnMut(Event)>,
|
||||||
}
|
}
|
||||||
|
|
@ -513,6 +518,16 @@ impl State {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn active_route(&mut self, id: DeviceId, index: u32, route: Route) {
|
fn active_route(&mut self, id: DeviceId, index: u32, route: Route) {
|
||||||
|
// Keep a record of routes attached to a device for setting properties.
|
||||||
|
// This will overwrite routes on updates to
|
||||||
|
let routes = self.active_routes.entry(id).or_default();
|
||||||
|
if routes.len() < index as usize + 1 {
|
||||||
|
let additional = (index as usize + 1) - routes.capacity();
|
||||||
|
routes.reserve_exact(additional);
|
||||||
|
routes.extend(std::iter::repeat_n(Route::default(), additional));
|
||||||
|
}
|
||||||
|
routes[index as usize] = route.clone();
|
||||||
|
|
||||||
self.on_event(Event::ActiveRoute(id, index, route));
|
self.on_event(Event::ActiveRoute(id, index, route));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -554,8 +569,8 @@ impl State {
|
||||||
self.on_event(Event::AddNode(node));
|
self.on_event(Event::AddNode(node));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_profile(&mut self, id: DeviceId, profile: Profile) {
|
fn add_profile(&mut self, id: DeviceId, index: u32, profile: Profile) {
|
||||||
self.on_event(Event::AddProfile(id, profile));
|
self.on_event(Event::AddProfile(id, index, profile));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_route(&mut self, id: DeviceId, index: u32, route: Route) {
|
fn add_route(&mut self, id: DeviceId, index: u32, route: Route) {
|
||||||
|
|
@ -565,7 +580,7 @@ impl State {
|
||||||
if routes.len() < index as usize + 1 {
|
if routes.len() < index as usize + 1 {
|
||||||
let additional = (index as usize + 1) - routes.capacity();
|
let additional = (index as usize + 1) - routes.capacity();
|
||||||
routes.reserve_exact(additional);
|
routes.reserve_exact(additional);
|
||||||
routes.extend(std::iter::repeat(Route::default()).take(additional));
|
routes.extend(std::iter::repeat_n(Route::default(), additional));
|
||||||
}
|
}
|
||||||
routes[index as usize] = route.clone();
|
routes[index as usize] = route.clone();
|
||||||
|
|
||||||
|
|
@ -592,8 +607,8 @@ impl State {
|
||||||
self.on_event(Event::DefaultSource(name));
|
self.on_event(Event::DefaultSource(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn node_route(&self, device_id: DeviceId, route_device: i32) -> Option<&Route> {
|
fn active_node_route(&self, device_id: DeviceId, route_device: i32) -> Option<&Route> {
|
||||||
self.routes
|
self.active_routes
|
||||||
.get(device_id)?
|
.get(device_id)?
|
||||||
.iter()
|
.iter()
|
||||||
.find(|r| r.devices.contains(&route_device))
|
.find(|r| r.devices.contains(&route_device))
|
||||||
|
|
@ -682,14 +697,14 @@ impl State {
|
||||||
fn set_mute_node(&self, id: NodeId, mute: bool) {
|
fn set_mute_node(&self, id: NodeId, mute: bool) {
|
||||||
// Prefer to mute the device instead of the node.
|
// Prefer to mute the device instead of the node.
|
||||||
// Muting a node will not emit a notification.
|
// Muting a node will not emit a notification.
|
||||||
if let Some((&device_id, &route_device)) = self
|
if let Some((&device_id, &card_profile_device)) = self
|
||||||
.node_devices
|
.node_devices
|
||||||
.get(id)
|
.get(id)
|
||||||
.zip(self.node_card_profile_device.get(id))
|
.zip(self.node_card_profile_device.get(id))
|
||||||
{
|
{
|
||||||
let route_device = route_device as i32;
|
let card_profile_device = card_profile_device as i32;
|
||||||
if let Some(route) = self.node_route(device_id, route_device) {
|
if let Some(route) = self.active_node_route(device_id, card_profile_device) {
|
||||||
self.set_mute(device_id, route_device, route, mute);
|
self.set_mute(device_id, card_profile_device, route, mute);
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -748,7 +763,6 @@ impl State {
|
||||||
if let Some(param) = Pod::from_bytes(&serialized) {
|
if let Some(param) = Pod::from_bytes(&serialized) {
|
||||||
device.set_param(ParamType::Route, 0, param);
|
device.set_param(ParamType::Route, 0, param);
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_node_props(&mut self, id: NodeId, props: NodeProps) {
|
fn set_node_props(&mut self, id: NodeId, props: NodeProps) {
|
||||||
|
|
@ -762,14 +776,21 @@ impl State {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Prefer to change the volume of the device instead of the node.
|
// Prefer to change the volume of the device instead of the node.
|
||||||
if let Some((&device_id, &route_device)) = self
|
if let Some((&device_id, &card_profile_device)) = self
|
||||||
.node_devices
|
.node_devices
|
||||||
.get(id)
|
.get(id)
|
||||||
.zip(self.node_card_profile_device.get(id))
|
.zip(self.node_card_profile_device.get(id))
|
||||||
{
|
{
|
||||||
let route_device = route_device as i32;
|
let card_profile_device = card_profile_device as i32;
|
||||||
if let Some(route) = self.node_route(device_id, route_device) {
|
if let Some(route) = self.active_node_route(device_id, card_profile_device) {
|
||||||
self.set_volume(device_id, props, route_device, route, volume, balance);
|
self.set_volume(
|
||||||
|
device_id,
|
||||||
|
props,
|
||||||
|
card_profile_device,
|
||||||
|
route,
|
||||||
|
volume,
|
||||||
|
balance,
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -789,7 +810,7 @@ impl State {
|
||||||
FormatProperties(libspa_sys::SPA_PROP_channelVolumes),
|
FormatProperties(libspa_sys::SPA_PROP_channelVolumes),
|
||||||
ValueArray,
|
ValueArray,
|
||||||
pod::ValueArray::Float(volume::to_channel_volumes(
|
pod::ValueArray::Float(volume::to_channel_volumes(
|
||||||
&props.channel_map.as_deref().unwrap_or_default(),
|
props.channel_map.as_deref().unwrap_or_default(),
|
||||||
volume,
|
volume,
|
||||||
balance,
|
balance,
|
||||||
))
|
))
|
||||||
|
|
@ -859,7 +880,7 @@ impl State {
|
||||||
ValueArray,
|
ValueArray,
|
||||||
pod::ValueArray::Float(if matches!(route.direction, Direction::Output) {
|
pod::ValueArray::Float(if matches!(route.direction, Direction::Output) {
|
||||||
volume::to_channel_volumes(
|
volume::to_channel_volumes(
|
||||||
&props.channel_map.as_deref().unwrap_or_default(),
|
props.channel_map.as_deref().unwrap_or_default(),
|
||||||
volume,
|
volume,
|
||||||
balance,
|
balance,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
use crate::{Availability, spa_utils::string_from_pod};
|
use crate::{Availability, spa_utils::string_from_pod};
|
||||||
use libspa::pod::Pod;
|
use libspa::pod::Pod;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug, Default)]
|
||||||
pub struct Profile {
|
pub struct Profile {
|
||||||
pub index: i32,
|
pub index: i32,
|
||||||
pub priority: i32,
|
pub priority: i32,
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,8 @@ pub fn string_from_pod(pod: &Pod) -> Option<String> {
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
// SAFETY: Pod is checked to be a string beforehand
|
// SAFETY: Pod is checked to be a string beforehand
|
||||||
if libspa_sys::spa_pod_get_string(pod.as_raw_ptr(), &mut cstr) == 0 {
|
if libspa_sys::spa_pod_get_string(pod.as_raw_ptr(), &mut cstr) == 0 && !cstr.is_null() {
|
||||||
if !cstr.is_null() {
|
return Some(String::from_utf8_lossy(CStr::from_ptr(cstr).to_bytes()).into_owned());
|
||||||
return Some(String::from_utf8_lossy(CStr::from_ptr(cstr).to_bytes()).into_owned());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
6
debian/changelog
vendored
6
debian/changelog
vendored
|
|
@ -1,3 +1,9 @@
|
||||||
|
cosmic-settings (1.0.7) noble; urgency=medium
|
||||||
|
|
||||||
|
* release: 1.0.7
|
||||||
|
|
||||||
|
-- Michael Murphy <michael@mmurphy.dev> Tue, 17 Feb 2026 17:02:45 +0100
|
||||||
|
|
||||||
cosmic-settings (1.0.2) noble; urgency=medium
|
cosmic-settings (1.0.2) noble; urgency=medium
|
||||||
|
|
||||||
* Released version
|
* Released version
|
||||||
|
|
|
||||||
80
i18n/af/cosmic_settings.ftl
vendored
80
i18n/af/cosmic_settings.ftl
vendored
|
|
@ -1,20 +1,32 @@
|
||||||
app = COSMIC Instellings
|
app = COSMIC Instellings
|
||||||
|
|
||||||
dbus-connection-error = Koppeling aan DBus het misluk
|
dbus-connection-error = Koppeling aan DBus het misluk
|
||||||
ok = OK
|
ok = OK
|
||||||
unknown = Onbekend
|
unknown = Onbekend
|
||||||
|
|
||||||
number = { $number }
|
number = { $number }
|
||||||
|
xdg-entry-about = Oor
|
||||||
|
xdg-entry-about-comment = Toestelnaam, hardeware-inligtings, standaardinstellings van die bedryfstelsel
|
||||||
|
xdg-entry-about-keywords = COSMIC;Oor
|
||||||
|
xdg-entry-a11y = Toeganklikhede
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Toeganklikhede;A11y;Screen;Reader;Magnifier;Contrast;Color;
|
||||||
|
xdg-entry-appearance = Weergawe
|
||||||
|
xdg-entry-appearance-comment = Aksentkleure en temas
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Weergawe;Aksentkleure;Color;Icon;Font;Temas
|
||||||
|
xdg-entry-applications = Toepassings
|
||||||
|
xdg-entry-bluetooth-comment = Bestuur Bluetooth-toestelle
|
||||||
|
xdg-entry-date-time = Datum en tyd
|
||||||
|
xdg-entry-date-time-comment = Tydsone, outomatiese klokinstellings en tydformatering
|
||||||
|
xdg-entry-default-apps = Standaard toepassings
|
||||||
|
xdg-entry-default-apps-comment = Default web browser, mail client, file browser, and other applications
|
||||||
|
xdg-entry-displays = Vertoonskerme
|
||||||
|
xdg-entry-displays-comment = Vertoonopsies, grafiese modusse en naglig
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Vertoonskerme;
|
||||||
|
xdg-entry-dock = Dock
|
||||||
|
xdg-entry-dock-comment = 'n Opsionele balk vir programme en applets
|
||||||
|
xdg-entry-input = Invoertoestelle
|
||||||
|
xdg-entry-input-comment = Sleutelbord, muis, ens
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles = { $variant ->
|
|
||||||
[wired] Kabelverbindings
|
|
||||||
[wifi] Wifi-verbindings
|
|
||||||
[vpn] VPN-verbindings
|
|
||||||
*[other] Onbekende verbindings
|
|
||||||
} en verbindingsprofiele.
|
|
||||||
|
|
||||||
add-network = Voeg netwerk toe
|
add-network = Voeg netwerk toe
|
||||||
.profile = Voeg profiel toe
|
.profile = Voeg profiel toe
|
||||||
add-vpn = Voeg VPN toe
|
add-vpn = Voeg VPN toe
|
||||||
|
|
@ -36,14 +48,11 @@ settings = Instellings
|
||||||
username = Gebruikersnaam
|
username = Gebruikersnaam
|
||||||
visible-networks = Sigbare netwerke
|
visible-networks = Sigbare netwerke
|
||||||
identity = Identiteit
|
identity = Identiteit
|
||||||
|
|
||||||
auth-dialog = Verifikasie vereis
|
auth-dialog = Verifikasie vereis
|
||||||
.vpn-description = Voer die gebruikersnaam en wagwoord in wat deur die VPN-diens vereis word.
|
.vpn-description = Voer die gebruikersnaam en wagwoord in wat deur die VPN-diens vereis word.
|
||||||
.wifi-description = Voer die wagwoord of enkripsiesleutel in. U kan ook verbind deur op die “WPS”-knoppie op die roeteerder te druk.
|
.wifi-description = Voer die wagwoord of enkripsiesleutel in. U kan ook verbind deur op die “WPS”-knoppie op die roeteerder te druk.
|
||||||
|
|
||||||
forget-dialog = Vergeet hierdie wifi-netwerk?
|
forget-dialog = Vergeet hierdie wifi-netwerk?
|
||||||
.description = U sal weer 'n wagwoord moet invoer as u hierdie wifi-netwerk in die toekoms gebruik wil.
|
.description = U sal weer 'n wagwoord moet invoer as u hierdie wifi-netwerk in die toekoms gebruik wil.
|
||||||
|
|
||||||
network-device-state =
|
network-device-state =
|
||||||
.activated = Gekoppel
|
.activated = Gekoppel
|
||||||
.config = Verbind, wag…
|
.config = Verbind, wag…
|
||||||
|
|
@ -51,7 +60,7 @@ network-device-state =
|
||||||
.disconnected = Het ontkoppel
|
.disconnected = Het ontkoppel
|
||||||
.failed = Kon nie verbind nie
|
.failed = Kon nie verbind nie
|
||||||
.ip-check = Verbinding nagaan…
|
.ip-check = Verbinding nagaan…
|
||||||
.ip-config = IP- en roeteringsinligting opvra…
|
.ip-config = IP- en roeteringsinligting opvra…
|
||||||
.need-auth = Dit benodig verifikasie
|
.need-auth = Dit benodig verifikasie
|
||||||
.prepare = Verbinding word voorberei…
|
.prepare = Verbinding word voorberei…
|
||||||
.secondaries = Wag op sekondêre verbinding…
|
.secondaries = Wag op sekondêre verbinding…
|
||||||
|
|
@ -59,17 +68,14 @@ network-device-state =
|
||||||
.unknown = Status onbekend
|
.unknown = Status onbekend
|
||||||
.unmanaged = Onbeheerd
|
.unmanaged = Onbeheerd
|
||||||
.unplugged = Kabel is losgekoppel
|
.unplugged = Kabel is losgekoppel
|
||||||
|
|
||||||
remove-connection-dialog = Hierdie verbindingsprofiel verwyder?
|
remove-connection-dialog = Hierdie verbindingsprofiel verwyder?
|
||||||
.vpn-description = U sal weer 'n wagwoord moet invoer as u hierdie netwerk in die toekoms gaan gebruik.
|
.vpn-description = U sal weer 'n wagwoord moet invoer as u hierdie netwerk in die toekoms gaan gebruik.
|
||||||
.wired-description = U sal hierdie profiel weer moet skep om dit in die toekoms te kan gebruik.
|
.wired-description = U sal hierdie profiel weer moet skep om dit in die toekoms te kan gebruik.
|
||||||
|
|
||||||
vpn = VPN
|
vpn = VPN
|
||||||
.connections = VPN-verbindings
|
.connections = VPN-verbindings
|
||||||
.error = Kon nie VPN-konfigurasie byvoeg nie
|
.error = Kon nie VPN-konfigurasie byvoeg nie
|
||||||
.remove = Verwyder verbindingsprofiel
|
.remove = Verwyder verbindingsprofiel
|
||||||
.select-file = Kies 'n VPN-konfigurasielêer
|
.select-file = Kies 'n VPN-konfigurasielêer
|
||||||
|
|
||||||
vpn-error = VPN-fout
|
vpn-error = VPN-fout
|
||||||
.config = Kon nie VPN-konfigurasie byvoeg nie
|
.config = Kon nie VPN-konfigurasie byvoeg nie
|
||||||
.connect = Kon nie aan VPN koppel nie
|
.connect = Kon nie aan VPN koppel nie
|
||||||
|
|
@ -79,22 +85,20 @@ vpn-error = VPN-fout
|
||||||
.wireguard-config-path = Ongeldige lêerpad vir WireGuard-konfigurasie
|
.wireguard-config-path = Ongeldige lêerpad vir WireGuard-konfigurasie
|
||||||
.wireguard-config-path-desc = Gekose lêer moet op 'n plaaslike lêerstelsel wees.
|
.wireguard-config-path-desc = Gekose lêer moet op 'n plaaslike lêerstelsel wees.
|
||||||
.wireguard-device = Die skepping van WireGuard-toestel het misluk
|
.wireguard-device = Die skepping van WireGuard-toestel het misluk
|
||||||
.with-password = Kon nie { $field ->
|
.with-password =
|
||||||
*[username] VPN-gebruikersnaam
|
Kon nie { $field ->
|
||||||
[password] VPN-wagwoord
|
*[username] VPN-gebruikersnaam
|
||||||
[password-flags] VPN-wagwoordvlae
|
[password] VPN-wagwoord
|
||||||
} met nmcli stel nie
|
[password-flags] VPN-wagwoordvlae
|
||||||
|
} met nmcli stel nie
|
||||||
wired = Bedraad
|
wired = Bedraad
|
||||||
.adapter = Bedrade adapter { $id }
|
.adapter = Bedrade adapter { $id }
|
||||||
.connections = Bedrade verbindings
|
.connections = Bedrade verbindings
|
||||||
.devices = Bedrade toestelle
|
.devices = Bedrade toestelle
|
||||||
.remove = Verwyder verbindingsprofiel
|
.remove = Verwyder verbindingsprofiel
|
||||||
|
|
||||||
wifi = Wifi
|
wifi = Wifi
|
||||||
.adapter = Wifi-adapter { $id }
|
.adapter = Wifi-adapter { $id }
|
||||||
.forget = Vergeet hierdie netwerk
|
.forget = Vergeet hierdie netwerk
|
||||||
|
|
||||||
wireguard-dialog = Voeg WireGuard-toestel toe
|
wireguard-dialog = Voeg WireGuard-toestel toe
|
||||||
.description = Kies 'n toestelnaam vir die WireGuard-konfigurasie.
|
.description = Kies 'n toestelnaam vir die WireGuard-konfigurasie.
|
||||||
|
|
||||||
|
|
@ -108,10 +112,9 @@ online-accounts = Aanlyn rekeninge
|
||||||
activate = Aktiveer
|
activate = Aktiveer
|
||||||
confirm = Bevestig
|
confirm = Bevestig
|
||||||
enable = Skakel in
|
enable = Skakel in
|
||||||
|
|
||||||
bluetooth = Bluetooth
|
bluetooth = Bluetooth
|
||||||
.desc = Om bluetooth-apparate te bestuur
|
.desc = Om bluetooth-apparate te bestuur
|
||||||
.status = Hierdie stelsel is sigbaar as { $aliases } wanneer u die bluetooth-instellings open hou.
|
.status = Hierdie stelsel is sigbaar as { $aliases } wanneer u die bluetooth-instellings open hou.
|
||||||
.connected = Gekoppel
|
.connected = Gekoppel
|
||||||
.connecting = Verbinding maak…
|
.connecting = Verbinding maak…
|
||||||
.disconnecting = Verbinding beëindig…
|
.disconnecting = Verbinding beëindig…
|
||||||
|
|
@ -122,16 +125,12 @@ bluetooth = Bluetooth
|
||||||
.disabled = Die bluetooth-diens is gedeaktiveer
|
.disabled = Die bluetooth-diens is gedeaktiveer
|
||||||
.inactive = Die bluetooth-diens is nie aktief nie
|
.inactive = Die bluetooth-diens is nie aktief nie
|
||||||
.unknown = Die Bluetooth-diens kon nie geaktiveer word nie. Het u BlueZ geïnstalleer?
|
.unknown = Die Bluetooth-diens kon nie geaktiveer word nie. Het u BlueZ geïnstalleer?
|
||||||
|
|
||||||
bluetooth-paired = Voorheen gekoppelde apparate
|
bluetooth-paired = Voorheen gekoppelde apparate
|
||||||
.connect = Verbind
|
.connect = Verbind
|
||||||
.battery = { $percentage }% battery
|
.battery = { $percentage }% battery
|
||||||
|
|
||||||
bluetooth-confirm-pin = Bevestig bluetooth-pinkode
|
bluetooth-confirm-pin = Bevestig bluetooth-pinkode
|
||||||
.description = Bevestig dat die volgende pinkode ooreenstem met dié wat op { $device } vertoon word
|
.description = Bevestig dat die volgende pinkode ooreenstem met dié wat op { $device } vertoon word
|
||||||
|
|
||||||
bluetooth-available = Apparate in die omgewing
|
bluetooth-available = Apparate in die omgewing
|
||||||
|
|
||||||
bluetooth-adapters = Bluetooth-adapters
|
bluetooth-adapters = Bluetooth-adapters
|
||||||
|
|
||||||
## Accessibility
|
## Accessibility
|
||||||
|
|
@ -145,20 +144,21 @@ accessibility = Toeganklikheid
|
||||||
.high-contrast = Hoë kontrastmodus
|
.high-contrast = Hoë kontrastmodus
|
||||||
.invert-colors = Keer kleure om
|
.invert-colors = Keer kleure om
|
||||||
.color-filters = Kleurfilters
|
.color-filters = Kleurfilters
|
||||||
|
|
||||||
hearing = Gehoor
|
hearing = Gehoor
|
||||||
.mono = Speel stereo-klank as mono
|
.mono = Speel stereo-klank as mono
|
||||||
|
|
||||||
default = Standaard
|
default = Standaard
|
||||||
magnifier = Vergrootglas
|
magnifier = Vergrootglas
|
||||||
.controls = Of gebruik hierdie kortpaaie: { $zoom_in ->
|
.controls =
|
||||||
[zero] {""}
|
Of gebruik hierdie kortpaaie: { $zoom_in ->
|
||||||
*[other] {""}
|
[zero] { "" }
|
||||||
{$zoom_in} om in te zoem,
|
*[other]
|
||||||
|
{ "" }
|
||||||
|
{ $zoom_in } om in te zoem,
|
||||||
}{ $zoom_out ->
|
}{ $zoom_out ->
|
||||||
[zero] {""}
|
[zero] { "" }
|
||||||
*[other] {""}
|
*[other]
|
||||||
{$zoom_out} om uit te zoem,
|
{ "" }
|
||||||
|
{ $zoom_out } om uit te zoem,
|
||||||
}
|
}
|
||||||
Super + Scroll met uw muis
|
Super + Scroll met uw muis
|
||||||
.scroll_controls = Aktiveer muis- of raakvlakzoem met Super + Scroll
|
.scroll_controls = Aktiveer muis- of raakvlakzoem met Super + Scroll
|
||||||
|
|
@ -176,5 +176,3 @@ color-filter = Kleurfiltertipe
|
||||||
.deuteranopia = Groen/Rooi (groenswakheid, Deuteranopie)
|
.deuteranopia = Groen/Rooi (groenswakheid, Deuteranopie)
|
||||||
.protanopia = Rooi/Groen (rooiswakheid, Protanopie)
|
.protanopia = Rooi/Groen (rooiswakheid, Protanopie)
|
||||||
.tritanopia = Blou/Geel (bluoswakheid, Tritanopie)
|
.tritanopia = Blou/Geel (bluoswakheid, Tritanopie)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
202
i18n/ar/cosmic_settings.ftl
vendored
202
i18n/ar/cosmic_settings.ftl
vendored
|
|
@ -3,22 +3,62 @@ dbus-connection-error = تعذر الاتصال بـDBus
|
||||||
ok = حسنًا
|
ok = حسنًا
|
||||||
unknown = مجهول
|
unknown = مجهول
|
||||||
number = { $number }
|
number = { $number }
|
||||||
|
xdg-entry-about = عن
|
||||||
|
xdg-entry-about-comment = اسم الجهاز ومعلومات العتاد وإعدادات نظام التشغيل المبدئية
|
||||||
|
xdg-entry-a11y = الإتاحة
|
||||||
|
xdg-entry-a11y-comment = قارئ الشاشة والمكبر والتباين العالي وتصفيات الألوان
|
||||||
|
xdg-entry-appearance = المظهر
|
||||||
|
xdg-entry-appearance-comment = ألوان التمييز والسمات
|
||||||
|
xdg-entry-applications = التطبيقات
|
||||||
|
xdg-entry-bluetooth-comment = أدِر أجهزة البلوتوث
|
||||||
|
xdg-entry-date-time = التاريخ والوقت
|
||||||
|
xdg-entry-date-time-comment = المنطقة الزمنية وإعدادات الساعة التلقائية وتنسيق الوقت
|
||||||
|
xdg-entry-default-apps = التطبيقات المبدئية
|
||||||
|
xdg-entry-default-apps-comment = متصفح الويب المبدئي، عميل البريد، متصفح الملفات، والتطبيقات الأخرى
|
||||||
|
xdg-entry-desktop = سطح المكتب
|
||||||
|
xdg-entry-desktop-comment = إعدادات خلفية الشاشة والمظهر واللوحة والمنصة وإدارة النوافذ ومساحة العمل
|
||||||
|
xdg-entry-displays = شاشات العرض
|
||||||
|
xdg-entry-displays-comment = أدِر إعدادات تضبيط العرض
|
||||||
|
xdg-entry-dock = الإرساء
|
||||||
|
xdg-entry-dock-comment = شريط إختياري للتطبيقات والبُريمجات
|
||||||
|
xdg-entry-input = أجهزة الإدخال
|
||||||
|
xdg-entry-input-comment = لوحة المفاتيح، المؤشر، إلخ
|
||||||
|
xdg-entry-keyboard = لوحة المفاتيح
|
||||||
|
xdg-entry-keyboard-comment = مصادر الإدخال، التبديل، إدخال الأحرف الخاصة، الاختصارات
|
||||||
|
xdg-entry-mouse = الفأرة
|
||||||
|
xdg-entry-mouse-comment = سرعة الفأرة، والتسارع، والتمرير الطبيعي
|
||||||
|
xdg-entry-network = الشبكة والاتصالات اللاسلكية
|
||||||
|
xdg-entry-network-comment = أدِر اتصالات الشبكة
|
||||||
|
xdg-entry-notifications = الإشعارات
|
||||||
|
xdg-entry-notifications-comment = عدم الإزعاج، إشعارات شاشة القفل، وإعدادات لكل تطبيق
|
||||||
|
xdg-entry-panel = اللوحة
|
||||||
|
xdg-entry-panel-comment = شريط النظام الأساسي للقوائم والبريمجات
|
||||||
|
xdg-entry-power = الطاقة والمُدَّخرة
|
||||||
|
xdg-entry-power-comment = أوضاع الطاقة وخيارات توفير الطاقة
|
||||||
|
xdg-entry-region-language = اللغة والمنطقة
|
||||||
|
xdg-entry-region-language-comment = نسق التواريخ والأوقات والأرقام بناءً على منطقتك
|
||||||
|
xdg-entry-sound = الصوت
|
||||||
|
xdg-entry-sound-comment = إعدادات الصوت للأجهزة والتنبيهات والتطبيقات
|
||||||
|
xdg-entry-startup-apps = تطبيقات بدء التشغيل
|
||||||
|
xdg-entry-startup-apps-comment = اضبط التطبيقات التي تعمل عند الولوج
|
||||||
|
xdg-entry-system = النظام والحسابات
|
||||||
|
xdg-entry-time-language = الوقت واللغة
|
||||||
|
xdg-entry-touchpad = لوحة اللمس
|
||||||
|
xdg-entry-touchpad-comment = سرعة لوحة اللمس، خيارات النقر، الإيماءات
|
||||||
|
xdg-entry-users = المستخدمين
|
||||||
|
xdg-entry-users-comment = الاستيثاق وحسابات المستخدمين
|
||||||
|
xdg-entry-vpn-comment = اتصالات VPN وملفات تعريف الاتصال
|
||||||
|
xdg-entry-x11-applications = توافق تطبيقات اكس11
|
||||||
|
xdg-entry-x11-applications-comment = توسيع نطاق تطبيق نظام النوافذ اكس11 والاختصارات العامة
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] سلكي
|
|
||||||
[wifi] واي فاي
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] غير معروف
|
|
||||||
} الاتصالات وملفات تعريف الاتصال.
|
|
||||||
add-network = أضف شبكة
|
add-network = أضف شبكة
|
||||||
.profile = أضف ملف تعريف
|
.profile = أضف ملف تعريف
|
||||||
add-vpn = إضافة VPN
|
add-vpn = أضف VPN
|
||||||
airplane-on = وضع الطائرة مفعَّل.
|
airplane-on = وضع الطائرة مفعَّل.
|
||||||
cable-unplugged = الكابل مفصول
|
cable-unplugged = الكابل مفصول
|
||||||
connect = توصيل
|
connect = اتصل
|
||||||
connected = متصل
|
connected = متصل
|
||||||
connecting = يتصل…
|
connecting = يتصل…
|
||||||
disconnect = اقطع الاتصال
|
disconnect = اقطع الاتصال
|
||||||
|
|
@ -26,7 +66,7 @@ forget = انسَ
|
||||||
known-networks = الشبكات المعروفة
|
known-networks = الشبكات المعروفة
|
||||||
network-and-wireless = الشبكة واللاسلكي
|
network-and-wireless = الشبكة واللاسلكي
|
||||||
no-networks = لم يُعثر على أي شبكات.
|
no-networks = لم يُعثر على أي شبكات.
|
||||||
no-vpn = لا توجد اتصالات VPN متاحة.
|
no-vpn = لا اتصالات VPN متوفرة.
|
||||||
password = كلمة السر
|
password = كلمة السر
|
||||||
password-confirm = أكِّد كلمة السر
|
password-confirm = أكِّد كلمة السر
|
||||||
remove = أزِل
|
remove = أزِل
|
||||||
|
|
@ -34,11 +74,11 @@ settings = الإعدادات
|
||||||
username = اسم المستخدم
|
username = اسم المستخدم
|
||||||
visible-networks = الشبكات المرئية
|
visible-networks = الشبكات المرئية
|
||||||
identity = الهوية
|
identity = الهوية
|
||||||
auth-dialog = المصادقة مطلوبة
|
auth-dialog = الاستيثاق مطلوب
|
||||||
.vpn-description = أدخل اسم المستخدم وكلمة السر المطلوبين من قبل خدمة VPN.
|
.vpn-description = أدخل اسم المستخدم وكلمة السر المطلوبين من قِبل خدمة VPN.
|
||||||
.wifi-description = أدخل كلمة السر أو مفتاح التشفير. يمكنك أيضًا الاتصال بالضغط على زر ”WPS“ الموجود على الراوتر.
|
.wifi-description = أدخل كلمة السر أو مفتاح التعمية. يمكنك أيضًا الاتصال بالضغط على زر "WPS" الموجود على جهاز التوجيه.
|
||||||
forget-dialog = هل تريد نسيان شبكة الواي فاي هذه؟
|
forget-dialog = أنسَ شبكة واي فاي هذه؟
|
||||||
.description = ستحتاج إلى إدخال كلمة السر مرة أخرى لاستخدام شبكة Wi-Fi هذه في المستقبل.
|
.description = سيتعين إدخال كلمة السر مجددًا لاستخدامها مستقبلًا.
|
||||||
network-device-state =
|
network-device-state =
|
||||||
.activated = متصل
|
.activated = متصل
|
||||||
.config = يتصل
|
.config = يتصل
|
||||||
|
|
@ -47,7 +87,7 @@ network-device-state =
|
||||||
.failed = فشل الاتصال
|
.failed = فشل الاتصال
|
||||||
.ip-check = يتحقق من الاتصال
|
.ip-check = يتحقق من الاتصال
|
||||||
.ip-config = طلب معلومات IP والتوجيه
|
.ip-config = طلب معلومات IP والتوجيه
|
||||||
.need-auth = يحتاج إلى مصادقة
|
.need-auth = يحتاج إلى الاستيثاق
|
||||||
.prepare = التحضير للاتصال
|
.prepare = التحضير للاتصال
|
||||||
.secondaries = انتظار الاتصال الثانوي
|
.secondaries = انتظار الاتصال الثانوي
|
||||||
.unavailable = غير متاح
|
.unavailable = غير متاح
|
||||||
|
|
@ -99,7 +139,6 @@ activate = تفعيل
|
||||||
confirm = أكِّد
|
confirm = أكِّد
|
||||||
enable = فعِّل
|
enable = فعِّل
|
||||||
bluetooth = بلوتوث
|
bluetooth = بلوتوث
|
||||||
.desc = أدر أجهزة بلوتوث
|
|
||||||
.status = سيظهر النظام باسم { $aliases } حين تُفتح إعدادات بلوتوث.
|
.status = سيظهر النظام باسم { $aliases } حين تُفتح إعدادات بلوتوث.
|
||||||
.connected = متصل
|
.connected = متصل
|
||||||
.connecting = يتصل
|
.connecting = يتصل
|
||||||
|
|
@ -169,9 +208,8 @@ desktop = سطح المكتب
|
||||||
|
|
||||||
## Desktop: Wallpaper
|
## Desktop: Wallpaper
|
||||||
|
|
||||||
wallpaper = خلفية
|
wallpaper = الخلفية
|
||||||
.change = غيِّر الصورة كل
|
.change = غيِّر الصورة كل
|
||||||
.desc = صور الخلفية والألوان وخيارات عرض الشرائح.
|
|
||||||
.fit = ملاءمة الخلفية
|
.fit = ملاءمة الخلفية
|
||||||
.folder-dialog = اختر مجلد الخلفية
|
.folder-dialog = اختر مجلد الخلفية
|
||||||
.image-dialog = اختر صورة الخلفية
|
.image-dialog = اختر صورة الخلفية
|
||||||
|
|
@ -201,7 +239,6 @@ x-hours =
|
||||||
## Desktop: Appearance
|
## Desktop: Appearance
|
||||||
|
|
||||||
appearance = المظهر
|
appearance = المظهر
|
||||||
.desc = ألوان التمييز والنسق
|
|
||||||
accent-color = لون التمييز
|
accent-color = لون التمييز
|
||||||
app-background = خلفية النافذة
|
app-background = خلفية النافذة
|
||||||
auto = آلي
|
auto = آلي
|
||||||
|
|
@ -230,15 +267,15 @@ container-background = خلفية الحاوية
|
||||||
.reset = صفِّر إلى الوضع الآلي
|
.reset = صفِّر إلى الوضع الآلي
|
||||||
.desc = يُستخدم في شريط التنقل الجانبي والدرج الجانبي ومربعات الحوار وعناصر واجهة المستخدم المماثلة
|
.desc = يُستخدم في شريط التنقل الجانبي والدرج الجانبي ومربعات الحوار وعناصر واجهة المستخدم المماثلة
|
||||||
control-tint = تحكم في لون المكون
|
control-tint = تحكم في لون المكون
|
||||||
.desc = يستخدم لخلفيات الأزرار القياسية ومدخلات البحث ومدخلات النص والمكونات المماثلة.
|
.desc = يستخدم لخلفيات الأزرار القياسية ومدخلات البحث ومدخلات النص والمكونات المماثلة
|
||||||
frosted = تأثير الزجاج البلوري على واجهة النظام
|
frosted = تأثير الزجاج البلوري على واجهة النظام
|
||||||
.desc = يطبِّق تمويه الخلفية للوحة والمرسى والبريمجات والمطلق ومكتبة التطبيقات
|
.desc = يطبِّق تمويه الخلفية للوحة والمرسى والبريمجات والمطلق ومكتبة التطبيقات
|
||||||
enable-export = قم بتطبيق هذا المظهر على تطبيقات GNOME.
|
enable-export = قم بتطبيق هذا المظهر على تطبيقات GNOME.
|
||||||
.desc = لا تدعم جميع مجموعات الأدوات التبديل التلقائي. قد تحتاج التطبيقات غير التابعة لـ COSMIC إلى إعادة التشغيل بعد تغيير المظهر.
|
.desc = لا تدعم جميع مجموعات الأدوات التبديل التلقائي. قد تحتاج التطبيقات غير التابعة لـ COSMIC إلى إعادة التشغيل بعد تغيير المظهر.
|
||||||
icon-theme = ثيم الأيقونات
|
icon-theme = نسق الأيقونات
|
||||||
.desc = يطبق مجموعة مختلفة من الأيقونات على التطبيقات.
|
.desc = يطبق مجموعة مختلفة من الأيقونات على التطبيقات
|
||||||
text-tint = لون نص الواجهة
|
text-tint = لون نص الواجهة
|
||||||
.desc = اللون المستخدم لاشتقاق ألوان نص الواجهة التي تتمتع بتباين كافٍ على الأسطح المختلفة.
|
.desc = اللون المستخدم لاشتقاق ألوان نص الواجهة التي تتمتع بتباين كافٍ على الأسطح المختلفة
|
||||||
style = المظهر
|
style = المظهر
|
||||||
.round = دائري
|
.round = دائري
|
||||||
.slightly-round = دائري قليلاً
|
.slightly-round = دائري قليلاً
|
||||||
|
|
@ -261,12 +298,10 @@ monospace-font = خط أحادي المسافة
|
||||||
## Desktop: Notifications
|
## Desktop: Notifications
|
||||||
|
|
||||||
notifications = الإشعارات
|
notifications = الإشعارات
|
||||||
.desc = لا تزعج، وإشعارات شاشة القفل، وإعدادات كل تطبيق على حدة.
|
|
||||||
|
|
||||||
## Desktop: Panel
|
## Desktop: Panel
|
||||||
|
|
||||||
panel = اللوحة
|
panel = اللوحة
|
||||||
.desc = شريط النظام الأساسي للقوائم والبريمجات
|
|
||||||
add = أضِف
|
add = أضِف
|
||||||
add-applet = أضِف بريمج
|
add-applet = أضِف بريمج
|
||||||
all = الكل
|
all = الكل
|
||||||
|
|
@ -279,7 +314,7 @@ panel-bottom = الأسفل
|
||||||
panel-left = الشمال
|
panel-left = الشمال
|
||||||
panel-right = اليمين
|
panel-right = اليمين
|
||||||
panel-top = الأعلى
|
panel-top = الأعلى
|
||||||
search-applets = ابحث البريمجات…
|
search-applets = ابحث عن بريمجات…
|
||||||
small = صغير
|
small = صغير
|
||||||
start-segment = جزء البداية
|
start-segment = جزء البداية
|
||||||
panel-appearance = المظهر
|
panel-appearance = المظهر
|
||||||
|
|
@ -308,19 +343,17 @@ panel-missing = ضبط اللوحة مفقود
|
||||||
|
|
||||||
## Desktop: Dock
|
## Desktop: Dock
|
||||||
|
|
||||||
dock = حامل التطبيقات
|
dock = المرسى
|
||||||
.desc = حامل اختياري للتطبيقات والبرامج المصغرة.
|
|
||||||
|
|
||||||
## Desktop: Window management
|
## Desktop: Window management
|
||||||
|
|
||||||
window-management = إدارة النوافذ
|
window-management = إدارة النوافذ
|
||||||
.desc = إجراءات مفتاح سوبر، وخيارات التحكم في النوافذ، وخيارات إضافية لتقسيم النوافذ.
|
super-key = إجراءات مفتاح Super
|
||||||
super-key = إجراءات مفتاح سوبر
|
|
||||||
.launcher = فتح مشغل التطبيقات
|
.launcher = فتح مشغل التطبيقات
|
||||||
.workspaces = فتح مساحات العمل
|
.workspaces = فتح مساحات العمل
|
||||||
.applications = فتح التطبيقات
|
.applications = فتح التطبيقات
|
||||||
.disable = تعطيل
|
.disable = تعطيل
|
||||||
edge-gravity = تنجذب النوافذ التي تطفو إلى الحواف القريبة
|
edge-gravity = تنجذب النوافذ العائمة إلى الحواف القريبة
|
||||||
window-controls = تحكمات النوافذ
|
window-controls = تحكمات النوافذ
|
||||||
.maximize = أظهر زر التكبير
|
.maximize = أظهر زر التكبير
|
||||||
.minimize = أظهر زر التصغير
|
.minimize = أظهر زر التصغير
|
||||||
|
|
@ -333,7 +366,6 @@ focus-navigation = تنقُل التركيز
|
||||||
## Desktop: Workspaces
|
## Desktop: Workspaces
|
||||||
|
|
||||||
workspaces = مساحات العمل
|
workspaces = مساحات العمل
|
||||||
.desc = توجه وسلوك مساحة العمل.
|
|
||||||
workspaces-behavior = سلوك مساحة العمل
|
workspaces-behavior = سلوك مساحة العمل
|
||||||
.dynamic = مساحات عمل حركيَّة
|
.dynamic = مساحات عمل حركيَّة
|
||||||
.dynamic-desc = يُزيل مساحات العمل الفارغة آليًا.
|
.dynamic-desc = يُزيل مساحات العمل الفارغة آليًا.
|
||||||
|
|
@ -360,7 +392,6 @@ color = اللون
|
||||||
.sidebar = ملفات تعريف الألوان
|
.sidebar = ملفات تعريف الألوان
|
||||||
.temperature = درجة حرارة اللون
|
.temperature = درجة حرارة اللون
|
||||||
display = الشاشات
|
display = الشاشات
|
||||||
.desc = أدر الشاشات والإضاءة الليلية
|
|
||||||
.arrangement = ترتيب الشاشات
|
.arrangement = ترتيب الشاشات
|
||||||
.arrangement-desc = اسحب الشاشات لإعادة ترتيبها.
|
.arrangement-desc = اسحب الشاشات لإعادة ترتيبها.
|
||||||
.enable = فعِّل الشاشة
|
.enable = فعِّل الشاشة
|
||||||
|
|
@ -409,7 +440,6 @@ dialog = حوار
|
||||||
## Sound
|
## Sound
|
||||||
|
|
||||||
sound = الصوت
|
sound = الصوت
|
||||||
.desc = غير متوفر
|
|
||||||
sound-output = الإخراج
|
sound-output = الإخراج
|
||||||
.volume = مستوي صوت الإخراج
|
.volume = مستوي صوت الإخراج
|
||||||
.device = جهاز الإخراج
|
.device = جهاز الإخراج
|
||||||
|
|
@ -423,7 +453,7 @@ sound-input = الإدخال
|
||||||
.device = جهاز الإدخال
|
.device = جهاز الإدخال
|
||||||
.level = مستوى الإدخال
|
.level = مستوى الإدخال
|
||||||
amplification = التضخيم
|
amplification = التضخيم
|
||||||
.desc = يسمح برفع مستوى الصوت إلى 150٪.
|
.desc = يسمح برفع مستوى الصوت إلى 150٪
|
||||||
sound-alerts = التنبيهات
|
sound-alerts = التنبيهات
|
||||||
.volume = مستوي صوت التنبيهات
|
.volume = مستوي صوت التنبيهات
|
||||||
.sound = صوت التنبيهات
|
.sound = صوت التنبيهات
|
||||||
|
|
@ -433,7 +463,6 @@ sound-applications = التطبيقات
|
||||||
## Power
|
## Power
|
||||||
|
|
||||||
power = الطاقة والمُدَّخرة
|
power = الطاقة والمُدَّخرة
|
||||||
.desc = أدر إعدادات الطاقة
|
|
||||||
battery = المُدَّخرة
|
battery = المُدَّخرة
|
||||||
.minute =
|
.minute =
|
||||||
{ $value } { $value ->
|
{ $value } { $value ->
|
||||||
|
|
@ -478,7 +507,6 @@ power-saving = خيارات توفير الطاقة
|
||||||
acceleration-desc = يضبط حساسية التتبع آليًا بناءً على السرعة
|
acceleration-desc = يضبط حساسية التتبع آليًا بناءً على السرعة
|
||||||
disable-while-typing = عطِّل أثناء الكتابة
|
disable-while-typing = عطِّل أثناء الكتابة
|
||||||
input-devices = أجهزة الإدخال
|
input-devices = أجهزة الإدخال
|
||||||
.desc = أجهزة الإدخال
|
|
||||||
primary-button = الزر الأساسي
|
primary-button = الزر الأساسي
|
||||||
.desc = يعيِّن ترتيب الأزرار الملموسة.
|
.desc = يعيِّن ترتيب الأزرار الملموسة.
|
||||||
.left = شمال
|
.left = شمال
|
||||||
|
|
@ -497,7 +525,6 @@ fast = سريع
|
||||||
short = قصير
|
short = قصير
|
||||||
long = طويل
|
long = طويل
|
||||||
keyboard = لوحة المفاتيح
|
keyboard = لوحة المفاتيح
|
||||||
.desc = مصادر الإدخال والتبديل وإدخال الأحرف الخاصة والاختصارات
|
|
||||||
keyboard-sources = مصادر الإدخال
|
keyboard-sources = مصادر الإدخال
|
||||||
.desc = يمكن تبديل مصادر الإدخال باستعمال تركيبة مفتاحي Super+Space. يمكن أن يُخصّص هذا من خلال إعدادات اختصارات لوحة المفاتيح.
|
.desc = يمكن تبديل مصادر الإدخال باستعمال تركيبة مفتاحي Super+Space. يمكن أن يُخصّص هذا من خلال إعدادات اختصارات لوحة المفاتيح.
|
||||||
.move-up = حرِك لأعلى
|
.move-up = حرِك لأعلى
|
||||||
|
|
@ -654,7 +681,6 @@ zoom-out = بعِّد
|
||||||
## Input: Mouse
|
## Input: Mouse
|
||||||
|
|
||||||
mouse = الفأرة
|
mouse = الفأرة
|
||||||
.desc = سرعة الفأرة والتسارع والتمرير الطبيعي.
|
|
||||||
.speed = سرعة الفأرة
|
.speed = سرعة الفأرة
|
||||||
.acceleration = فعِّل تسارع الفأرة
|
.acceleration = فعِّل تسارع الفأرة
|
||||||
|
|
||||||
|
|
@ -663,13 +689,12 @@ mouse = الفأرة
|
||||||
click-behavior = سلوك النقر
|
click-behavior = سلوك النقر
|
||||||
.click-finger = النقر الثانوي بإصبعين والنقر الأوسط بثلاثة أصابع
|
.click-finger = النقر الثانوي بإصبعين والنقر الأوسط بثلاثة أصابع
|
||||||
.button-areas = النقر الثانوي في الزاوية اليمنى السفلية والنقر الأوسط في المنتصف السفلي
|
.button-areas = النقر الثانوي في الزاوية اليمنى السفلية والنقر الأوسط في المنتصف السفلي
|
||||||
pinch-to-zoom = الضغط للتكبير
|
pinch-to-zoom = قرص للتكبير
|
||||||
.desc = استخدم إصبعين لتقريب المحتوى، في التطبيقات التي تدعم ذلك.
|
.desc = استخدم إصبعين لتقريب المحتوى، في التطبيقات التي تدعم ذلك
|
||||||
tap-to-click = اضغط للنقر
|
tap-to-click = اضغط للنقر
|
||||||
.desc = يتيح الضغط بإصبع واحد للنقر الأساسي والضغط بإصبعين للنقر الثانوي والضغط بثلاثة أصابع للنقر الأوسط
|
.desc = يتيح الضغط بإصبع واحد للنقر الأساسي والضغط بإصبعين للنقر الثانوي والضغط بثلاثة أصابع للنقر الأوسط
|
||||||
touchpad = لوحة اللمس
|
touchpad = لوحة اللمس
|
||||||
.acceleration = فعِّل تسارع لوحة اللمس
|
.acceleration = فعِّل تسارع لوحة اللمس
|
||||||
.desc = سرعة لوحة اللمس وخيارات النقر والإيماءات.
|
|
||||||
.speed = سرعة لوحة اللمس
|
.speed = سرعة لوحة اللمس
|
||||||
|
|
||||||
## Input: Gestures
|
## Input: Gestures
|
||||||
|
|
@ -690,11 +715,9 @@ open-workspaces-view = نظرة عامة على مساحات العمل المف
|
||||||
## Time & Language
|
## Time & Language
|
||||||
|
|
||||||
time = الوقت واللغة
|
time = الوقت واللغة
|
||||||
.desc = غير متوفر
|
|
||||||
time-date = التاريخ والوقت
|
time-date = التاريخ والوقت
|
||||||
.desc = المنطقة الزمنية وإعدادات الساعة الآلية وبعض تنسيقات الوقت.
|
.auto = عيِّن آليًا
|
||||||
.auto = الضبط الآلي
|
.auto-ntp = سيحدَّث التاريخ والوقت الآلي عند تعيين المنطقة الزمنية
|
||||||
.auto-ntp = سيحدَّث التاريخ والوقت الآلي عند ضبط المنطقة الزمنية
|
|
||||||
time-zone = المنطقة الزمنية
|
time-zone = المنطقة الزمنية
|
||||||
.auto = المنطقة الزمنية الآلية
|
.auto = المنطقة الزمنية الآلية
|
||||||
.auto-info = يتطلب خدمات الموقع والوصول إلى الإنترنت
|
.auto-info = يتطلب خدمات الموقع والوصول إلى الإنترنت
|
||||||
|
|
@ -708,7 +731,6 @@ time-format = تنسيق التاريخ والوقت
|
||||||
.sunday = الأحد
|
.sunday = الأحد
|
||||||
.monday = الاثنين
|
.monday = الاثنين
|
||||||
time-region = المنطقة واللغة
|
time-region = المنطقة واللغة
|
||||||
.desc = تنسيق التواريخ والأوقات والأرقام بناءً على منطقتك.
|
|
||||||
formatting = التنسيق
|
formatting = التنسيق
|
||||||
.dates = التواريخ
|
.dates = التواريخ
|
||||||
.time = الوقت
|
.time = الوقت
|
||||||
|
|
@ -730,7 +752,6 @@ applications = التطبيقات
|
||||||
## Applications: Default Applications
|
## Applications: Default Applications
|
||||||
|
|
||||||
default-apps = التطبيقات المبدئية
|
default-apps = التطبيقات المبدئية
|
||||||
.desc = متصفح الويب المبدئي وعميل البريد ومتصفح الملفات والتطبيقات الأخرى.
|
|
||||||
.web-browser = متصفح الوِب
|
.web-browser = متصفح الوِب
|
||||||
.file-manager = مدير الملفات
|
.file-manager = مدير الملفات
|
||||||
.mail-client = عميل البريد
|
.mail-client = عميل البريد
|
||||||
|
|
@ -741,22 +762,21 @@ default-apps = التطبيقات المبدئية
|
||||||
.terminal = طرفية
|
.terminal = طرفية
|
||||||
.other-associations = جمعيات أخرى
|
.other-associations = جمعيات أخرى
|
||||||
.text-editor = محرِّر نصوص
|
.text-editor = محرِّر نصوص
|
||||||
|
.not-installed = غير مُنصَّب
|
||||||
|
|
||||||
## Applications: Startup Applications
|
## Applications: Startup Applications
|
||||||
|
|
||||||
startup-apps = تطبيقات بدء التشغيل
|
startup-apps = تطبيقات بدء التشغيل
|
||||||
.desc = تكوين التطبيقات التي يتم تشغيلها عند تسجيل الدخول.
|
.add = أضِف تطبيق
|
||||||
.add = إضافة تطبيق
|
.user = التطبيقات التي تُشغّل عند الولوج
|
||||||
.user = التطبيقات التي يتم تشغيلها عند تسجيل الدخول
|
.none = لم تُضاف تطبيقات بدء تشغيل
|
||||||
.none = لم تتم إضافة أي تطبيقات بدء تشغيل
|
.remove-dialog-title = أزلِ { $name }؟
|
||||||
.remove-dialog-title = إزالة { $name }؟
|
.remove-dialog-description = أتريد إزالة تطبيق بدء التشغيل هذا؟
|
||||||
.remove-dialog-description = هل تريد حذف تطبيق بدء التشغيل هذا؟
|
.add-startup-app = أضِف تطبيق بدء التشغيل
|
||||||
.search-for-application = البحث عن تطبيق
|
|
||||||
|
|
||||||
## Applications: Legacy Applications
|
## Applications: Legacy Applications
|
||||||
|
|
||||||
legacy-applications = توافق تطبيقات اكس11
|
legacy-applications = توافق تطبيقات اكس11
|
||||||
.desc = تغيير مقياس تطبيقات نظام النوافذ اكس11 والاختصارات العامة
|
|
||||||
legacy-app-global-shortcuts = اختصارات عامة في تطبيقات اكس11
|
legacy-app-global-shortcuts = اختصارات عامة في تطبيقات اكس11
|
||||||
.desc = تسمح الاختصارات العامة بالتعرّف على ضغطات المفاتيح وأحداث زر الفأرة المُجراة في تطبيقٍ ما لتطبيقاتٍ أخرى — لميزات مثل «اضغط لتتحدث» أو «اضغط لكتم الصوت». مبدئيًا، يُعطّل هذا في تطبيقات اكس11 لضمان عدم تمكن التطبيقات الأخرى من مراقبة أحداث لوحة المفاتيح والفأرة التي تحتوي على معلومات حساسة.
|
.desc = تسمح الاختصارات العامة بالتعرّف على ضغطات المفاتيح وأحداث زر الفأرة المُجراة في تطبيقٍ ما لتطبيقاتٍ أخرى — لميزات مثل «اضغط لتتحدث» أو «اضغط لكتم الصوت». مبدئيًا، يُعطّل هذا في تطبيقات اكس11 لضمان عدم تمكن التطبيقات الأخرى من مراقبة أحداث لوحة المفاتيح والفأرة التي تحتوي على معلومات حساسة.
|
||||||
.none = لا مفاتيح
|
.none = لا مفاتيح
|
||||||
|
|
@ -781,9 +801,8 @@ system = النظام والحسابات
|
||||||
## System: About
|
## System: About
|
||||||
|
|
||||||
about = عن
|
about = عن
|
||||||
.desc = اسم الجهاز ومعلومات العتاد ومبدئيات نظام التشغيل
|
|
||||||
about-device = اسم الجهاز
|
about-device = اسم الجهاز
|
||||||
.desc = هذا الاسم يظهر للشبكات الأخرى وأجهزة بلوتوث.
|
.desc = هذا الاسم يظهر للشبكات الأخرى وأجهزة بلوتوث
|
||||||
about-hardware = العتاد
|
about-hardware = العتاد
|
||||||
.model = طراز العتاد
|
.model = طراز العتاد
|
||||||
.memory = الذاكرة
|
.memory = الذاكرة
|
||||||
|
|
@ -802,23 +821,21 @@ about-related = الإعدادات ذات الصلة
|
||||||
## System: Firmware
|
## System: Firmware
|
||||||
|
|
||||||
firmware = البرمجيات الثابتة
|
firmware = البرمجيات الثابتة
|
||||||
.desc = تفاصيل البرمجيات الثابتة.
|
|
||||||
|
|
||||||
## System: Users
|
## System: Users
|
||||||
|
|
||||||
users = المستخدمون
|
users = المستخدمون
|
||||||
.desc = الاستيثاق وحسابات المستخدمين.
|
|
||||||
.admin = مدير
|
.admin = مدير
|
||||||
.standard = عادي
|
.standard = عادي
|
||||||
.profile-add = اختر صورة ملف تعريف
|
.profile-add = اختر صورة ملف تعريف
|
||||||
administrator = مدير
|
administrator = مدير
|
||||||
.desc = يمكن للمديرين تغيير الإعدادات لجميع المستخدمين، وإضافة مستخدمين آخرين وإزالتهم.
|
.desc = يمكن للمديرين تغيير الإعدادات لجميع المستخدمين، وإضافة مستخدمين آخرين وإزالتهم
|
||||||
add-user = أضِف مستخدم
|
add-user = أضِف مستخدم
|
||||||
change-password = غيَّر كلمة السر
|
change-password = غيَّر كلمة السر
|
||||||
remove-user = أزِل المستخدم
|
remove-user = أزِل المستخدم
|
||||||
full-name = الاسم الكامل
|
full-name = الاسم الكامل
|
||||||
invalid-username = اسم المستخدم غير صالح.
|
invalid-username = اسم المستخدم غير صالح
|
||||||
password-mismatch = يجب أن تتطابق كلمة السر والتأكيد.
|
password-mismatch = يجب أن تتطابق كلمة السر والتأكيد
|
||||||
save = حفظ
|
save = حفظ
|
||||||
never = أبدًا
|
never = أبدًا
|
||||||
keyboard-numlock-boot = Numlock
|
keyboard-numlock-boot = Numlock
|
||||||
|
|
@ -837,3 +854,60 @@ shadows-tiling = النوافذ المبلطة
|
||||||
.clip = مطابقة زوايا النظام
|
.clip = مطابقة زوايا النظام
|
||||||
.shadow = طبِّق الظلال
|
.shadow = طبِّق الظلال
|
||||||
shadow-and-corners = ظل النافذة وزواياها
|
shadow-and-corners = ظل النافذة وزواياها
|
||||||
|
network-name = اسم الشبكة
|
||||||
|
qr-code-unavailable = رمز QR غير متاح
|
||||||
|
scan-to-connect-description = افحص رمز QR للاتصال بهذه الشبكة.
|
||||||
|
share = شارك الشبكة
|
||||||
|
place-here = اضع البريمجات هنا
|
||||||
|
workspaces-overview = نظرة عامة على مساحات العمل
|
||||||
|
.action-on-typing = الإجراء عند الكتابة
|
||||||
|
.none = لا شيء
|
||||||
|
.launcher = فتح المشغل
|
||||||
|
.applications = فتح التطبيقات
|
||||||
|
xdg-entry-wired = سلكي
|
||||||
|
xdg-entry-about-keywords = COSMIC;عن;حول
|
||||||
|
xdg-entry-comment = تطبيق الإعدادات لسطح مكتب COSMIC
|
||||||
|
xdg-entry-keywords = COSMIC;إعدادات;
|
||||||
|
xdg-entry-window-management-comment = إجراء مفتاح Super وخيارات التحكم في النوافذ وخيارات إضافية تبليط النوافذ
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;فأرة;تسارع;تمرير;
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;إشعار;قفل;
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;بدء التشغيل;تطبيق;
|
||||||
|
xdg-entry-wired-keywords = COSMIC;سلكي;LAN;شبكة;اتصال;
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;تمييز;لون;أيقونة;خط;سمة;نسق
|
||||||
|
xdg-entry-dock-keywords = COSMIC;مرسى;لوحة;بريمج
|
||||||
|
xdg-entry-panel-keywords = COSMIC;لوحة;بريمج
|
||||||
|
xdg-entry-window-management = إدارة النوافذ
|
||||||
|
xdg-entry-time-language-comment = أدِر نظام التاريخ والتوقيت والمنطقة واللغة
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;سطح المكتب;
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;تطبيق;لعبة;التوافق;
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;لوحة اللمس;إيماءة;
|
||||||
|
xdg-entry-system-keywords = COSMIC;النظام;المعلومات;الحسابات;البرمجيات الثابتة;
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;واي فاي;Wi-Fi;شبكة;اتصال;
|
||||||
|
xdg-entry-applications-comment = التطبيقات المبدئية وتطبيقات بدء التشغيل وإعدادات توافق تطبيقات اكس11
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;الإتاحة;A11y;شاشة;قارئ;مكبر;تباين;لون;
|
||||||
|
xdg-entry-wireless-comment = اتصالات الواي فاي وملفات تعريف الاتصال
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;الوقت;المنطقة;
|
||||||
|
xdg-entry-wallpaper = الخلفية
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;بلوتوث;
|
||||||
|
xdg-entry-network-keywords = COSMIC;شبكة;لاسلكي;واي فاي;VPN;شخف;شبكة خاصة افتراضية;
|
||||||
|
xdg-entry-wallpaper-comment = صور الخلفية والألوان وخيارات عرض الشرائح
|
||||||
|
xdg-entry-wireless = واي فاي
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;مساحة العمل;التوجيه;نظرة عامة;الشاشة;
|
||||||
|
xdg-entry-system-comment = معلومات النظام والحسابات وتحديثات البرامج الثابتة
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;خلفية;خلفية الشاشة;عرض شرائح;
|
||||||
|
xdg-entry-users-keywords = COSMIC;مستخدم;حساب;
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;شبكة;اتصال;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;النظام;الوقت;التاريخ;المنطقة;اللغة;
|
||||||
|
xdg-entry-input-keywords = COSMIC;إدخال;لوحة مفاتيح;ماوس;فأرة;
|
||||||
|
xdg-entry-sound-keywords = COSMIC;صوت;صوتي;تنبيه;Pipewire;
|
||||||
|
xdg-entry-power-keywords = COSMIC;طاقة;مدخرة;بطارية
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;مبدئي;تطبيق
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;المنطقة;اللغة;التاريخ;التنسيق;الوقت;الإعدادات المحلية;التوطين;
|
||||||
|
xdg-entry-applications-keywords = COSMIC;افتراضي;تطبيق;بدء التشغيل;X11;توافقية;مبدئي;اكس11
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;لوحة المفاتيح;الإدخال;المصدر;الاختصارات;
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;إدارة;النوافذ;التبليط;مفتاح;Super;
|
||||||
|
xdg-entry-workspaces-comment = اتجاه مساحة العمل ونظرة عامة وسلوك الشاشات المتعدّدة
|
||||||
|
xdg-entry-displays-keywords = COSMIC;عرض;
|
||||||
|
xdg-entry-workspaces = مساحات العمل
|
||||||
|
xdg-entry-wired-comment = الاتصالات السلكية وملفات تعريف الاتصال
|
||||||
|
no-search-results = لا توجد شبكات تطابق بحثك.
|
||||||
|
|
|
||||||
54
i18n/be/cosmic_settings.ftl
vendored
54
i18n/be/cosmic_settings.ftl
vendored
|
|
@ -6,13 +6,6 @@ number = { $number }
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Правадныя
|
|
||||||
[wifi] Wi-Fi
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] Невядомыя
|
|
||||||
} злучэнні і профілі злучэнняў.
|
|
||||||
add-network = Дадаць сетку
|
add-network = Дадаць сетку
|
||||||
.profile = Дадаць профіль
|
.profile = Дадаць профіль
|
||||||
add-vpn = Дадаць VPN
|
add-vpn = Дадаць VPN
|
||||||
|
|
@ -549,7 +542,7 @@ migrate-workspace =
|
||||||
navigate = Перайсці
|
navigate = Перайсці
|
||||||
replace = Замяніць
|
replace = Замяніць
|
||||||
shortcut-name = Назва спалучэння
|
shortcut-name = Назва спалучэння
|
||||||
system-controls = Элементы кантроля сістэмай
|
system-controls = Элементы кантролю сістэмай
|
||||||
terminate = Завяршыць
|
terminate = Завяршыць
|
||||||
toggle-stacking = Пераключыць стасаванне акна
|
toggle-stacking = Пераключыць стасаванне акна
|
||||||
type-key-combination = Увядзіце камбінацыю клавіш
|
type-key-combination = Увядзіце камбінацыю клавіш
|
||||||
|
|
@ -654,7 +647,7 @@ window-tiling = Укладанне вокнаў
|
||||||
.toggle-floating = Пераключыць плавучасць акна
|
.toggle-floating = Пераключыць плавучасць акна
|
||||||
.toggle-orientation = Пераключыць арыентацыю
|
.toggle-orientation = Пераключыць арыентацыю
|
||||||
replace-shortcut-dialog = Замянць спалучэнне?
|
replace-shortcut-dialog = Замянць спалучэнне?
|
||||||
.desc = { $shortcut } выкарыстоўваецца для { $name }. Калі вы заменіце яго, { $name } будзе адаключана.
|
.desc = { $shortcut } выкарыстоўваецца для { $name }. Калі вы заменіце яго, { $name } будзе адключана.
|
||||||
zoom-in = Павялічыць
|
zoom-in = Павялічыць
|
||||||
zoom-out = Паменшыць
|
zoom-out = Паменшыць
|
||||||
|
|
||||||
|
|
@ -671,9 +664,9 @@ click-behavior = Паводзіны пры націску
|
||||||
.click-finger = Другасны клік актывуецца двума пальцамі, а сярэдні клік — трыма пальцамі
|
.click-finger = Другасны клік актывуецца двума пальцамі, а сярэдні клік — трыма пальцамі
|
||||||
.button-areas = Другасны клік актывуецца ў ніжнім правым вугле, а сярэдні клік — у ніжнім цэнтры
|
.button-areas = Другасны клік актывуецца ў ніжнім правым вугле, а сярэдні клік — у ніжнім цэнтры
|
||||||
pinch-to-zoom = Шчыпок для маштабавання
|
pinch-to-zoom = Шчыпок для маштабавання
|
||||||
.desc = Выкарыстоўвайце два пальцы для маштабавання змесціва праграм, якія падтрымліваюць маштабаванне.
|
.desc = Выкарыстоўвайце два пальцы для маштабавання змесціва праграм, якія падтрымліваюць маштабаванне
|
||||||
tap-to-click = Націск для кліку
|
tap-to-click = Націск для кліку
|
||||||
.desc = Уключае націск адным пальцам для асноўнага кліку, двума пальцамі — для другаснага кліку і трыма пальцамі — для сярэдняга кліку.
|
.desc = Уключае націск адным пальцам для асноўнага кліку, двума пальцамі — для другаснага кліку і трыма пальцамі — для сярэдняга кліку
|
||||||
touchpad = Сэнсарная панэль
|
touchpad = Сэнсарная панэль
|
||||||
.acceleration = Уключыць паскарэнне сэнсарнай панэлі
|
.acceleration = Уключыць паскарэнне сэнсарнай панэлі
|
||||||
.desc = Хуткасць сэнсарнай панэлі, параметры націскаў, жэсты.
|
.desc = Хуткасць сэнсарнай панэлі, параметры націскаў, жэсты.
|
||||||
|
|
@ -699,11 +692,11 @@ open-workspaces-view = Адкрыць агляд працоўных прасто
|
||||||
time = Час і мова
|
time = Час і мова
|
||||||
.desc = N/A
|
.desc = N/A
|
||||||
time-date = Дата і час
|
time-date = Дата і час
|
||||||
.desc = Часавы пояс, аўтаматычныя налады гадзінніка і фарматаванне часу.
|
.desc = Часавы пояс, аўтаматычныя налады гадзінніка і фарматаванне часу
|
||||||
.auto = Задаваць аўтаматычна
|
.auto = Задаваць аўтаматычна
|
||||||
.auto-ntp = Дата і час будуць абнаўляцца аўтаматычка, калі заданы часавы пояс.
|
.auto-ntp = Дата і час будуць абнаўляцца аўтаматычна, калі зададзены часавы пояс
|
||||||
time-zone = Часовы пояс
|
time-zone = Часавы пояс
|
||||||
.auto = Аўтаматычны часовы пояс
|
.auto = Аўтаматычны часавы пояс
|
||||||
.auto-info = Патрабуецца доступ да месцазнаходжання і інтэрнэту
|
.auto-info = Патрабуецца доступ да месцазнаходжання і інтэрнэту
|
||||||
time-format = Фармат даты і часу
|
time-format = Фармат даты і часу
|
||||||
.twenty-four = 24-гадзінны фармат
|
.twenty-four = 24-гадзінны фармат
|
||||||
|
|
@ -715,7 +708,7 @@ time-format = Фармат даты і часу
|
||||||
.sunday = Нядзеля
|
.sunday = Нядзеля
|
||||||
.monday = Панядзелак
|
.monday = Панядзелак
|
||||||
time-region = Рэгіён і мова
|
time-region = Рэгіён і мова
|
||||||
.desc = Фармат даты, часу і лікаў у адпаведнасці з рэгіёнам.
|
.desc = Фармат даты, часу і лікаў у адпаведнасці з рэгіёнам
|
||||||
formatting = Фарматаванне
|
formatting = Фарматаванне
|
||||||
.dates = Даты
|
.dates = Даты
|
||||||
.time = Час
|
.time = Час
|
||||||
|
|
@ -751,21 +744,21 @@ default-apps = Праграмы па змаўчанні
|
||||||
|
|
||||||
## Applications: Startup Applications
|
## Applications: Startup Applications
|
||||||
|
|
||||||
startup-apps = Праграмы пры запуску
|
startup-apps = Праграмы для аўтазапуску
|
||||||
.desc = Наладзьце праграмы, якія запускаюцца пры ўваходзе ў сістэму.
|
.desc = Наладзьце праграмы, якія запускаюцца пры ўваходзе ў сістэму.
|
||||||
.add = Дадаць праграму
|
.add = Дадаць праграму
|
||||||
.user = Праграмы, якія запускаюцца падчас вашага ўвахода ў сістэму
|
.user = Праграмы, якія запускаюцца падчас вашага ўвахода ў сістэму
|
||||||
.none = У аўтазапуску няма праграм
|
.none = У аўтазапуску няма праграм
|
||||||
.remove-dialog-title = Выдаліць { $name }?
|
.remove-dialog-title = Выдаліць { $name }?
|
||||||
.remove-dialog-description = Вы сапраўды жадаеце выдаліць гэта як праграму для запуску?
|
.remove-dialog-description = Выдаліць гэта як праграму для аўтазапуску?
|
||||||
.search-for-application = Пошук праграмы
|
.add-startup-app = Дадаць праграму для аўтазапуску
|
||||||
|
|
||||||
## Applications: Legacy Applications
|
## Applications: Legacy Applications
|
||||||
|
|
||||||
legacy-applications = Сумяшчальнасць праграм X11
|
legacy-applications = Сумяшчальнасць праграм X11
|
||||||
.desc = Маштабаванне праграм аконнай сістэмы X11 і глабальныя спалучэнні клавіш.
|
.desc = Маштабаванне праграм аконнай сістэмы X11 і глабальныя спалучэнні клавіш
|
||||||
legacy-app-global-shortcuts = Глабальныя спалучэнні клавіш у праграмах X11
|
legacy-app-global-shortcuts = Глабальныя спалучэнні клавіш у праграмах X11
|
||||||
.desc = Глабальныя спалучэнні клавіш дазваляюць распазнаваць націсканні клавіш і падзеі кнопак мышы ў праграмах іншымі праграмамі для такіх функцый, як "націсні і кажы" або "націсні і адключы гук". Па змаўчанні гэта адключана ў праграмах X11, каб іншыя праграмы не маглі маніторыць падзеі клавіятуры і мышы, якія змяшчаюць канфідэнцыйную інфармацыю.
|
.desc = Глабальныя спалучэнні клавіш дазваляюць распазнаваць націсканні клавіш і падзеі кнопак мышы ў праграмах іншымі праграмамі для такіх функцый, як "націсні і кажы" або "націсні і адключы гук". Стандартна, Глабальныя спалучэнні адключаны ў праграмах X11, каб іншыя праграмы не маглі кантраляваць падзеі клавіятуры і мышы, якія змяшчаюць канфідэнцыяльную інфармацыю.
|
||||||
.none = Без клавіш
|
.none = Без клавіш
|
||||||
.modifiers = Мадыфікатары (Super, Shift, Control, Alt)
|
.modifiers = Мадыфікатары (Super, Shift, Control, Alt)
|
||||||
.combination = Усе клавішы, пакуль націснутыя мадыфікатары Super, Control або Alt
|
.combination = Усе клавішы, пакуль націснутыя мадыфікатары Super, Control або Alt
|
||||||
|
|
@ -775,22 +768,22 @@ legacy-app-scaling = Маштабаванне праграм аконнай сі
|
||||||
.scaled-gaming = Аптымізаваць для гульняў і поўнаэкранных праграм
|
.scaled-gaming = Аптымізаваць для гульняў і поўнаэкранных праграм
|
||||||
.gaming-description = Праграмы X11 могуць выглядаць крыху большымі/меншымі ў параўнанні з праграмамі Wayland.
|
.gaming-description = Праграмы X11 могуць выглядаць крыху большымі/меншымі ў параўнанні з праграмамі Wayland.
|
||||||
.scaled-applications = Аптымізаваць для праграм
|
.scaled-applications = Аптымізаваць для праграм
|
||||||
.applications-description = Гульні і поўнаэкранныя праграмы X11 могуць не адпавядаць разрозненню вашага дысплея.
|
.applications-description = Гульні і поўнаэкранныя праграмы X11 могуць не адпавядаць раздзяляльнасці вашага дысплэя.
|
||||||
.scaled-compatibility = Рэжым максімальнай сумяшчальнасці
|
.scaled-compatibility = Рэжым максімальнай сумяшчальнасці
|
||||||
.compatibility-description = Праграмы X11 могуць выглядаць размытымі на HiDPI-экранах.
|
.compatibility-description = Праграмы X11 могуць выглядаць размытымі на HiDPI-экранах.
|
||||||
.preferred-display = Выбраны дысплей для гульняў і поўнаэкранных праграм X11
|
.preferred-display = Выбраны дысплэй для гульняў і поўнаэкранных праграм X11
|
||||||
.no-display = Няма
|
.no-display = Няма
|
||||||
|
|
||||||
## System
|
## System
|
||||||
|
|
||||||
system = Сістэма і акаўнты
|
system = Сістэма і ўліковыя запісы
|
||||||
|
|
||||||
## System: About
|
## System: About
|
||||||
|
|
||||||
about = Пра сістэму
|
about = Пра сістэму
|
||||||
.desc = Назва прылады, інфармацыя аб абсталяванні, стандартныя налады аперацыйнай сістэмы.
|
.desc = Назва прылады, інфармацыя аб абсталяванні, стандартныя налады аперацыйнай сістэмы
|
||||||
about-device = Назва прылады
|
about-device = Назва прылады
|
||||||
.desc = Гэтая назва адлюстроўваецца іншым сеткавым або блютуз прыладам.
|
.desc = Гэтая назва адлюстроўваецца іншым сеткавым або блютуз прыладам
|
||||||
about-hardware = Абсталяванне
|
about-hardware = Абсталяванне
|
||||||
.model = Мадэль абсталявання
|
.model = Мадэль абсталявання
|
||||||
.memory = Памяць
|
.memory = Памяць
|
||||||
|
|
@ -800,6 +793,7 @@ about-hardware = Абсталяванне
|
||||||
about-os = Аперацыйная сістэма
|
about-os = Аперацыйная сістэма
|
||||||
.os = Аперацыйная сістэма
|
.os = Аперацыйная сістэма
|
||||||
.os-architecture = Архітэктура аперацыйнай сістэмы
|
.os-architecture = Архітэктура аперацыйнай сістэмы
|
||||||
|
.kernel = Версія ядра
|
||||||
.desktop-environment = Асяроддзе працоўнага стала
|
.desktop-environment = Асяроддзе працоўнага стала
|
||||||
.windowing-system = Сістэма вокнаў
|
.windowing-system = Сістэма вокнаў
|
||||||
about-related = Спадарожныя налады
|
about-related = Спадарожныя налады
|
||||||
|
|
@ -808,7 +802,7 @@ about-related = Спадарожныя налады
|
||||||
## System: Firmware
|
## System: Firmware
|
||||||
|
|
||||||
firmware = Праграмнае забеспячэнне
|
firmware = Праграмнае забеспячэнне
|
||||||
.desc = Дэталі праграмнага забеспячэння.
|
.desc = Дэталі праграмнага забеспячэння
|
||||||
|
|
||||||
## System: Users
|
## System: Users
|
||||||
|
|
||||||
|
|
@ -818,13 +812,13 @@ users = Карыстальнікі
|
||||||
.standard = Звычайны
|
.standard = Звычайны
|
||||||
.profile-add = Выбраць выяву профілю
|
.profile-add = Выбраць выяву профілю
|
||||||
administrator = Адміністратар
|
administrator = Адміністратар
|
||||||
.desc = Адміністратары могуць змяняць налады для ўсіх карыстальнікаў, дадаваць і выдаляць іншых карыстальнікаў.
|
.desc = Адміністратары могуць змяняць налады для ўсіх карыстальнікаў, дадаваць і выдаляць іншых карыстальнікаў
|
||||||
add-user = Дадаць карыстальніка
|
add-user = Дадаць карыстальніка
|
||||||
change-password = Змяніць пароль
|
change-password = Змяніць пароль
|
||||||
remove-user = Выдаліць карыстальніка
|
remove-user = Выдаліць карыстальніка
|
||||||
full-name = Поўнае імя
|
full-name = Поўнае імя
|
||||||
invalid-username = Недапушчальнае імя карыстальніка.
|
invalid-username = Недапушчальнае імя карыстальніка
|
||||||
password-mismatch = Пароль і пацвярджэнне мусяць супадаць.
|
password-mismatch = Пароль і пацвярджэнне мусяць супадаць
|
||||||
save = Захаваць
|
save = Захаваць
|
||||||
amplification = Узмацненне
|
amplification = Узмацненне
|
||||||
.desc = Дазваляе павялічваць гучнасць да 150%.
|
.desc = Дазваляе павялічваць гучнасць да 150%.
|
||||||
|
|
|
||||||
7
i18n/bg/cosmic_settings.ftl
vendored
7
i18n/bg/cosmic_settings.ftl
vendored
|
|
@ -6,13 +6,6 @@ number = { $number }
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Кабелни
|
|
||||||
[wifi] Безжични
|
|
||||||
[vpn] ВЧМ
|
|
||||||
*[other] Неизвестни
|
|
||||||
} връзки и профили на връзките.
|
|
||||||
add-network = Добавяне на мрежа
|
add-network = Добавяне на мрежа
|
||||||
.profile = Добавяне на профил
|
.profile = Добавяне на профил
|
||||||
add-vpn = Добавяне на ВЧМ
|
add-vpn = Добавяне на ВЧМ
|
||||||
|
|
|
||||||
296
i18n/cs/cosmic_settings.ftl
vendored
296
i18n/cs/cosmic_settings.ftl
vendored
|
|
@ -2,6 +2,65 @@ app = Nastavení COSMIC
|
||||||
unknown = Neznámé
|
unknown = Neznámé
|
||||||
number = { $number }
|
number = { $number }
|
||||||
|
|
||||||
|
## Freedesktop desktop entries
|
||||||
|
|
||||||
|
xdg-entry-about = O systému
|
||||||
|
xdg-entry-about-comment = Název zařízení, informace o hardwaru, výchozí nastavení operačního systému
|
||||||
|
xdg-entry-a11y = Přístupnost
|
||||||
|
xdg-entry-a11y-comment = Čtečka obrazovky, lupa, vysoký kontrast a barevné filtry
|
||||||
|
xdg-entry-appearance = Vzhled
|
||||||
|
xdg-entry-appearance-comment = Barvy zvýraznění a motivy
|
||||||
|
xdg-entry-applications = Aplikace
|
||||||
|
xdg-entry-bluetooth-comment = Správa Bluetooth zařízení
|
||||||
|
xdg-entry-date-time = Datum a čas
|
||||||
|
xdg-entry-date-time-comment = Časové pásmo, automatické nastavení hodin a formátování času
|
||||||
|
xdg-entry-default-apps = Výchozí aplikace
|
||||||
|
xdg-entry-default-apps-comment = Výchozí webový prohlížeč, poštovní klient, správce souborů a další aplikace
|
||||||
|
xdg-entry-desktop = Plocha
|
||||||
|
xdg-entry-desktop-comment = Tapeta, vzhled, panel, dok, správa oken a nastavení pracovní plochy
|
||||||
|
xdg-entry-displays = Obrazovky
|
||||||
|
xdg-entry-displays-comment = Správa nastavení obrazovek
|
||||||
|
xdg-entry-dock = Dok
|
||||||
|
xdg-entry-dock-comment = Volitelná lišta pro aplikace a applety
|
||||||
|
xdg-entry-input = Vstupní zařízení
|
||||||
|
xdg-entry-input-comment = Nastavení klávesnice a myši
|
||||||
|
xdg-entry-keyboard = Klávesnice
|
||||||
|
xdg-entry-keyboard-comment = Vstupní zdroje, přepínání, vkládání speciálních znaků, zkratky
|
||||||
|
xdg-entry-mouse = Myš
|
||||||
|
xdg-entry-mouse-comment = Rychlost myši, zrychlení, přirozené rolování
|
||||||
|
xdg-entry-network = Síť a Wi-Fi
|
||||||
|
xdg-entry-network-comment = Správa síťových připojení
|
||||||
|
xdg-entry-notifications = Oznámení
|
||||||
|
xdg-entry-notifications-comment = Režim Nerušit, oznámení na zamykací obrazovce a nastavení jednotlivých aplikací
|
||||||
|
xdg-entry-panel-comment = Hlavní systémová lišta pro menu a applety
|
||||||
|
xdg-entry-power = Napájení a baterie
|
||||||
|
xdg-entry-power-comment = Režimy napájení a možnosti úspory energie
|
||||||
|
xdg-entry-region-language = Region a jazyk
|
||||||
|
xdg-entry-region-language-comment = Formátování data, času a čísel podle vašeho regionu
|
||||||
|
xdg-entry-sound = Zvuk
|
||||||
|
xdg-entry-sound-comment = Nastavení zvuku pro zařízení, upozornění a aplikace
|
||||||
|
xdg-entry-startup-apps = Automaticky spouštěné aplikace
|
||||||
|
xdg-entry-startup-apps-comment = Správa aplikací, které se spouštějí při přihlášení
|
||||||
|
xdg-entry-system = Systém a účty
|
||||||
|
xdg-entry-system-comment = Informace o systému, účty a aktualizace firmwaru
|
||||||
|
xdg-entry-time-language = Čas a jazyk
|
||||||
|
xdg-entry-time-language-comment = Správa systémového data, času, regionu a jazyka
|
||||||
|
xdg-entry-touchpad-comment = Rychlost touchpadu, možnosti klikání a gesta
|
||||||
|
xdg-entry-users = Uživatelé
|
||||||
|
xdg-entry-users-comment = Ověření a uživatelské účty
|
||||||
|
xdg-entry-vpn-comment = VPN připojení a profily
|
||||||
|
xdg-entry-wallpaper = Tapeta
|
||||||
|
xdg-entry-wallpaper-comment = Obrázky tapet, barvy a možnosti prezentace
|
||||||
|
xdg-entry-window-management = Správa oken
|
||||||
|
xdg-entry-window-management-comment = Akce klávesy Super, možnosti ovládání oken a další možnosti dlaždicového režimu oken
|
||||||
|
xdg-entry-wired = Drátové
|
||||||
|
xdg-entry-wired-comment = Drátové připojení a profily
|
||||||
|
xdg-entry-wireless-comment = Wi-Fi připojení a profily
|
||||||
|
xdg-entry-workspaces = Pracovní plochy
|
||||||
|
xdg-entry-workspaces-comment = Orientace pracovních ploch, přehled a chování při více monitorech
|
||||||
|
xdg-entry-x11-applications = Kompatibilita aplikací X11
|
||||||
|
xdg-entry-x11-applications-comment = Měřítko aplikací využívajících okenní systém X11, hlavní displej a globální zkratky
|
||||||
|
|
||||||
## Desktop
|
## Desktop
|
||||||
|
|
||||||
desktop = Plocha
|
desktop = Plocha
|
||||||
|
|
@ -9,12 +68,10 @@ desktop = Plocha
|
||||||
## Desktop: Appearance
|
## Desktop: Appearance
|
||||||
|
|
||||||
appearance = Vzhled
|
appearance = Vzhled
|
||||||
.desc = Doplňkové barvy a témata
|
|
||||||
|
|
||||||
## Desktop: Notifications
|
## Desktop: Notifications
|
||||||
|
|
||||||
notifications = Oznámení
|
notifications = Oznámení
|
||||||
.desc = Nerušit, oznámení na zamykací obrazovce a nastavení pro specifické aplikace
|
|
||||||
|
|
||||||
## Desktop: Options
|
## Desktop: Options
|
||||||
|
|
||||||
|
|
@ -23,19 +80,17 @@ hot-corner = Aktivní roh
|
||||||
window-controls = Ovládání oken
|
window-controls = Ovládání oken
|
||||||
.maximize = Zobrazit tlačítko pro maximalizaci
|
.maximize = Zobrazit tlačítko pro maximalizaci
|
||||||
.minimize = Zobrazit tlačítko pro minimalizaci
|
.minimize = Zobrazit tlačítko pro minimalizaci
|
||||||
.active-window-hint = Zobrazit zvýraznění aktivního okna
|
.active-window-hint = Zobrazit ohraničení aktivního okna
|
||||||
dock = Dok
|
dock = Dok
|
||||||
.desc = Volitelná lišta pro aplikace a applety
|
|
||||||
|
|
||||||
## Desktop: Panel
|
## Desktop: Panel
|
||||||
|
|
||||||
panel = Panel
|
panel = Panel
|
||||||
.desc = Hlavní systémová lišta pro menu a applety
|
|
||||||
panel-behavior-and-position = Chování a pozice
|
panel-behavior-and-position = Chování a pozice
|
||||||
.autohide = Automaticky skrýt panel
|
.autohide = Automaticky skrýt panel
|
||||||
.dock-autohide = Automaticky skrýt dok
|
.dock-autohide = Automaticky skrýt dok
|
||||||
.position = Pozice na obrazovce
|
.position = Pozice na obrazovce
|
||||||
.display = Zobrazit na displeji
|
.display = Zobrazit na obrazovce
|
||||||
panel-top = Nahoře
|
panel-top = Nahoře
|
||||||
panel-bottom = Dole
|
panel-bottom = Dole
|
||||||
panel-left = Vlevo
|
panel-left = Vlevo
|
||||||
|
|
@ -72,16 +127,15 @@ all = Všechny
|
||||||
|
|
||||||
## Desktop: Tapeta
|
## Desktop: Tapeta
|
||||||
|
|
||||||
wallpaper = Pozadí
|
wallpaper = Tapeta
|
||||||
.change = Měnit obrázek každých
|
.change = Měnit obrázek každých
|
||||||
.desc = Obrázky pozadí, barvy a možnosti prezentace
|
.fit = Způsob umístění tapety
|
||||||
.fit = Způsob umístění pozadí
|
.folder-dialog = Vyberte složku s tapetami
|
||||||
.folder-dialog = Vyberte složku s obrázky pozadí
|
.image-dialog = Vyberte obrázek tapety
|
||||||
.image-dialog = Vyberte obrázek pozadí
|
.plural = Tapety
|
||||||
.plural = Pozadí
|
.same = Stejná tapeta na všech obrazovkách
|
||||||
.same = Stejné pozadí na všech displejích
|
|
||||||
.slide = Prezentace
|
.slide = Prezentace
|
||||||
all-displays = Všechny displeje
|
all-displays = Všechny obrazovky
|
||||||
colors = Barvy
|
colors = Barvy
|
||||||
fit-to-screen = Přizpůsobit obrazovce
|
fit-to-screen = Přizpůsobit obrazovce
|
||||||
x-minutes =
|
x-minutes =
|
||||||
|
|
@ -100,15 +154,14 @@ x-hours =
|
||||||
## Desktop: Workspaces
|
## Desktop: Workspaces
|
||||||
|
|
||||||
workspaces = Pracovní plochy
|
workspaces = Pracovní plochy
|
||||||
.desc = Chování a orientace pracovních ploch
|
|
||||||
workspaces-behavior = Chování pracovních ploch
|
workspaces-behavior = Chování pracovních ploch
|
||||||
.dynamic = Dynamické pracovní plochy
|
.dynamic = Dynamické pracovní plochy
|
||||||
.dynamic-desc = Automaticky odstraní prázdné pracovní plochy.
|
.dynamic-desc = Automaticky odstraní prázdné pracovní plochy.
|
||||||
.fixed = Fixní množství pracovních ploch
|
.fixed = Fixní množství pracovních ploch
|
||||||
.fixed-desc = Přidat nebo odstranit pracovní plochy v přehledu.
|
.fixed-desc = Přidat nebo odstranit pracovní plochy v přehledu.
|
||||||
workspaces-multi-behavior = Chování při více monitorech
|
workspaces-multi-behavior = Chování při více monitorech
|
||||||
.span = Pracovní plochy obsadí více displejů
|
.span = Pracovní plochy obsadí více obrazovek
|
||||||
.separate = Každý displej má svou vlastní pracovní plochu
|
.separate = Každá obrazovka má svou vlastní pracovní plochu
|
||||||
|
|
||||||
## Networking: Wired
|
## Networking: Wired
|
||||||
|
|
||||||
|
|
@ -126,13 +179,11 @@ online-accounts = Online účty
|
||||||
## Time & Language
|
## Time & Language
|
||||||
|
|
||||||
time = Čas a jazyk
|
time = Čas a jazyk
|
||||||
.desc = N/A
|
|
||||||
time-date = Datum a čas
|
time-date = Datum a čas
|
||||||
.desc = Časová zóna, automatické nastavení hodin a formátování času
|
|
||||||
.auto = Nastavit automaticky
|
.auto = Nastavit automaticky
|
||||||
.auto-ntp = Pokud nastavíte časovou zónu, datum a čas se bude aktualizovat automaticky
|
.auto-ntp = Pokud nastavíte časové pásmo, datum a čas se bude aktualizovat automaticky
|
||||||
time-zone = Časová zóna
|
time-zone = Časové pásmo
|
||||||
.auto = Automatická časová zóna
|
.auto = Automatické časové pásmo
|
||||||
.auto-info = Vyžaduje službu polohy a internet
|
.auto-info = Vyžaduje službu polohy a internet
|
||||||
time-format = Formát data a času
|
time-format = Formát data a času
|
||||||
.twenty-four = 24 hodinový čas
|
.twenty-four = 24 hodinový čas
|
||||||
|
|
@ -144,12 +195,10 @@ time-format = Formát data a času
|
||||||
.sunday = Neděle
|
.sunday = Neděle
|
||||||
.monday = Pondělí
|
.monday = Pondělí
|
||||||
time-region = Region a jazyk
|
time-region = Region a jazyk
|
||||||
.desc = Formátujte datumy, časy a čísla podle vašeho regionu
|
|
||||||
|
|
||||||
## Sound
|
## Sound
|
||||||
|
|
||||||
sound = Zvuk
|
sound = Zvuk
|
||||||
.desc = N/A
|
|
||||||
sound-output = Výstup
|
sound-output = Výstup
|
||||||
.volume = Hlasitost výstupu
|
.volume = Hlasitost výstupu
|
||||||
.device = Výstupní zařízení
|
.device = Výstupní zařízení
|
||||||
|
|
@ -175,7 +224,6 @@ system = Systém a účty
|
||||||
## System: About
|
## System: About
|
||||||
|
|
||||||
about = O systému
|
about = O systému
|
||||||
.desc = Název zařízení, informace o hardwaru, výchozí nastavení operačního systému
|
|
||||||
about-device = Název počítače
|
about-device = Název počítače
|
||||||
.desc = Tento název se zobrazí ostatním síťovým a Bluetooth zařízením
|
.desc = Tento název se zobrazí ostatním síťovým a Bluetooth zařízením
|
||||||
about-hardware = Hardware
|
about-hardware = Hardware
|
||||||
|
|
@ -188,7 +236,7 @@ about-os = Operační systém
|
||||||
.os = Operační systém
|
.os = Operační systém
|
||||||
.os-architecture = Architektura operačního systému
|
.os-architecture = Architektura operačního systému
|
||||||
.kernel = Verze jádra
|
.kernel = Verze jádra
|
||||||
.desktop-environment = Desktopové prostředí
|
.desktop-environment = Prostředí plochy
|
||||||
.windowing-system = Okenní systém
|
.windowing-system = Okenní systém
|
||||||
about-related = Podobná nastavení
|
about-related = Podobná nastavení
|
||||||
.support = Získat podporu
|
.support = Získat podporu
|
||||||
|
|
@ -196,12 +244,10 @@ about-related = Podobná nastavení
|
||||||
## System: Firmware
|
## System: Firmware
|
||||||
|
|
||||||
firmware = Firmware
|
firmware = Firmware
|
||||||
.desc = Podrobnosti o firmwaru
|
|
||||||
|
|
||||||
## System: Users
|
## System: Users
|
||||||
|
|
||||||
users = Uživatelé
|
users = Uživatelé
|
||||||
.desc = Ověření a uživatelské účty
|
|
||||||
.admin = Administrátor
|
.admin = Administrátor
|
||||||
.standard = Standardní
|
.standard = Standardní
|
||||||
.profile-add = Vyberte obrázek profilu
|
.profile-add = Vyberte obrázek profilu
|
||||||
|
|
@ -223,15 +269,14 @@ scrolling = Rolování
|
||||||
## Input: Keyboard
|
## Input: Keyboard
|
||||||
|
|
||||||
keyboard = Klávesnice
|
keyboard = Klávesnice
|
||||||
.desc = Metody zadávání, přepínání, vkládání speciálních znaků, zkratky
|
keyboard-sources = Vstupní zdroje
|
||||||
keyboard-sources = Metody zadávání
|
.desc = Vstupní zdroje lze přepínat pomocí Super + Mezerník. Toto se dá změnit v nastavení klávesových zkratek.
|
||||||
.desc = Metody zadávání se dají přepínat pomocí Super + Mezerník. Toto se dá změnit v nastavení klávesových zkratek.
|
|
||||||
.move-up = Posunout nahoru
|
.move-up = Posunout nahoru
|
||||||
.move-down = Posunout dolů
|
.move-down = Posunout dolů
|
||||||
.settings = Nastavení
|
.settings = Nastavení
|
||||||
.view-layout = Zobrazit rozložení klávesnice
|
.view-layout = Zobrazit rozložení klávesnice
|
||||||
.remove = Odstranit
|
.remove = Odstranit
|
||||||
.add = Přidat metodu zadávání
|
.add = Přidat vstupní zdroj
|
||||||
keyboard-special-char = Zadávání speciálních znaků
|
keyboard-special-char = Zadávání speciálních znaků
|
||||||
.alternate = Klávesa pro náhradní znaky
|
.alternate = Klávesa pro náhradní znaky
|
||||||
.compose = Klávesa Compose
|
.compose = Klávesa Compose
|
||||||
|
|
@ -241,12 +286,11 @@ keyboard-special-char = Zadávání speciálních znaků
|
||||||
## Input: Keyboard: Shortcuts
|
## Input: Keyboard: Shortcuts
|
||||||
|
|
||||||
keyboard-shortcuts = Klávesové zkratky
|
keyboard-shortcuts = Klávesové zkratky
|
||||||
.desc = Zobrazit a změnit klávesové zkratky
|
.desc = Zobrazit a změnit zkratky
|
||||||
|
|
||||||
## Input: Mouse
|
## Input: Mouse
|
||||||
|
|
||||||
mouse = Myš
|
mouse = Myš
|
||||||
.desc = Rychlost myši, zrychlení, přirozené rolování
|
|
||||||
.speed = Rychlost myši
|
.speed = Rychlost myši
|
||||||
.acceleration = Povolit zrychlení myši
|
.acceleration = Povolit zrychlení myši
|
||||||
|
|
||||||
|
|
@ -254,7 +298,6 @@ mouse = Myš
|
||||||
|
|
||||||
touchpad = Touchpad
|
touchpad = Touchpad
|
||||||
.acceleration = Povolit zrychlení touchpadu
|
.acceleration = Povolit zrychlení touchpadu
|
||||||
.desc = Rychlost touchpadu, nastavení klikání, gesta
|
|
||||||
.speed = Rychlost touchpadu
|
.speed = Rychlost touchpadu
|
||||||
dbus-connection-error = Selhalo připojení k DBus
|
dbus-connection-error = Selhalo připojení k DBus
|
||||||
ok = OK
|
ok = OK
|
||||||
|
|
@ -277,15 +320,14 @@ settings = Nastavení
|
||||||
username = Uživatelské jméno
|
username = Uživatelské jméno
|
||||||
visible-networks = Viditelné sítě
|
visible-networks = Viditelné sítě
|
||||||
identity = Identita
|
identity = Identita
|
||||||
dark = Tmavé
|
dark = Tmavý
|
||||||
light = Světlé
|
light = Světlý
|
||||||
wireguard-dialog = Přidat zařízení WireGuard
|
wireguard-dialog = Přidat zařízení WireGuard
|
||||||
.description = Vyberte název zařízení pro nastavení WireGuard.
|
.description = Vyberte název zařízení pro nastavení WireGuard.
|
||||||
activate = Aktivovat
|
activate = Aktivovat
|
||||||
confirm = Potvrdit
|
confirm = Potvrdit
|
||||||
enable = Povolit
|
enable = Povolit
|
||||||
bluetooth = Bluetooth
|
bluetooth = Bluetooth
|
||||||
.desc = Správa Bluetooth zařízení.
|
|
||||||
.status = Tento systém je viditelný jako { $aliases }, dokud jsou otevřena nastavení Bluetooth.
|
.status = Tento systém je viditelný jako { $aliases }, dokud jsou otevřena nastavení Bluetooth.
|
||||||
.connected = Připojeno
|
.connected = Připojeno
|
||||||
.connecting = Připojování
|
.connecting = Připojování
|
||||||
|
|
@ -324,14 +366,14 @@ fill = Vyplnit
|
||||||
open-new-folder = Otevřít novou složku
|
open-new-folder = Otevřít novou složku
|
||||||
recent-folders = Nedávné složky
|
recent-folders = Nedávné složky
|
||||||
never = Nikdy
|
never = Nikdy
|
||||||
accent-color = Doplňková barva
|
accent-color = Barva zvýraznění
|
||||||
app-background = Pozadí okna
|
app-background = Pozadí okna
|
||||||
auto = Auto
|
auto = Auto
|
||||||
close = Zavřít
|
close = Zavřít
|
||||||
replace = Nahradit
|
replace = Nahradit
|
||||||
color-picker = Výběr barvy
|
color-picker = Výběr barvy
|
||||||
copied-to-clipboard = Zkopírováno do schránky
|
copied-to-clipboard = Zkopírováno do schránky
|
||||||
copy-to-clipboard = Zkopírovat do schránky
|
copy-to-clipboard = Kopírovat do schránky
|
||||||
export = Exportovat
|
export = Exportovat
|
||||||
hex = Hex
|
hex = Hex
|
||||||
import = Importovat
|
import = Importovat
|
||||||
|
|
@ -339,7 +381,7 @@ mode-and-colors = Režim a barvy
|
||||||
recent-colors = Nedávné barvy
|
recent-colors = Nedávné barvy
|
||||||
reset-to-default = Obnovit výchozí
|
reset-to-default = Obnovit výchozí
|
||||||
rgb = RGB
|
rgb = RGB
|
||||||
window-hint-accent = Barva zvýraznění aktivního okna
|
window-hint-accent = Barva ohraničení aktivního okna
|
||||||
add-network = Přidat síť
|
add-network = Přidat síť
|
||||||
.profile = Přidat profil
|
.profile = Přidat profil
|
||||||
auth-dialog = Vyžadováno ověření
|
auth-dialog = Vyžadováno ověření
|
||||||
|
|
@ -371,19 +413,12 @@ vpn = VPN
|
||||||
.error = Nepodařilo se přidat nastavení VPN
|
.error = Nepodařilo se přidat nastavení VPN
|
||||||
.remove = Odstranit profil připojení
|
.remove = Odstranit profil připojení
|
||||||
.select-file = Vybrat konfigurační soubor VPN
|
.select-file = Vybrat konfigurační soubor VPN
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Drátové
|
|
||||||
[wifi] Wi-Fi
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] Neznámé
|
|
||||||
} připojení a profily.
|
|
||||||
vpn-error = Chyba VPN
|
vpn-error = Chyba VPN
|
||||||
.config = Nepodařilo se přidat nastavení VPN
|
.config = Nepodařilo se přidat nastavení VPN
|
||||||
.connect = Nepodařilo se připojit k VPN
|
.connect = Nepodařilo se připojit k VPN
|
||||||
.connection-editor = Editor připojení selhal
|
.connection-editor = Editor připojení selhal
|
||||||
.connection-settings = Nepodařilo se získat nastavení aktivních připojení
|
.connection-settings = Nepodařilo se získat nastavení aktivních připojení
|
||||||
.updating-state = Nepodařilo se aktualizovat stav síťového manažera
|
.updating-state = Nepodařilo se aktualizovat stav správce sítě
|
||||||
.wireguard-config-path = Chybně zadaná cesta souboru nastavení WireGuard
|
.wireguard-config-path = Chybně zadaná cesta souboru nastavení WireGuard
|
||||||
.wireguard-config-path-desc = Vybraný soubor musí být na lokálním souborovém systému
|
.wireguard-config-path-desc = Vybraný soubor musí být na lokálním souborovém systému
|
||||||
.wireguard-device = Nepodařilo se vytvořit zařízení WireGuard
|
.wireguard-device = Nepodařilo se vytvořit zařízení WireGuard
|
||||||
|
|
@ -396,7 +431,7 @@ vpn-error = Chyba VPN
|
||||||
wifi = Wi-Fi
|
wifi = Wi-Fi
|
||||||
.adapter = Adaptér Wi-Fi { $id }
|
.adapter = Adaptér Wi-Fi { $id }
|
||||||
.forget = Zapomenout tuto síť
|
.forget = Zapomenout tuto síť
|
||||||
window-hint-accent-toggle = Použít doplňkovou barvu pro zvýraznění aktivního okna
|
window-hint-accent-toggle = Použít barvu zvýraznění pro ohraničení aktivního okna
|
||||||
auto-switch = Automaticky přepínat mezi světlými a tmavými režimy
|
auto-switch = Automaticky přepínat mezi světlými a tmavými režimy
|
||||||
.sunrise = Přepne na světlý režim při východu slunce
|
.sunrise = Přepne na světlý režim při východu slunce
|
||||||
.sunset = Přepne na tmavý režim při západu slunce
|
.sunset = Přepne na tmavý režim při západu slunce
|
||||||
|
|
@ -409,16 +444,15 @@ container-background = Pozadí kontejneru
|
||||||
control-tint = Odstín ovládacích prvků
|
control-tint = Odstín ovládacích prvků
|
||||||
.desc = Používá se pro pozadí standardních tlačítek, vyhledávacích polí, textových vstupů a podobných komponent
|
.desc = Používá se pro pozadí standardních tlačítek, vyhledávacích polí, textových vstupů a podobných komponent
|
||||||
frosted = Efekt zmrazeného okna na systémovém rozhraní
|
frosted = Efekt zmrazeného okna na systémovém rozhraní
|
||||||
.desc = Aplikuje rozmazané pozadí na panel, dok, applety, spouštěč a knihovnu aplikací
|
.desc = Použije rozmazané pozadí pro panel, dok, applety, spouštěč a knihovnu aplikací
|
||||||
enable-export = Použít současné téma pro GNOME aplikace
|
enable-export = Použít aktuální motiv v aplikacích GNOME
|
||||||
.desc = Ne všechny toolkity podporují automatické přepínání. Aplikace, které nejsou postaveny na COSMIC toolkitu mohou vyžadovat restart po změně tématu.
|
.desc = Ne všechny toolkity podporují automatické přepínání. Aplikace, které nejsou postaveny na COSMIC toolkitu mohou vyžadovat restart po změně motivu.
|
||||||
password-mismatch = Heslo a jeho potvrzení se musí shodovat
|
password-mismatch = Heslo a jeho potvrzení se musí shodovat
|
||||||
invalid-username = Neplatné uživatelské jméno
|
invalid-username = Neplatné uživatelské jméno
|
||||||
icon-theme = Téma ikon
|
icon-theme = Motiv ikon
|
||||||
.desc = Aplikuje jinou sadu ikon na aplikace
|
.desc = Použije jinou sadu ikon pro aplikace
|
||||||
monospace-font = Monospace písmo
|
monospace-font = Písmo s pevnou šířkou
|
||||||
window-management = Správa oken
|
window-management = Správa oken
|
||||||
.desc = Akce klávesy Super, možnosti ovládání oken a další možnosti dlaždicového režimu oken
|
|
||||||
window-tiling = Dlaždicový režim oken
|
window-tiling = Dlaždicový režim oken
|
||||||
.horizontal = Nastavit horizontální orientaci
|
.horizontal = Nastavit horizontální orientaci
|
||||||
.vertical = Nastavit vertikální orientaci
|
.vertical = Nastavit vertikální orientaci
|
||||||
|
|
@ -427,8 +461,8 @@ window-tiling = Dlaždicový režim oken
|
||||||
.toggle-stacking = Přepnout režim skládání oken
|
.toggle-stacking = Přepnout režim skládání oken
|
||||||
.toggle-floating = Přepnout plovoucí okno
|
.toggle-floating = Přepnout plovoucí okno
|
||||||
.toggle-orientation = Přepnout orientaci
|
.toggle-orientation = Přepnout orientaci
|
||||||
icons-and-toolkit = Témata ikon a toolkitů
|
icons-and-toolkit = Motivy ikon a toolkitů
|
||||||
interface-font = Systémové písmo
|
interface-font = Písmo systému
|
||||||
super-key = Akce klávesy Super
|
super-key = Akce klávesy Super
|
||||||
.launcher = Otevřít spouštěč
|
.launcher = Otevřít spouštěč
|
||||||
.workspaces = Otevřít pracovní plochy
|
.workspaces = Otevřít pracovní plochy
|
||||||
|
|
@ -483,18 +517,17 @@ color-filter = Typ barevného filtru
|
||||||
text-tint = Odstín textu rozhraní
|
text-tint = Odstín textu rozhraní
|
||||||
.desc = Používá se k odvození barev textu rozhraní, které mají dostatečný kontrast na různých površích
|
.desc = Používá se k odvození barev textu rozhraní, které mají dostatečný kontrast na různých površích
|
||||||
experimental-settings = Experimentální nastavení
|
experimental-settings = Experimentální nastavení
|
||||||
display = Displeje
|
display = Obrazovky
|
||||||
.desc = Spravujte displeje a noční světlo
|
.arrangement = Uspořádání obrazovek
|
||||||
.arrangement = Uspořádání displejů
|
.arrangement-desc = Přetáhněte obrazovky pro jejich uspořádání
|
||||||
.arrangement-desc = Přetáhněte displeje pro jejich uspořádání
|
.enable = Povolit obrazovku
|
||||||
.enable = Povolit displej
|
.external = { $size } { $output } externí obrazovka
|
||||||
.external = { $size } { $output } Externí displej
|
.laptop = { $size } obrazovka notebooku
|
||||||
.laptop = { $size } Displej laptopu
|
.options = Možnosti obrazovky
|
||||||
.options = Možnosti displeje
|
|
||||||
.refresh-rate = Obnovovací frekvence
|
.refresh-rate = Obnovovací frekvence
|
||||||
.resolution = Rozlišení
|
.resolution = Rozlišení
|
||||||
.scale = Škálování
|
.scale = Měřítko
|
||||||
.additional-scale-options = Další možnosti škálování
|
.additional-scale-options = Další možnosti měřítka
|
||||||
style = Styl
|
style = Styl
|
||||||
.round = Kulatý
|
.round = Kulatý
|
||||||
.slightly-round = Lehce kulatý
|
.slightly-round = Lehce kulatý
|
||||||
|
|
@ -504,7 +537,7 @@ interface-density = Hustota rozhraní
|
||||||
.compact = Kompaktní
|
.compact = Kompaktní
|
||||||
.spacious = Prostorné
|
.spacious = Prostorné
|
||||||
window-management-appearance = Správa oken
|
window-management-appearance = Správa oken
|
||||||
.active-hint = Velikost zvýraznění aktivního okna
|
.active-hint = Velikost ohraničení aktivního okna
|
||||||
.gaps = Mezery kolem oken v dlaždicovém režimu
|
.gaps = Mezery kolem oken v dlaždicovém režimu
|
||||||
mirroring = Zrcadlení
|
mirroring = Zrcadlení
|
||||||
.id = Zrcadlení { $id }
|
.id = Zrcadlení { $id }
|
||||||
|
|
@ -512,14 +545,14 @@ mirroring = Zrcadlení
|
||||||
.mirror = Zrcadlit { $display }
|
.mirror = Zrcadlit { $display }
|
||||||
.project =
|
.project =
|
||||||
Vysílat na { $display ->
|
Vysílat na { $display ->
|
||||||
[all] všechny displeje
|
[all] všechny obrazovky
|
||||||
*[other] { $display }
|
*[other] { $display }
|
||||||
}
|
}
|
||||||
.project-count =
|
.project-count =
|
||||||
Vysílání na { $count } { $count ->
|
Vysílání na { $count } { $count ->
|
||||||
[one] další displej
|
[one] další obrazovku
|
||||||
[few] další displeje
|
[few] další obrazovky
|
||||||
*[other] dalších displejů
|
*[other] dalších obrazovek
|
||||||
}
|
}
|
||||||
night-light = Noční světlo
|
night-light = Noční světlo
|
||||||
.auto = Automaticky (od západu do východu)
|
.auto = Automaticky (od západu do východu)
|
||||||
|
|
@ -537,14 +570,19 @@ vrr = Variabilní obnovovací frekvence
|
||||||
scheduling = Plánování
|
scheduling = Plánování
|
||||||
.manual = Manuální plán
|
.manual = Manuální plán
|
||||||
dialog = Dialog
|
dialog = Dialog
|
||||||
.title = Ponechat tato nastavení displeje?
|
.title = Ponechat toto nastavení obrazovky?
|
||||||
.keep-changes = Ponechat změny
|
.keep-changes = Ponechat změny
|
||||||
.change-prompt = Změny nastavení se automaticky zruší za { $time } sekund.
|
.change-prompt =
|
||||||
.revert-settings = Obnovit nastavení
|
Původní nastavení se automaticky obnoví { $time ->
|
||||||
|
[0] nyní.
|
||||||
|
[one] za 1 sekundu.
|
||||||
|
[few] za { $time } sekundy.
|
||||||
|
*[other] za { $time } sekund.
|
||||||
|
}
|
||||||
|
.revert-settings = Obnovit původní
|
||||||
amplification = Zesílení
|
amplification = Zesílení
|
||||||
.desc = Umožňuje zesílit zvuk až na 150%
|
.desc = Umožňuje zesílit zvuk až na 150%
|
||||||
power = Napájení a baterie
|
power = Napájení a baterie
|
||||||
.desc = Spravujte nastavení napájení
|
|
||||||
battery = Baterie
|
battery = Baterie
|
||||||
.minute =
|
.minute =
|
||||||
{ $value } { $value ->
|
{ $value } { $value ->
|
||||||
|
|
@ -584,11 +622,10 @@ power-mode = Režim napájení
|
||||||
power-saving = Možnosti úspory energie
|
power-saving = Možnosti úspory energie
|
||||||
.turn-off-screen-after = Vypnout obrazovku za
|
.turn-off-screen-after = Vypnout obrazovku za
|
||||||
.auto-suspend = Automaticky uspat za
|
.auto-suspend = Automaticky uspat za
|
||||||
.auto-suspend-ac = Automaticky uspávat při napájení z elektrické sítě
|
.auto-suspend-ac = Automaticky uspat při napájení ze sítě
|
||||||
.auto-suspend-battery = Automaticky uspávat při napájení pouze z baterie
|
.auto-suspend-battery = Automaticky uspat při napájení z baterie
|
||||||
disable-while-typing = Zakázat při psaní
|
disable-while-typing = Zakázat při psaní
|
||||||
input-devices = Vstupní zařízení
|
input-devices = Vstupní zařízení
|
||||||
.desc = Vstupní zařízení
|
|
||||||
modified = { $count } změněných
|
modified = { $count } změněných
|
||||||
slow = Pomalá
|
slow = Pomalá
|
||||||
fast = Rychlá
|
fast = Rychlá
|
||||||
|
|
@ -597,16 +634,16 @@ long = Dlouhé
|
||||||
keyboard-typing-assist = Psaní
|
keyboard-typing-assist = Psaní
|
||||||
.repeat-rate = Frekvence opakování
|
.repeat-rate = Frekvence opakování
|
||||||
.repeat-delay = Zpoždění opakování
|
.repeat-delay = Zpoždění opakování
|
||||||
keyboard-numlock-boot = Numlock
|
keyboard-numlock-boot = Num Lock
|
||||||
.boot-state = Stav při spuštění systému
|
.boot-state = Stav klávesy při spuštění systému
|
||||||
.last-boot = Poslední spuštění systému
|
.last-boot = Poslední spuštění systému
|
||||||
.on = Zapnuto
|
.on = Zapnutý
|
||||||
.off = Vypnuto
|
.off = Vypnutý
|
||||||
.set = Nastavit stav numlock při spuštění systému
|
.set = Num Lock při spuštění systému
|
||||||
added = Přidáno
|
added = Přidáno
|
||||||
type-to-search = Pište pro vyhledávání...
|
type-to-search = Pište pro vyhledávání...
|
||||||
show-extended-input-sources = Zobrazit rozšířené metody zadávání
|
show-extended-input-sources = Zobrazit rozšířené vstupní zdroje
|
||||||
input-source-switch = Přepnout metodu zadávání klávesnice
|
input-source-switch = Přepnout vstupní zdroj klávesnice
|
||||||
add-another-keybinding = Přidat další klávesovou zkratku
|
add-another-keybinding = Přidat další klávesovou zkratku
|
||||||
command = Příkaz
|
command = Příkaz
|
||||||
custom = Vlastní
|
custom = Vlastní
|
||||||
|
|
@ -661,7 +698,7 @@ manage-windows = Správa oken
|
||||||
.minimize = Minimalizovat okno
|
.minimize = Minimalizovat okno
|
||||||
.resize-inwards = Zmenšit okno
|
.resize-inwards = Zmenšit okno
|
||||||
.resize-outwards = Zvětšit okno
|
.resize-outwards = Zvětšit okno
|
||||||
.toggle-sticky = Přepnout přilepené okno
|
.toggle-sticky = Přepnout „okno vždy nahoře“
|
||||||
zoom-in = Přiblížit
|
zoom-in = Přiblížit
|
||||||
zoom-out = Oddálit
|
zoom-out = Oddálit
|
||||||
preferred-languages = Preferované jazyky
|
preferred-languages = Preferované jazyky
|
||||||
|
|
@ -703,19 +740,19 @@ move-windows = Přesouvání oken
|
||||||
.prev-workspace = Přesunout okno na předchozí pracovní plochu
|
.prev-workspace = Přesunout okno na předchozí pracovní plochu
|
||||||
.next-workspace = Přesunout okno na další pracovní plochu
|
.next-workspace = Přesunout okno na další pracovní plochu
|
||||||
.last-workspace = Přesunout okno na poslední pracovní plochu
|
.last-workspace = Přesunout okno na poslední pracovní plochu
|
||||||
.next-display = Přesunout okno na další displej
|
.next-display = Přesunout okno na další obrazovku
|
||||||
.prev-display = Přesunout okno na předchozí displej
|
.prev-display = Přesunout okno na předchozí obrazovku
|
||||||
.send-to-prev-workspace = Přesunout okno na předchozí pracovní plochu
|
.send-to-prev-workspace = Přesunout okno na předchozí pracovní plochu
|
||||||
.send-to-next-workspace = Přesunout okno na další pracovní plochu
|
.send-to-next-workspace = Přesunout okno na další pracovní plochu
|
||||||
system-shortcut = Systém
|
system-shortcut = Systém
|
||||||
.app-library = Otevřít knihovnu aplikací
|
.app-library = Otevřít knihovnu aplikací
|
||||||
.brightness-down = Snížit jas displeje
|
.brightness-down = Snížit jas obrazovky
|
||||||
.brightness-up = Zvýšit jas displeje
|
.brightness-up = Zvýšit jas obrazovky
|
||||||
.display-toggle = Přepnout interní displej
|
.display-toggle = Přepnout vestavěnou obrazovku
|
||||||
.home-folder = Otevřít domovskou složku
|
.home-folder = Otevřít domovskou složku
|
||||||
.keyboard-brightness-down = Snížit jas klávesnice
|
.keyboard-brightness-down = Snížit jas klávesnice
|
||||||
.keyboard-brightness-up = Zvýšit jas klávesnice
|
.keyboard-brightness-up = Zvýšit jas klávesnice
|
||||||
.launcher = Otevřít Spouštěč
|
.launcher = Otevřít spouštěč
|
||||||
.log-out = Odhlásit se
|
.log-out = Odhlásit se
|
||||||
.lock-screen = Zamknout obrazovku
|
.lock-screen = Zamknout obrazovku
|
||||||
.mute = Ztlumit zvukový výstup
|
.mute = Ztlumit zvukový výstup
|
||||||
|
|
@ -763,9 +800,8 @@ formatting = Formátování
|
||||||
.measurement = Jednotky
|
.measurement = Jednotky
|
||||||
.paper = Papír
|
.paper = Papír
|
||||||
default-apps = Výchozí aplikace
|
default-apps = Výchozí aplikace
|
||||||
.desc = Výchozí webový prohlížeč, poštovní klient, prohlížeč souborů a další aplikace
|
|
||||||
.web-browser = Webový prohlížeč
|
.web-browser = Webový prohlížeč
|
||||||
.file-manager = Prohlížeč souborů
|
.file-manager = Správce souborů
|
||||||
.mail-client = Poštovní klient
|
.mail-client = Poštovní klient
|
||||||
.music = Hudba
|
.music = Hudba
|
||||||
.video = Video
|
.video = Video
|
||||||
|
|
@ -774,32 +810,31 @@ default-apps = Výchozí aplikace
|
||||||
.terminal = Terminál
|
.terminal = Terminál
|
||||||
.other-associations = Ostatní asociace
|
.other-associations = Ostatní asociace
|
||||||
.text-editor = Textový editor
|
.text-editor = Textový editor
|
||||||
startup-apps = Automatické spouštění aplikací
|
.not-installed = Není nainstalováno
|
||||||
.desc = Nastavte aplikace, které se spustí při přihlášení
|
startup-apps = Automaticky spouštěné aplikace
|
||||||
.add = Přidat aplikaci
|
.add = Přidat aplikaci
|
||||||
.user = Aplikace spouštěné při přihlášení
|
.user = Aplikace spouštěné při přihlášení
|
||||||
.none = Nejsou přidány žádné aplikace pro automatické spouštění
|
.none = Nejsou přidány žádné aplikace pro automatické spouštění
|
||||||
.remove-dialog-title = Odstranit { $name }?
|
.remove-dialog-title = Odstranit { $name }?
|
||||||
.remove-dialog-description = Odstranit tuto aplikaci z automatického spouštění?
|
.remove-dialog-description = Odstranit tuto aplikaci z automatického spouštění?
|
||||||
.add-startup-app = Přidat aplikaci pro spouštění
|
.add-startup-app = Přidat aplikaci pro spouštění
|
||||||
legacy-applications = Kompatibilita X11 aplikací
|
legacy-applications = Kompatibilita aplikací X11
|
||||||
.desc = Škálování a globální klávesové zkratky aplikací využívajících okenní systém X11
|
legacy-app-global-shortcuts = Globální zkratky aplikací X11
|
||||||
legacy-app-global-shortcuts = Globální klávesové zkratky X11 aplikací
|
.desc = Globální zkratky umožňují, aby stisky kláves a události tlačítek myši provedené v aplikacích byly rozpoznány i jinými aplikacemi, například pro funkce typu push-to-talk nebo push-to-mute. Ve výchozím nastavení jsou v aplikacích X11 zakázány, aby jiné aplikace nemohly sledovat stisky kláves a události myši obsahující citlivé informace.
|
||||||
.desc = Globální klávesové zkratky umožňují, aby stisky kláves a události tlačítek myši provedené v aplikacích byly rozpoznány i jinými aplikacemi, například pro funkce typu push-to-talk nebo push-to-mute. Ve výchozím nastavení jsou v aplikacích X11 zakázány, aby jiné aplikace nemohly sledovat stisky kláves a události myši obsahující citlivé informace.
|
|
||||||
.none = Žádné klávesy
|
.none = Žádné klávesy
|
||||||
.modifiers = Modifikátory (Super, Shift, Control, Alt)
|
.modifiers = Modifikátory (Super, Shift, Control, Alt)
|
||||||
.combination = Všechny klávesy při stisku modifikátorů Super, Control nebo Alt
|
.combination = Všechny klávesy při stisku modifikátorů Super, Control nebo Alt
|
||||||
.all = Všechny klávesy
|
.all = Všechny klávesy
|
||||||
.mouse = Události tlačítek myši v X11 aplikacích
|
.mouse = Události tlačítek myši v aplikacích X11
|
||||||
legacy-app-scaling = Škálování aplikací v okenním systému X11
|
legacy-app-scaling = Měřítko aplikací v okenním systému X11
|
||||||
.scaled-gaming = Optimalizovat pro hry a aplikace na celé obrazovce
|
.scaled-gaming = Optimalizovat pro hry a aplikace na celé obrazovce
|
||||||
.gaming-description = Aplikace X11 se mohou zdát o něco větší/menší v porovnání s Wayland aplikacemi
|
.gaming-description = Aplikace X11 se mohou zdát o něco větší/menší v porovnání s aplikacemi Wayland
|
||||||
.scaled-applications = Optimalizovat pro aplikace
|
.scaled-applications = Optimalizovat pro aplikace
|
||||||
.applications-description = Hry a aplikace X11 na celé obrazovce nemusí odpovídat rozlišení vašeho displeje
|
.applications-description = Hry a aplikace X11 na celé obrazovce nemusí odpovídat rozlišení vaší obrazovky
|
||||||
.scaled-compatibility = Režim maximální kompatibility
|
.scaled-compatibility = Režim maximální kompatibility
|
||||||
.compatibility-description = Aplikace X11 mohou na HiDPI obrazovkách vypadat rozmazaně
|
.compatibility-description = Aplikace X11 mohou na HiDPI obrazovkách vypadat rozmazaně
|
||||||
.preferred-display = Preferovaný displej pro hry a aplikace X11 na celé obrazovce
|
.preferred-display = Preferovaná obrazovka pro hry a aplikace X11 na celé obrazovce
|
||||||
.no-display = Žádný
|
.no-display = Žádná
|
||||||
place-here = Sem umístěte applety
|
place-here = Sem umístěte applety
|
||||||
network-name = Název sítě
|
network-name = Název sítě
|
||||||
qr-code-unavailable = QR kód není dostupný
|
qr-code-unavailable = QR kód není dostupný
|
||||||
|
|
@ -815,3 +850,46 @@ shadows-tiling = Okna v dlaždicovém režimu
|
||||||
.shadow = Použít stíny
|
.shadow = Použít stíny
|
||||||
shadows-floating = Plovoucí okna
|
shadows-floating = Plovoucí okna
|
||||||
.clip = Sjednotit rohy podle systému a použít stíny
|
.clip = Sjednotit rohy podle systému a použít stíny
|
||||||
|
workspaces-overview = Přehled pracovních ploch
|
||||||
|
.action-on-typing = Akce při psaní
|
||||||
|
.none = Žádná
|
||||||
|
.launcher = Otevřít spouštěč
|
||||||
|
.applications = Otevřít aplikace
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Oznámení;Zámek;Zamykání;Zamykací;
|
||||||
|
xdg-entry-touchpad = Touchpad
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Myš;Zrychlení;Rolování;
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Automatické;Spuštění;Spouštění;Start;Aplikace;
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Drátové;LAN;Síť;Připojení;
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Zvýraznění;Barva;Barvy;Akcent;Ikona;Ikony;Font;Písmo;Písma;Témata;Motivy;
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Dok;Panel;Applet;
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Panel;Applet;
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Plocha;
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;Touchpad;Gesta;
|
||||||
|
xdg-entry-system-keywords = COSMIC;Systém;Informace;Účty;Účet;Firmware;
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;Síť;Připojení;
|
||||||
|
xdg-entry-applications-comment = Výchozí aplikace, automaticky spouštěné aplikace a nastavení kompatibility aplikací X11
|
||||||
|
xdg-entry-about-keywords = COSMIC;O systému;
|
||||||
|
xdg-entry-panel = Panel
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Přístupnost;A11y;Obrazovka;Obrazovky;Čtečka;Lupa;Přiblížení;Kontrast;Barva;Barvy;
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Čas;Pásmo;Zóna;
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
xdg-entry-network-keywords = COSMIC;Síť;Bezdrátové;WiFi;VPN;
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Tapeta;Tapety;Pozadí;Prezentace;
|
||||||
|
xdg-entry-users-keywords = COSMIC;Uživatel;Uživatelé;Účet;Účty;
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Síť;Připojení;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;Systém;Čas;Datum;Region;Oblast;Jazyk;
|
||||||
|
xdg-entry-input-keywords = COSMIC;Vstup;Klávesnice;Myš;Myši;
|
||||||
|
xdg-entry-comment = Aplikace nastavení pro prostředí COSMIC
|
||||||
|
xdg-entry-sound-keywords = COSMIC;Zvuk;Audio;Upozornění;Pipewire;
|
||||||
|
xdg-entry-power-keywords = COSMIC;Napájení;Baterie;
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Výchozí;Aplikace;
|
||||||
|
xdg-entry-keywords = COSMIC;Nastavení;Nastavit;
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Region;Oblast;Jazyk;Datum;Formát;Čas;Lokalizace;
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Výchozí;Aplikace;Automatické;Spuštění;Spouštění;Start;X11;Kompatibilita;
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Klávesnice;Vstup;Zdroj;Zdroje;Metoda;Metody;Zkratky;
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;Okno;Okna;Správa;Dlaždicový režim;Super;Klávesa;
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Obrazovka;Obrazovky;Displeje;Monitory;Zobrazení;Rozlišení;Měřítko;Škálování;Orientace;Obnovovací frekvence;Variabilní;VRR;
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Pracovní;Plocha;Plochy;Orientace;Přehled;Sledování;
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Aplikace;Hra;Hry;Kompatibilita;
|
||||||
|
no-search-results = Žádné sítě neodpovídají vašemu vyhledávání.
|
||||||
|
|
|
||||||
7
i18n/da/cosmic_settings.ftl
vendored
7
i18n/da/cosmic_settings.ftl
vendored
|
|
@ -6,13 +6,6 @@ number = { $number }
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Kablet
|
|
||||||
[wifi] Wi-Fi
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] Ukendt
|
|
||||||
} forbindelser og forbindelsesprofiler.
|
|
||||||
add-network = Tilføj Netværk
|
add-network = Tilføj Netværk
|
||||||
.profile = Tilføj profil
|
.profile = Tilføj profil
|
||||||
add-vpn = Tilføj VPN
|
add-vpn = Tilføj VPN
|
||||||
|
|
|
||||||
331
i18n/de/cosmic_settings.ftl
vendored
331
i18n/de/cosmic_settings.ftl
vendored
|
|
@ -1,4 +1,4 @@
|
||||||
app = COSMIC Einstellungen
|
app = COSMIC-Einstellungen
|
||||||
dbus-connection-error = Verbindung zum DBus ist fehlgeschlagen
|
dbus-connection-error = Verbindung zum DBus ist fehlgeschlagen
|
||||||
ok = OK
|
ok = OK
|
||||||
unknown = Unbekannt
|
unknown = Unbekannt
|
||||||
|
|
@ -6,13 +6,6 @@ number = { $number }
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Kabelgebundene Verbindungen
|
|
||||||
[wifi] Wi-Fi-Verbindungen
|
|
||||||
[vpn] VPN-Verbindungen
|
|
||||||
*[other] Unbekannte Verbindungen
|
|
||||||
} und Verbindungsprofile.
|
|
||||||
add-network = Netzwerk hinzufügen
|
add-network = Netzwerk hinzufügen
|
||||||
.profile = Profil hinzufügen
|
.profile = Profil hinzufügen
|
||||||
add-vpn = VPN hinzufügen
|
add-vpn = VPN hinzufügen
|
||||||
|
|
@ -36,9 +29,9 @@ visible-networks = Sichtbare Netzwerke
|
||||||
identity = Identität
|
identity = Identität
|
||||||
auth-dialog = Authentifizierung erforderlich
|
auth-dialog = Authentifizierung erforderlich
|
||||||
.vpn-description = Gib den vom VPN-Dienst geforderten Benutzernamen und das Passwort ein.
|
.vpn-description = Gib den vom VPN-Dienst geforderten Benutzernamen und das Passwort ein.
|
||||||
.wifi-description = Gib das Passwort oder den Verschlüsselungscode ein. Du kannst die Verbindung auch durch Drücken der „WPS“-Taste am Router herstellen.
|
.wifi-description = Gib das Passwort oder den Verschlüsselungsschlüssel ein. Du kannst die Verbindung auch durch Drücken der Taste „WPS“ am Router herstellen.
|
||||||
forget-dialog = Dieses Wi-Fi-Netzwerk vergessen?
|
forget-dialog = Dieses WLAN-Netzwerk vergessen?
|
||||||
.description = Du musst erneut ein Passwort eingeben, um dieses Wi-Fi-Netzwerk in der Zukunft zu verwenden.
|
.description = Du musst erneut ein Passwort eingeben, um dieses WLAN-Netzwerk in Zukunft verwenden zu können.
|
||||||
network-device-state =
|
network-device-state =
|
||||||
.activated = Verbunden
|
.activated = Verbunden
|
||||||
.config = Wird verbunden
|
.config = Wird verbunden
|
||||||
|
|
@ -55,7 +48,7 @@ network-device-state =
|
||||||
.unmanaged = Unverwaltet
|
.unmanaged = Unverwaltet
|
||||||
.unplugged = Kabel ausgesteckt
|
.unplugged = Kabel ausgesteckt
|
||||||
remove-connection-dialog = Verbindungsprofil entfernen?
|
remove-connection-dialog = Verbindungsprofil entfernen?
|
||||||
.vpn-description = Um dieses Netzwerk in der Zukunft nutzen zu können, musst du erneut ein Passwort eingeben.
|
.vpn-description = Du musst erneut ein Passwort eingeben, um dieses Netzwerk in Zukunft verwenden zu können.
|
||||||
.wired-description = Du musst dieses Profil neu erstellen, um es in Zukunft verwenden zu können.
|
.wired-description = Du musst dieses Profil neu erstellen, um es in Zukunft verwenden zu können.
|
||||||
vpn = VPN
|
vpn = VPN
|
||||||
.connections = VPN-Verbindungen
|
.connections = VPN-Verbindungen
|
||||||
|
|
@ -82,8 +75,8 @@ wired = Kabelgebunden
|
||||||
.connections = Kabelgebundene Verbindungen
|
.connections = Kabelgebundene Verbindungen
|
||||||
.devices = Kabelgebundene Geräte
|
.devices = Kabelgebundene Geräte
|
||||||
.remove = Verbindungsprofil entfernen
|
.remove = Verbindungsprofil entfernen
|
||||||
wifi = Wi-Fi
|
wifi = WLAN
|
||||||
.adapter = Wi-Fi-Adapter { $id }
|
.adapter = WLAN-Adapter { $id }
|
||||||
.forget = Dieses Netzwerk vergessen
|
.forget = Dieses Netzwerk vergessen
|
||||||
wireguard-dialog = WireGuard-Gerät hinzufügen
|
wireguard-dialog = WireGuard-Gerät hinzufügen
|
||||||
.description = Wähle einen Gerätenamen für die WireGuard-Konfiguration aus.
|
.description = Wähle einen Gerätenamen für die WireGuard-Konfiguration aus.
|
||||||
|
|
@ -91,7 +84,7 @@ wireguard-dialog = WireGuard-Gerät hinzufügen
|
||||||
## Networking: Online Accounts
|
## Networking: Online Accounts
|
||||||
|
|
||||||
online-accounts = Online-Konten
|
online-accounts = Online-Konten
|
||||||
.desc = Hinzufügen von Konten, IMAP und SMTP, Unternehmensanmeldungen
|
.desc = Konten, IMAP und SMTP, Unternehmensanmeldungen hinzufügen
|
||||||
|
|
||||||
# Bluetooth
|
# Bluetooth
|
||||||
|
|
||||||
|
|
@ -99,7 +92,6 @@ activate = Aktivieren
|
||||||
confirm = Bestätigen
|
confirm = Bestätigen
|
||||||
enable = Aktivieren
|
enable = Aktivieren
|
||||||
bluetooth = Bluetooth
|
bluetooth = Bluetooth
|
||||||
.desc = Bluetooth-Geräte verwalten
|
|
||||||
.status = Dieses System ist als { $aliases } sichtbar, während die Bluetooth-Einstellungen geöffnet sind.
|
.status = Dieses System ist als { $aliases } sichtbar, während die Bluetooth-Einstellungen geöffnet sind.
|
||||||
.connected = Verbunden
|
.connected = Verbunden
|
||||||
.connecting = Wird verbunden
|
.connecting = Wird verbunden
|
||||||
|
|
@ -121,16 +113,16 @@ bluetooth-adapters = Bluetooth-Adapter
|
||||||
|
|
||||||
## Accessibility
|
## Accessibility
|
||||||
|
|
||||||
accessibility = Zugänglichkeit
|
accessibility = Barrierefreiheit
|
||||||
.vision = Sehkraft
|
.vision = Sehen
|
||||||
.on = Ein
|
.on = Ein
|
||||||
.off = Aus
|
.off = Aus
|
||||||
.unavailable = Nicht verfügbar
|
.unavailable = Nicht verfügbar
|
||||||
.screen-reader = Bildschirmleser
|
.screen-reader = Bildschirmleser
|
||||||
.high-contrast = Modus mit hohem Kontrast
|
.high-contrast = Modus für hohen Kontrast
|
||||||
.invert-colors = Farben invertieren
|
.invert-colors = Farben invertieren
|
||||||
.color-filters = Farbfilter
|
.color-filters = Farbfilter
|
||||||
hearing = Gehör
|
hearing = Hören
|
||||||
.mono = Stereo-Audio als Mono abspielen
|
.mono = Stereo-Audio als Mono abspielen
|
||||||
default = Standard
|
default = Standard
|
||||||
magnifier = Vergrößerungsglas
|
magnifier = Vergrößerungsglas
|
||||||
|
|
@ -156,8 +148,8 @@ magnifier = Vergrößerungsglas
|
||||||
.continuous = Vergrößerung folgt der Maus
|
.continuous = Vergrößerung folgt der Maus
|
||||||
.onedge = Bewegt sich, wenn die Maus die Kanten berürt
|
.onedge = Bewegt sich, wenn die Maus die Kanten berürt
|
||||||
.centered = Den Mauszeiger auf der Vergrößerung zentriert halten
|
.centered = Den Mauszeiger auf der Vergrößerung zentriert halten
|
||||||
color-filter = Typ des Farbfilters
|
color-filter = Farbfiltertyp
|
||||||
.unknown = Unbekannt Filter aktiv
|
.unknown = Unbekannter Filter aktiv
|
||||||
.greyscale = Graustufen
|
.greyscale = Graustufen
|
||||||
.deuteranopia = Grün/Rot (Grünschwäche, Deuteranopie)
|
.deuteranopia = Grün/Rot (Grünschwäche, Deuteranopie)
|
||||||
.protanopia = Rot/Grün (Rotschwäche, Protanopie)
|
.protanopia = Rot/Grün (Rotschwäche, Protanopie)
|
||||||
|
|
@ -171,13 +163,12 @@ desktop = Desktop
|
||||||
|
|
||||||
wallpaper = Hintergrundbild
|
wallpaper = Hintergrundbild
|
||||||
.change = Bild ändern alle
|
.change = Bild ändern alle
|
||||||
.desc = Hintergrundbilder, Farben und Diashow-Optionen.
|
|
||||||
.fit = Hintergrundbild anpassen
|
.fit = Hintergrundbild anpassen
|
||||||
.folder-dialog = Ordner für Hintergrundbilder auswählen
|
.folder-dialog = Ordner für Hintergrundbilder auswählen
|
||||||
.image-dialog = Hintergrundbild auswählen
|
.image-dialog = Hintergrundbild auswählen
|
||||||
.plural = Hintergrundbilder
|
.plural = Hintergrundbilder
|
||||||
.same = Gleiches Hintergrundbild auf allen Bildschirmen
|
.same = Gleiches Hintergrundbild auf allen Bildschirmen
|
||||||
.slide = Diashow
|
.slide = Slideshow
|
||||||
add-color = Farbe hinzufügen
|
add-color = Farbe hinzufügen
|
||||||
add-image = Bild hinzufügen
|
add-image = Bild hinzufügen
|
||||||
all-displays = Alle Bildschirme
|
all-displays = Alle Bildschirme
|
||||||
|
|
@ -186,7 +177,7 @@ dialog-add = Hinzufügen
|
||||||
fill = Füllen
|
fill = Füllen
|
||||||
fit-to-screen = An Bildschirm anpassen
|
fit-to-screen = An Bildschirm anpassen
|
||||||
open-new-folder = Neuen Ordner öffnen
|
open-new-folder = Neuen Ordner öffnen
|
||||||
recent-folders = Letzte Ordner
|
recent-folders = Zuletzt verwendete Ordner
|
||||||
x-minutes =
|
x-minutes =
|
||||||
{ $number } { $number ->
|
{ $number } { $number ->
|
||||||
[one] Minute
|
[one] Minute
|
||||||
|
|
@ -202,9 +193,8 @@ never = Nie
|
||||||
## Desktop: Appearance
|
## Desktop: Appearance
|
||||||
|
|
||||||
appearance = Aussehen
|
appearance = Aussehen
|
||||||
.desc = Akzentfarben und Themen.
|
|
||||||
accent-color = Akzentfarbe
|
accent-color = Akzentfarbe
|
||||||
app-background = Anwendungs- oder Fensterhintergrund
|
app-background = Fensterhintergrund
|
||||||
auto = Automatisch
|
auto = Automatisch
|
||||||
close = Schließen
|
close = Schließen
|
||||||
color-picker = Farbwähler
|
color-picker = Farbwähler
|
||||||
|
|
@ -212,34 +202,34 @@ copied-to-clipboard = In Zwischenablage kopiert
|
||||||
copy-to-clipboard = In Zwischenablage kopieren
|
copy-to-clipboard = In Zwischenablage kopieren
|
||||||
dark = Dunkel
|
dark = Dunkel
|
||||||
export = Exportieren
|
export = Exportieren
|
||||||
hex = Hex
|
hex = Hexadezimal
|
||||||
import = Importieren
|
import = Importieren
|
||||||
light = Hell
|
light = Hell
|
||||||
mode-and-colors = Modus und Farben
|
mode-and-colors = Modus und Farben
|
||||||
recent-colors = Letzte Farben
|
recent-colors = Zuletzt verwendete Farben
|
||||||
reset-to-default = Auf Standardwerte zurücksetzen
|
reset-to-default = Auf Standard zurücksetzen
|
||||||
rgb = RGB
|
rgb = RGB
|
||||||
window-hint-accent = Hinweisfarbe für aktives Fenster
|
window-hint-accent = Hinweisfarbe für aktives Fenster
|
||||||
window-hint-accent-toggle = Akzentfarbe des Themas als Hinweisfarbe für aktives Fenster verwenden
|
window-hint-accent-toggle = Themenakzentfarbe als Hinweis für aktives Fenster verwenden
|
||||||
auto-switch = Automatischer Wechsel zwischen hellem und dunklem Modus
|
auto-switch = Automatisch zwischen hellem und dunklem Modus wechseln
|
||||||
.sunrise = Wechselt bei Sonnenaufgang in den hellen Modus
|
.sunrise = Wechselt bei Sonnenaufgang in den hellen Modus
|
||||||
.sunset = Wechselt bei Sonnenuntergang in den dunklen Modus
|
.sunset = Wechselt bei Sonnenuntergang in den dunklen Modus
|
||||||
.next-sunrise = Wechselt beim nächsten Sonnenaufgang in den hellen Modus
|
.next-sunrise = Wechselt beim nächsten Sonnenaufgang in den hellen Modus
|
||||||
.next-sunset = Wechselt beim nächsten Sonnenuntergang in den dunklen Modus
|
.next-sunset = Wechselt beim nächsten Sonnenuntergang in den dunklen Modus
|
||||||
container-background = Container-Hintergrund
|
container-background = Container-Hintergrund
|
||||||
.desc-detail = Die Hintergrundfarbe des Containers wird für die Navigationsseitenleiste, die Seitenschublade, Dialoge und ähnliche Widgets verwendet. Standardmäßig wird sie automatisch vom Anwendungs- oder Fensterhintergrund abgeleitet.
|
.desc-detail = Die Hintergrundfarbe des Containers wird für die Navigationsseitenleiste, die Seitenschublade, Dialoge und ähnliche Widgets verwendet. Standardmäßig wird die Hintergrundfarbe des Containers automatisch aus dem Hintergrund des Fensters abgeleitet.
|
||||||
.reset = Auf Automatisch zurücksetzen
|
.reset = Auf automatisch zurücksetzen
|
||||||
.desc = Die Farbe des primären Containers wird für die Navigationsseitenleiste, die Seitenschublade, Dialoge und ähnliche Widgets verwendet.
|
.desc = Wird für die Navigationsseitenleiste, Seitenschublade, Dialoge und ähnliche Widgets verwendet
|
||||||
control-tint = Komponententönung steuern
|
control-tint = Komponententönung steuern
|
||||||
.desc = Wird für Hintergründe von Standardschaltflächen, Sucheingaben, Texteingaben und ähnlichen Komponenten verwendet.
|
.desc = Wird für Hintergründe von Standardschaltflächen, Sucheingaben, Texteingaben und ähnlichen Komponenten verwendet
|
||||||
frosted = Milchglaseffekt bei der Systemoberfläche
|
frosted = Milchglaseffekt bei der Systemoberfläche
|
||||||
.desc = Wendet eine Hintergrundunschärfe auf Panel, Dock, Applets, Starter und Anwendungsbibliothek an.
|
.desc = Wendet Hintergrundunschärfe auf Panel, Dock, Applets, Starter und Anwendungsbibliothek an
|
||||||
enable-export = Dieses Thema auf GNOME-Apps anwenden.
|
enable-export = Aktuelles Thema auf GNOME-Apps anwenden
|
||||||
.desc = Nicht alle Toolkits unterstützen den automatischen Wechsel. Nicht-COSMIC-Apps müssen nach einem Themenwechsel möglicherweise neu gestartet werden.
|
.desc = Nicht alle Toolkits unterstützen den automatischen Wechsel. Nicht-COSMIC-Apps müssen nach einem Themenwechsel möglicherweise neu gestartet werden.
|
||||||
icon-theme = Symbolthema
|
icon-theme = Symbolthema
|
||||||
.desc = Wendet einen anderen Satz von Symbolen auf Anwendungen an.
|
.desc = Wendet einen anderen Satz von Symbolen auf Anwendungen an
|
||||||
text-tint = Texttönung der Oberfläche
|
text-tint = Texttönung der Benutzeroberfläche
|
||||||
.desc = Farbe zur Ableitung von Oberflächentextfarben, die auf verschiedenen Oberflächen einen ausreichenden Kontrast aufweisen.
|
.desc = Zum Ableiten von Textfarben der Benutzeroberfläche, die auf verschiedenen Oberflächen einen ausreichenden Kontrast aufweisen
|
||||||
style = Stil
|
style = Stil
|
||||||
.round = Rund
|
.round = Rund
|
||||||
.slightly-round = Leicht rund
|
.slightly-round = Leicht rund
|
||||||
|
|
@ -262,12 +252,10 @@ monospace-font = Nichtproportionale Schriftart
|
||||||
## Desktop: Notifications
|
## Desktop: Notifications
|
||||||
|
|
||||||
notifications = Benachrichtigungen
|
notifications = Benachrichtigungen
|
||||||
.desc = Nicht stören, Sperrbildschirm-Benachrichtigungen und Einstellungen pro Anwendung.
|
|
||||||
|
|
||||||
## Desktop: Panel
|
## Desktop: Panel
|
||||||
|
|
||||||
panel = Panel
|
panel = Panel
|
||||||
.desc = Obere Leiste mit Desktop-Steuerelementen und Menüs.
|
|
||||||
add = Hinzufügen
|
add = Hinzufügen
|
||||||
add-applet = Applet hinzufügen
|
add-applet = Applet hinzufügen
|
||||||
all = Alle
|
all = Alle
|
||||||
|
|
@ -291,7 +279,7 @@ panel-behavior-and-position = Verhalten und Positionen
|
||||||
.autohide = Panel automatisch ausblenden
|
.autohide = Panel automatisch ausblenden
|
||||||
.dock-autohide = Dock automatisch ausblenden
|
.dock-autohide = Dock automatisch ausblenden
|
||||||
.position = Position auf Bildschirm
|
.position = Position auf Bildschirm
|
||||||
.display = Anzeigen auf Bildschirm
|
.display = Auf Bildschirm anzeigen
|
||||||
panel-style = Stil
|
panel-style = Stil
|
||||||
.anchor-gap = Lücke zwischen Panel und Bildschirmrändern
|
.anchor-gap = Lücke zwischen Panel und Bildschirmrändern
|
||||||
.dock-anchor-gap = Lücke zwischen Dock und Bildschirmrändern
|
.dock-anchor-gap = Lücke zwischen Dock und Bildschirmrändern
|
||||||
|
|
@ -299,23 +287,21 @@ panel-style = Stil
|
||||||
.dock-extend = Dock bis zu den Bildschirmrändern ausdehnen
|
.dock-extend = Dock bis zu den Bildschirmrändern ausdehnen
|
||||||
.appearance = Aussehen
|
.appearance = Aussehen
|
||||||
.size = Größe
|
.size = Größe
|
||||||
.background-opacity = Deckkraft des Hintergrunds
|
.background-opacity = Hintergrunddeckkraft
|
||||||
panel-applets = Konfiguration
|
panel-applets = Konfiguration
|
||||||
.dock-desc = Dock-Applets konfigurieren.
|
.dock-desc = Dock-Applets konfigurieren
|
||||||
.desc = Panel-Applets konfigurieren.
|
.desc = Panel-Applets konfigurieren
|
||||||
panel-missing = Panel-Konfiguration fehlt
|
panel-missing = Panel-Konfiguration fehlt
|
||||||
.desc = Die Konfigurationsdatei des Panels fehlt aufgrund der Verwendung einer benutzerdefinierten Konfiguration oder sie ist beschädigt.
|
.desc = Die Konfigurationsdatei des Panels fehlt aufgrund der Verwendung einer benutzerdefinierten Konfiguration oder sie ist beschädigt.
|
||||||
.fix = Auf Standardwerte zurücksetzen
|
.fix = Auf Standard zurücksetzen
|
||||||
|
|
||||||
## Desktop: Dock
|
## Desktop: Dock
|
||||||
|
|
||||||
dock = Dock
|
dock = Dock
|
||||||
.desc = Panel mit angehefteten Anwendungen in der App-Ablage und anderen Applets.
|
|
||||||
|
|
||||||
## Desktop: Window management
|
## Desktop: Window management
|
||||||
|
|
||||||
window-management = Fensterverwaltung
|
window-management = Fensterverwaltung
|
||||||
.desc = Super-Tasten-Aktion, Optionen für die Fenstersteuerung und zusätzliche Optionen für die Fensterkachelung.
|
|
||||||
super-key = Super-Tasten-Aktion
|
super-key = Super-Tasten-Aktion
|
||||||
.launcher = Starter öffnen
|
.launcher = Starter öffnen
|
||||||
.workspaces = Arbeitsflächen öffnen
|
.workspaces = Arbeitsflächen öffnen
|
||||||
|
|
@ -334,22 +320,26 @@ focus-navigation = Fokus-Navigation
|
||||||
## Desktop: Workspaces
|
## Desktop: Workspaces
|
||||||
|
|
||||||
workspaces = Arbeitsflächen
|
workspaces = Arbeitsflächen
|
||||||
.desc = Anzahl, Verhalten und Platzierung der Arbeitsflächen festlegen.
|
workspaces-overview = Arbeitsflächenübersicht
|
||||||
workspaces-behavior = Verhaltern der Arbeitsfläche
|
.action-on-typing = Aktion beim Tippen
|
||||||
|
.none = Keine
|
||||||
|
.launcher = Starter öffnen
|
||||||
|
.applications = Anwendungen öffnen
|
||||||
|
workspaces-behavior = Arbeitsflächenverhalten
|
||||||
.dynamic = Dynamische Arbeitsflächen
|
.dynamic = Dynamische Arbeitsflächen
|
||||||
.dynamic-desc = Entfernt automatisch leere Arbeitsflächen.
|
.dynamic-desc = Entfernt automatisch leere Arbeitsflächen.
|
||||||
.fixed = Feste Anzahl an Arbeitsflächen
|
.fixed = Feste Anzahl an Arbeitsflächen
|
||||||
.fixed-desc = Arbeitsflächen in der Übersicht hinzufügen oder entfernen.
|
.fixed-desc = Arbeitsflächen in der Übersicht hinzufügen oder entfernen.
|
||||||
workspaces-multi-behavior = Multi-Monitor-Verhalten
|
workspaces-multi-behavior = Verhalten bei mehreren Monitoren
|
||||||
.span = Arbeitsflächen erstrecken sich über mehrere Bildschirme
|
.span = Arbeitsflächen erstrecken sich über mehrere Bildschirme
|
||||||
.separate = Bildschirme haben separate Arbeitsflächen
|
.separate = Bildschirme haben separate Arbeitsflächen
|
||||||
workspaces-overview-thumbnails = Miniaturansichten der Arbeitsflächenübersicht
|
workspaces-overview-thumbnails = Miniaturansichten der Arbeitsflächenübersicht
|
||||||
.show-number = Nummer der Arbeitsfläche anzeigen
|
.show-number = Arbeitsflächennummer anzeigen
|
||||||
.show-name = Name der Arbeitsfläche anzeigen
|
.show-name = Arbeitsflächenname anzeigen
|
||||||
workspaces-orientation = Ausrichtung der Arbeitsflächen
|
workspaces-orientation = Arbeitsflächenausrichtung
|
||||||
.vertical = Vertikal
|
.vertical = Vertikal
|
||||||
.horizontal = Horizontal
|
.horizontal = Horizontal
|
||||||
hot-corner = Aktive Ecken
|
hot-corner = Aktive Ecke
|
||||||
.top-left-corner = Aktive Ecke oben links für Arbeitsflächen aktivieren
|
.top-left-corner = Aktive Ecke oben links für Arbeitsflächen aktivieren
|
||||||
|
|
||||||
## Displays
|
## Displays
|
||||||
|
|
@ -361,7 +351,6 @@ color = Farbe
|
||||||
.sidebar = Farbprofile
|
.sidebar = Farbprofile
|
||||||
.temperature = Farbtemperatur
|
.temperature = Farbtemperatur
|
||||||
display = Bildschirme
|
display = Bildschirme
|
||||||
.desc = Bildschirme, Grafikumschaltung und Nachtlicht verwalten
|
|
||||||
.arrangement = Bildschirmanordnung
|
.arrangement = Bildschirmanordnung
|
||||||
.arrangement-desc = Bildschirme ziehen, um sie neu anzuordnen.
|
.arrangement-desc = Bildschirme ziehen, um sie neu anzuordnen.
|
||||||
.enable = Bildschirm aktivieren
|
.enable = Bildschirm aktivieren
|
||||||
|
|
@ -388,15 +377,15 @@ mirroring = Spiegelung
|
||||||
}
|
}
|
||||||
night-light = Nachtlicht
|
night-light = Nachtlicht
|
||||||
.auto = Automatisch (Sonnenuntergang bis Sonnenaufgang)
|
.auto = Automatisch (Sonnenuntergang bis Sonnenaufgang)
|
||||||
.desc = Blaues Licht mittels wärmerer Farben reduzieren.
|
.desc = Blaues Licht mittels wärmerer Farben reduzieren
|
||||||
orientation = Ausrichtung
|
orientation = Ausrichtung
|
||||||
.standard = Standard
|
.standard = Standard
|
||||||
.rotate-90 = Um 90 Grad drehen
|
.rotate-90 = Um 90° drehen
|
||||||
.rotate-180 = Um 180 Grad drehen
|
.rotate-180 = Um 180° drehen
|
||||||
.rotate-270 = Um 270 Grad drehen
|
.rotate-270 = Um 270° drehen
|
||||||
vrr = Variable refresh rate
|
vrr = Variable Bildwiederholrate
|
||||||
.enabled = Aktiv
|
.enabled = Aktiviert
|
||||||
.force = Immer aktiv
|
.force = Immer
|
||||||
.auto = Automatisch
|
.auto = Automatisch
|
||||||
.disabled = Deaktiviert
|
.disabled = Deaktiviert
|
||||||
scheduling = Zeitplanung
|
scheduling = Zeitplanung
|
||||||
|
|
@ -410,7 +399,6 @@ dialog = Dialog
|
||||||
## Sound
|
## Sound
|
||||||
|
|
||||||
sound = Klang
|
sound = Klang
|
||||||
.desc = N/V
|
|
||||||
sound-output = Ausgabe
|
sound-output = Ausgabe
|
||||||
.volume = Ausgabelautstärke
|
.volume = Ausgabelautstärke
|
||||||
.device = Ausgabegerät
|
.device = Ausgabegerät
|
||||||
|
|
@ -424,15 +412,14 @@ sound-input = Eingang
|
||||||
.device = Eingabegerät
|
.device = Eingabegerät
|
||||||
.level = Eingangspegel
|
.level = Eingangspegel
|
||||||
sound-alerts = Alarmsignale
|
sound-alerts = Alarmsignale
|
||||||
.volume = Lautstärke von Alarmsignalen.
|
.volume = Lautstärke von Alarmsignalen
|
||||||
.sound = Alarmsignalklang.
|
.sound = Alarmsignalklang
|
||||||
sound-applications = Anwendungen
|
sound-applications = Anwendungen
|
||||||
.desc = Lautstärken und Einstellungen von Anwendungen
|
.desc = Lautstärken und Einstellungen von Anwendungen
|
||||||
|
|
||||||
## Energie
|
## Energie
|
||||||
|
|
||||||
power = Energie & Akku
|
power = Energie & Akku
|
||||||
.desc = Energieeinstellungen verwalten
|
|
||||||
battery = Akku
|
battery = Akku
|
||||||
.minute =
|
.minute =
|
||||||
{ $value } { $value ->
|
{ $value } { $value ->
|
||||||
|
|
@ -474,12 +461,11 @@ power-saving = Energiesparoptionen
|
||||||
|
|
||||||
## Input
|
## Input
|
||||||
|
|
||||||
acceleration-desc = Passt die Tracking-Empfindlichkeit automatisch an die Geschwindigkeit an.
|
acceleration-desc = Passt die Tracking-Empfindlichkeit automatisch an die Geschwindigkeit an
|
||||||
disable-while-typing = Während dem Tippen deaktivieren
|
disable-while-typing = Während dem Tippen deaktivieren
|
||||||
input-devices = Eingabegeräte
|
input-devices = Eingabegeräte
|
||||||
.desc = Eingabegeräte
|
|
||||||
primary-button = Primäre Taste
|
primary-button = Primäre Taste
|
||||||
.desc = Legt die Reihenfolge der physischen Tasten fest.
|
.desc = Legt die Reihenfolge der physischen Tasten fest
|
||||||
.left = Links
|
.left = Links
|
||||||
.right = Rechts
|
.right = Rechts
|
||||||
scrolling = Scrollen
|
scrolling = Scrollen
|
||||||
|
|
@ -496,7 +482,6 @@ fast = Schnell
|
||||||
short = Kurz
|
short = Kurz
|
||||||
long = Lang
|
long = Lang
|
||||||
keyboard = Tastatur
|
keyboard = Tastatur
|
||||||
.desc = Eingabequellen, Umschaltung, Eingabe von Sonderzeichen, Tastenkombinationen.
|
|
||||||
keyboard-sources = Eingabequellen
|
keyboard-sources = Eingabequellen
|
||||||
.desc = Die Eingabequellen können mit der Tastenkombination Super+Leertaste umgeschaltet werden. Dies kann in den Einstellungen für Tastenkombinationen angepasst werden.
|
.desc = Die Eingabequellen können mit der Tastenkombination Super+Leertaste umgeschaltet werden. Dies kann in den Einstellungen für Tastenkombinationen angepasst werden.
|
||||||
.move-up = Nach oben verschieben
|
.move-up = Nach oben verschieben
|
||||||
|
|
@ -508,6 +493,7 @@ keyboard-sources = Eingabequellen
|
||||||
keyboard-special-char = Eingabe von Sonderzeichen
|
keyboard-special-char = Eingabe von Sonderzeichen
|
||||||
.alternate = Taste für alternative Zeichen
|
.alternate = Taste für alternative Zeichen
|
||||||
.compose = Compose-Taste
|
.compose = Compose-Taste
|
||||||
|
.compose-desc = Mit der Compose-Taste kannst du viele verschiedene Zeichen eingeben. Drück einfach die Compose-Taste und dann die Zeichen, die du brauchst. Wenn du zum Beispiel die Compose-Taste und dann C und o drückst, kommt ©, und wenn du die Compose-Taste und dann a und ' drückst, kommt á.
|
||||||
.caps = Feststelltaste
|
.caps = Feststelltaste
|
||||||
keyboard-typing-assist = Tippen
|
keyboard-typing-assist = Tippen
|
||||||
.repeat-rate = Wiederholungsrate
|
.repeat-rate = Wiederholungsrate
|
||||||
|
|
@ -526,22 +512,22 @@ show-extended-input-sources = Erweiterte Eingabequellen anzeigen
|
||||||
|
|
||||||
keyboard-shortcuts = Tastenkombinationen
|
keyboard-shortcuts = Tastenkombinationen
|
||||||
.desc = Tastenkombinationen anzeigen und anpassen
|
.desc = Tastenkombinationen anzeigen und anpassen
|
||||||
add-another-keybinding = Weitere Tastenkombination hinzufügen
|
add-another-keybinding = Weitere Tastenbelegung hinzufügen
|
||||||
cancel = Abbrechen
|
cancel = Abbrechen
|
||||||
command = Befehl
|
command = Befehl
|
||||||
custom = Benutzerdefiniert
|
custom = Benutzerdefiniert
|
||||||
debug = Debug
|
debug = Fehlerbehebung
|
||||||
disabled = Deaktiviert
|
disabled = Deaktiviert
|
||||||
input-source-switch = Tastaturlayout umschalten
|
input-source-switch = Spracheingabequelle der Tastatur wechseln
|
||||||
migrate-workspace-prev = Arbeitsfläche zur vorherigen Ausgabe migrieren
|
migrate-workspace-prev = Arbeitsfläche zur vorherigen Ausgabe verlagern
|
||||||
migrate-workspace-next = Arbeitsfläche zur nächsten Ausgabe migrieren
|
migrate-workspace-next = Arbeitsfläche zur nächsten Ausgabe verlagern
|
||||||
migrate-workspace =
|
migrate-workspace =
|
||||||
Arbeitsfläche zur { $direction ->
|
Arbeitsfläche zur { $direction ->
|
||||||
*[down] unteren
|
*[down] unteren
|
||||||
[left] linken
|
[left] linken
|
||||||
[right] rechten
|
[right] rechten
|
||||||
[up] oberen
|
[up] oberen
|
||||||
} Ausgabe migrieren
|
} Ausgabe verlagern
|
||||||
navigate = Navigieren
|
navigate = Navigieren
|
||||||
replace = Ersetzen
|
replace = Ersetzen
|
||||||
shortcut-name = Name der Tastenkombination
|
shortcut-name = Name der Tastenkombination
|
||||||
|
|
@ -580,7 +566,7 @@ nav-shortcuts = Navigation
|
||||||
manage-windows = Fenster verwalten
|
manage-windows = Fenster verwalten
|
||||||
.close = Fenster schließen
|
.close = Fenster schließen
|
||||||
.maximize = Fenster maximieren
|
.maximize = Fenster maximieren
|
||||||
.fullscreen = Fenster zum Vollbild
|
.fullscreen = Vollbildfenster
|
||||||
.minimize = Fenster minimieren
|
.minimize = Fenster minimieren
|
||||||
.resize-inwards = Fenstergröße nach innen ändern
|
.resize-inwards = Fenstergröße nach innen ändern
|
||||||
.resize-outwards = Fenstergröße nach außen ändern
|
.resize-outwards = Fenstergröße nach außen ändern
|
||||||
|
|
@ -619,6 +605,7 @@ system-shortcut = System
|
||||||
.app-library = App-Bibliothek öffnen
|
.app-library = App-Bibliothek öffnen
|
||||||
.brightness-down = Bildschirmhelligkeit verringern
|
.brightness-down = Bildschirmhelligkeit verringern
|
||||||
.brightness-up = Bildschirmhelligkeit erhöhen
|
.brightness-up = Bildschirmhelligkeit erhöhen
|
||||||
|
.display-toggle = Internen Bildschirm umschalten
|
||||||
.home-folder = Persönlichen Ordner öffnen
|
.home-folder = Persönlichen Ordner öffnen
|
||||||
.keyboard-brightness-down = Tastaturhelligkeit verringern
|
.keyboard-brightness-down = Tastaturhelligkeit verringern
|
||||||
.keyboard-brightness-up = Tastaturhelligkeit erhöhen
|
.keyboard-brightness-up = Tastaturhelligkeit erhöhen
|
||||||
|
|
@ -632,7 +619,9 @@ system-shortcut = System
|
||||||
.play-prev = Vorheriger Titel
|
.play-prev = Vorheriger Titel
|
||||||
.poweroff = System ausschalten
|
.poweroff = System ausschalten
|
||||||
.screenshot = Bildschirmfoto machen
|
.screenshot = Bildschirmfoto machen
|
||||||
|
.suspend = Bereitschaft
|
||||||
.terminal = Terminal öffnen
|
.terminal = Terminal öffnen
|
||||||
|
.touchpad-toggle = Touchpad umschalten
|
||||||
.volume-lower = Lautstärke der Audioausgabe verringern
|
.volume-lower = Lautstärke der Audioausgabe verringern
|
||||||
.volume-raise = Lautstärke der Audioausgabe erhöhen
|
.volume-raise = Lautstärke der Audioausgabe erhöhen
|
||||||
.web-browser = Webbrowser öffnen
|
.web-browser = Webbrowser öffnen
|
||||||
|
|
@ -655,7 +644,6 @@ zoom-out = Herauszoomen
|
||||||
## Input: Mouse
|
## Input: Mouse
|
||||||
|
|
||||||
mouse = Maus
|
mouse = Maus
|
||||||
.desc = Mausgeschwindigkeit, -beschleunigung, natürliches Scrollen.
|
|
||||||
.speed = Mausgeschwindigkeit
|
.speed = Mausgeschwindigkeit
|
||||||
.acceleration = Mausbeschleunigung aktivieren
|
.acceleration = Mausbeschleunigung aktivieren
|
||||||
|
|
||||||
|
|
@ -663,14 +651,13 @@ mouse = Maus
|
||||||
|
|
||||||
click-behavior = Klickverhalten
|
click-behavior = Klickverhalten
|
||||||
.click-finger = Sekundärklick mit zwei Fingern und Mittelklick mit drei Fingern
|
.click-finger = Sekundärklick mit zwei Fingern und Mittelklick mit drei Fingern
|
||||||
.button-areas = Sekundärklick in der rechten unteren Ecke und Mittelklick in der unteren Mitte
|
.button-areas = Sekundärklick in der unteren rechten Ecke und Mittelklick in der unteren Mitte
|
||||||
pinch-to-zoom = Zwei-Finger-Zoom
|
pinch-to-zoom = Zwei-Finger-Zoom
|
||||||
.desc = Mit zwei Fingern in den Inhalt zoomen, wenn die Anwendung den Zoom unterstützt.
|
.desc = Mit zwei Fingern in den Inhalt zoomen, wenn die Anwendung den Zoom unterstützt
|
||||||
tap-to-click = Tippen zum Klicken
|
tap-to-click = Tippen zum Klicken
|
||||||
.desc = Ermöglicht das Tippen mit einem Finger für den ersten Klick, mit zwei Fingern für den zweiten Klick und mit drei Fingern für den mittleren Klick.
|
.desc = Ermöglicht das Tippen mit einem Finger für den Primärklick, das Tippen mit zwei Fingern für den Sekundärklick und das Tippen mit drei Fingern für den Mittelklick
|
||||||
touchpad = Touchpad
|
touchpad = Touchpad
|
||||||
.acceleration = Touchpad-Beschleunigung aktivieren
|
.acceleration = Touchpad-Beschleunigung aktivieren
|
||||||
.desc = Touchpad-Geschwindigkeit, Klickoptionen, Gesten.
|
|
||||||
.speed = Touchpad-Geschwindigkeit
|
.speed = Touchpad-Geschwindigkeit
|
||||||
|
|
||||||
## Input: Gestures
|
## Input: Gestures
|
||||||
|
|
@ -691,34 +678,31 @@ open-workspaces-view = Arbeitsflächenübersicht öffnen
|
||||||
## Time & Language
|
## Time & Language
|
||||||
|
|
||||||
time = Uhrzeit & Sprache
|
time = Uhrzeit & Sprache
|
||||||
.desc = N/V
|
|
||||||
time-date = Datum & Uhrzeit
|
time-date = Datum & Uhrzeit
|
||||||
.desc = Zeitzone, automatische Uhreinstellungen und einige Zeitformatierungen.
|
|
||||||
.auto = Automatisch festlegen
|
.auto = Automatisch festlegen
|
||||||
.auto-ntp = Datum & Uhrzeit werden automatisch aktualisiert, wenn die Zeitzone eingestellt ist.
|
.auto-ntp = Datum & Uhrzeit werden automatisch aktualisiert, wenn die Zeitzone eingestellt ist
|
||||||
time-zone = Zeitzone
|
time-zone = Zeitzone
|
||||||
.auto = Automatische Zeitzone
|
.auto = Automatische Zeitzone
|
||||||
.auto-info = Erfordert Ortungsdienste und Internetzugang
|
.auto-info = Erfordert Ortungsdienste und Internetzugang
|
||||||
time-format = Datum- & Zeitformat
|
time-format = Datums- & Uhrzeitformat
|
||||||
.twenty-four = 24-Stunden-Uhrzeit
|
.twenty-four = 24-Stunden-Uhrzeit
|
||||||
.show-seconds = Sekunden anzeigen
|
.show-seconds = Sekunden anzeigen
|
||||||
.first = Erster Tag der Woche
|
.first = Erster Tag der Woche
|
||||||
.show-date = Datum im oberen Panel anzeigen
|
.show-date = Datum im Zeit-Applet anzeigen
|
||||||
.friday = Freitag
|
.friday = Freitag
|
||||||
.saturday = Samstag
|
.saturday = Samstag
|
||||||
.sunday = Sonntag
|
.sunday = Sonntag
|
||||||
.monday = Montag
|
.monday = Montag
|
||||||
time-region = Region & Sprache
|
time-region = Region & Sprache
|
||||||
.desc = Datum, Uhrzeiten und Zahlen gemäß deiner Region formatieren
|
|
||||||
formatting = Formatierung
|
formatting = Formatierung
|
||||||
.dates = Daten
|
.dates = Datum
|
||||||
.time = Uhrzeit
|
.time = Uhrzeit
|
||||||
.date-and-time = Datum & Uhrzeit
|
.date-and-time = Datum & Uhrzeit
|
||||||
.numbers = Zahlen
|
.numbers = Zahlen
|
||||||
.measurement = Maß
|
.measurement = Maß
|
||||||
.paper = Papier
|
.paper = Papier
|
||||||
preferred-languages = Bevorzugte Sprachen
|
preferred-languages = Bevorzugte Sprachen
|
||||||
.desc = Die Reihenfolge der Sprachen bestimmt, welche Sprache für die Übersetzung des Desktops verwendet wird. Die Änderungen werden bei der nächsten Anmeldung wirksam.
|
.desc = Die Reihenfolge der Sprachen bestimmt, welche Sprache für die Übersetzung der Benutzeroberfläche verwendet wird. Die Änderungen werden bei der nächsten Anmeldung wirksam.
|
||||||
add-language = Sprache hinzufügen
|
add-language = Sprache hinzufügen
|
||||||
.context = Sprache hinzufügen
|
.context = Sprache hinzufügen
|
||||||
install-additional-languages = Zusätzliche Sprachen installieren
|
install-additional-languages = Zusätzliche Sprachen installieren
|
||||||
|
|
@ -731,7 +715,6 @@ applications = Anwendungen
|
||||||
## Applications: Default Applications
|
## Applications: Default Applications
|
||||||
|
|
||||||
default-apps = Standardanwendungen
|
default-apps = Standardanwendungen
|
||||||
.desc = Standard-Webbrowser, E-Mail-Client, Dateibrowser und andere Anwendungen.
|
|
||||||
.web-browser = Webbrowser
|
.web-browser = Webbrowser
|
||||||
.file-manager = Dateibrowser
|
.file-manager = Dateibrowser
|
||||||
.mail-client = E-Mail-Client
|
.mail-client = E-Mail-Client
|
||||||
|
|
@ -740,30 +723,33 @@ default-apps = Standardanwendungen
|
||||||
.photos = Fotos
|
.photos = Fotos
|
||||||
.calendar = Kalender
|
.calendar = Kalender
|
||||||
.terminal = Terminal
|
.terminal = Terminal
|
||||||
.other-associations = Weitere Standardanwendungen
|
.other-associations = Andere Zuordnungen
|
||||||
.text-editor = Text-Editor
|
.text-editor = Texteditor
|
||||||
|
.not-installed = Nicht installiert
|
||||||
|
|
||||||
## Applications: Startup Applications
|
## Applications: Startup Applications
|
||||||
|
|
||||||
startup-apps = Startup-Anwendungen
|
startup-apps = Startanwendungen
|
||||||
.desc = Konfigurieren Sie Anwendungen, die bei der Anmeldung ausgeführt werden.
|
|
||||||
.add = Anwendung hinzufügen
|
.add = Anwendung hinzufügen
|
||||||
.user = Benutzerspezifische Anwendungen
|
.user = Anwendungen, die bei deiner Anmeldung gestartet werden
|
||||||
.user-description = Diese Anwendungen werden gestartet, wenn Sie sich bei Ihrem aktuellen Benutzer anmelden.
|
.none = Keine Startanwendungen hinzugefügt
|
||||||
.remove-dialog-title = { $name } entfernen?
|
.remove-dialog-title = { $name } entfernen?
|
||||||
.remove-dialog-description = Sind Sie sicher, dass Sie diese Anwendung als Startup-Anwendung entfernen möchten?
|
.remove-dialog-description = Diese Startanwendung entfernen?
|
||||||
.search-for-application = Nach Anwendungen suche
|
.add-startup-app = Startanwendung hinzufügen
|
||||||
|
|
||||||
## Applications: Legacy Applications
|
## Applications: Legacy Applications
|
||||||
|
|
||||||
legacy-applications = Kompatibilität mit X11-Anwendungen
|
legacy-applications = Kompatibilität mit X11-Anwendungen
|
||||||
.desc = Anwendungsskalierung des X11-Fenstersystems und globale Tastaturkürzel.
|
|
||||||
# This is still work in progress, as I didn't have enough time. Therefore, I left this here temporarily.
|
# This is still work in progress, as I didn't have enough time. Therefore, I left this here temporarily.
|
||||||
legacy-app-scaling = Anwendungsskalierung des X11-Fenstersystems
|
legacy-app-scaling = Anwendungsskalierung des X11-Fenstersystems
|
||||||
.scaled-by-system = Alle X11-Anwendungen skalieren
|
.scaled-gaming = Für Spiele und Vollbild-Apps optimieren
|
||||||
.system-description = X11-Anwendungen werden auf HiDPI-Bildschirmen unscharf dargestellt.
|
.gaming-description = X11-Anwendungen können im Vergleich zu Wayland-Anwendungen etwas größer/kleiner erscheinen
|
||||||
.scaled-natively = X11-Anwendungen in nativer Auflösung rendern
|
.scaled-applications = Für Anwendungen optimieren
|
||||||
.native-description = X11-Anwendungen, die keine Skalierung unterstützen, werden klein dargestellt, wenn HiDPI-Bildschirme verwendet werden. Für Spiele aktivieren, um die volle Monitorauflösung auszunutzen.
|
.applications-description = Spiele und Vollbild-X11-Anwendungen passen möglicherweise nicht zu deiner Bildschirmauflösung
|
||||||
|
.scaled-compatibility = Modus für maximale Kompatibilität
|
||||||
|
.compatibility-description = X11-Anwendungen können auf HiDPI-Bildschirmen unscharf erscheinen
|
||||||
|
.preferred-display = Bevorzugte Anzeige für Spiele und Vollbild-X11-Anwendungen
|
||||||
|
.no-display = Keine
|
||||||
|
|
||||||
## System
|
## System
|
||||||
|
|
||||||
|
|
@ -772,9 +758,8 @@ system = System & Konten
|
||||||
## System: Über
|
## System: Über
|
||||||
|
|
||||||
about = Über
|
about = Über
|
||||||
.desc = Gerätename, Hardwareinfo, Voreinstellungen des Betriebssystems.
|
|
||||||
about-device = Gerätename
|
about-device = Gerätename
|
||||||
.desc = Dieser Name erscheint bei anderen Netzwerk- oder Bluetooth-Geräten.
|
.desc = Dieser Name erscheint bei anderen Netzwerk- oder Bluetooth-Geräten
|
||||||
about-hardware = Hardware
|
about-hardware = Hardware
|
||||||
.model = Hardwaremodell
|
.model = Hardwaremodell
|
||||||
.memory = Speicher
|
.memory = Speicher
|
||||||
|
|
@ -784,7 +769,7 @@ about-hardware = Hardware
|
||||||
about-os = Betriebssystem
|
about-os = Betriebssystem
|
||||||
.os = Betriebssystem
|
.os = Betriebssystem
|
||||||
.os-architecture = Betriebssystemarchitektur
|
.os-architecture = Betriebssystemarchitektur
|
||||||
.kernel = Kernel Version
|
.kernel = Kernel-Version
|
||||||
.desktop-environment = Desktopumgebung
|
.desktop-environment = Desktopumgebung
|
||||||
.windowing-system = Fenstersystem
|
.windowing-system = Fenstersystem
|
||||||
about-related = Zugehörige Einstellungen
|
about-related = Zugehörige Einstellungen
|
||||||
|
|
@ -793,17 +778,137 @@ about-related = Zugehörige Einstellungen
|
||||||
## System: Firmware
|
## System: Firmware
|
||||||
|
|
||||||
firmware = Firmware
|
firmware = Firmware
|
||||||
.desc = Firmwaredetails.
|
|
||||||
|
|
||||||
## System: Benutzer
|
## System: Benutzer
|
||||||
|
|
||||||
users = Benutzer
|
users = Benutzer
|
||||||
.desc = Authentifizierung und Benutzerkonten.
|
|
||||||
.admin = Administrator
|
.admin = Administrator
|
||||||
.standard = Standard
|
.standard = Standard
|
||||||
.profile-add = Profilbild auswählen
|
.profile-add = Profilbild auswählen
|
||||||
administrator = Administrator
|
administrator = Administrator
|
||||||
.desc = Administratoren können die Einstellungen für alle Benutzer ändern, andere Benutzer hinzufügen und entfernen.
|
.desc = Administratoren können die Einstellungen für alle Benutzer ändern, andere Benutzer hinzufügen und entfernen
|
||||||
add-user = Benutzer hinzufügen
|
add-user = Benutzer hinzufügen
|
||||||
remove-user = Benutzer entfernen
|
remove-user = Benutzer entfernen
|
||||||
full-name = Vollständiger Name
|
full-name = Vollständiger Name
|
||||||
|
network-name = Netzwerkname
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Dock;Panel;Applet
|
||||||
|
xdg-entry-a11y = Barrierefreiheit
|
||||||
|
xdg-entry-displays-comment = Bildschirm-Konfigurationseinstellungen verwalten
|
||||||
|
xdg-entry-default-apps = Standardanwendungen
|
||||||
|
xdg-entry-about-keywords = COSMIC;Über
|
||||||
|
xdg-entry-desktop-comment = Hintergrundbild, Aussehen, Panel, Dock, Fensterverwaltung und Arbeitsflächeneinstellungen
|
||||||
|
xdg-entry-keyboard = Tastatur
|
||||||
|
xdg-entry-displays = Bildschirme
|
||||||
|
xdg-entry-input-comment = Tastatur- und Mauseinstellungen
|
||||||
|
xdg-entry-dock-comment = Eine optionale Leiste für Apps und Applets
|
||||||
|
xdg-entry-dock = Dock
|
||||||
|
xdg-entry-input-keywords = COSMIC;Eingabe;Tastatur;Maus;Mäuse;
|
||||||
|
xdg-entry-comment = Einstellungsanwendung für den COSMIC Desktop
|
||||||
|
xdg-entry-applications = Anwendungen
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Standard;Anwendung
|
||||||
|
xdg-entry-keywords = COSMIC;Einstellungen;
|
||||||
|
xdg-entry-about = Über
|
||||||
|
xdg-entry-input = Eingabegeräte
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Standard;Anwendung;Start;X11;Kompatibilität
|
||||||
|
xdg-entry-appearance = Aussehen
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Bildschirm;
|
||||||
|
save = Speichern
|
||||||
|
share = Netzwerk teilen
|
||||||
|
scan-to-connect-description = Scanne den QR-Code, um dich mit diesem Netzwerk zu verbinden.
|
||||||
|
qr-code-unavailable = QR-Code nicht verfügbar
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Anwendung;Spiel;Kompatibilität;
|
||||||
|
xdg-entry-x11-applications-comment = Skalierung von X11-Fenstersystemanwendungen, primärer Bildschirm und globale Tastenkombinationen
|
||||||
|
xdg-entry-x11-applications = Kompatibilität mit X11-Anwendungen
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Arbeitsfläche;Ausrichtung;Übersicht;Monitor;
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WLAN;Netzwerk;Verbindung;
|
||||||
|
xdg-entry-wireless-comment = WLAN-Verbindungen und Verbindungsprofile
|
||||||
|
xdg-entry-wireless = WLAN
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Kabelgebunden;LAN;Netzwerk;Verbindung;
|
||||||
|
xdg-entry-wired-comment = Kabelgebundene Verbindungen und Verbindungsprofile
|
||||||
|
xdg-entry-wired = Kabelgebunden
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;Fenster;Verwaltung;Kachelung;Super;Taste;
|
||||||
|
xdg-entry-window-management-comment = Super-Tasten-Aktion, Fenstersteuerungsoptionen und zusätzliche Fensterkachelungsoptionen
|
||||||
|
xdg-entry-window-management = Fensterverwaltung
|
||||||
|
xdg-entry-wallpaper = Hintergrundbild
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Netzwerk;Verbindung;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-vpn-comment = VPN-Verbindungen und Verbindungsprofile
|
||||||
|
xdg-entry-users-keywords = COSMIC;Benutzer;Konto;
|
||||||
|
xdg-entry-users-comment = Authentifizierung und Benutzerkonten
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;System;Uhrzeit;Datum;Region;Sprache;
|
||||||
|
xdg-entry-time-language-comment = Systemdatum, Uhrzeit, Region und Sprache verwalten
|
||||||
|
xdg-entry-system-keywords = COSMIC;System;Info;Konten;Firmware;
|
||||||
|
xdg-entry-system-comment = Systeminformationen, Konten und Firmware-Aktualisierungen
|
||||||
|
xdg-entry-system = System & Konten
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Start;Anwendung;
|
||||||
|
xdg-entry-startup-apps-comment = Anwendungen konfigurieren, die bei der Anmeldung ausgeführt werden
|
||||||
|
xdg-entry-startup-apps = Startanwendungen
|
||||||
|
xdg-entry-sound-keywords = COSMIC;Klang;Audio;Alarm;Pipewire;
|
||||||
|
xdg-entry-sound-comment = Audioeinstellungen für Geräte, Alarme und Anwendungen
|
||||||
|
xdg-entry-sound = Klang
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Region;Sprache;Datum;Format;Uhrzeit;Gebietsschema;Lokalisierung;
|
||||||
|
xdg-entry-region-language-comment = Datumsangaben, Uhrzeiten und Zahlen entsprechend deiner Region formatieren
|
||||||
|
xdg-entry-region-language = Region & Sprache
|
||||||
|
xdg-entry-power-keywords = COSMIC;Energie;Akku
|
||||||
|
xdg-entry-power-comment = Energiemodi und Energiesparoptionen
|
||||||
|
xdg-entry-power = Energie & Akku
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Panel;Applet
|
||||||
|
xdg-entry-panel-comment = Primäre Systemleiste für Menüs und Applets
|
||||||
|
xdg-entry-panel = Panel
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Zeit;Zone;
|
||||||
|
xdg-entry-date-time-comment = Zeitzone, automatische Uhrzeiteinstellungen und Zeitformatierung
|
||||||
|
sound-device-profiles = Geräteprofile
|
||||||
|
sound-usb-audio = USB-Audio
|
||||||
|
sound-hd-audio = HD-Audio
|
||||||
|
sound-device-port-unplugged = Ausgesteckt
|
||||||
|
amplification = Verstärkung
|
||||||
|
.desc = Ermöglicht die Erhöhung der Lautstärke auf 150 %
|
||||||
|
place-here = Applets hier platzieren
|
||||||
|
shadow-and-corners = Fensterschatten und -ecken
|
||||||
|
shadows-tiling = Gekachelte Fenster
|
||||||
|
.clip = Systemecken zuordnen
|
||||||
|
.shadow = Schatten anwenden
|
||||||
|
shadows-floating = Schwebende Fenster
|
||||||
|
.clip = Systemecken zuordnen und Schatten anwenden
|
||||||
|
xdg-entry-workspaces-comment = Arbeitsflächenausrichtung, Übersicht und Verhalten bei mehreren Monitoren
|
||||||
|
xdg-entry-workspaces = Arbeitsflächen
|
||||||
|
xdg-entry-users = Benutzer
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;Touchpad;Geste;
|
||||||
|
xdg-entry-touchpad-comment = Touchpad-Geschwindigkeit, Klickoptionen und Gesten
|
||||||
|
xdg-entry-touchpad = Touchpad
|
||||||
|
xdg-entry-time-language = Uhrzeit & Sprache
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Benachrichtigung;Sperre;
|
||||||
|
xdg-entry-notifications-comment = Nicht stören, Sperrbildschirm-Benachrichtigungen und Einstellungen pro Anwendung
|
||||||
|
xdg-entry-notifications = Benachrichtigungen
|
||||||
|
xdg-entry-network-keywords = COSMIC;Netzwerk;Drahtlos;WLAN;VPN;
|
||||||
|
xdg-entry-network = Netzwerk & Drahtlos
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Maus;Beschleunigung;Scrollen;
|
||||||
|
xdg-entry-mouse-comment = Mausgeschwindigkeit, -beschleunigung und natürliches Scrollen
|
||||||
|
xdg-entry-mouse = Maus
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Tastatur;Eingabe;Quelle;Tastenkombinationen;
|
||||||
|
xdg-entry-date-time = Datum & Uhrzeit
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
xdg-entry-bluetooth-comment = Bluetooth-Geräte verwalten
|
||||||
|
xdg-entry-applications-comment = Standardanwendungen, Startanwendungen und Kompatibilitätseinstellungen für X11-Anwendungen
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Hintergrundbild;Hintergrund;Slideshow;
|
||||||
|
xdg-entry-wallpaper-comment = Hintergrundbilder, Farben und Slideshow-Optionen
|
||||||
|
xdg-entry-network-comment = Netzwerkverbindungen verwalten
|
||||||
|
xdg-entry-keyboard-comment = Eingabequellen, Umschalten, Eingabe von Sonderzeichen, Tastenkombinationen
|
||||||
|
xdg-entry-default-apps-comment = Standard-Webbrowser, E-Mail-Client, Dateibrowser und andere Anwendungen
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Akzent;Farbe;Symbol;Schriftart;Thema
|
||||||
|
xdg-entry-appearance-comment = Akzentfarben und Themen
|
||||||
|
password-mismatch = Passwort und Bestätigung müssen übereinstimmen
|
||||||
|
invalid-username = Ungültiger Benutzername
|
||||||
|
change-password = Passwort ändern
|
||||||
|
xdg-entry-about-comment = Gerätename, Hardware-Informationen, Betriebssystem-Standardeinstellungen
|
||||||
|
no-search-results = Es wurden keine Netzwerke gefunden, die deiner Suche entsprechen.
|
||||||
|
legacy-app-global-shortcuts = Globale Tastenkombinationen in X11-Anwendungen
|
||||||
|
.desc = Globale Tastenkombinationen ermöglichen es, dass in Anwendungen ausgeführte Tastenanschläge und Mausklicks von anderen Anwendungen für Funktionen wie Push-to-Talk oder Push-to-Mute erkannt werden. Standardmäßig sind globale Tastenkombinationen in X11-Anwendungen deaktiviert, um sicherzustellen, dass andere Anwendungen keine Tastatur- und Mausereignisse überwachen können, die sensible Informationen enthalten.
|
||||||
|
.none = Keine Tasten
|
||||||
|
.modifiers = Modifikatortasten (Super, Umschalt, Steuerung, Alt)
|
||||||
|
.combination = Alle Tasten, während die Modifikatortasten Super, Steuerung oder Alt gedrückt werden
|
||||||
|
.all = Alle Tasten
|
||||||
|
.mouse = Maustasten-Ereignisse in X11-Anwendungen
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Desktop;
|
||||||
|
xdg-entry-desktop = Desktop
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Barrierefreiheit;A11y;Bildschirm;Leser;Vergrößerungsglas;Kontrast;Farbe;
|
||||||
|
xdg-entry-a11y-comment = Bildschirmleser, Vergrößerungsglas, hoher Kontrast und Farbfilter
|
||||||
|
|
|
||||||
1
i18n/el/cosmic_settings.ftl
vendored
1
i18n/el/cosmic_settings.ftl
vendored
|
|
@ -0,0 +1 @@
|
||||||
|
share = Κοινοποίηση δικτύου
|
||||||
175
i18n/en/cosmic_settings.ftl
vendored
175
i18n/en/cosmic_settings.ftl
vendored
|
|
@ -1,19 +1,138 @@
|
||||||
app = COSMIC Settings
|
|
||||||
|
|
||||||
dbus-connection-error = Failed to connect to DBus
|
dbus-connection-error = Failed to connect to DBus
|
||||||
ok = OK
|
ok = OK
|
||||||
unknown = Unknown
|
unknown = Unknown
|
||||||
|
|
||||||
number = { $number }
|
number = { $number }
|
||||||
|
|
||||||
## Network & Wireless
|
## Freedesktop desktop entries
|
||||||
|
|
||||||
connections-and-profiles = { $variant ->
|
app = COSMIC Settings
|
||||||
[wired] Wired
|
xdg-entry-comment = Settings application for the COSMIC desktop
|
||||||
[wifi] Wi-Fi
|
xdg-entry-keywords = COSMIC;Settings;
|
||||||
[vpn] VPN
|
|
||||||
*[other] Unknown
|
xdg-entry-about = About
|
||||||
} connections and connection profiles.
|
xdg-entry-about-comment = Device name, hardware information, operating system defaults
|
||||||
|
xdg-entry-about-keywords = COSMIC;About
|
||||||
|
|
||||||
|
xdg-entry-a11y = Accessibility
|
||||||
|
xdg-entry-a11y-comment = Screen reader, magnifier, high contrast, and color filters
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Accessibility;A11y;Screen;Reader;Magnifier;Contrast;Color;
|
||||||
|
|
||||||
|
xdg-entry-appearance = Appearance
|
||||||
|
xdg-entry-appearance-comment = Accent colors and theming
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Accent;Color;Icon;Font;Theme
|
||||||
|
|
||||||
|
xdg-entry-applications = Applications
|
||||||
|
xdg-entry-applications-comment = Default applications, startup applications, and X11 application compatibility settings
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Default;Application;Startup;X11;Compatibility
|
||||||
|
|
||||||
|
xdg-entry-bluetooth-comment = Manage Bluetooth devices
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
|
||||||
|
xdg-entry-date-time = Date & Time
|
||||||
|
xdg-entry-date-time-comment = Time zone, automatic clock settings, and time formatting
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Time;Zone;
|
||||||
|
|
||||||
|
xdg-entry-default-apps = Default Applications
|
||||||
|
xdg-entry-default-apps-comment = Default web browser, mail client, file browser, and other applications
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Default;Application
|
||||||
|
|
||||||
|
xdg-entry-desktop = Desktop
|
||||||
|
xdg-entry-desktop-comment = Wallpaper, appearance, panel, dock, window management and workspace settings
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Desktop;
|
||||||
|
|
||||||
|
xdg-entry-displays = Displays
|
||||||
|
xdg-entry-displays-comment = Manage display configuration settings
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Display;
|
||||||
|
|
||||||
|
xdg-entry-dock = Dock
|
||||||
|
xdg-entry-dock-comment = An optional bar for apps and applets
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Dock;Panel;Applet
|
||||||
|
|
||||||
|
xdg-entry-input = Input Devices
|
||||||
|
xdg-entry-input-comment = Keyboard and mouse settings
|
||||||
|
xdg-entry-input-keywords = COSMIC;Input;Keyboard;Mouse;Mice;
|
||||||
|
|
||||||
|
xdg-entry-keyboard = Keyboard
|
||||||
|
xdg-entry-keyboard-comment = Input sources, switching, special character entry, shortcuts
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Keyboard;Input;Source;Shortcuts;
|
||||||
|
|
||||||
|
xdg-entry-mouse = Mouse
|
||||||
|
xdg-entry-mouse-comment = Mouse speed, acceleration, and natural scrolling
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Mouse;Acceleration;Scrolling;
|
||||||
|
|
||||||
|
xdg-entry-network = Network & Wireless
|
||||||
|
xdg-entry-network-comment = Manage network connections
|
||||||
|
xdg-entry-network-keywords = COSMIC;Network;Wireless;WiFi;VPN;
|
||||||
|
|
||||||
|
xdg-entry-notifications = Notifications
|
||||||
|
xdg-entry-notifications-comment = Do Not Disturb, lockscreen notifications, and per-application settings
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Notification;Lock;
|
||||||
|
|
||||||
|
xdg-entry-panel = Panel
|
||||||
|
xdg-entry-panel-comment = Primary system bar for menus and applets
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Panel;Applet
|
||||||
|
|
||||||
|
xdg-entry-power = Power & Battery
|
||||||
|
xdg-entry-power-comment = Power modes and power saving options
|
||||||
|
xdg-entry-power-keywords = COSMIC;Power;Battery
|
||||||
|
|
||||||
|
xdg-entry-region-language = Region & Language
|
||||||
|
xdg-entry-region-language-comment = Format dates, times, and numbers based on your region
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Region;Language;Date;Format;Time;Locale;Localization;
|
||||||
|
|
||||||
|
xdg-entry-sound = Sound
|
||||||
|
xdg-entry-sound-comment = Audio settings for devices, alerts, and applications
|
||||||
|
xdg-entry-sound-keywords = COSMIC;Sound;Audio;Alert;Pipewire;
|
||||||
|
|
||||||
|
xdg-entry-startup-apps = Startup Applications
|
||||||
|
xdg-entry-startup-apps-comment = Configure applications which run on login
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Startup;Application;
|
||||||
|
|
||||||
|
xdg-entry-system = System & Accounts
|
||||||
|
xdg-entry-system-comment = System information, accounts, and firmware updates
|
||||||
|
xdg-entry-system-keywords = COSMIC;System;Info;Accounts;Firmware;
|
||||||
|
|
||||||
|
xdg-entry-time-language = Time & Language
|
||||||
|
xdg-entry-time-language-comment = Manage system date, time, region, and language
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;System;Time;Date;Region;Language;
|
||||||
|
|
||||||
|
xdg-entry-touchpad = Touchpad
|
||||||
|
xdg-entry-touchpad-comment = Touchpad speed, click options, and gestures
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;Touchpad;Gesture;
|
||||||
|
|
||||||
|
xdg-entry-users = Users
|
||||||
|
xdg-entry-users-comment = Authentication and user accounts
|
||||||
|
xdg-entry-users-keywords = COSMIC;User;Account;
|
||||||
|
|
||||||
|
xdg-entry-vpn-comment = VPN connections and connection profiles
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Network;Connection;OpenVPN;OpenConnect;
|
||||||
|
|
||||||
|
xdg-entry-wallpaper = Wallpaper
|
||||||
|
xdg-entry-wallpaper-comment = Wallpaper images, colors, and slideshow options
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Wallpaper;Background;Slideshow;
|
||||||
|
|
||||||
|
xdg-entry-window-management = Window Management
|
||||||
|
xdg-entry-window-management-comment = Super key action, window control options, and additional window tiling options
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;Window;Management;Tiling;Super;Key;
|
||||||
|
|
||||||
|
xdg-entry-wired = Wired
|
||||||
|
xdg-entry-wired-comment = Wired connections and connection profiles
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Wired;LAN;Network;Connection;
|
||||||
|
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-wireless-comment = Wi-Fi connections and connection profiles
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;Network;Connection;
|
||||||
|
|
||||||
|
xdg-entry-workspaces = Workspaces
|
||||||
|
xdg-entry-workspaces-comment = Workspace orientation, overview, and multi-monitor behavior
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Workspace;Orientation;Overview;Monitor;
|
||||||
|
|
||||||
|
xdg-entry-x11-applications = X11 Applications Compatibility
|
||||||
|
xdg-entry-x11-applications-comment = X11 window system application scaling, primary display, and global shortcuts
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Application;Game;Compatibility;
|
||||||
|
|
||||||
|
## Network & Wireless
|
||||||
|
|
||||||
add-network = Add network
|
add-network = Add network
|
||||||
.profile = Add profile
|
.profile = Add profile
|
||||||
|
|
@ -114,7 +233,6 @@ confirm = Confirm
|
||||||
enable = Enable
|
enable = Enable
|
||||||
|
|
||||||
bluetooth = Bluetooth
|
bluetooth = Bluetooth
|
||||||
.desc = Manage Bluetooth devices
|
|
||||||
.status = This system is visible as { $aliases } while Bluetooth settings are open.
|
.status = This system is visible as { $aliases } while Bluetooth settings are open.
|
||||||
.connected = Connected
|
.connected = Connected
|
||||||
.connecting = Connecting
|
.connecting = Connecting
|
||||||
|
|
@ -189,7 +307,6 @@ desktop = Desktop
|
||||||
|
|
||||||
wallpaper = Wallpaper
|
wallpaper = Wallpaper
|
||||||
.change = Change image every
|
.change = Change image every
|
||||||
.desc = Wallpaper images, colors, and slideshow options
|
|
||||||
.fit = Wallpaper fit
|
.fit = Wallpaper fit
|
||||||
.folder-dialog = Choose wallpaper folder
|
.folder-dialog = Choose wallpaper folder
|
||||||
.image-dialog = Choose wallpaper image
|
.image-dialog = Choose wallpaper image
|
||||||
|
|
@ -220,7 +337,6 @@ never = Never
|
||||||
## Desktop: Appearance
|
## Desktop: Appearance
|
||||||
|
|
||||||
appearance = Appearance
|
appearance = Appearance
|
||||||
.desc = Accent colors and theming
|
|
||||||
|
|
||||||
accent-color = Accent color
|
accent-color = Accent color
|
||||||
app-background = Window background
|
app-background = Window background
|
||||||
|
|
@ -298,12 +414,10 @@ shadow-and-corners = Window shadow and corners
|
||||||
## Desktop: Notifications
|
## Desktop: Notifications
|
||||||
|
|
||||||
notifications = Notifications
|
notifications = Notifications
|
||||||
.desc = Do Not Disturb, lockscreen notifications, and per-application settings
|
|
||||||
|
|
||||||
## Desktop: Panel
|
## Desktop: Panel
|
||||||
|
|
||||||
panel = Panel
|
panel = Panel
|
||||||
.desc = Primary system bar for menus and applets
|
|
||||||
|
|
||||||
add = Add
|
add = Add
|
||||||
add-applet = Add applet
|
add-applet = Add applet
|
||||||
|
|
@ -353,12 +467,10 @@ panel-missing = Panel configuration is missing
|
||||||
## Desktop: Dock
|
## Desktop: Dock
|
||||||
|
|
||||||
dock = Dock
|
dock = Dock
|
||||||
.desc = An optional bar for apps and applets
|
|
||||||
|
|
||||||
## Desktop: Window management
|
## Desktop: Window management
|
||||||
|
|
||||||
window-management = Window management
|
window-management = Window management
|
||||||
.desc = Super key action, window control options, and additional window tiling options
|
|
||||||
|
|
||||||
super-key = Super key action
|
super-key = Super key action
|
||||||
.launcher = Open Launcher
|
.launcher = Open Launcher
|
||||||
|
|
@ -372,6 +484,7 @@ window-controls = Window controls
|
||||||
.maximize = Show maximize button
|
.maximize = Show maximize button
|
||||||
.minimize = Show minimize button
|
.minimize = Show minimize button
|
||||||
.active-window-hint = Show active window hint
|
.active-window-hint = Show active window hint
|
||||||
|
.position-start = Place buttons on the left (macOS style)
|
||||||
|
|
||||||
focus-navigation = Focus navigation
|
focus-navigation = Focus navigation
|
||||||
.focus-follows-cursor = Focus follows cursor
|
.focus-follows-cursor = Focus follows cursor
|
||||||
|
|
@ -381,7 +494,12 @@ focus-navigation = Focus navigation
|
||||||
## Desktop: Workspaces
|
## Desktop: Workspaces
|
||||||
|
|
||||||
workspaces = Workspaces
|
workspaces = Workspaces
|
||||||
.desc = Workspace orientation and behavior
|
|
||||||
|
workspaces-overview = Workspaces overview
|
||||||
|
.action-on-typing = Action on typing
|
||||||
|
.none = None
|
||||||
|
.launcher = Open Launcher
|
||||||
|
.applications = Open Applications
|
||||||
|
|
||||||
workspaces-behavior = Workspace behavior
|
workspaces-behavior = Workspace behavior
|
||||||
.dynamic = Dynamic workspaces
|
.dynamic = Dynamic workspaces
|
||||||
|
|
@ -404,6 +522,9 @@ workspaces-orientation = Workspaces orientation
|
||||||
hot-corner = Hot Corner
|
hot-corner = Hot Corner
|
||||||
.top-left-corner = Enable top-left hot corner for Workspaces
|
.top-left-corner = Enable top-left hot corner for Workspaces
|
||||||
|
|
||||||
|
workspaces-navigation = Navigation
|
||||||
|
.wraparound = Move between first and last workspace using keyboard shortcuts and gestures
|
||||||
|
|
||||||
## Displays
|
## Displays
|
||||||
|
|
||||||
-requires-restart = Requires restart
|
-requires-restart = Requires restart
|
||||||
|
|
@ -415,7 +536,6 @@ color = Color
|
||||||
.temperature = Color temperature
|
.temperature = Color temperature
|
||||||
|
|
||||||
display = Displays
|
display = Displays
|
||||||
.desc = Manage displays and night light
|
|
||||||
.arrangement = Display arrangement
|
.arrangement = Display arrangement
|
||||||
.arrangement-desc = Drag displays to rearrange them
|
.arrangement-desc = Drag displays to rearrange them
|
||||||
.enable = Enable display
|
.enable = Enable display
|
||||||
|
|
@ -468,7 +588,6 @@ dialog = Dialog
|
||||||
## Sound
|
## Sound
|
||||||
|
|
||||||
sound = Sound
|
sound = Sound
|
||||||
.desc = N/A
|
|
||||||
|
|
||||||
sound-output = Output
|
sound-output = Output
|
||||||
.volume = Output volume
|
.volume = Output volume
|
||||||
|
|
@ -504,7 +623,6 @@ sound-device-profiles = Device profiles
|
||||||
|
|
||||||
# Power & Battery settings page
|
# Power & Battery settings page
|
||||||
power = Power & battery
|
power = Power & battery
|
||||||
.desc = Manage power settings
|
|
||||||
|
|
||||||
battery = Battery
|
battery = Battery
|
||||||
.minute = { $value } { $value ->
|
.minute = { $value } { $value ->
|
||||||
|
|
@ -551,7 +669,7 @@ acceleration-desc = Automatically adjusts tracking sensitivity based on speed
|
||||||
disable-while-typing = Disable while typing
|
disable-while-typing = Disable while typing
|
||||||
|
|
||||||
input-devices = Input devices
|
input-devices = Input devices
|
||||||
.desc = Input devices
|
|
||||||
|
|
||||||
primary-button = Primary button
|
primary-button = Primary button
|
||||||
.desc = Sets the order of physical buttons
|
.desc = Sets the order of physical buttons
|
||||||
|
|
@ -572,7 +690,6 @@ fast = Fast
|
||||||
short = Short
|
short = Short
|
||||||
long = Long
|
long = Long
|
||||||
keyboard = Keyboard
|
keyboard = Keyboard
|
||||||
.desc = Input sources, switching, special character entry, shortcuts
|
|
||||||
|
|
||||||
keyboard-sources = Input Sources
|
keyboard-sources = Input Sources
|
||||||
.desc = Input sources can be switched using Super+Space key combination. This can be customized in the keyboard shortcut settings.
|
.desc = Input sources can be switched using Super+Space key combination. This can be customized in the keyboard shortcut settings.
|
||||||
|
|
@ -602,6 +719,7 @@ keyboard-numlock-boot = Numlock
|
||||||
|
|
||||||
added = Added
|
added = Added
|
||||||
type-to-search = Type to search...
|
type-to-search = Type to search...
|
||||||
|
no-search-results = No networks match your search.
|
||||||
show-extended-input-sources = Show extended input sources
|
show-extended-input-sources = Show extended input sources
|
||||||
|
|
||||||
## Input: Keyboard: Shortcuts
|
## Input: Keyboard: Shortcuts
|
||||||
|
|
@ -744,7 +862,6 @@ zoom-out = Zoom Out
|
||||||
## Input: Mouse
|
## Input: Mouse
|
||||||
|
|
||||||
mouse = Mouse
|
mouse = Mouse
|
||||||
.desc = Mouse speed, acceleration, natural scrolling
|
|
||||||
.speed = Mouse speed
|
.speed = Mouse speed
|
||||||
.acceleration = Enable mouse acceleration
|
.acceleration = Enable mouse acceleration
|
||||||
|
|
||||||
|
|
@ -762,7 +879,6 @@ tap-to-click = Tap to click
|
||||||
|
|
||||||
touchpad = Touchpad
|
touchpad = Touchpad
|
||||||
.acceleration = Enable touchpad acceleration
|
.acceleration = Enable touchpad acceleration
|
||||||
.desc = Touchpad speed, click options, gestures
|
|
||||||
.speed = Touchpad speed
|
.speed = Touchpad speed
|
||||||
|
|
||||||
## Input: Gestures
|
## Input: Gestures
|
||||||
|
|
@ -785,10 +901,8 @@ open-workspaces-view = Open Workspaces Overview
|
||||||
## Time & language
|
## Time & language
|
||||||
|
|
||||||
time = Time & language
|
time = Time & language
|
||||||
.desc = N/A
|
|
||||||
|
|
||||||
time-date = Date & time
|
time-date = Date & time
|
||||||
.desc = Time zone, automatic clock settings, and time formatting
|
|
||||||
.auto = Set automatically
|
.auto = Set automatically
|
||||||
.auto-ntp = Date & time will update automatically when the time zone is set
|
.auto-ntp = Date & time will update automatically when the time zone is set
|
||||||
|
|
||||||
|
|
@ -807,7 +921,6 @@ time-format = Date & time format
|
||||||
.monday = Monday
|
.monday = Monday
|
||||||
|
|
||||||
time-region = Region & language
|
time-region = Region & language
|
||||||
.desc = Format dates, times, and numbers based on your region
|
|
||||||
|
|
||||||
formatting = Formatting
|
formatting = Formatting
|
||||||
.dates = Dates
|
.dates = Dates
|
||||||
|
|
@ -832,7 +945,6 @@ applications = Applications
|
||||||
## Applications: Default applications
|
## Applications: Default applications
|
||||||
|
|
||||||
default-apps = Default Applications
|
default-apps = Default Applications
|
||||||
.desc = Default web browser, mail client, file browser, and other applications
|
|
||||||
.web-browser = Web browser
|
.web-browser = Web browser
|
||||||
.file-manager = File manager
|
.file-manager = File manager
|
||||||
.mail-client = Mail client
|
.mail-client = Mail client
|
||||||
|
|
@ -843,11 +955,12 @@ default-apps = Default Applications
|
||||||
.terminal = Terminal
|
.terminal = Terminal
|
||||||
.other-associations = Other associations
|
.other-associations = Other associations
|
||||||
.text-editor = Text Editor
|
.text-editor = Text Editor
|
||||||
|
.not-installed = Not installed
|
||||||
|
|
||||||
|
|
||||||
## Applications: Startup applications
|
## Applications: Startup applications
|
||||||
|
|
||||||
startup-apps = Startup applications
|
startup-apps = Startup applications
|
||||||
.desc = Configure applications which run on login
|
|
||||||
.add = Add app
|
.add = Add app
|
||||||
.user = Applications launched when you log in
|
.user = Applications launched when you log in
|
||||||
.none = No startup applications added
|
.none = No startup applications added
|
||||||
|
|
@ -858,7 +971,6 @@ startup-apps = Startup applications
|
||||||
## Applications: Legacy applications
|
## Applications: Legacy applications
|
||||||
|
|
||||||
legacy-applications = X11 applications compatibility
|
legacy-applications = X11 applications compatibility
|
||||||
.desc = X11 Window system application scaling and Global shortcuts
|
|
||||||
|
|
||||||
legacy-app-global-shortcuts = Global shortcuts in X11 applications
|
legacy-app-global-shortcuts = Global shortcuts in X11 applications
|
||||||
.desc = Global shortcuts allows keystrokes and mouse button events performed in applications to be recognized by other applications for features like push-to-talk or push-to-mute. By default, Global shortcuts is disabled in X11 applications to ensure other applications can’t monitor for keyboard and mouse events containing sensitive information.
|
.desc = Global shortcuts allows keystrokes and mouse button events performed in applications to be recognized by other applications for features like push-to-talk or push-to-mute. By default, Global shortcuts is disabled in X11 applications to ensure other applications can’t monitor for keyboard and mouse events containing sensitive information.
|
||||||
|
|
@ -885,7 +997,6 @@ system = System & accounts
|
||||||
## System: About
|
## System: About
|
||||||
|
|
||||||
about = About
|
about = About
|
||||||
.desc = Device name, hardware information, operating system defaults
|
|
||||||
|
|
||||||
about-device = Device name
|
about-device = Device name
|
||||||
.desc = This name appears to other network or Bluetooth devices
|
.desc = This name appears to other network or Bluetooth devices
|
||||||
|
|
@ -910,12 +1021,10 @@ about-related = Related settings
|
||||||
## System: Firmware
|
## System: Firmware
|
||||||
|
|
||||||
firmware = Firmware
|
firmware = Firmware
|
||||||
.desc = Firmware details
|
|
||||||
|
|
||||||
## System: Users
|
## System: Users
|
||||||
|
|
||||||
users = Users
|
users = Users
|
||||||
.desc = Authentication and user accounts
|
|
||||||
.admin = Admin
|
.admin = Admin
|
||||||
.standard = Standard
|
.standard = Standard
|
||||||
.profile-add = Choose profile image
|
.profile-add = Choose profile image
|
||||||
|
|
|
||||||
10
i18n/es-419/cosmic_settings.ftl
vendored
10
i18n/es-419/cosmic_settings.ftl
vendored
|
|
@ -6,13 +6,6 @@ number = { $number }
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Cableada
|
|
||||||
[wifi] Wi-Fi
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] Desconocida
|
|
||||||
} conexiones y perfiles de conexión.
|
|
||||||
add-network = Añadir red
|
add-network = Añadir red
|
||||||
.profile = Añadir perfil
|
.profile = Añadir perfil
|
||||||
add-vpn = Añadir VPN
|
add-vpn = Añadir VPN
|
||||||
|
|
@ -809,3 +802,6 @@ full-name = Nombre completo
|
||||||
invalid-username = Nombre de usuario inválido.
|
invalid-username = Nombre de usuario inválido.
|
||||||
password-mismatch = Las contraseñas no coinciden.
|
password-mismatch = Las contraseñas no coinciden.
|
||||||
save = Guardar
|
save = Guardar
|
||||||
|
xdg-entry-applications = Aplicaciones
|
||||||
|
xdg-entry-appearance = Apariencia
|
||||||
|
xdg-entry-a11y = Accesibilidad
|
||||||
|
|
|
||||||
70
i18n/es/cosmic_settings.ftl
vendored
70
i18n/es/cosmic_settings.ftl
vendored
|
|
@ -4,15 +4,66 @@ ok = OK
|
||||||
unknown = Desconocido
|
unknown = Desconocido
|
||||||
number = { $number }
|
number = { $number }
|
||||||
|
|
||||||
|
## Freedesktop desktop entries
|
||||||
|
|
||||||
|
xdg-entry-about = A cerca de
|
||||||
|
xdg-entry-about-comment = Nombre del dispositivo, información de hardware y valores del sistema operativo
|
||||||
|
xdg-entry-a11y = Accesibilidad
|
||||||
|
xdg-entry-a11y-comment = Configuración de accesibilidad
|
||||||
|
xdg-entry-appearance = Apariencia
|
||||||
|
xdg-entry-appearance-comment = Colores de énfasis y temas
|
||||||
|
xdg-entry-applications = Aplicaciones
|
||||||
|
xdg-entry-applications-comment = Gestionar configuración de aplicaciones
|
||||||
|
xdg-entry-bluetooth-comment = Gestionar dispositivos Bluetooth
|
||||||
|
xdg-entry-date-time = Fecha y Hora
|
||||||
|
xdg-entry-date-time-comment = Zona horaria, configuración automática del reloj y formatos de hora
|
||||||
|
xdg-entry-default-apps = Aplicaciones predeterminadas
|
||||||
|
xdg-entry-default-apps-comment = Navegador web predeterminado, cliente de correo, explorador de archivos y otras aplicaciones
|
||||||
|
xdg-entry-desktop = Escritorio
|
||||||
|
xdg-entry-displays = Pantallas
|
||||||
|
xdg-entry-displays-comment = Opciones de pantalla, modos gráficos y luz nocturna
|
||||||
|
xdg-entry-dock = Dock
|
||||||
|
xdg-entry-dock-comment = Panel opcional para aplicaciones y otros applets
|
||||||
|
xdg-entry-input = Dispositivos de entrada
|
||||||
|
xdg-entry-input-comment = Teclado, ratón, etc.
|
||||||
|
xdg-entry-keyboard = Teclado
|
||||||
|
xdg-entry-keyboard-comment = Entrada de teclado, conmutación, carácteres especiales, atajos
|
||||||
|
xdg-entry-mouse = Ratón
|
||||||
|
xdg-entry-mouse-comment = Velocidad del ratón, aceleración y desplazamiento natural
|
||||||
|
xdg-entry-network = Red e inalámbrico
|
||||||
|
xdg-entry-network-comment = Gestionar conexiones de red
|
||||||
|
xdg-entry-notifications = Notificaciones
|
||||||
|
xdg-entry-notifications-comment = No molestar, notificaciones de pantalla de bloqueo y ajustes de aplicación
|
||||||
|
xdg-entry-panel = Barra
|
||||||
|
xdg-entry-panel-comment = Barra principal del sistema para menús y applets
|
||||||
|
xdg-entry-power = Energía y batería
|
||||||
|
xdg-entry-power-comment = Modos de energía y opciones de ahorro de energía
|
||||||
|
xdg-entry-region-language = Región e Idioma
|
||||||
|
xdg-entry-region-language-comment = Formato de fechas, horas y números según su región
|
||||||
|
xdg-entry-sound = Sonido
|
||||||
|
xdg-entry-sound-comment = Configuraciones de audio para dispositivos, alertas y aplicaciones
|
||||||
|
xdg-entry-system = Sistema y cuentas
|
||||||
|
xdg-entry-system-comment = Información del sistema, cuentas y firmware
|
||||||
|
xdg-entry-time-language = Hora e Idioma
|
||||||
|
xdg-entry-touchpad = Panel táctil
|
||||||
|
xdg-entry-touchpad-comment = Velocidad del panel táctil, opciones de clic, gestos
|
||||||
|
xdg-entry-users = Usuarios
|
||||||
|
xdg-entry-users-comment = Autenticación y cuentas de usuario
|
||||||
|
xdg-entry-vpn-comment = Conexiones VPN y perfiles de conexión
|
||||||
|
xdg-entry-wallpaper = Fondo de pantalla
|
||||||
|
xdg-entry-wallpaper-comment = Imágenes de fondo, colores y opciones de carrusel de imágenes
|
||||||
|
xdg-entry-window-management = Gestión de ventanas
|
||||||
|
xdg-entry-window-management-comment = Acción de la tecla Super, opciones de control de ventana y opciones adicionales de mosaico de ventana
|
||||||
|
xdg-entry-wired = Red cableada
|
||||||
|
xdg-entry-wired-comment = Conexiones cableadas y perfiles de conexión
|
||||||
|
xdg-entry-wireless-comment = Conexiones Wi-Fi y perfiles de conexión
|
||||||
|
xdg-entry-workspaces = Espacios de trabajo
|
||||||
|
xdg-entry-workspaces-comment = Orientación de los espacios de trabajo y comportamiento
|
||||||
|
xdg-entry-x11-applications = Compatibilidad para aplicaciones X11
|
||||||
|
xdg-entry-x11-applications-comment = Escalado de aplicaciones del sistema de ventanas X11 y atajos globales
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Cableada,
|
|
||||||
[wifi] Wi-Fi,
|
|
||||||
[vpn] VPN,
|
|
||||||
*[other] Desconocida
|
|
||||||
} conexiones y perfiles de conexión.
|
|
||||||
add-network = Añadir red
|
add-network = Añadir red
|
||||||
.profile = Añadir perfil
|
.profile = Añadir perfil
|
||||||
add-vpn = Añadir VPN
|
add-vpn = Añadir VPN
|
||||||
|
|
@ -335,6 +386,11 @@ focus-navigation = Navegación de enfoque
|
||||||
|
|
||||||
workspaces = Espacios de trabajo
|
workspaces = Espacios de trabajo
|
||||||
.desc = Configurar el número de espacios de trabajo, comportamiento y ubicación.
|
.desc = Configurar el número de espacios de trabajo, comportamiento y ubicación.
|
||||||
|
workspaces-overview = Vista general de espacios de trabajo
|
||||||
|
.action-on-typing = Acción al escribir
|
||||||
|
.none = Ninguna
|
||||||
|
.launcher = Abrir lanzador
|
||||||
|
.applications = Abrir aplicaciones
|
||||||
workspaces-behavior = Comportamiento de los espacios de trabajo
|
workspaces-behavior = Comportamiento de los espacios de trabajo
|
||||||
.dynamic = Espacios de trabajo dinámicos
|
.dynamic = Espacios de trabajo dinámicos
|
||||||
.dynamic-desc = Elimina automáticamente los espacios de trabajo vacíos.
|
.dynamic-desc = Elimina automáticamente los espacios de trabajo vacíos.
|
||||||
|
|
|
||||||
7
i18n/et/cosmic_settings.ftl
vendored
7
i18n/et/cosmic_settings.ftl
vendored
|
|
@ -86,13 +86,6 @@ remove-connection-dialog = Kas soovid ühendusprofiili eemaldada?
|
||||||
.vpn-description = Kui tahad seda VPN-võrku hiljem kasutada, siis pead uuesti salasõna sisestama.
|
.vpn-description = Kui tahad seda VPN-võrku hiljem kasutada, siis pead uuesti salasõna sisestama.
|
||||||
.wired-description = Kui tahad seda võrku hiljem kasutada, siis pead profiili uuesti looma.
|
.wired-description = Kui tahad seda võrku hiljem kasutada, siis pead profiili uuesti looma.
|
||||||
app = COSMICu seadistused
|
app = COSMICu seadistused
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Traadiga
|
|
||||||
[wifi] WiFi
|
|
||||||
[vpn] VPN-i
|
|
||||||
*[other] Muud
|
|
||||||
} ühendust ja ühendusprofiili.
|
|
||||||
add-network = Lisa võrk
|
add-network = Lisa võrk
|
||||||
.profile = Lisa võrguprofiil
|
.profile = Lisa võrguprofiil
|
||||||
color-picker = Värvivalija
|
color-picker = Värvivalija
|
||||||
|
|
|
||||||
0
i18n/eu/cosmic_settings.ftl
vendored
Normal file
0
i18n/eu/cosmic_settings.ftl
vendored
Normal file
820
i18n/fi/cosmic_settings.ftl
vendored
820
i18n/fi/cosmic_settings.ftl
vendored
|
|
@ -0,0 +1,820 @@
|
||||||
|
connect = Yhdistä
|
||||||
|
known-networks = Tunnetut verkot
|
||||||
|
unknown = Tuntematon
|
||||||
|
connecting = Yhdistetään…
|
||||||
|
disconnect = Katkaise yhteys
|
||||||
|
ok = OK
|
||||||
|
app = COSMICin asetukset
|
||||||
|
number = { $number }
|
||||||
|
dbus-connection-error = DBusiin yhdistäminen epäonnistui
|
||||||
|
add-vpn = Lisää VPN
|
||||||
|
connected = Yhdistetty
|
||||||
|
forget = Unohda
|
||||||
|
add-network = Lisää verkko
|
||||||
|
.profile = Lisää profiili
|
||||||
|
xdg-entry-touchpad = Kosketuslevy
|
||||||
|
xdg-entry-region-language = Alue ja kieli
|
||||||
|
xdg-entry-bluetooth-comment = Hallitse Bluetooth-laitteita
|
||||||
|
xdg-entry-mouse = Hiiri
|
||||||
|
xdg-entry-system = Järjestelmä ja tilit
|
||||||
|
xdg-entry-a11y = Esteettömyys
|
||||||
|
xdg-entry-time-language = Aika ja kieli
|
||||||
|
xdg-entry-users = Käyttäjät
|
||||||
|
xdg-entry-default-apps = Oletussovellukset
|
||||||
|
xdg-entry-about-keywords = COSMIC;About;tietoa;tietoja
|
||||||
|
xdg-entry-panel = Paneeli
|
||||||
|
xdg-entry-notifications = Ilmoitukset
|
||||||
|
xdg-entry-wireless-comment = Wi-Fi-yhteydet ja -yhteysprofiilit
|
||||||
|
xdg-entry-desktop = Työpöytä
|
||||||
|
xdg-entry-wallpaper = Taustakuva
|
||||||
|
xdg-entry-keyboard = Näppäimistö
|
||||||
|
xdg-entry-displays = Näytöt
|
||||||
|
xdg-entry-input-comment = Näppäimistön ja hiiren asetukset
|
||||||
|
xdg-entry-dock = Telakka
|
||||||
|
xdg-entry-about-comment = Laitenimi, laitteistotiedot, käyttöjärjestelmän oletukset
|
||||||
|
xdg-entry-comment = Asetussovellus COSMIC-työpöydälle
|
||||||
|
xdg-entry-applications = Sovellukset
|
||||||
|
xdg-entry-keywords = COSMIC;Settings;asetukset;
|
||||||
|
xdg-entry-input = Syötelaitteet
|
||||||
|
xdg-entry-vpn-comment = VPN-yhteydet ja -yhteysprofiilit
|
||||||
|
xdg-entry-appearance = Ulkoasu
|
||||||
|
xdg-entry-network-comment = Hallitse verkkoyhteyksiä
|
||||||
|
xdg-entry-sound = Ääni
|
||||||
|
xdg-entry-workspaces = Työtilat
|
||||||
|
xdg-entry-x11-applications = X11-sovellusten yhteensopivuus
|
||||||
|
xdg-entry-default-apps-comment = Oletusselain, sähköposti, tiedostonhallinta ja muut sovellukset
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Desktop;työpöytä;
|
||||||
|
xdg-entry-desktop-comment = Taustakuva, ulkoasu, paneeli, telakka, ikkunanhallinta ja työtilojen asetukset
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Default;Application;oletus;sovellus;oletussovellus
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Time;Zone;aika;aikavyöhyke;
|
||||||
|
xdg-entry-date-time-comment = Aikavyöhyke, automaattiset kellon asetukset ja ajan muotoilu
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
xdg-entry-a11y-comment = Näytönlukija, suurennuslasi, suuri kontrasti ja värisuodattimet
|
||||||
|
time-region = Alue ja kieli
|
||||||
|
region = Alue
|
||||||
|
about-hardware = Laitteisto
|
||||||
|
.model = Laitteistomalli
|
||||||
|
.memory = Muisti
|
||||||
|
.processor = Suoritin
|
||||||
|
.graphics = Grafiikka
|
||||||
|
.disk-capacity = Levyn kapasiteetti
|
||||||
|
about-os = Käyttöjärjestelmä
|
||||||
|
.os = Käyttöjärjestelmä
|
||||||
|
.os-architecture = Käyttöjärjestelmän arkkitehtuuri
|
||||||
|
.kernel = Ytimen versio
|
||||||
|
.desktop-environment = Työpöytäympäristö
|
||||||
|
.windowing-system = Ikkunointijärjestelmä
|
||||||
|
add-language = Lisää kieli
|
||||||
|
.context = Lisää kieli
|
||||||
|
firmware = Laiteohjelmisto
|
||||||
|
open-workspaces-view = Avaa työtilojen yleiskuva
|
||||||
|
preferred-languages = Ensisijaiset kielet
|
||||||
|
.desc = Kielten järjestys määrittää käyttöliittymässä käytetyn kielen. Muutokset tulevat voimaan seuraavalla kirjautumiskerralla.
|
||||||
|
about-device = Laitenimi
|
||||||
|
.desc = Tämä näkyy muille verkon käyttäjille tai Bluetooth-laitteille
|
||||||
|
window-tiling = Ikkunoiden asettelu
|
||||||
|
.horizontal = Aseta vaakasuuntaan
|
||||||
|
.vertical = Aseta pystysuuntaan
|
||||||
|
.swap-window = Vaihda ikkunaa
|
||||||
|
.toggle-tiling = Vaihda asettelun tilaa
|
||||||
|
.toggle-stacking = Vaihda ikkunoiden pinoamisen tilaa
|
||||||
|
.toggle-floating = Vaihda kelluvan ikkunan tilaa
|
||||||
|
.toggle-orientation = Vaihda suuntaa
|
||||||
|
applications = Sovellukset
|
||||||
|
legacy-applications = X11-sovellusten yhteensopivuus
|
||||||
|
install-additional-languages = Asenna lisäkieliä
|
||||||
|
replace = Korvaa
|
||||||
|
time-zone = Aikavyöhyke
|
||||||
|
.auto = Automaattinen aikavyöhyke
|
||||||
|
.auto-info = Vaatii sijaintipalvelun ja verkkoyhteyden
|
||||||
|
system = Järjestelmä ja tilit
|
||||||
|
time = Aika ja kieli
|
||||||
|
close = Sulje
|
||||||
|
password = Salasana
|
||||||
|
import = Tuo
|
||||||
|
export = Vie
|
||||||
|
appearance = Ulkoasu
|
||||||
|
light = Vaalea
|
||||||
|
identity = Identiteetti
|
||||||
|
type-to-search = Etsi kirjoittamalla…
|
||||||
|
password-confirm = Vahvista salasana
|
||||||
|
dark = Tumma
|
||||||
|
cancel = Peru
|
||||||
|
confirm = Vahvista
|
||||||
|
settings = Asetukset
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Startup;Application;käynnistys;sovellus;
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Panel;Applet;paneeli;sovelma
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Application;Game;Compatibility;sovellus;peli;yhteensopivuus;
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;Touchpad;Gesture;kosketuslevy;ele;
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Workspace;Orientation;Overview;Monitor;työtila;suunta;yleiskuva;yleisnäkymä;
|
||||||
|
x-minutes =
|
||||||
|
{ $number } { $number ->
|
||||||
|
[one] minuutti
|
||||||
|
*[other] minuuttia
|
||||||
|
}
|
||||||
|
vrr = Vaihteleva virkistystaajuus
|
||||||
|
.enabled = Käytössä
|
||||||
|
.force = Aina
|
||||||
|
.auto = Automaattinen
|
||||||
|
.disabled = Ei käytössä
|
||||||
|
fit-to-screen = Sovita näytölle
|
||||||
|
save = Tallenna
|
||||||
|
no-applets-found = Sovelmia ei löytynyt…
|
||||||
|
zoom-in = Lähennä
|
||||||
|
place-here = Sijoita sovelmat tähän
|
||||||
|
-requires-restart = Vaatii uudelleenkäynnistyksen
|
||||||
|
workspaces-orientation = Työtilojen suunta
|
||||||
|
.vertical = Pysty
|
||||||
|
.horizontal = Vaaka
|
||||||
|
all-displays = Kaikki näytöt
|
||||||
|
short = Lyhyt
|
||||||
|
bluetooth-available = Lähellä olevat laitteet
|
||||||
|
cable-unplugged = Kaapeli irrotettu
|
||||||
|
color-picker = Värivalitsin
|
||||||
|
interface-font = Järjestelmäfontti
|
||||||
|
remove = Poista
|
||||||
|
default = Oletus
|
||||||
|
zoom-out = Loitonna
|
||||||
|
password-mismatch = Salasanan ja vahvistuksen tulee täsmätä
|
||||||
|
switch-between-windows = Vaihda ikkunoiden välillä
|
||||||
|
sound-usb-audio = USB-ääni
|
||||||
|
all = Kaikki
|
||||||
|
remove-user = Poista käyttäjä
|
||||||
|
copy-to-clipboard = Kopioi leikepöydälle
|
||||||
|
monospace-font = Tasalevyinen fontti
|
||||||
|
experimental-settings = Kokeelliset asetukset
|
||||||
|
recent-folders = Viimeaikaiset kansiot
|
||||||
|
search-applets = Etsi sovelmia…
|
||||||
|
window-management = Ikkunanhallinta
|
||||||
|
x-hours =
|
||||||
|
{ $number } { $number ->
|
||||||
|
[one] tunti
|
||||||
|
*[other] tuntia
|
||||||
|
}
|
||||||
|
added = Lisätty
|
||||||
|
full-name = Koko nimi
|
||||||
|
app-background = Ikkunan tausta
|
||||||
|
sound-device-profiles = Laiteprofiilit
|
||||||
|
dock = Telakka
|
||||||
|
sound-hd-audio = HD-ääni
|
||||||
|
network-and-wireless = Verkko ja langaton
|
||||||
|
no-vpn = VPN-yhteyksiä ei ole saatavilla.
|
||||||
|
desktop = Työpöytä
|
||||||
|
sound = Ääni
|
||||||
|
qr-code-unavailable = QR-koodi ei ole saatavilla
|
||||||
|
small = Pieni
|
||||||
|
change-password = Vaihda salasana
|
||||||
|
disable-while-typing = Poista käytöstä kirjoitettaessa
|
||||||
|
long = Pitkä
|
||||||
|
copied-to-clipboard = Kopioitu leikepöydälle
|
||||||
|
visible-networks = Näkyvät verkot
|
||||||
|
applets = Sovelmat
|
||||||
|
workspaces = Työtilat
|
||||||
|
slow = Hidas
|
||||||
|
network-name = Verkon nimi
|
||||||
|
large = Suuri
|
||||||
|
panel = Paneeli
|
||||||
|
add-user = Lisää käyttäjä
|
||||||
|
add-image = Lisää kuva
|
||||||
|
add-applet = Lisää sovelma
|
||||||
|
orientation = Suunta
|
||||||
|
.standard = Oletus
|
||||||
|
.rotate-90 = Käännä 90°
|
||||||
|
.rotate-180 = Käännä 180°
|
||||||
|
.rotate-270 = Käännä 270°
|
||||||
|
auto = Automaattinen
|
||||||
|
bluetooth-adapters = Bluetooth-sovittimet
|
||||||
|
accent-color = Korostusväri
|
||||||
|
never = Ei koskaan
|
||||||
|
keyboard = Näppäimistö
|
||||||
|
dialog-add = Lisää
|
||||||
|
fast = Nopea
|
||||||
|
add-color = Lisää väri
|
||||||
|
command = Komento
|
||||||
|
no-networks = Verkkoja ei löytynyt.
|
||||||
|
open-new-folder = Avaa uusi kansio
|
||||||
|
share = Jaa verkko
|
||||||
|
add = Lisää
|
||||||
|
fill = Täytä
|
||||||
|
color = Väri
|
||||||
|
.depth = Värisyvyys
|
||||||
|
.profile = Väriprofiili
|
||||||
|
.sidebar = Väriprofiilit
|
||||||
|
.temperature = Värilämpötila
|
||||||
|
colors = Värit
|
||||||
|
scan-to-connect-description = Yhdistä tähän verkkoon lukemalla QR-koodi.
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-wallpaper-comment = Taustakuvat, -värit ja diaesityksen valinnat
|
||||||
|
xdg-entry-users-keywords = COSMIC;User;Account;käyttäjä;tili;tunnus;käyttäjätili;käyttätunnus;
|
||||||
|
wifi = Wi-Fi
|
||||||
|
.adapter = Wi-Fi-sovitin { $id }
|
||||||
|
.forget = Unohda tämä verkko
|
||||||
|
notifications = Ilmoitukset
|
||||||
|
input-devices = Syötelaitteet
|
||||||
|
xdg-entry-wired = Kiinteä
|
||||||
|
xdg-entry-startup-apps-comment = Määritä kirjautumisen jälkeen käynnistettävät sovellukset
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Notification;Lock;ilmoitus;lukitus;
|
||||||
|
xdg-entry-keyboard-comment = Syötelähteet, vaihtaminen, erikoismerkkien syöttäminen, pikanäppäimet
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Wired;LAN;Network;Connection;kiinteä;paikallisverkko;langallinen;verkko;yhteys;
|
||||||
|
xdg-entry-power = Virranhallinta ja akku
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Dock;Panel;Applet;telakka;paneeli;sovelma
|
||||||
|
xdg-entry-window-management = Ikkunanhallinta
|
||||||
|
xdg-entry-time-language-comment = Hallitse järjestelmän päivää, kellonaikaa, aluetta ja kieltä
|
||||||
|
xdg-entry-system-keywords = COSMIC;System;Info;Accounts;Firmware;järjestelmä;tiedot;tilit;laiteohjelmisto;
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;Network;Connection;langaton;verkko;yhteys;
|
||||||
|
xdg-entry-applications-comment = Oletussovellukset, käynnistettävät sovellukset ja X11-sovellusten yhteensopivuusasetukset
|
||||||
|
xdg-entry-network = Verkko ja langaton
|
||||||
|
xdg-entry-users-comment = Tunnistus ja käyttäjätilit
|
||||||
|
xdg-entry-dock-comment = Valinnainen palkki sovelluksille ja sovelmille
|
||||||
|
xdg-entry-network-keywords = COSMIC;Network;Wireless;WiFi;VPN;verkko;langaton;erillisverkko;
|
||||||
|
xdg-entry-startup-apps = Käynnistettävät sovellukset
|
||||||
|
xdg-entry-x11-applications-comment = X11-ikkunajärjestelmän sovellusskaalaus, ensisijainen näyttö ja yleiset pikanäppäimet
|
||||||
|
xdg-entry-region-language-comment = Muotoile päivät, kellonajat ja numerot alueesi mukaisesti
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Network;Connection;OpenVPN;OpenConnect;verkko;yhteys;netti;
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;System;Time;Date;Region;Language;järjestelmä;aika;kello;päivä;alue;kieli;
|
||||||
|
xdg-entry-input-keywords = COSMIC;Input;Keyboard;Mouse;Mice;syöte;sisääntulo;näppäimistö;hiiri;
|
||||||
|
xdg-entry-notifications-comment = Älä häiritse, lukitusnäytön ilmoitukset ja sovelluskohtaiset asetukset
|
||||||
|
xdg-entry-sound-keywords = COSMIC;Sound;Audio;Alert;Pipewire;ääni;hälytys;
|
||||||
|
xdg-entry-power-keywords = COSMIC;Power;Battery;virta;virranhallinta;akku
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Region;Language;Date;Format;Time;Locale;Localization;alue;kieli;päivä;päiväys;muotoile;muoto;aika;kello;lokaali;maa-asetus;lokalisointi;kotoistus;
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Default;Application;Startup;X11;Compatibility;oletus;ohjelma;sovellus;äppi;käynnistys;yhteensopivuus
|
||||||
|
xdg-entry-sound-comment = Ääniasetukset laitteille, hälytyksille ja sovelluksille
|
||||||
|
xdg-entry-touchpad-comment = Kosketuslevyn nopeus, napsautusvalinnat ja eleet
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Keyboard;Input;Source;Shortcuts;näppäimistö;syöte;sisääntulo;lähde;pikanäppäimet;
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;Window;Management;Tiling;Super;Key;ikkuna;ikkunanhallinta;laatoitus;laatoita;aseta;asettelu;
|
||||||
|
xdg-entry-workspaces-comment = Työtilan suunta, yleiskuva ja usean näytön toiminta
|
||||||
|
xdg-entry-panel-comment = Ensisijainen järjestelmäpalkki valikoille ja sovelmille
|
||||||
|
xdg-entry-power-comment = Tehotilat ja virransäästön asetukset
|
||||||
|
xdg-entry-window-management-comment = Super-näppäimen toiminta, ikkunasäädinten valinnat, ikkunoiden asettelun lisävalinnat
|
||||||
|
xdg-entry-wired-comment = Kiinteät yhteydet ja yhteysprofiilit
|
||||||
|
add-another-keybinding = Lisää toinen näppäinsidos
|
||||||
|
reset-to-default = Palauta oletukseksi
|
||||||
|
airplane-on = Lentotila on käytössä.
|
||||||
|
xdg-entry-system-comment = Järjestelmän tiedot, tilit ja laiteohjelmistopäivitykset
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Mouse;Acceleration;Scrolling;hiiri;kiihdytys;vieritys;skrollaus;
|
||||||
|
xdg-entry-mouse-comment = Hiiren nopeus, kiihdytys ja luonnollinen vieritys
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Display;näyttö;monitori;
|
||||||
|
xdg-entry-displays-comment = Hallitse näyttöön liittyviä asetuksia
|
||||||
|
xdg-entry-date-time = Päivä ja aika
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Accent;Color;Icon;Font;Theme;korostus;aksentti;väri;kuvake;ikoni;fontti;kirjasin;teema
|
||||||
|
xdg-entry-appearance-comment = Korostusvärit ja teemat
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Accessibility;A11y;Screen;Reader;Magnifier;Contrast;Color;esteettömyys;näytönlukija;ruudunluku;suurennuslasi;kontrasti;väri;
|
||||||
|
xdg-entry-about = Tietoa
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Wallpaper;Background;Slideshow;taustakuva;tausta;diaesitys;
|
||||||
|
forget-dialog = Unohdetaanko tämä Wi-Fi-verkko?
|
||||||
|
.description = Sinun tulee kirjoittaa Wi-Fi-verkon salasana uudelleen käyttääksesi tätä verkkoa myöhemmin.
|
||||||
|
username = Käyttäjätunnus
|
||||||
|
remove-connection-dialog = Poistetaanko yhteysprofiili?
|
||||||
|
.vpn-description = Yhdistääksesi tähän verkkoon myöhemmin tarvitset taas sen salasanan.
|
||||||
|
.wired-description = Käyttääksesi tätä profiilia myöhemmin se pitää luoda uudelleen.
|
||||||
|
auth-dialog = Tunnistautuminen vaaditaan
|
||||||
|
.vpn-description = Anna VPN-palvelun vaatima käyttäjätunnus ja salasana.
|
||||||
|
.wifi-description = Anna salasana tai salausavain. Voit yhdistää myös painamalla reitittimen ”WPS”-painiketta.
|
||||||
|
network-device-state =
|
||||||
|
.activated = Yhdistetty
|
||||||
|
.config = Yhdistetään
|
||||||
|
.deactivating = Katkaistaan yhteyttä
|
||||||
|
.disconnected = Yhteys katkaistu
|
||||||
|
.failed = Yhdistäminen epäonnistui
|
||||||
|
.ip-check = Tarkistetaan yhteyttä
|
||||||
|
.ip-config = Kysellään IP- ja reititystietoa
|
||||||
|
.need-auth = Vaatii tunnistautumisen
|
||||||
|
.prepare = Valmistellaan yhteyttä
|
||||||
|
.secondaries = Odotetaan toissijaista yhteyttä
|
||||||
|
.unavailable = Ei käytettävissä
|
||||||
|
.unknown = Tuntematon tila
|
||||||
|
.unmanaged = Ei hallinnoitu
|
||||||
|
.unplugged = Kaapeli irrotettu
|
||||||
|
panel-left = Vasemmalla
|
||||||
|
super-key = Super-näppäimen toiminta
|
||||||
|
.launcher = Avaa käynnistin
|
||||||
|
.workspaces = Avaa työtilat
|
||||||
|
.applications = Avaa sovellukset
|
||||||
|
.disable = Poista käytöstä
|
||||||
|
window-hint-accent = Aktiivisen ikkunan vihjeväri
|
||||||
|
power = Virranhallinta ja akku
|
||||||
|
control-tint = Hallitse osien sävyä
|
||||||
|
.desc = Käytetään vakiopainikkeiden, haku- ja syötekenttien ja vastaavien käyttöliittymän elementtien taustaan
|
||||||
|
time-date = Päiväys ja kellonaika
|
||||||
|
.auto = Aseta automaattisesti
|
||||||
|
.auto-ntp = Päiväys ja kellonaika päivittyvät automaattisesti, kun aikavyöhyke on asetettu
|
||||||
|
vpn-error = VPN-virhe
|
||||||
|
.config = VPN-määrityksen lisääminen epäonnistui
|
||||||
|
.connect = VPN:ään yhdistäminen epäonnistui
|
||||||
|
.connection-editor = Yhteyden muokkaaminen epäonnistui
|
||||||
|
.connection-settings = Aktiivisten yhteyksien asetuksia ei saatu noudettua
|
||||||
|
.updating-state = Verkonhallinnan tilan päivittäminen epäonnistui
|
||||||
|
.wireguard-config-path = Virheellinen tiedoston sijainti WireGuard-määritykselle
|
||||||
|
.wireguard-config-path-desc = Valitun tiedoston on sijaittava paikallisessa tiedostojärjestelmässä
|
||||||
|
.wireguard-device = WireGuard-laitteen luominen epäonnistui
|
||||||
|
.with-password =
|
||||||
|
VPN:n { $field ->
|
||||||
|
*[username] käyttäjätunnuksen
|
||||||
|
[password] salasanan
|
||||||
|
[password-flags] salasanalippujen
|
||||||
|
} asettaminen nmcli:llä epäonnistui
|
||||||
|
toggle-stacking = Vaihda ikkunoiden pinoamisen tila
|
||||||
|
panel-top = Ylhäällä
|
||||||
|
acceleration-desc = Säätää jäljitysherkkyyttä automaattisesti nopeuden mukaan
|
||||||
|
scheduling = Ajastus
|
||||||
|
.manual = Käyttäjän asettama aikataulu
|
||||||
|
frosted = Järjestelmäkäyttöliittymän jäätynyt lasi -tehoste
|
||||||
|
.desc = Käyttää taustasumennusta paneeliin, telakkaan, sovelmiin, käynnistimeen ja sovelluskirjastoon
|
||||||
|
vpn = VPN
|
||||||
|
.connection = VPN-yhteydet
|
||||||
|
.error = VPN-määrityksen lisääminen epäonnistui
|
||||||
|
.remove = Poista yhteysprofiili
|
||||||
|
.select-file = Valitse VPN-määritystiedosto
|
||||||
|
power-mode = Tehotila
|
||||||
|
.battery = Pidennetty akunkesto
|
||||||
|
.battery-desc = Pienempi virrankulutus, hiljainen suorituskyky
|
||||||
|
.balanced = Tasapainotettu
|
||||||
|
.balanced-desc = Hiljainen suorituskyky, keskitason virrankulutus
|
||||||
|
.performance = Hyvä suorituskyky
|
||||||
|
.performance-desc = Erinomainen suorituskyky, suuri virrankulutus
|
||||||
|
.no-backend = Taustajärjestelmää ei löytynyt. Asenna system76-power tai power-profiles-daemon.
|
||||||
|
wired = Lankaverkko
|
||||||
|
.adapter = Lankaverkkosovitin { $id }
|
||||||
|
.connections = Lankaverkkoyhteydet
|
||||||
|
.devices = Lankaverkkolaitteet
|
||||||
|
.remove = Poista yhteysprofiili
|
||||||
|
hot-corner = Aktivointikulma
|
||||||
|
.top-left-corner = Käytä vasenta yläkulmaa työtilojen aktivointiin
|
||||||
|
keyboard-typing-assist = Kirjoittaminen
|
||||||
|
.repeat-rate = Toistonopeus
|
||||||
|
.repeat-delay = Toistoviive
|
||||||
|
edge-gravity = Kelluvat ikkunat vedetään läheisiin reunoihin
|
||||||
|
bluetooth = Bluetooth
|
||||||
|
.status = Bluetooth-asetusten ollessa auki tämä järjestelmä näkyy nimellä { $aliases }
|
||||||
|
.connected = Yhdistetty
|
||||||
|
.connecting = Yhdistetään
|
||||||
|
.disconnecting = Katkaistaan yhteyttä
|
||||||
|
.connect = Yhdistä
|
||||||
|
.disconnect = Katkaise yhteys
|
||||||
|
.forget = Unohda
|
||||||
|
.dbus-error = DBus-vuorovaikutuksessa tapahtui virhe: { $why }
|
||||||
|
.disabled = Bluetooth-palvelu ei ole käytössä
|
||||||
|
.inactive = Bluetooth-palvelu ei ole aktiivinen
|
||||||
|
.unknown = Bluetooth-palvelua ei voitu aktivoida. Onko BlueZ asennettu?
|
||||||
|
amplification = Vahvistus
|
||||||
|
.desc = Sallii äänenvoimakkuuden noston 150 prosenttiin asti
|
||||||
|
recent-colors = Viimeaikaiset värit
|
||||||
|
panel-behavior-and-position = Toiminta ja sijainnit
|
||||||
|
.autohide = Piilota paneeli automaattisesti
|
||||||
|
.dock-autohide = Piilota telakka automaattisesti
|
||||||
|
.position = Sijainti näytöllä
|
||||||
|
.display = Näytä näytöllä
|
||||||
|
container-background = Säilön tausta
|
||||||
|
.desc-detail = Säilön taustaväriä käytetään navigointisivupaneeliin, sivuhyllyyn, valintaikkunoihin ja vastaaviin käyttöliittymän elementteihin. Oletuksena säilön taustaväri johdetaan automaattisesti ikkunan taustasta.
|
||||||
|
.reset = Palaa automaattiseen
|
||||||
|
.desc = Käytetään navigointisivupaneeliin, sivuhyllyyn, valintaikkunoihin ja vastaaviin käyttöliittymän elementteihin
|
||||||
|
primary-button = Ensisijainen painike
|
||||||
|
.desc = Asettaa fyysisten painikkeiden järjestyksen
|
||||||
|
.left = Vasen
|
||||||
|
.right = Oikea
|
||||||
|
sound-alerts = Hälytykset
|
||||||
|
.volume = Äänenvoimakkuus
|
||||||
|
.sound = Hälytysääni
|
||||||
|
icon-theme = Kuvaketeema
|
||||||
|
.desc = Käyttää sovelluksiin eri kuvakejoukkoa
|
||||||
|
keyboard-shortcuts = Pikanäppäimet
|
||||||
|
.desc = Näytä pikanäppäimet ja mukauta niitä
|
||||||
|
text-tint = Käyttöliittymän tekstin sävytys
|
||||||
|
.desc = Käytetään johtamaan käyttöliittymään tekstivärit, joilla on eri pinnoille riittävä kontrasti
|
||||||
|
online-accounts = Verkkotilit
|
||||||
|
.desc = Lisää IMAP-, SMTP- ja yritysverkkotilejä
|
||||||
|
default-apps = Oletussovellukset
|
||||||
|
.web-browser = Selain
|
||||||
|
.file-manager = Tiedostonhallinta
|
||||||
|
.mail-client = Sähköposti
|
||||||
|
.music = Musiikki
|
||||||
|
.video = Video
|
||||||
|
.photos = Kuvat
|
||||||
|
.calendar = Kalenteri
|
||||||
|
.terminal = Pääte
|
||||||
|
.other-associations = Muut kytkökset
|
||||||
|
.text-editor = Tekstimuokkain
|
||||||
|
.not-installed = Ei asennettu
|
||||||
|
sound-input = Sisääntulo
|
||||||
|
.volume = Äänenvoimakkuus
|
||||||
|
.device = Laite
|
||||||
|
.level = Äänen taso
|
||||||
|
color-filter = Värisuodatintyyppi
|
||||||
|
.unknown = Aktiivisena tuntematon suodatin
|
||||||
|
.greyscale = Harmaasävy
|
||||||
|
.deuteranopia = Vihreä/punainen (vihreä heikko, deuteranopia)
|
||||||
|
.protanopia = Punainen/vihreä (punainen heikko, protanopia)
|
||||||
|
.tritanopia = Sininen/keltainen (sininen heikko, tritanopia)
|
||||||
|
migrate-workspace =
|
||||||
|
Siirrä työtila { $direction ->
|
||||||
|
*[down] alempaan
|
||||||
|
[left] vasemmanpuoleiseen
|
||||||
|
[right] oikeanpuoleiseen
|
||||||
|
[up] ylempään
|
||||||
|
} ulostuloon
|
||||||
|
battery = Akku
|
||||||
|
.minute =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] minuutti
|
||||||
|
*[other] minuuttia
|
||||||
|
}
|
||||||
|
.hour =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] tunti
|
||||||
|
*[other] tuntia
|
||||||
|
}
|
||||||
|
.day =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] päivä
|
||||||
|
*[other] päivää
|
||||||
|
}
|
||||||
|
.less-than-minute = Alle minuutti
|
||||||
|
.and = ja
|
||||||
|
.remaining-time =
|
||||||
|
{ $time } kunnes { $action ->
|
||||||
|
[full] täynnä
|
||||||
|
*[other] tyhjä
|
||||||
|
}
|
||||||
|
pinch-to-zoom = Tarkenna nipistämällä
|
||||||
|
.desc = Lähennä sisältöön kahden sormen nipistyseleellä (lähennystä tukevissa sovelluksissa)
|
||||||
|
input-source-switch = Vaihda näppäimistökielen syötelähde
|
||||||
|
focus-navigation = Kohdistusnavigointi
|
||||||
|
.focus-follows-cursor = Kohdistus seuraa osoitinta
|
||||||
|
.focus-follows-cursor-delay = Kohdistus seuraa osoitinta viipellä (ms)
|
||||||
|
.cursor-follows-focus = Osoitin seuraa kohdistusta
|
||||||
|
panel-right = Oikealla
|
||||||
|
mouse = Hiiri
|
||||||
|
.speed = Hiiren nopeus
|
||||||
|
.acceleration = Käytä hiiren kiihdytystä
|
||||||
|
keyboard-sources = Syötelähteet
|
||||||
|
.desc = Syötelähdettä voi vaihtaa Super+välilyönti-näppäinyhdistelmällä. Tätä voi mukauttaa pikanäppäinasetuksista.
|
||||||
|
.move-up = Siirry ylemmäs
|
||||||
|
.move-down = Siirry alemmas
|
||||||
|
.settings = Asetukset
|
||||||
|
.view-layout = Näytä näppäimistöasettelu
|
||||||
|
.remove = Poista
|
||||||
|
.add = Lisää syötelähde
|
||||||
|
nav-shortcuts = Navigointi
|
||||||
|
.prev-output = Kohdista edelliseen ulostuloon
|
||||||
|
.next-output = Kohdista seuraavaan ulostuloon
|
||||||
|
.last-workspace = Kohdista viimeiseen työtilaan
|
||||||
|
.prev-workspace = Kohdista edelliseen työtilaan
|
||||||
|
.next-workspace = Kohdista seuraavaan työtilaan
|
||||||
|
.focus =
|
||||||
|
Kohdista { $direction ->
|
||||||
|
*[down] alempaan
|
||||||
|
[in] sisempään
|
||||||
|
[left] vasemmanpuoleiseen
|
||||||
|
[out] ulompaan
|
||||||
|
[right] oikeanpuoleiseen
|
||||||
|
[up] ylempään
|
||||||
|
} ikkunaan
|
||||||
|
.output =
|
||||||
|
Vaihda { $direction ->
|
||||||
|
*[down] alempaan
|
||||||
|
[left] vasemmanpuoleiseen
|
||||||
|
[right] oikeanpuoleiseen
|
||||||
|
[up] ylempään
|
||||||
|
} ulostuloon
|
||||||
|
.workspace = Vaihda työtilaan { $num }
|
||||||
|
hearing = Kuuleminen
|
||||||
|
.mono = Toista stereoääni monona
|
||||||
|
display = Näytöt
|
||||||
|
.arrangement = Näyttöjen järjestäminen
|
||||||
|
.arrangement-desc = Järjestä näytöt vetämällä
|
||||||
|
.enable = Ota käyttöön
|
||||||
|
.external = { $size } { $output } ulkoinen näyttö
|
||||||
|
.laptop = { $size } kannettavan näyttö
|
||||||
|
.options = Näyttövalinnat
|
||||||
|
.refresh-rate = Virkistystaajuus
|
||||||
|
.resolution = Tarkkuus
|
||||||
|
.scale = Mittakaava
|
||||||
|
.additional-scale-options = Mittakaavan lisävalinnat
|
||||||
|
panel-style = Tyyli
|
||||||
|
.anchor-gap = Paneelin ja näytön reunojen välinen tyhjä tila
|
||||||
|
.dock-anchor-gap = Telakan ja näytön reunojen välinen tyhjä tila
|
||||||
|
.extend = Laajenna paneeli näytön reunoille
|
||||||
|
.dock-extend = Laajenna telakka näytön reunoille
|
||||||
|
.appearance = Ulkoasu
|
||||||
|
.size = Koko
|
||||||
|
.background-opacity = Taustan peittävyys
|
||||||
|
panel-appearance = Ulkoasu
|
||||||
|
.match = Sama kuin työpöydällä
|
||||||
|
.light = Vaalea
|
||||||
|
.dark = Tumma
|
||||||
|
workspaces-multi-behavior = Useamman näytön toiminta
|
||||||
|
.span = Työtilat jakautuvat näytöille
|
||||||
|
.separate = Kullakin näytöllä oma työtilansa
|
||||||
|
replace-shortcut-dialog = Korvataanko pikanäppäin?
|
||||||
|
.desc = { $shortcut } on jo käytössä toimintoon: { $name }. Jos korvaat pikanäppäimen, { $name } poistuu käytöstä.
|
||||||
|
rgb = RGB
|
||||||
|
start-segment = Alkualue
|
||||||
|
enable-export = Käytä nykyistä teemaa Gnome-sovelluksiin
|
||||||
|
.desc = Kaikki työkalukirjastot eivät tue automaattista vaihtoa. Muut kuin COSMIC-sovellukset pitää ehkä käynnistää uudelleen teeman vaihtamisen jälkeen.
|
||||||
|
shortcut-name = Pikanäppäimen nimi
|
||||||
|
style = Tyyli
|
||||||
|
.round = Pyöristetty
|
||||||
|
.slightly-round = Hieman pyöristetty
|
||||||
|
.square = Nelikulmainen
|
||||||
|
panel-applets = Asetukset
|
||||||
|
.dock-desc = Telakkasovelmien asetukset
|
||||||
|
.desc = Paneelisovelmien asetukset
|
||||||
|
bluetooth-confirm-pin = Vahvista Bluetoothin PIN
|
||||||
|
.description = Vahvista, että seuraava PIN vastaa laitteella { $device } näkyvää
|
||||||
|
startup-apps = Käynnistettävät sovellukset
|
||||||
|
.add = Lisää sovellus
|
||||||
|
.user = Kirjauduttaessa käynnistettävät sovellukset
|
||||||
|
.none = Käynnistettäviä sovelluksia ei ole lisätty
|
||||||
|
.remove-dialog-title = Poistetaanko { $name }?
|
||||||
|
.remove-dialog-description = Poistetaanko tämän sovelluksen käynnistys?
|
||||||
|
.add-startup-app = Lisää käynnistettävä sovellus
|
||||||
|
legacy-app-scaling = X11-ikkunointijärjestelmän sovellusten mittakaava
|
||||||
|
.scaled-gaming = Optimoi pelaamiseen ja koko näytön sovelluksille
|
||||||
|
.gaming-description = X11-sovellukset voivat näkyä hieman eri koossa Wayland-sovelluksiin verrattuna
|
||||||
|
.scaled-applications = Optimoi sovelluksille
|
||||||
|
.applications-description = Pelit ja koko näytön X11-sovellukset eivät välttämättä vastaa näytön tarkkuutta
|
||||||
|
.scaled-compatibility = Parhaan yhteensopivuuden tila
|
||||||
|
.compatibility-description = X11-sovellukset voivat HiDPI-näytöissä vaikuttaa sumeilta
|
||||||
|
.preferred-display = Ensisijainen näyttö peleille ja koko näytön X11-sovelluksille
|
||||||
|
.no-display = Ei mitään
|
||||||
|
night-light = Yövalo
|
||||||
|
.auto = Automaattinen (auringonnoususta auringonlaskuun)
|
||||||
|
.desc = Vähennä sinistä valoa lämpimillä väreillä
|
||||||
|
about = Tietoa
|
||||||
|
custom-shortcuts = Mukautetut pikanäppäimet
|
||||||
|
.add = Lisää pikanäppäin
|
||||||
|
.context = Lisää mukautettu pikanäppäin
|
||||||
|
.none = Ei mukautettuja pikanäppäimiä
|
||||||
|
terminate = Lopeta
|
||||||
|
window-hint-accent-toggle = Käytä teeman korostusväriä aktiivisen ikkunan vihjevärinä
|
||||||
|
workspaces-behavior = Työtilan toiminta
|
||||||
|
.dynamic = Dynaamiset työtilat
|
||||||
|
.dynamic-desc = Poista tyhjät työtilat automaattisesti.
|
||||||
|
.fixed = Kiinteä määrä työtiloja
|
||||||
|
.fixed-desc = Lisää tai poista työtiloja yleiskuvassa.
|
||||||
|
wireguard-dialog = Lisää WireGuard-laite
|
||||||
|
.description = Valitse WireGuard-määrityksen laitenimi.
|
||||||
|
click-behavior = Napsautuksen toiminta
|
||||||
|
.click-finger = Toissijainen napsautus kahdella, keskinapsautus kolmella sormella
|
||||||
|
.button-areas = Toissijainen napsautus oikeasta alakulmasta, keskinapsautus keskeltä
|
||||||
|
move-windows = Siirrä ikkunoita
|
||||||
|
.direction =
|
||||||
|
Siirrä ikkunaa { $direction ->
|
||||||
|
*[down] alemmas
|
||||||
|
[left] vasempaan
|
||||||
|
[right] oikeaan
|
||||||
|
[up] ylemmäs
|
||||||
|
}
|
||||||
|
.display =
|
||||||
|
Siirrä ikkunaa näytön verran { $direction ->
|
||||||
|
*[down] alemmas
|
||||||
|
[left] vasempaan
|
||||||
|
[right] oikeaan
|
||||||
|
[up] ylemmäs
|
||||||
|
}
|
||||||
|
.workspace =
|
||||||
|
Siirrä ikkunaa työtilan verran { $direction ->
|
||||||
|
*[below] alemmas
|
||||||
|
[left] vasempaan
|
||||||
|
[right] oikeaan
|
||||||
|
[above] ylemmäs
|
||||||
|
}
|
||||||
|
.workspace-num = Siirrä ikkuna työtilaan { $num }
|
||||||
|
.prev-workspace = Siirrä ikkuna edelliseen työtilaan
|
||||||
|
.next-workspace = Siirrä ikkuna seuraavaan työtilaan
|
||||||
|
.last-workspace = Siirrä ikkuna viimeiseen työtilaan
|
||||||
|
.next-display = Siirrä ikkuna seuraavaan näyttöön
|
||||||
|
.prev-display = Siirrä ikkuna edelliseen näyttöön
|
||||||
|
.send-to-prev-workspace = Siirrä ikkuna edelliseen työtilaan
|
||||||
|
.send-to-next-workspace = Siirrä ikkuna seuraavaan työtilaan
|
||||||
|
switch-workspaces = Vaihda työtilojen välillä
|
||||||
|
.horizontal = Neljän sormen pyyhkäisy vasemmalle tai oikealle
|
||||||
|
.vertical = Neljän sormen pyyhkäisy ylös tai alas
|
||||||
|
shadow-and-corners = Ikkunan varjo ja kulmat
|
||||||
|
workspaces-overview = Työtilojen yleiskuva
|
||||||
|
.action-on-typing = Toiminta kirjoitettaessa
|
||||||
|
.none = Ei mitään
|
||||||
|
.launcher = Avaa käynnistin
|
||||||
|
.applications = Avaa sovellukset
|
||||||
|
system-controls = Järjestelmäsäätimet
|
||||||
|
auto-switch = Vaihda vaalean ja tumman tilan välillä automaattisesti
|
||||||
|
.sunrise = Vaihtaa vaaleaan tilaan auringon noustessa
|
||||||
|
.sunset = Vaihtaa tummaan tilaan auringon laskiessa
|
||||||
|
.next-sunrise = Vaihtaa vaaleaan tilaan auringon seuraavan kerran noustessa
|
||||||
|
.next-sunset = Vaihtaa tummaan tilaan auringon seuraavan kerran laskiessa
|
||||||
|
keyboard-numlock-boot = Numerolukko
|
||||||
|
.boot-state = Tila käynnistettäessä
|
||||||
|
.last-boot = Viime käynnistys
|
||||||
|
.on = Käytössä
|
||||||
|
.off = Ei käytössä
|
||||||
|
.set = Aseta numerolukon tila käynnistettäessä
|
||||||
|
about-related = Muut asetukset
|
||||||
|
.support = Hanki tukea
|
||||||
|
tap-to-click = Napsauta napauttamalla
|
||||||
|
.desc = Käytä yhden sormen napautusta ensisijaiselle, kahden sormen napautusta toissijaiselle ja kolmen sormen napautusta keskipainikkeen painallukselle
|
||||||
|
interface-density = Käyttöliittymän tiiviys
|
||||||
|
.comfortable = Mukava
|
||||||
|
.compact = Tiivis
|
||||||
|
.spacious = Väljä
|
||||||
|
open-application-library = Avaa sovelluskirjasto
|
||||||
|
scrolling = Vieritys
|
||||||
|
.two-finger = Vieritä kahdella sormella
|
||||||
|
.edge = Vieritä reunasta yhdellä sormella
|
||||||
|
.speed = Vieritysnopeus
|
||||||
|
.natural = Luonnollinen vieritys
|
||||||
|
.natural-desc = Vieritä näkymän sijaan sisältöä
|
||||||
|
enable = Ota käyttöön
|
||||||
|
migrate-workspace-next = Siirrä työtila seuraavaan ulostuloon
|
||||||
|
formatting = Muotoilu
|
||||||
|
.dates = Päiväykset
|
||||||
|
.time = Kellonaika
|
||||||
|
.date-and-time = Päiväys ja kellonaika
|
||||||
|
.numbers = Luvut
|
||||||
|
.measurement = Mitat
|
||||||
|
.paper = Paperikoot
|
||||||
|
disabled = Ei käytössä
|
||||||
|
show-extended-input-sources = Näytä lisäsyötelähteet
|
||||||
|
mode-and-colors = Tila ja värit
|
||||||
|
users = Käyttäjät
|
||||||
|
.admin = Ylläpitäjä
|
||||||
|
.standard = Käyttäjä
|
||||||
|
.profile-add = Valitse profiilikuva
|
||||||
|
center-segment = Keskialue
|
||||||
|
panel-missing = Paneelimääritys puuttuu
|
||||||
|
.desc = Paneelin määritystiedosto puuttuu joko mukautuksen tai vioittumisen vuoksi.
|
||||||
|
.fix = Palauta oletusarvot
|
||||||
|
invalid-username = Virheellinen käyttäjätunnus
|
||||||
|
mirroring = Peilaus
|
||||||
|
.id = Peilataan { $id }
|
||||||
|
.dont = Älä peilaa
|
||||||
|
.mirror = Peilaa { $display }
|
||||||
|
.project =
|
||||||
|
Peilaa { $display ->
|
||||||
|
[all] kaikille näytöille
|
||||||
|
*[other] näytölle { $display }
|
||||||
|
}
|
||||||
|
.project-count =
|
||||||
|
Peilataan { $count } { $count ->
|
||||||
|
[1] näytölle
|
||||||
|
*[other] näytölle
|
||||||
|
}
|
||||||
|
end-segment = Päätyalue
|
||||||
|
time-format = Päiväyksen ja kellonajan muotoilu
|
||||||
|
.twenty-four = 24-tuntinen kello
|
||||||
|
.show-seconds = Näytä sekunnit
|
||||||
|
.first = Ensimmäinen viikonpäivä
|
||||||
|
.show-date = Näytä päiväys aikasovelmassa
|
||||||
|
.friday = Perjantai
|
||||||
|
.saturday = Lauantai
|
||||||
|
.sunday = Sunnuntai
|
||||||
|
.monday = Maanantai
|
||||||
|
type-key-combination = Syötä näppäinyhdistelmä
|
||||||
|
keyboard-special-char = Erikoismerkkien syöttäminen
|
||||||
|
.alternate = Vaihtoehtomerkkien näppäin
|
||||||
|
.compose = Compose-näppäin
|
||||||
|
.compose-desc = Compose-näppäin mahdollista laajan merkkivalikoiman syöttämisen. Sitä käytetään painamalla Compose sekä merkkisarja. Esimerkiksi Compose-näppäin, jota seuraa C ja o, tuottaa merkin ©, kun taas a sekä ' tuottaa merkin á.
|
||||||
|
.caps = Vaihtolukkonäppäin
|
||||||
|
manage-windows = Hallitse ikkunoita
|
||||||
|
.close = Sulje ikkuna
|
||||||
|
.maximize = Suurenna ikkuna
|
||||||
|
.fullscreen = Koko näytön ikkuna
|
||||||
|
.minimize = Pienennä ikkuna
|
||||||
|
.resize-inwards = Pienennä ikkunan kokoa
|
||||||
|
.resize-outwards = Suurenna ikkunan kokoa
|
||||||
|
.toggle-sticky = Vaihda ikkunan tahmeuden tilaa
|
||||||
|
wallpaper = Tausta
|
||||||
|
.change = Vaihda kuvaa aikavälein
|
||||||
|
.fit = Sovita tausta
|
||||||
|
.folder-dialog = Valitse taustakuvakansio
|
||||||
|
.image-dialog = Valitse taustakuva
|
||||||
|
.plural = Taustat
|
||||||
|
.same = Sama tausta joka näytössä
|
||||||
|
.slide = Diaesitys
|
||||||
|
window-controls = Ikkunasäätimet
|
||||||
|
.maximize = Näytä suurennuspainike
|
||||||
|
.minimize = Näytä pienennyspainike
|
||||||
|
.active-window-hint = Näytä aktiivisen ikkunan vihje
|
||||||
|
window-management-appearance = Ikkunanhallinta
|
||||||
|
.active-hint = Aktiivisen ikkunan vihjeen koko
|
||||||
|
.gaps = Aseteltujen ikkunoiden välinen tyhjä tila
|
||||||
|
migrate-workspace-prev = Siirrä työtila edelliseen ulostuloon
|
||||||
|
legacy-app-global-shortcuts = X11-sovellusten yleiset pikanäppäimet
|
||||||
|
.desc = Yleispikanäppäimet mahdollistavat sovellusten näppäin- ja hiiripainikepainallusten tunnistamisen muissa sovelluksissa sellaisia ominaisuuksia kuin mikrofonin avaamista tai sulkemista varten. Oletuksena yleispikanäppäimet on X11-sovelluksissa poistettu käytöstä tietoturvan vuoksi.
|
||||||
|
.none = Ei näppäimiä
|
||||||
|
.modifiers = Muuntonäppäimet (Super, Vaihto, Ctrl, Alt)
|
||||||
|
.combination = Kaikki näppäimet muuntonäppäimiä Super, Ctrl tai Alt painettaessa
|
||||||
|
.all = Kaikki näppäimet
|
||||||
|
.mouse = X11-sovellusten hiiripainikepainallukset
|
||||||
|
activate = Aktivoi
|
||||||
|
power-saving = Virransäästön asetukset
|
||||||
|
.turn-off-screen-after = Sammuta näyttö ajassa
|
||||||
|
.auto-suspend = Siirry automaattisesti lepotilaan
|
||||||
|
.auto-suspend-ac = Siirry automaattisesti lepotilaan verkkovirralla
|
||||||
|
.auto-suspend-battery = Siirry automaattisesti lepotilaan akkuvirralla
|
||||||
|
connected-devices = Yhdistetyt laitteet
|
||||||
|
.unknown = Tuntematon laite
|
||||||
|
icons-and-toolkit = Kuvakkeet ja työkalukirjaston teemoitus
|
||||||
|
sound-applications = Sovellukset
|
||||||
|
.desc = Sovellusten äänenvoimakkuudet ja ääniasetukset
|
||||||
|
shadows-floating = Kelluvat ikkunat
|
||||||
|
.clip = Sovita järjestelmän kulmiin ja käytä varjoja
|
||||||
|
touchpad = Kosketuslevy
|
||||||
|
.acceleration = Käytä kiihdytystä
|
||||||
|
.speed = Kosketuslevyn nopeus
|
||||||
|
gestures = Eleet
|
||||||
|
.four-finger-down = Neljän sormen pyyhkäisy alas
|
||||||
|
.four-finger-left = Neljän sormen pyyhkäisy vasemmalle
|
||||||
|
.four-finger-right = Neljän sormen pyyhkäisy oikealle
|
||||||
|
.four-finger-up = Neljän sormen pyyhkäisy ylös
|
||||||
|
.three-finger-any = Kolmen sormen pyyhkäisy mihin suuntaan tahansa
|
||||||
|
panel-bottom = Alhaalla
|
||||||
|
custom = Mukautettu
|
||||||
|
bluetooth-paired = Aiemmin yhdistetyt laitteet
|
||||||
|
.connect = Yhdistä
|
||||||
|
.battery = { $percentage } % akkua
|
||||||
|
dialog = Kyselyikkuna
|
||||||
|
.title = Säilytetäänkö nämä näyttöasetukset?
|
||||||
|
.keep-changes = Säilytä
|
||||||
|
.change-prompt = Muutetut asetukset palautuvat automaattiseti { $time } sekunnissa.
|
||||||
|
.revert-settings = Palauta asetukset
|
||||||
|
sound-device-port-unplugged = Ei kytketty
|
||||||
|
navigate = Navigointi
|
||||||
|
workspaces-overview-thumbnails = Työtilojen yleiskuvan pienoiskuvat
|
||||||
|
.show-number = Näytä työtilan numero
|
||||||
|
.show-name = Näytä työtilan nimi
|
||||||
|
hex = Heksa
|
||||||
|
magnifier = Suurennuslasi
|
||||||
|
.controls =
|
||||||
|
Tai käytä näitä pikanäppäimiä: { $zoom_in ->
|
||||||
|
[zero] { "" }
|
||||||
|
*[other]
|
||||||
|
{ "" }
|
||||||
|
{ $zoom_in } lähentää,
|
||||||
|
}{ $zoom_out ->
|
||||||
|
[zero] { "" }
|
||||||
|
*[other]
|
||||||
|
{ "" }
|
||||||
|
{ $zoom_out } loitontaa,
|
||||||
|
}
|
||||||
|
Super + vieritys hiirellä
|
||||||
|
.scroll_controls = Käytä hiiren tai kosketuslevyn lähennystä Super + vierityksellä
|
||||||
|
.show_overlay = Näytä suurennuslasi
|
||||||
|
.increment = Lähennysaskel
|
||||||
|
.signin = Käynnistä suurennuslasi kirjautumisen jälkeen
|
||||||
|
.applet = Näytä tai piilota suurennuslasin sovelma paanelissa
|
||||||
|
.movement = Lähennetty näkymä liikkuu
|
||||||
|
.continuous = Jatkuvasti osoittimen kanssa
|
||||||
|
.onedge = Osoittimen saavuttaessa reunan
|
||||||
|
.centered = Pitää osoittimen keskitettynä
|
||||||
|
administrator = Ylläpitäjä
|
||||||
|
.desc = Ylläpitäjät voivat muuttaa kaikkien käyttäjien asetuksia sekä lisätä ja poistaa käyttäjiä
|
||||||
|
modified = { $count } muutettu
|
||||||
|
accessibility = Esteettömyys
|
||||||
|
.vision = Näköaisti
|
||||||
|
.on = Käytössä
|
||||||
|
.off = Ei käytössä
|
||||||
|
.unavailable = Ei käytettävissä
|
||||||
|
.screen-reader = Ruudunlukija
|
||||||
|
.high-contrast = Suurikontrastinen tila
|
||||||
|
.invert-colors = Käänteiset värit
|
||||||
|
.color-filters = Värisuodattimet
|
||||||
|
debug = Vianjäljitys
|
||||||
|
system-shortcut = Järjestelmä
|
||||||
|
.app-library = Avaa sovelluskirjasto
|
||||||
|
.brightness-down = Vähennä näytön kirkkautta
|
||||||
|
.brightness-up = Lisää näytön kirkkautta
|
||||||
|
.display-toggle = Vaihda sisäisen näytön tilaa
|
||||||
|
.home-folder = Avaa kotikansio
|
||||||
|
.keyboard-brightness-down = Vähennä näppäimistön taustavalon kirkkautta
|
||||||
|
.keyboard-brightness-up = Lisää näppäimistön taustavalon kirkkautta
|
||||||
|
.launcher = Avaa käynnistin
|
||||||
|
.log-out = Kirjaudu ulos
|
||||||
|
.lock-screen = Lukitse näyttö
|
||||||
|
.mute = Vaimenna äänentoisto
|
||||||
|
.mute-mic = Vaimenna mikrofoni
|
||||||
|
.play-pause = Toista tai keskeytä
|
||||||
|
.play-next = Seuraava kappale
|
||||||
|
.play-prev = Edellinen kappale
|
||||||
|
.poweroff = Sammuta
|
||||||
|
.screenshot = Ota kuvakaappaus
|
||||||
|
.suspend = Lepotila
|
||||||
|
.terminal = Avaa pääte
|
||||||
|
.touchpad-toggle = Ota kosketuslevy käyttöön tai poista se käytöstä
|
||||||
|
.volume-lower = Vähennä äänenvoimakkuutta
|
||||||
|
.volume-raise = Lisää äänenvoimakkuutta
|
||||||
|
.web-browser = Avaa selain
|
||||||
|
.window-switcher = Vaihda avoimesta ikkunasta toiseen
|
||||||
|
.window-switcher-previous = Vaihda käänteisesti avoimesta ikkunasta toiseen
|
||||||
|
.workspace-overview = Avaa työtilojen yleiskuva
|
||||||
|
sound-output = Ulostulo
|
||||||
|
.volume = Äänenvoimakkuus
|
||||||
|
.device = Laite
|
||||||
|
.level = Äänen taso
|
||||||
|
.config = Asetukset
|
||||||
|
.balance = Tasapaino
|
||||||
|
.left = Vasen
|
||||||
|
.right = Oikea
|
||||||
|
shadows-tiling = Asetellut ikkunat
|
||||||
|
.clip = Sovita järjestelmän kulmiin
|
||||||
|
.shadow = Käytä varjoja
|
||||||
|
no-search-results = Hakuasi vastaavia verkkoja ei löytynyt.
|
||||||
143
i18n/fr/cosmic_settings.ftl
vendored
143
i18n/fr/cosmic_settings.ftl
vendored
|
|
@ -4,15 +4,67 @@ ok = OK
|
||||||
unknown = Inconnu
|
unknown = Inconnu
|
||||||
number = { $number }
|
number = { $number }
|
||||||
|
|
||||||
|
## Freedesktop desktop entries
|
||||||
|
|
||||||
|
xdg-entry-about = À propos
|
||||||
|
xdg-entry-about-comment = Nom de l'appareil, informations sur le matériel et paramètres par défaut du système d'exploitation
|
||||||
|
xdg-entry-a11y = Accessibilité
|
||||||
|
xdg-entry-a11y-comment = Lecteur d’écran, loupe, contraste élevé et filtres de couleur
|
||||||
|
xdg-entry-appearance = Apparence
|
||||||
|
xdg-entry-appearance-comment = Couleurs d'accentuation et thèmes
|
||||||
|
xdg-entry-applications = Applications
|
||||||
|
xdg-entry-applications-comment = Applications par défaut, applications au démarrage et paramètres de compatibilité des applications X11
|
||||||
|
xdg-entry-bluetooth-comment = Gérer les appareils Bluetooth
|
||||||
|
xdg-entry-date-time = Date et heure
|
||||||
|
xdg-entry-date-time-comment = Fuseau horaire, réglage de l'heure automatique et formatage de l'heure
|
||||||
|
xdg-entry-default-apps = Applications par défaut
|
||||||
|
xdg-entry-default-apps-comment = Navigateur par défaut, client mail, explorateur de fichiers, et autres applications
|
||||||
|
xdg-entry-desktop = Bureau
|
||||||
|
xdg-entry-displays = Écrans
|
||||||
|
xdg-entry-displays-comment = Gérer les paramètres de configuration de l’affichage
|
||||||
|
xdg-entry-dock = Dock
|
||||||
|
xdg-entry-dock-comment = Barre facultative pour les applis et les applets
|
||||||
|
xdg-entry-input = Périphériques d'entrée
|
||||||
|
xdg-entry-input-comment = Paramètres du clavier et de la souris
|
||||||
|
xdg-entry-keyboard = Clavier
|
||||||
|
xdg-entry-keyboard-comment = Sources d'entrée, commutation, saisie de caractères spéciaux, raccourcis
|
||||||
|
xdg-entry-mouse = Souris
|
||||||
|
xdg-entry-mouse-comment = Vitesse de la souris, accélération et défilement naturel
|
||||||
|
xdg-entry-network = Réseau et sans fil
|
||||||
|
xdg-entry-network-comment = Gérer les connexions réseau
|
||||||
|
xdg-entry-notifications = Notifications
|
||||||
|
xdg-entry-notifications-comment = Ne pas déranger, notifications sur l'écran de verrouillage et paramètres par application
|
||||||
|
xdg-entry-panel = Panneau
|
||||||
|
xdg-entry-panel-comment = Barre système principale pour les menus et les applets
|
||||||
|
xdg-entry-power = Alimentation et batterie
|
||||||
|
xdg-entry-power-comment = Modes d'alimentation et options d'économie d'énergie
|
||||||
|
xdg-entry-region-language = Région et langue
|
||||||
|
xdg-entry-region-language-comment = Formater les dates, les heures et les nombres en fonction de votre région
|
||||||
|
xdg-entry-sound = Son
|
||||||
|
xdg-entry-sound-comment = Paramètres audio pour les appareils, les alertes et les applications
|
||||||
|
xdg-entry-startup-apps = Applications de démarrage
|
||||||
|
xdg-entry-startup-apps-comment = Configurer les applications qui s'exécutent lors de la connexion
|
||||||
|
xdg-entry-system = Système et comptes
|
||||||
|
xdg-entry-time-language = Heure et langue
|
||||||
|
xdg-entry-touchpad = Pavé tactile
|
||||||
|
xdg-entry-touchpad-comment = Vitesse du pavé tactile, options de clic, gestes
|
||||||
|
xdg-entry-users = Utilisateurs
|
||||||
|
xdg-entry-users-comment = Authentification et comptes utilisateurs
|
||||||
|
xdg-entry-vpn-comment = Connexions VPN et profils de connexion
|
||||||
|
xdg-entry-wallpaper = Fond d'écran
|
||||||
|
xdg-entry-wallpaper-comment = Images de fond d'écran, couleurs et options de diaporama
|
||||||
|
xdg-entry-window-management = Gestion des fenêtres
|
||||||
|
xdg-entry-window-management-comment = Action de la touche Super, options de contrôle des fenêtres et options supplémentaires d'agencement des fenêtres
|
||||||
|
xdg-entry-wired = Filaire
|
||||||
|
xdg-entry-wired-comment = Connexions filaires et profils
|
||||||
|
xdg-entry-wireless-comment = Connexions Wi-Fi et profils
|
||||||
|
xdg-entry-workspaces = Espaces de travail
|
||||||
|
xdg-entry-workspaces-comment = Orientation des espaces de travail, aperçu et gestion multi-écrans
|
||||||
|
xdg-entry-x11-applications = Compatibilité des applications X11
|
||||||
|
xdg-entry-x11-applications-comment = Mise à l’échelle des applications du gestionnaire de fenêtres X11, écran principal et raccourcis globaux
|
||||||
|
|
||||||
## Networking & Wireless
|
## Networking & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
Connexions { $variant ->
|
|
||||||
[wired] filaires
|
|
||||||
[wifi] Wi-Fi
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] inconnues
|
|
||||||
} et profils.
|
|
||||||
add-network = Ajouter un réseau
|
add-network = Ajouter un réseau
|
||||||
.profile = Ajouter un profil
|
.profile = Ajouter un profil
|
||||||
add-vpn = Ajouter un VPN
|
add-vpn = Ajouter un VPN
|
||||||
|
|
@ -95,7 +147,6 @@ online-accounts = Comptes en lignes
|
||||||
|
|
||||||
confirm = Confirmer
|
confirm = Confirmer
|
||||||
bluetooth = Bluetooth
|
bluetooth = Bluetooth
|
||||||
.desc = Gérer les périphériques Bluetooth
|
|
||||||
.status = Ce système est visible en tant que { $aliases } tant que les paramètres Bluetooth sont ouverts.
|
.status = Ce système est visible en tant que { $aliases } tant que les paramètres Bluetooth sont ouverts.
|
||||||
.connected = Connecté
|
.connected = Connecté
|
||||||
.connecting = Connexion
|
.connecting = Connexion
|
||||||
|
|
@ -123,7 +174,6 @@ desktop = Bureau
|
||||||
|
|
||||||
wallpaper = Fond d’écran
|
wallpaper = Fond d’écran
|
||||||
.change = Changer l'image tous les
|
.change = Changer l'image tous les
|
||||||
.desc = Images de fond d’écran, couleurs et options de diaporama
|
|
||||||
.fit = Adapter le fond d’écran
|
.fit = Adapter le fond d’écran
|
||||||
.folder-dialog = Choisir le dossier de fond d’écran
|
.folder-dialog = Choisir le dossier de fond d’écran
|
||||||
.image-dialog = Choisir l'image de fond d’écran
|
.image-dialog = Choisir l'image de fond d’écran
|
||||||
|
|
@ -154,7 +204,6 @@ never = Jamais
|
||||||
## Desktop: Appearance
|
## Desktop: Appearance
|
||||||
|
|
||||||
appearance = Apparence
|
appearance = Apparence
|
||||||
.desc = Couleur d'accentuation et thème
|
|
||||||
accent-color = Couleur d'accentuation
|
accent-color = Couleur d'accentuation
|
||||||
app-background = Arrière-plan des fenêtres
|
app-background = Arrière-plan des fenêtres
|
||||||
auto = Auto
|
auto = Auto
|
||||||
|
|
@ -214,12 +263,10 @@ monospace-font = Police monospace
|
||||||
## Desktop: Notifications
|
## Desktop: Notifications
|
||||||
|
|
||||||
notifications = Notifications
|
notifications = Notifications
|
||||||
.desc = Ne pas déranger, notifications sur l'écran de verrouillage, et paramètres par application
|
|
||||||
|
|
||||||
## Desktop: Panel
|
## Desktop: Panel
|
||||||
|
|
||||||
panel = Panneau
|
panel = Panneau
|
||||||
.desc = Barre système principale pour les menus et les applets
|
|
||||||
add = Ajouter
|
add = Ajouter
|
||||||
add-applet = Ajouter applet
|
add-applet = Ajouter applet
|
||||||
all = Tous
|
all = Tous
|
||||||
|
|
@ -262,12 +309,10 @@ panel-missing = La configuration du panneau est manquante
|
||||||
## Desktop: Dock
|
## Desktop: Dock
|
||||||
|
|
||||||
dock = Dock
|
dock = Dock
|
||||||
.desc = Un panneau optionnel pour les applis et les applets
|
|
||||||
|
|
||||||
## Desktop: Window management
|
## Desktop: Window management
|
||||||
|
|
||||||
window-management = Gestion des fenêtres
|
window-management = Gestion des fenêtres
|
||||||
.desc = Actions de la touche Super, options de contrôle des fenêtres et options supplémentaires d'agencement des fenêtres
|
|
||||||
super-key = Action de la touche Super
|
super-key = Action de la touche Super
|
||||||
.launcher = Ouvrir le Lanceur
|
.launcher = Ouvrir le Lanceur
|
||||||
.workspaces = Ouvrir les Espaces de travail
|
.workspaces = Ouvrir les Espaces de travail
|
||||||
|
|
@ -277,6 +322,7 @@ window-controls = Contrôles des fenêtres
|
||||||
.maximize = Afficher le bouton maximiser
|
.maximize = Afficher le bouton maximiser
|
||||||
.minimize = Afficher le bouton minimiser
|
.minimize = Afficher le bouton minimiser
|
||||||
.active-window-hint = Afficher l'indice de la fenêtre active
|
.active-window-hint = Afficher l'indice de la fenêtre active
|
||||||
|
.position-start = Placer les boutons à gauche (style macOS)
|
||||||
focus-navigation = Navigation par le focus
|
focus-navigation = Navigation par le focus
|
||||||
.focus-follows-cursor = Le focus suit le curseur
|
.focus-follows-cursor = Le focus suit le curseur
|
||||||
.focus-follows-cursor-delay = Délai de suivi du focus en ms
|
.focus-follows-cursor-delay = Délai de suivi du focus en ms
|
||||||
|
|
@ -285,7 +331,6 @@ focus-navigation = Navigation par le focus
|
||||||
## Desktop: Workspaces
|
## Desktop: Workspaces
|
||||||
|
|
||||||
workspaces = Espaces de travail
|
workspaces = Espaces de travail
|
||||||
.desc = Orientation et comportement des espaces de travail
|
|
||||||
workspaces-behavior = Comportement des espaces de travail
|
workspaces-behavior = Comportement des espaces de travail
|
||||||
.dynamic = Espaces de travail dynamiques
|
.dynamic = Espaces de travail dynamiques
|
||||||
.dynamic-desc = Supprime automatiquement les espaces de travail vides.
|
.dynamic-desc = Supprime automatiquement les espaces de travail vides.
|
||||||
|
|
@ -312,7 +357,6 @@ color = Couleur
|
||||||
.sidebar = Profils de couleurs
|
.sidebar = Profils de couleurs
|
||||||
.temperature = Température de couleur
|
.temperature = Température de couleur
|
||||||
display = Écrans
|
display = Écrans
|
||||||
.desc = Gérer les écrans, les modes graphiques et le mode nuit
|
|
||||||
.arrangement = Disposition des écrans
|
.arrangement = Disposition des écrans
|
||||||
.arrangement-desc = Faire glisser les écrans pour les réorganiser
|
.arrangement-desc = Faire glisser les écrans pour les réorganiser
|
||||||
.enable = Activer écran
|
.enable = Activer écran
|
||||||
|
|
@ -365,7 +409,6 @@ legacy-app-scaling = Mise à l'échelle des applications système X11
|
||||||
## Sound
|
## Sound
|
||||||
|
|
||||||
sound = Son
|
sound = Son
|
||||||
.desc = N/A
|
|
||||||
sound-output = Sortie
|
sound-output = Sortie
|
||||||
.volume = Volume de sortie
|
.volume = Volume de sortie
|
||||||
.device = Périphérique de sortie
|
.device = Périphérique de sortie
|
||||||
|
|
@ -387,7 +430,6 @@ sound-applications = Applications
|
||||||
## Power
|
## Power
|
||||||
|
|
||||||
power = Alimentation
|
power = Alimentation
|
||||||
.desc = Gérer les paramètres d'alimentation
|
|
||||||
battery = Batterie
|
battery = Batterie
|
||||||
.minute =
|
.minute =
|
||||||
{ $value } { $value ->
|
{ $value } { $value ->
|
||||||
|
|
@ -432,7 +474,6 @@ power-saving = Options d'économie d'énergie
|
||||||
acceleration-desc = Ajuste automatiquement la sensibilité du suivi en fonction de la vitesse
|
acceleration-desc = Ajuste automatiquement la sensibilité du suivi en fonction de la vitesse
|
||||||
disable-while-typing = Désactiver pendant la saisie
|
disable-while-typing = Désactiver pendant la saisie
|
||||||
input-devices = Périphériques d'entrée
|
input-devices = Périphériques d'entrée
|
||||||
.desc = Périphériques d'entrée
|
|
||||||
primary-button = Bouton principal
|
primary-button = Bouton principal
|
||||||
.desc = Définit l'ordre des boutons physiques
|
.desc = Définit l'ordre des boutons physiques
|
||||||
.left = Gauche
|
.left = Gauche
|
||||||
|
|
@ -451,7 +492,6 @@ fast = Rapide
|
||||||
short = Court
|
short = Court
|
||||||
long = Long
|
long = Long
|
||||||
keyboard = Clavier
|
keyboard = Clavier
|
||||||
.desc = Sources de saisie, changement de source, saisie de caractères spéciaux, raccourcis
|
|
||||||
keyboard-sources = Sources de saisie
|
keyboard-sources = Sources de saisie
|
||||||
.desc = Les sources d'entrée peuvent être changées en utilisant la combinaison de touches Super+Espace. Cette combinaison peut être modifiée dans les paramètres des raccourcis clavier.
|
.desc = Les sources d'entrée peuvent être changées en utilisant la combinaison de touches Super+Espace. Cette combinaison peut être modifiée dans les paramètres des raccourcis clavier.
|
||||||
.move-up = Remonter
|
.move-up = Remonter
|
||||||
|
|
@ -604,7 +644,6 @@ replace-shortcut-dialog = Remplacer le raccourci ?
|
||||||
## Input: Mouse
|
## Input: Mouse
|
||||||
|
|
||||||
mouse = Souris
|
mouse = Souris
|
||||||
.desc = Vitesse de la souris, accélération, défilement naturel
|
|
||||||
.speed = Vitesse de la souris
|
.speed = Vitesse de la souris
|
||||||
.acceleration = Activer l'accélération de la souris
|
.acceleration = Activer l'accélération de la souris
|
||||||
|
|
||||||
|
|
@ -619,7 +658,6 @@ tap-to-click = Tapoter pour cliquer
|
||||||
.desc = Active le tapotement à un doigt pour le clic principal, le tapotement à deux doigts pour le clic secondaire, et le tapotement à trois doigts pour le clic du milieu
|
.desc = Active le tapotement à un doigt pour le clic principal, le tapotement à deux doigts pour le clic secondaire, et le tapotement à trois doigts pour le clic du milieu
|
||||||
touchpad = Pavé tactile
|
touchpad = Pavé tactile
|
||||||
.acceleration = Activer l'accélération du pavé tactile
|
.acceleration = Activer l'accélération du pavé tactile
|
||||||
.desc = Vitesse du pavé tactile, options de clic, gestes
|
|
||||||
.speed = Vitesse du pavé tactile
|
.speed = Vitesse du pavé tactile
|
||||||
|
|
||||||
## Input: Gestures
|
## Input: Gestures
|
||||||
|
|
@ -634,9 +672,7 @@ open-workspaces-view = Ouvrir l'aperçu des espaces de travail
|
||||||
## Time & Language
|
## Time & Language
|
||||||
|
|
||||||
time = Heure et langue
|
time = Heure et langue
|
||||||
.desc = N/A
|
|
||||||
time-date = Date et heure
|
time-date = Date et heure
|
||||||
.desc = Fuseau horaire, réglage de l'heure automatique et format de l'heure
|
|
||||||
.auto = Régler automatiquement
|
.auto = Régler automatiquement
|
||||||
.auto-ntp = La date et l'heure seront mises à jour automatiquement lorsque le fuseau horaire sera défini
|
.auto-ntp = La date et l'heure seront mises à jour automatiquement lorsque le fuseau horaire sera défini
|
||||||
time-zone = Fuseau Horaire
|
time-zone = Fuseau Horaire
|
||||||
|
|
@ -652,7 +688,6 @@ time-format = Format date et heure
|
||||||
.sunday = Dimanche
|
.sunday = Dimanche
|
||||||
.monday = Lundi
|
.monday = Lundi
|
||||||
time-region = Région et langue
|
time-region = Région et langue
|
||||||
.desc = Format de la date, de l'heure et des nombres en fonction de votre région
|
|
||||||
formatting = Format
|
formatting = Format
|
||||||
.dates = Dates
|
.dates = Dates
|
||||||
.time = Heure
|
.time = Heure
|
||||||
|
|
@ -674,7 +709,6 @@ system = Système et comptes
|
||||||
## System: About
|
## System: About
|
||||||
|
|
||||||
about = À propos
|
about = À propos
|
||||||
.desc = Nom de l'appareil, informations sur le matériel et paramètres par défaut du système d'exploitation
|
|
||||||
about-device = Nom de l'appareil
|
about-device = Nom de l'appareil
|
||||||
.desc = Il est visible par les autres appareils réseau ou Bluetooth
|
.desc = Il est visible par les autres appareils réseau ou Bluetooth
|
||||||
about-hardware = Matériel
|
about-hardware = Matériel
|
||||||
|
|
@ -694,13 +728,11 @@ about-related = Paramètres associés
|
||||||
|
|
||||||
## System: Firmware
|
## System: Firmware
|
||||||
|
|
||||||
firmware = Micrologiciel
|
firmware = Firmware
|
||||||
.desc = Détails micrologiciel
|
|
||||||
|
|
||||||
## System: Users
|
## System: Users
|
||||||
|
|
||||||
users = Utilisateurs
|
users = Utilisateurs
|
||||||
.desc = Authentification et comptes utilisateurs
|
|
||||||
.admin = Admin
|
.admin = Admin
|
||||||
.standard = Standard
|
.standard = Standard
|
||||||
.profile-add = Choisir l'image de profil
|
.profile-add = Choisir l'image de profil
|
||||||
|
|
@ -713,7 +745,6 @@ full-name = Nom complet
|
||||||
## System: Default Applications
|
## System: Default Applications
|
||||||
|
|
||||||
default-apps = Applications par défaut
|
default-apps = Applications par défaut
|
||||||
.desc = Navigateur web, client mail, explorateur de fichiers, et autres applications
|
|
||||||
.web-browser = Navigateur web
|
.web-browser = Navigateur web
|
||||||
.file-manager = Explorateur de fichiers
|
.file-manager = Explorateur de fichiers
|
||||||
.mail-client = Client mail
|
.mail-client = Client mail
|
||||||
|
|
@ -724,6 +755,7 @@ default-apps = Applications par défaut
|
||||||
.terminal = Terminal
|
.terminal = Terminal
|
||||||
.other-associations = Autres associations
|
.other-associations = Autres associations
|
||||||
.text-editor = Éditeur de texte
|
.text-editor = Éditeur de texte
|
||||||
|
.not-installed = Non installé
|
||||||
identity = Identité
|
identity = Identité
|
||||||
save = Enregistrer
|
save = Enregistrer
|
||||||
password-confirm = Confirmer le mot de passe
|
password-confirm = Confirmer le mot de passe
|
||||||
|
|
@ -798,10 +830,8 @@ gestures = Gestes
|
||||||
.four-finger-up = Glissement de quatre doigts vers le haut
|
.four-finger-up = Glissement de quatre doigts vers le haut
|
||||||
.three-finger-any = Glissement de trois doigts dans n'importe quelle direction
|
.three-finger-any = Glissement de trois doigts dans n'importe quelle direction
|
||||||
legacy-applications = Compatibilité des applications X11
|
legacy-applications = Compatibilité des applications X11
|
||||||
.desc = Échelle des fenêtres d'applications systèmes X11 et raccourcis globaux
|
|
||||||
input-source-switch = Changer la langue de saisie du clavier
|
input-source-switch = Changer la langue de saisie du clavier
|
||||||
startup-apps = Applications de démarrage
|
startup-apps = Applications de démarrage
|
||||||
.desc = Configurer les applications qui se lancent au démarrage
|
|
||||||
.add = Ajouter appli
|
.add = Ajouter appli
|
||||||
.user = Applications lancées lors de la connexion
|
.user = Applications lancées lors de la connexion
|
||||||
.none = Aucune application de démarrage ajoutée
|
.none = Aucune application de démarrage ajoutée
|
||||||
|
|
@ -824,3 +854,52 @@ sound-device-port-unplugged = Débranché
|
||||||
sound-hd-audio = Audio HD
|
sound-hd-audio = Audio HD
|
||||||
sound-usb-audio = Audio USB
|
sound-usb-audio = Audio USB
|
||||||
sound-device-profiles = Profils des périphériques
|
sound-device-profiles = Profils des périphériques
|
||||||
|
shadows-floating = Fenêtres flottantes
|
||||||
|
.clip = Aligner avec les coins système et appliquer les ombres
|
||||||
|
shadows-tiling = Fenêtres agencées
|
||||||
|
.clip = Aligner avec les coins système
|
||||||
|
.shadow = Appliquer les ombres
|
||||||
|
shadow-and-corners = Ombres et arrondis des fenêtres
|
||||||
|
workspaces-overview = Aperçu des espaces de travail
|
||||||
|
.action-on-typing = Action lors de la saisie
|
||||||
|
.none = Aucun
|
||||||
|
.launcher = Ouvrir le lanceur
|
||||||
|
.applications = Ouvrir les applications
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Souris;Accélération;Défilement;
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Notification;Verrouillage;
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Démarrage;Application;
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Filaire;LAN;Réseau;Connexion;
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Accentuation;Couleur;Icône;Police;Thème
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Dock;Panneau;Applet
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Panneau;Applet
|
||||||
|
xdg-entry-time-language-comment = Gérer la date, l’heure, la région et la langue du système
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Bureau;
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Application;Jeu;Compatibilité;
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;Pavé tactile;Gestes;
|
||||||
|
xdg-entry-system-keywords = COSMIC;Système;Info;Comptes;Firmware;
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;Réseau;Connexion;
|
||||||
|
xdg-entry-about-keywords = COSMIC;À propos
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Accessibilité,A11y;Écran;Lecteur;Loupe;Contraste;Couleur;
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Horaire;Fuseau;
|
||||||
|
xdg-entry-desktop-comment = Fond d’écran, apparence, panneau, dock, gestion des fenêtres et paramètres des espaces de travail
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
xdg-entry-network-keywords = COSMIC;Réseau;Sans fil;Wi-Fi;VPN;
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Espace de travail;Orientation;Aperçu;Écran;
|
||||||
|
xdg-entry-system-comment = Informations système, comptes et mises à jour du firmware
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Fond d'écran;Arrière-plan;Diaporama;
|
||||||
|
xdg-entry-users-keywords = COSMIC;Utilisateur;Compte;
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Réseau;Connexion;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;Système;Heure;Date;Région;Langue;
|
||||||
|
xdg-entry-input-keywords = COSMIC;Saisie;Clavier;Souris;Souris;
|
||||||
|
xdg-entry-comment = Application Paramètres pour le bureau COSMIC
|
||||||
|
xdg-entry-sound-keywords = COSMIC;Son;Audio;Alerte;Pipewire;
|
||||||
|
xdg-entry-power-keywords = COSMIC;Alimentation;Batterie
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Défaut;Application
|
||||||
|
xdg-entry-keywords = COSMIC;Paramètres;
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Région;Langue;Date;Format;Heure;Paramètres régionaux;Localisation;
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Défaut;Application;Démarrage;X11;Compatibilité
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Clavier;Saisie;Source;Raccourcis;
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;Fenêtre;Gestion;Agencement;Super;Touche;
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Écran;
|
||||||
|
no-search-results = Aucun réseau ne correspond à votre recherche.
|
||||||
|
|
|
||||||
7
i18n/fy/cosmic_settings.ftl
vendored
7
i18n/fy/cosmic_settings.ftl
vendored
|
|
@ -4,12 +4,5 @@ dbus-connection-error = Koe net mei DBus ferbine
|
||||||
ok = Okee
|
ok = Okee
|
||||||
unknown = Ûnbekend
|
unknown = Ûnbekend
|
||||||
number = { $number }
|
number = { $number }
|
||||||
connections-and-profiles =
|
|
||||||
connections-and-profiles = { $variant ->
|
|
||||||
[wired] Kabelferbiningen
|
|
||||||
[wifi] Wifi-ferbiningen
|
|
||||||
[vpn] VPN-ferbiningen
|
|
||||||
*[other] Ûnbekende ferbiningen
|
|
||||||
} en ferbiningsprofilen.
|
|
||||||
cancel = Annulearje
|
cancel = Annulearje
|
||||||
settings = Ynstellings
|
settings = Ynstellings
|
||||||
|
|
|
||||||
189
i18n/ga/cosmic_settings.ftl
vendored
189
i18n/ga/cosmic_settings.ftl
vendored
|
|
@ -6,13 +6,6 @@ number = { $number }
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Sreangnasctha
|
|
||||||
[wifi] Wi-Fi
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] anaithnid
|
|
||||||
} ceangail agus próifílí ceangailte.
|
|
||||||
add-network = Cuir líonra leis
|
add-network = Cuir líonra leis
|
||||||
.profile = Cuir próifíl leis
|
.profile = Cuir próifíl leis
|
||||||
add-vpn = Cuir VPN leis
|
add-vpn = Cuir VPN leis
|
||||||
|
|
@ -99,7 +92,6 @@ activate = Gníomhachtaigh
|
||||||
confirm = Deimhnigh
|
confirm = Deimhnigh
|
||||||
enable = Cumasaigh
|
enable = Cumasaigh
|
||||||
bluetooth = Bluetooth
|
bluetooth = Bluetooth
|
||||||
.desc = Bainistigh gléasanna Bluetooth
|
|
||||||
.status = Tá an córas seo le feiceáil mar { $aliases } agus socruithe Bluetooth oscailte.
|
.status = Tá an córas seo le feiceáil mar { $aliases } agus socruithe Bluetooth oscailte.
|
||||||
.connected = Ceangailte
|
.connected = Ceangailte
|
||||||
.connecting = Ag ceangal
|
.connecting = Ag ceangal
|
||||||
|
|
@ -108,9 +100,9 @@ bluetooth = Bluetooth
|
||||||
.disconnect = Dícheangail
|
.disconnect = Dícheangail
|
||||||
.forget = Déan dearmad
|
.forget = Déan dearmad
|
||||||
.dbus-error = Tharla earráid agus tú ag idirghníomhú le DBus: { $why }
|
.dbus-error = Tharla earráid agus tú ag idirghníomhú le DBus: { $why }
|
||||||
.disabled = Tá an tseirbhís bluetooth díchumasaithe
|
.disabled = Tá an tseirbhís Bluetooth díchumasaithe
|
||||||
.inactive = Níl an tseirbhís bluetooth gníomhach
|
.inactive = Níl an tseirbhís Bluetooth gníomhach
|
||||||
.unknown = Níorbh fhéidir an tseirbhís bluetooth a ghníomhachtú. An bhfuil blueZ suiteáilte?
|
.unknown = Níorbh fhéidir an tseirbhís Bluetooth a ghníomhachtú. An bhfuil BlueZ suiteáilte?
|
||||||
bluetooth-paired = Gléasanna ceangailte roimhe seo
|
bluetooth-paired = Gléasanna ceangailte roimhe seo
|
||||||
.connect = Ceangail
|
.connect = Ceangail
|
||||||
.battery = { $percentage }% cadhnra
|
.battery = { $percentage }% cadhnra
|
||||||
|
|
@ -171,10 +163,9 @@ desktop = Deasc
|
||||||
|
|
||||||
wallpaper = Cúlbhrat
|
wallpaper = Cúlbhrat
|
||||||
.change = Athraigh íomhá gach
|
.change = Athraigh íomhá gach
|
||||||
.desc = Íomhánna cúlbhrat, dathanna, agus roghanna taispeántas sleamhnán.
|
|
||||||
.fit = Cúlbhrat oiriúnach
|
.fit = Cúlbhrat oiriúnach
|
||||||
.folder-dialog = Roghnaigh fillteán cúlbhrat
|
.folder-dialog = Roghnaigh fillteán cúlbhrat
|
||||||
.image-dialog = Roghnaigh íomhá cúlbhrat
|
.image-dialog = Roghnaigh íomhá chúlbhrat
|
||||||
.plural = Cúlbhrat
|
.plural = Cúlbhrat
|
||||||
.same = Cúlbhrat céanna ar gach taispeáint
|
.same = Cúlbhrat céanna ar gach taispeáint
|
||||||
.slide = Taispeántas sleamhnán
|
.slide = Taispeántas sleamhnán
|
||||||
|
|
@ -202,7 +193,6 @@ never = Riamh
|
||||||
## Desktop: Appearance
|
## Desktop: Appearance
|
||||||
|
|
||||||
appearance = Dealramh
|
appearance = Dealramh
|
||||||
.desc = Dathanna béime agus téamaíocht
|
|
||||||
accent-color = Dath béime
|
accent-color = Dath béime
|
||||||
app-background = Cúlra fuinneoige
|
app-background = Cúlra fuinneoige
|
||||||
auto = Uath
|
auto = Uath
|
||||||
|
|
@ -233,7 +223,7 @@ container-background = Cúlra coimeádán
|
||||||
control-tint = Dath scátha comhpháirte rialaithe
|
control-tint = Dath scátha comhpháirte rialaithe
|
||||||
.desc = Úsáidtear é le haghaidh cúlra de chnaipí caighdeánacha, ionchuir chuardaigh, ionchuir téacs, agus comhpháirteanna comhchosúla
|
.desc = Úsáidtear é le haghaidh cúlra de chnaipí caighdeánacha, ionchuir chuardaigh, ionchuir téacs, agus comhpháirteanna comhchosúla
|
||||||
frosted = Éifeacht gloine reatha ar chóras an úsáideora
|
frosted = Éifeacht gloine reatha ar chóras an úsáideora
|
||||||
.desc = Cuireann sé doiléiriú cúlra i bhfeidhm ar an bpainéal, an duga, na feidhmchláiríní, an lainseálaí, agus an leabharlann aip
|
.desc = Cuireann sé doiléiriú cúlra i bhfeidhm ar an bpainéal, an duga, na feidhmchláiríní, an lainseálaí, agus leabharlann feidhmchlár
|
||||||
enable-export = Cuir an téama seo i bhfeidhm ar aipeanna GNOME.
|
enable-export = Cuir an téama seo i bhfeidhm ar aipeanna GNOME.
|
||||||
.desc = Ní thacaíonn gach tacar uirlisí le huath-athrú. B’fhéidir go mbeadh gá aipeanna nach bhfuil i COSMIC a atosú tar éis athrú téama.
|
.desc = Ní thacaíonn gach tacar uirlisí le huath-athrú. B’fhéidir go mbeadh gá aipeanna nach bhfuil i COSMIC a atosú tar éis athrú téama.
|
||||||
icon-theme = Téama deilbhíní
|
icon-theme = Téama deilbhíní
|
||||||
|
|
@ -262,12 +252,10 @@ monospace-font = Cló monospás
|
||||||
## Desktop: Notifications
|
## Desktop: Notifications
|
||||||
|
|
||||||
notifications = Fógraí
|
notifications = Fógraí
|
||||||
.desc = Ná cuir isteach, fógraí glasála scáileáin, agus socruithe in aghaidh an fheidhmchláir
|
|
||||||
|
|
||||||
## Desktop: Panel
|
## Desktop: Panel
|
||||||
|
|
||||||
panel = Painéal
|
panel = Painéal
|
||||||
.desc = Barra córais phríomhúil do roghchláir agus feidhmchláiríní
|
|
||||||
add = Cuir leis
|
add = Cuir leis
|
||||||
add-applet = Cuir feidhmchláirín leis
|
add-applet = Cuir feidhmchláirín leis
|
||||||
all = Gach
|
all = Gach
|
||||||
|
|
@ -277,8 +265,8 @@ end-segment = Deighleog deireadh
|
||||||
large = Mór
|
large = Mór
|
||||||
no-applets-found = Níor aimsíodh feidhmchláiríní...
|
no-applets-found = Níor aimsíodh feidhmchláiríní...
|
||||||
panel-bottom = Bun
|
panel-bottom = Bun
|
||||||
panel-left = Clé
|
panel-left = Ar chlé
|
||||||
panel-right = Deas
|
panel-right = Ar dheis
|
||||||
panel-top = Barr
|
panel-top = Barr
|
||||||
search-applets = Cuardach feidhmchláiríní...
|
search-applets = Cuardach feidhmchláiríní...
|
||||||
small = Beag
|
small = Beag
|
||||||
|
|
@ -310,12 +298,10 @@ panel-missing = Tá cumraíocht an phainéil ar iarraidh
|
||||||
## Desktop: Dock
|
## Desktop: Dock
|
||||||
|
|
||||||
dock = Duga
|
dock = Duga
|
||||||
.desc = Barra roghnach le haghaidh aipeanna agus feidhmchláiríní
|
|
||||||
|
|
||||||
## Desktop: Window management
|
## Desktop: Window management
|
||||||
|
|
||||||
window-management = Bainistíocht fuinneoige
|
window-management = Bainistíocht fuinneoige
|
||||||
.desc = Gníomh eochair Super, roghanna rialaithe fuinneog, agus roghanna breise tíliú fuinneog
|
|
||||||
super-key = Gníomh na heochrach Super
|
super-key = Gníomh na heochrach Super
|
||||||
.launcher = Oscail lainseálaí
|
.launcher = Oscail lainseálaí
|
||||||
.workspaces = Oscail spásanna oibre
|
.workspaces = Oscail spásanna oibre
|
||||||
|
|
@ -334,7 +320,6 @@ focus-navigation = Nascleanúint fócais
|
||||||
## Desktop: Workspaces
|
## Desktop: Workspaces
|
||||||
|
|
||||||
workspaces = Spásanna oibre
|
workspaces = Spásanna oibre
|
||||||
.desc = Treoshuíomh agus iompar spás oibre
|
|
||||||
workspaces-behavior = Iompar spáis oibre
|
workspaces-behavior = Iompar spáis oibre
|
||||||
.dynamic = Spásanna oibre dinimiciúla
|
.dynamic = Spásanna oibre dinimiciúla
|
||||||
.dynamic-desc = Baintear spásanna oibre folamh go huathoibríoch.
|
.dynamic-desc = Baintear spásanna oibre folamh go huathoibríoch.
|
||||||
|
|
@ -361,10 +346,9 @@ color = Dath
|
||||||
.sidebar = Próifílí dathanna
|
.sidebar = Próifílí dathanna
|
||||||
.temperature = Teocht datha
|
.temperature = Teocht datha
|
||||||
display = Taispeántais
|
display = Taispeántais
|
||||||
.desc = Bainistigh taispeántais agus solas oíche
|
|
||||||
.arrangement = Socrú taispeántais
|
.arrangement = Socrú taispeántais
|
||||||
.arrangement-desc = Tarraing taispeántais chun iad a athshocrú
|
.arrangement-desc = Tarraing taispeántais chun iad a athshocrú
|
||||||
.enable = Cumasaigh an taispeáint
|
.enable = Cumasaigh an dtaispeáint
|
||||||
.external = { $size } { $output } taispeáint sheachtrach
|
.external = { $size } { $output } taispeáint sheachtrach
|
||||||
.laptop = { $size } taispeáint ríomhaire glúine
|
.laptop = { $size } taispeáint ríomhaire glúine
|
||||||
.options = Roghanna taispeána
|
.options = Roghanna taispeána
|
||||||
|
|
@ -410,7 +394,6 @@ dialog = Dialóg
|
||||||
## Sound
|
## Sound
|
||||||
|
|
||||||
sound = Fuaim
|
sound = Fuaim
|
||||||
.desc = N/A
|
|
||||||
sound-output = Aschur
|
sound-output = Aschur
|
||||||
.volume = Toirt aschuir
|
.volume = Toirt aschuir
|
||||||
.device = Gléas aschuir
|
.device = Gléas aschuir
|
||||||
|
|
@ -432,7 +415,6 @@ sound-applications = Feidhmchláir
|
||||||
## Power
|
## Power
|
||||||
|
|
||||||
power = Cumhacht & ceallraí
|
power = Cumhacht & ceallraí
|
||||||
.desc = Bainistigh socruithe cumhachta
|
|
||||||
battery = Ceallraí
|
battery = Ceallraí
|
||||||
.minute =
|
.minute =
|
||||||
{ $value } { $value ->
|
{ $value } { $value ->
|
||||||
|
|
@ -477,7 +459,6 @@ power-saving = Roghanna coigilte cumhachta
|
||||||
acceleration-desc = Coigeartaíonn sé íogaireacht rianaithe go huathoibríoch bunaithe ar luas
|
acceleration-desc = Coigeartaíonn sé íogaireacht rianaithe go huathoibríoch bunaithe ar luas
|
||||||
disable-while-typing = Díchumasaigh agus tú ag clóscríobh
|
disable-while-typing = Díchumasaigh agus tú ag clóscríobh
|
||||||
input-devices = Gléasanna ionchuir
|
input-devices = Gléasanna ionchuir
|
||||||
.desc = Gléasanna ionchuir
|
|
||||||
primary-button = Cnaipe príomhúil
|
primary-button = Cnaipe príomhúil
|
||||||
.desc = Socraíonn sé ord na gcnaipí fisiciúla
|
.desc = Socraíonn sé ord na gcnaipí fisiciúla
|
||||||
.left = Clé
|
.left = Clé
|
||||||
|
|
@ -496,7 +477,6 @@ fast = Tapa
|
||||||
short = Gairid
|
short = Gairid
|
||||||
long = Fada
|
long = Fada
|
||||||
keyboard = Méarchlár
|
keyboard = Méarchlár
|
||||||
.desc = Foinsí ionchuir, athrú, iontráil carachtar speisialta, aicearraí
|
|
||||||
keyboard-sources = Foinsí ionchuir
|
keyboard-sources = Foinsí ionchuir
|
||||||
.desc = Is féidir foinsí ionchuir a athrú trí úsáid a bhaint as teaglaim eochair Super+Spás. Is féidir é seo a shaincheapadh sna socruithe aicearra méarchláir.
|
.desc = Is féidir foinsí ionchuir a athrú trí úsáid a bhaint as teaglaim eochair Super+Spás. Is féidir é seo a shaincheapadh sna socruithe aicearra méarchláir.
|
||||||
.move-up = Bog suas
|
.move-up = Bog suas
|
||||||
|
|
@ -538,8 +518,8 @@ migrate-workspace-next = Aistrigh spás oibre go dtí an chéad aschur eile
|
||||||
migrate-workspace =
|
migrate-workspace =
|
||||||
Imirce spás oibre chuig aschur { $direction ->
|
Imirce spás oibre chuig aschur { $direction ->
|
||||||
*[down] síos
|
*[down] síos
|
||||||
[left] clé
|
[left] ar chlé
|
||||||
[right] deas
|
[right] ar dheis
|
||||||
[up] suas
|
[up] suas
|
||||||
}
|
}
|
||||||
navigate = Nascleanúint
|
navigate = Nascleanúint
|
||||||
|
|
@ -561,19 +541,19 @@ nav-shortcuts = Nascleanúint
|
||||||
.prev-workspace = Fócas ar spás oibre roimhe seo
|
.prev-workspace = Fócas ar spás oibre roimhe seo
|
||||||
.next-workspace = Fócas ar an gcéad spás oibre eile
|
.next-workspace = Fócas ar an gcéad spás oibre eile
|
||||||
.focus =
|
.focus =
|
||||||
Fuinneog fócais { $direction ->
|
Fócas fuinneog { $direction ->
|
||||||
*[down] síos
|
*[down] síos
|
||||||
[in] isteach
|
[in] isteach
|
||||||
[left] clé
|
[left] ar chlé
|
||||||
[out] amach
|
[out] amach
|
||||||
[right] deas
|
[right] ar dheis
|
||||||
[up] suas
|
[up] suas
|
||||||
}
|
}
|
||||||
.output =
|
.output =
|
||||||
Athraigh chuig aschur { $direction ->
|
Athraigh chuig aschur { $direction ->
|
||||||
*[down] síos
|
*[down] síos
|
||||||
[left] clé
|
[left] ar chlé
|
||||||
[right] deas
|
[right] ar dheis
|
||||||
[up] suas
|
[up] suas
|
||||||
}
|
}
|
||||||
.workspace = Athraigh go spás oibre { $num }
|
.workspace = Athraigh go spás oibre { $num }
|
||||||
|
|
@ -587,24 +567,24 @@ manage-windows = Bainistigh fuinneoga
|
||||||
.toggle-sticky = Scoránaigh an fhuinneog greamaitheach
|
.toggle-sticky = Scoránaigh an fhuinneog greamaitheach
|
||||||
move-windows = Bog fuinneoga
|
move-windows = Bog fuinneoga
|
||||||
.direction =
|
.direction =
|
||||||
Bog Fuinneog { $direction ->
|
Bog an fhuinneog { $direction ->
|
||||||
*[down] síos
|
*[down] síos
|
||||||
[left] clé
|
[left] ar chlé
|
||||||
[right] deas
|
[right] ar dheis
|
||||||
[up] suas
|
[up] suas
|
||||||
}
|
}
|
||||||
.display =
|
.display =
|
||||||
Bog fuinneog monatóir amháin { $direction ->
|
Bog an fhuinneog monatóir amháin { $direction ->
|
||||||
*[down] síos
|
*[down] síos
|
||||||
[left] clé
|
[left] ar chlé
|
||||||
[right] deas
|
[right] ar dheis
|
||||||
[up] suas
|
[up] suas
|
||||||
}
|
}
|
||||||
.workspace =
|
.workspace =
|
||||||
Bog fuinneog spás oibre amháin { $direction ->
|
Bog an fhuinneog spás oibre amháin { $direction ->
|
||||||
*[below] thíos
|
*[below] thíos
|
||||||
[left] clé
|
[left] ar chlé
|
||||||
[right] deas
|
[right] ar dheis
|
||||||
[above] thuas
|
[above] thuas
|
||||||
}
|
}
|
||||||
.workspace-num = Bog an fhuinneog go spás oibre { $num }
|
.workspace-num = Bog an fhuinneog go spás oibre { $num }
|
||||||
|
|
@ -658,9 +638,8 @@ zoom-out = Súmáil amach
|
||||||
## Input: Mouse
|
## Input: Mouse
|
||||||
|
|
||||||
mouse = Luch
|
mouse = Luch
|
||||||
.desc = Luas luch, luasghéarú, scrollú nádúrtha
|
|
||||||
.speed = Luas luch
|
.speed = Luas luch
|
||||||
.acceleration = Cumasaigh luasghéarú na luiche
|
.acceleration = Cumasaigh luasghéarú luiche
|
||||||
|
|
||||||
## Input: Touchpad
|
## Input: Touchpad
|
||||||
|
|
||||||
|
|
@ -673,7 +652,6 @@ tap-to-click = Tapáil le cliceáil
|
||||||
.desc = Cumasaíonn sé tapáil le méar amháin le haghaidh cliceáil phríomhúil, tapáil le dhá mhéar le haghaidh cliceáil thánaisteach, agus tapáil le trí mhéar le haghaidh cliceáil lár
|
.desc = Cumasaíonn sé tapáil le méar amháin le haghaidh cliceáil phríomhúil, tapáil le dhá mhéar le haghaidh cliceáil thánaisteach, agus tapáil le trí mhéar le haghaidh cliceáil lár
|
||||||
touchpad = Ceap tadhaill
|
touchpad = Ceap tadhaill
|
||||||
.acceleration = Cumasaigh luasghéarú an ceap tadhaill
|
.acceleration = Cumasaigh luasghéarú an ceap tadhaill
|
||||||
.desc = Luas an ceap tadhaill, roghanna cliceáil, gothaí
|
|
||||||
.speed = Luas an ceap tadhaill
|
.speed = Luas an ceap tadhaill
|
||||||
|
|
||||||
## Input: Gestures
|
## Input: Gestures
|
||||||
|
|
@ -694,9 +672,7 @@ open-workspaces-view = Oscail radharc spásanna oibre
|
||||||
## Time & Language
|
## Time & Language
|
||||||
|
|
||||||
time = Am & teanga
|
time = Am & teanga
|
||||||
.desc = N/A
|
|
||||||
time-date = Dáta & am
|
time-date = Dáta & am
|
||||||
.desc = Crios ama, socruithe uathoibríocha cloig, agus formáidiú ama
|
|
||||||
.auto = Socraigh go huathoibríoch
|
.auto = Socraigh go huathoibríoch
|
||||||
.auto-ntp = Nuashonrófar an dáta agus an t-am go huathoibríoch nuair a shocrófar an crios ama
|
.auto-ntp = Nuashonrófar an dáta agus an t-am go huathoibríoch nuair a shocrófar an crios ama
|
||||||
time-zone = Crios ama
|
time-zone = Crios ama
|
||||||
|
|
@ -712,7 +688,6 @@ time-format = Formáid dáta & ama
|
||||||
.sunday = Domhnach
|
.sunday = Domhnach
|
||||||
.monday = Luan
|
.monday = Luan
|
||||||
time-region = Réigiún & teanga
|
time-region = Réigiún & teanga
|
||||||
.desc = Formáidigh dátaí, amanna agus uimhreacha bunaithe ar do réigiún
|
|
||||||
formatting = Formáidiú
|
formatting = Formáidiú
|
||||||
.dates = Dátaí
|
.dates = Dátaí
|
||||||
.time = Am
|
.time = Am
|
||||||
|
|
@ -734,7 +709,6 @@ applications = Feidhmchláir
|
||||||
## Applications: Default Applications
|
## Applications: Default Applications
|
||||||
|
|
||||||
default-apps = Feidhmchláir réamhshocraithe
|
default-apps = Feidhmchláir réamhshocraithe
|
||||||
.desc = Brabhsálaí gréasáin réamhshocraithe, cliant ríomhphoist, brabhsálaí comhad, agus feidhmchláir eile
|
|
||||||
.web-browser = Brabhsálaí gréasáin
|
.web-browser = Brabhsálaí gréasáin
|
||||||
.file-manager = Bainisteoir comhad
|
.file-manager = Bainisteoir comhad
|
||||||
.mail-client = Cliant ríomhphoist
|
.mail-client = Cliant ríomhphoist
|
||||||
|
|
@ -745,11 +719,11 @@ default-apps = Feidhmchláir réamhshocraithe
|
||||||
.terminal = Teirminéal
|
.terminal = Teirminéal
|
||||||
.other-associations = Cumainn eile
|
.other-associations = Cumainn eile
|
||||||
.text-editor = Eagarthóir téacs
|
.text-editor = Eagarthóir téacs
|
||||||
|
.not-installed = Gan suiteáil
|
||||||
|
|
||||||
## Applications: Startup Applications
|
## Applications: Startup Applications
|
||||||
|
|
||||||
startup-apps = Feidhmchláir tosaithe
|
startup-apps = Feidhmchláir tosaithe
|
||||||
.desc = Cumraigh feidhmchláir a ritheann ar logáil isteach.
|
|
||||||
.add = Cuir feidhmchlár leis
|
.add = Cuir feidhmchlár leis
|
||||||
.user = Lainseáil feidhmchláir nuair a logálann tú isteach
|
.user = Lainseáil feidhmchláir nuair a logálann tú isteach
|
||||||
.none = Níor cuireadh aon fheidhmchláir tosaithe leis
|
.none = Níor cuireadh aon fheidhmchláir tosaithe leis
|
||||||
|
|
@ -760,9 +734,8 @@ startup-apps = Feidhmchláir tosaithe
|
||||||
## Applications: Legacy Applications
|
## Applications: Legacy Applications
|
||||||
|
|
||||||
legacy-applications = Comhoiriúnacht feidhmchláir X11
|
legacy-applications = Comhoiriúnacht feidhmchláir X11
|
||||||
.desc = Scálú feidhmchlár córais fuinneoige X11 agus aicearraí domhanda
|
|
||||||
legacy-app-global-shortcuts = Aicearraí domhanda i feidhmchláir X11
|
legacy-app-global-shortcuts = Aicearraí domhanda i feidhmchláir X11
|
||||||
.desc = Le haicearraí domhanda, is féidir le feidhmchláir eile aitheantas a thabhairt do bhuillí eochracha agus d’imeachtaí cnaipe luiche a dhéantar in aipeanna le haghaidh gnéithe cosúil le brúigh-chun-caint nó brúigh-chun-balbhú. De réir réamhshocraithe, tá sé seo díchumasaithe in aipeanna X11 lena chinntiú nach féidir le feidhmchláir eile monatóireacht a dhéanamh ar imeachtaí méarchláir agus luiche ina bhfuil faisnéis íogair.
|
.desc = Le haicearraí domhanda, is féidir le feidhmchláir eile aitheantas a thabhairt do bhuillí eochracha agus d’imeachtaí cnaipe luiche a dhéantar in feidhmchláir le haghaidh gnéithe cosúil le brúigh-chun-caint nó brúigh-chun-balbhú. De réir réamhshocraithe, tá sé seo díchumasaithe in feidhmchláir X11 lena chinntiú nach féidir le feidhmchláir eile monatóireacht a dhéanamh ar imeachtaí méarchláir agus luiche ina bhfuil faisnéis íogair.
|
||||||
.none = Gan eochracha
|
.none = Gan eochracha
|
||||||
.modifiers = Mionathraitheoirí (Super, Shift, Control, Alt)
|
.modifiers = Mionathraitheoirí (Super, Shift, Control, Alt)
|
||||||
.combination = Gach eochair agus na modhnóirí Super, Control nó Alt á mbrú
|
.combination = Gach eochair agus na modhnóirí Super, Control nó Alt á mbrú
|
||||||
|
|
@ -785,7 +758,6 @@ system = Córas & cuntais
|
||||||
## System: About
|
## System: About
|
||||||
|
|
||||||
about = Maidir
|
about = Maidir
|
||||||
.desc = Ainm gléis, faisnéis crua-earraí, réamhshocruithe córais oibriúcháin
|
|
||||||
about-device = Ainm an ghléis
|
about-device = Ainm an ghléis
|
||||||
.desc = Feictear an t-ainm seo ar líonraí nó ar ghléasanna Bluetooth eile
|
.desc = Feictear an t-ainm seo ar líonraí nó ar ghléasanna Bluetooth eile
|
||||||
about-hardware = Crua-earraí
|
about-hardware = Crua-earraí
|
||||||
|
|
@ -806,12 +778,10 @@ about-related = Socruithe gaolmhara
|
||||||
## System: Firmware
|
## System: Firmware
|
||||||
|
|
||||||
firmware = Dochtearraí
|
firmware = Dochtearraí
|
||||||
.desc = Sonraí maidir le dochtearraí
|
|
||||||
|
|
||||||
## System: Users
|
## System: Users
|
||||||
|
|
||||||
users = Úsáideoirí
|
users = Úsáideoirí
|
||||||
.desc = Fíordheimhniú agus cuntais úsáideora
|
|
||||||
.admin = Riarthóir
|
.admin = Riarthóir
|
||||||
.standard = Caighdeán
|
.standard = Caighdeán
|
||||||
.profile-add = Roghnaigh íomhá phróifíl
|
.profile-add = Roghnaigh íomhá phróifíl
|
||||||
|
|
@ -836,3 +806,108 @@ sound-device-port-unplugged = Díphlugáilte
|
||||||
sound-hd-audio = Fuaim HD
|
sound-hd-audio = Fuaim HD
|
||||||
sound-usb-audio = Fuaim USB
|
sound-usb-audio = Fuaim USB
|
||||||
sound-device-profiles = Próifílí gléasanna
|
sound-device-profiles = Próifílí gléasanna
|
||||||
|
shadows-floating = Fuinneoga ar snámh
|
||||||
|
.clip = Meaitseáil coirnéil an chórais agus cuir scáthanna i bhfeidhm
|
||||||
|
shadows-tiling = Fuinneoga tílithe
|
||||||
|
.clip = Meaitseáil coirnéil an chórais
|
||||||
|
.shadow = Cuir scáthanna i bhfeidhm
|
||||||
|
shadow-and-corners = Scáth agus coirnéil fuinneoige
|
||||||
|
workspaces-overview = Forbhreathnú ar Spásanna Oibre
|
||||||
|
.action-on-typing = Gníomh ar chlóscríobh
|
||||||
|
.none = Dada
|
||||||
|
.launcher = Oscail an Lainseálaí
|
||||||
|
.applications = Oscail Feidhmchláir
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-a11y = Inrochtaineacht
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Deasc;
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;Líonra;Ceangal;
|
||||||
|
xdg-entry-about-keywords = COSMIC;Maidir
|
||||||
|
xdg-entry-desktop = Deasc
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Am;Crios;
|
||||||
|
xdg-entry-wallpaper = Cúlbhrat
|
||||||
|
xdg-entry-displays = Taispeántais
|
||||||
|
xdg-entry-date-time = Dáta & Am
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
xdg-entry-applications = Feidhmchláir
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Réamhshocrú;Feidhmchlár
|
||||||
|
xdg-entry-keywords = COSMIC;Socruithe;
|
||||||
|
xdg-entry-about = Maidir
|
||||||
|
xdg-entry-appearance = Dealramh
|
||||||
|
xdg-entry-workspaces = Spásanna Oibre
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Luch;Luasghéarú;Scrolláil;
|
||||||
|
xdg-entry-keyboard-comment = Foinsí ionchuir, athrú, iontráil carachtar speisialta, aicearraí
|
||||||
|
xdg-entry-mouse = Luch
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Duga;Painéal;Feidhmchláirín
|
||||||
|
xdg-entry-mouse-comment = Luas luiche, luasghéarú, agus scrollú nádúrtha
|
||||||
|
xdg-entry-keyboard = Méarchlár
|
||||||
|
xdg-entry-network = Líonra & Gan Sreang
|
||||||
|
xdg-entry-input-comment = Socruithe méarchláir agus luiche
|
||||||
|
xdg-entry-dock = Duga
|
||||||
|
xdg-entry-input-keywords = COSMIC;Ionchur;Méarchlár;Luch;Luchóga;
|
||||||
|
xdg-entry-input = Gléasanna Ionchuir
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Méarchlár;Ionchur;Foinse;Aicearraí;
|
||||||
|
xdg-entry-network-comment = Bainistigh naisc líonra
|
||||||
|
xdg-entry-touchpad = Ceap tadhaill
|
||||||
|
xdg-entry-wired = Sreangaithe
|
||||||
|
xdg-entry-startup-apps-comment = Cumraigh feidhmchláir a ritheann ar logáil isteach
|
||||||
|
xdg-entry-region-language = Réigiún & Teanga
|
||||||
|
xdg-entry-bluetooth-comment = Bainistigh gléasanna Bluetooth
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Fógra;Glasáil;
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Tosú;Feidhmchlár;
|
||||||
|
xdg-entry-default-apps-comment = Brabhsálaí gréasáin réamhshocraithe, cliant ríomhphoist, brabhsálaí comhad, agus feidhmchláir eile
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Sreangaithe;Líonra Ceantair Áitiúil;Líonra;Nasc;
|
||||||
|
xdg-entry-power = Cumhacht & Ceallraí
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Béim;Dath;Deilbhín;Cló;Téama
|
||||||
|
xdg-entry-system = Córas & Cuntais
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Painéal;Feidhmchláirín
|
||||||
|
xdg-entry-window-management = Bainistíocht Fuinneog
|
||||||
|
xdg-entry-time-language-comment = Bainistigh dáta an chórais, am, réigiún agus teanga
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Feidhmchlár;Cluiche;Comhoiriúnacht;
|
||||||
|
xdg-entry-displays-comment = Bainistigh socruithe cumraíochta taispeána
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;Ceap tadhaill;Gothaí;
|
||||||
|
xdg-entry-time-language = Am & Teanga
|
||||||
|
xdg-entry-users = Úsáideoirí
|
||||||
|
xdg-entry-system-keywords = COSMIC;Córas;Eolas;Cuntais;Dochtearraí;
|
||||||
|
xdg-entry-default-apps = Feidhmchláir Réamhshocraithe
|
||||||
|
xdg-entry-applications-comment = Feidhmchláir réamhshocraithe, feidhmchláir tosaithe, agus socruithe comhoiriúnachta feidhmchlár X11
|
||||||
|
xdg-entry-panel = Painéal
|
||||||
|
xdg-entry-notifications = Fógraí
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Inrochtaineacht;A11y;Scáileán;Léitheoir;Formhéadaitheoir;Codarsnacht;Dath;
|
||||||
|
xdg-entry-wireless-comment = Naisc Wi-Fi agus próifílí nasc
|
||||||
|
xdg-entry-desktop-comment = Socruithe cúlbhrat, cuma, painéal, duga, bainistíocht fuinneoga agus spás oibre
|
||||||
|
xdg-entry-a11y-comment = Léitheoir scáileáin, formhéadaitheoir, ardchodarsnacht, agus scagairí datha
|
||||||
|
xdg-entry-users-comment = Fíordheimhniú agus cuntais úsáideora
|
||||||
|
xdg-entry-dock-comment = Barra roghnach le haghaidh aipeanna agus feidhmchláiríní
|
||||||
|
xdg-entry-network-keywords = COSMIC;Líonra;Gan Sreang;WiFi;VPN;
|
||||||
|
xdg-entry-wallpaper-comment = Íomhánna cúlbhrat, dathanna agus roghanna taispeántais sleamhnán
|
||||||
|
xdg-entry-startup-apps = Feidhmchláir tosaithe
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Spás Oibre;Treoshuíomh;Forbhreathnú;Monatóir;
|
||||||
|
xdg-entry-system-comment = Faisnéis chórais, cuntais, agus nuashonruithe dochtearraí
|
||||||
|
xdg-entry-x11-applications-comment = Scálú feidhmchlár chóras fuinneoga X11, príomhthaispeántas, agus aicearraí domhanda
|
||||||
|
xdg-entry-region-language-comment = Formáidigh dátaí, amanna agus uimhreacha bunaithe ar do réigiún
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Cúlbhrat;Cúlra;Taispeántas sleamhnán;
|
||||||
|
xdg-entry-users-keywords = COSMIC;Úsáideoir;Cuntas;
|
||||||
|
xdg-entry-about-comment = Ainm gléis, faisnéis crua-earraí, réamhshocruithe córais oibriúcháin
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Líonra;Nasc;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-appearance-comment = Dathanna béime agus téamaí
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;Córas;Am;Dáta;Réigiún;Teanga;
|
||||||
|
xdg-entry-comment = Feidhmchlár socruithe don deasc COSMIC
|
||||||
|
xdg-entry-notifications-comment = Ná Cuir Isteach, fógraí glasála scáileáin, agus socruithe in aghaidh an fheidhmchláir
|
||||||
|
xdg-entry-sound-keywords = COSMIC;Fuaim;Cloisteáil;Foláireamh;Pipewire;
|
||||||
|
xdg-entry-power-keywords = COSMIC;Cumhacht;Ceallraí
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Réigiún;Teanga;Dáta;Formáid;Am;Suíomh;Logánú;
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Réamhshocrú;Feidhmchlár;Tosaithe;X11;Comhoiriúnacht
|
||||||
|
xdg-entry-sound-comment = Socruithe fuaime do ghléasanna, d’fholáirimh agus d’fheidhmchláir
|
||||||
|
xdg-entry-touchpad-comment = Luas an ceap tadhaill, roghanna cliceáil, agus gothaí
|
||||||
|
xdg-entry-vpn-comment = Naisc VPN agus próifílí nasc
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;Fuinneog;Bainistíocht;Tíliú;Super;Eochair;
|
||||||
|
xdg-entry-workspaces-comment = Treoshuíomh, forbhreathnú, agus iompar il-mhonatóireachta ar an spás oibre
|
||||||
|
xdg-entry-panel-comment = Barra córais phríomhúil le haghaidh biachláir agus feidhmchláiríní
|
||||||
|
xdg-entry-sound = Fuaim
|
||||||
|
xdg-entry-power-comment = Modhanna cumhachta agus roghanna coigilte cumhachta
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Taispeántas;
|
||||||
|
xdg-entry-date-time-comment = Crios ama, socruithe uathoibríocha cloig, agus formáidiú ama
|
||||||
|
xdg-entry-x11-applications = Comhoiriúnacht Feidhmchláir X11
|
||||||
|
xdg-entry-window-management-comment = Gníomh na sár-eochrach, roghanna rialaithe fuinneoige, agus roghanna breise tíleála fuinneoige
|
||||||
|
xdg-entry-wired-comment = Naisc sreangaithe agus próifílí nasc
|
||||||
|
no-search-results = Níl aon líonra ag teacht leis an gcuardach seo.
|
||||||
|
|
|
||||||
7
i18n/hi/cosmic_settings.ftl
vendored
7
i18n/hi/cosmic_settings.ftl
vendored
|
|
@ -6,13 +6,6 @@ number = { $number }
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] तार
|
|
||||||
[wifi] वाई-फाई
|
|
||||||
[vpn] वी.पी.एन
|
|
||||||
*[other] अज्ञात
|
|
||||||
} कनेक्शन और प्रोफाइल।
|
|
||||||
add-network = नेटवर्क जोड़ें
|
add-network = नेटवर्क जोड़ें
|
||||||
.profile = प्रोफाइल जोड़ें
|
.profile = प्रोफाइल जोड़ें
|
||||||
add-vpn = वी.पी.एन जोड़ें
|
add-vpn = वी.पी.एन जोड़ें
|
||||||
|
|
|
||||||
260
i18n/hu/cosmic_settings.ftl
vendored
260
i18n/hu/cosmic_settings.ftl
vendored
|
|
@ -4,56 +4,107 @@ ok = OK
|
||||||
unknown = Ismeretlen
|
unknown = Ismeretlen
|
||||||
number = { $number }
|
number = { $number }
|
||||||
|
|
||||||
|
## Freedesktop desktop entries
|
||||||
|
|
||||||
|
xdg-entry-about = Rendszerinformáció
|
||||||
|
xdg-entry-about-comment = Eszköznév, hardverinformációk és az operációs rendszer alapértelmezett beállításai
|
||||||
|
xdg-entry-a11y = Akadálymentesség
|
||||||
|
xdg-entry-a11y-comment = Képernyőolvasó, nagyító, magas kontraszt és színszűrők
|
||||||
|
xdg-entry-appearance = Megjelenés
|
||||||
|
xdg-entry-appearance-comment = Kiemelőszínek és témázás
|
||||||
|
xdg-entry-applications = Alkalmazások
|
||||||
|
xdg-entry-applications-comment = Alapértelmezett alkalmazások, indítási alkalmazások és X11 alkalmazáskompatibilitási beállítások
|
||||||
|
xdg-entry-bluetooth-comment = Bluetooth-eszközök kezelése
|
||||||
|
xdg-entry-date-time = Dátum és idő
|
||||||
|
xdg-entry-date-time-comment = Időzóna, automatikus órabeállítások és időformátum
|
||||||
|
xdg-entry-default-apps = Alapértelmezett alkalmazások
|
||||||
|
xdg-entry-default-apps-comment = Alapértelmezett böngésző, levelezőprogram, fájlkezelő és egyéb alkalmazások
|
||||||
|
xdg-entry-desktop = Asztal
|
||||||
|
xdg-entry-displays = Kijelzők
|
||||||
|
xdg-entry-displays-comment = Kijelzőbeállítások kezelése
|
||||||
|
xdg-entry-dock = Dokk
|
||||||
|
xdg-entry-dock-comment = Egy opcionális sáv alkalmazásokhoz és kisalkalmazásokhoz
|
||||||
|
xdg-entry-input = Beviteli eszközök
|
||||||
|
xdg-entry-input-comment = Billentyűzet- és egérbeállítások
|
||||||
|
xdg-entry-keyboard = Billentyűzet
|
||||||
|
xdg-entry-keyboard-comment = Bemeneti források, speciális karakterek, gyorsbillentyűk
|
||||||
|
xdg-entry-mouse = Egér
|
||||||
|
xdg-entry-mouse-comment = Egérsebesség, gyorsítás és természetes görgetés
|
||||||
|
xdg-entry-network = Hálózat és Wi-Fi
|
||||||
|
xdg-entry-network-comment = Hálózati kapcsolatok kezelése
|
||||||
|
xdg-entry-notifications = Értesítések
|
||||||
|
xdg-entry-notifications-comment = Ne zavarjanak, zárolási képernyő értesítések és alkalmazásonkénti beállítások
|
||||||
|
xdg-entry-panel-comment = Fő rendszersáv menükhöz és kisalkalmazásokhoz
|
||||||
|
xdg-entry-power = Energia és akkumulátor
|
||||||
|
xdg-entry-power-comment = Energiagazdálkodási módok és energiagazdálkodási beállítások
|
||||||
|
xdg-entry-region-language = Régió és nyelv
|
||||||
|
xdg-entry-region-language-comment = Dátumok, időpontok és számok formázása a régió alapján
|
||||||
|
xdg-entry-sound = Hang
|
||||||
|
xdg-entry-sound-comment = Hangbeállítások eszközökhöz, figyelmeztetésekhez és alkalmazásokhoz
|
||||||
|
xdg-entry-startup-apps = Indítási alkalmazások
|
||||||
|
xdg-entry-startup-apps-comment = Azoknak az alkalmazásoknak a beállítása, amelyek bejelentkezéskor elindulnak
|
||||||
|
xdg-entry-system = Rendszer és fiókok
|
||||||
|
xdg-entry-time-language = Idő és nyelv
|
||||||
|
xdg-entry-touchpad = Érintőpárna
|
||||||
|
xdg-entry-touchpad-comment = Érintőpárna sebessége, kattintási beállítások és gesztusok
|
||||||
|
xdg-entry-users = Felhasználók
|
||||||
|
xdg-entry-users-comment = Hitelesítés és felhasználói fiókok
|
||||||
|
xdg-entry-vpn-comment = VPN-kapcsolatok és kapcsolódási profilok
|
||||||
|
xdg-entry-wallpaper = Háttérkép
|
||||||
|
xdg-entry-wallpaper-comment = Háttérképek, színek és diavetítési beállítások
|
||||||
|
xdg-entry-window-management = Ablakkezelés
|
||||||
|
xdg-entry-window-management-comment = Super billentyű funkció, ablakkezelési és csempézési beállítások
|
||||||
|
xdg-entry-wired = Vezetékes kapcsolatok
|
||||||
|
xdg-entry-wired-comment = Vezetékes kapcsolatok és kapcsolódási profilok
|
||||||
|
xdg-entry-wireless-comment = Wi-Fi kapcsolatok és kapcsolódási profilok
|
||||||
|
xdg-entry-workspaces = Munkaterületek
|
||||||
|
xdg-entry-workspaces-comment = Munkaterület-tájolás, áttekintés és többképernyős viselkedés
|
||||||
|
xdg-entry-x11-applications = X11 alkalmazások támogatása
|
||||||
|
xdg-entry-x11-applications-comment = X11 ablakrendszer alkalmazásméretezés, elsődleges kijelző és globális gyorsbillentyűk
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Vezetékes
|
|
||||||
[wifi] Wi-Fi
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] Ismeretlen
|
|
||||||
} kapcsolatok és profilok
|
|
||||||
add-network = Hálózat hozzáadása
|
add-network = Hálózat hozzáadása
|
||||||
.profile = Profil hozzáadása
|
.profile = Profil hozzáadása
|
||||||
add-vpn = VPN hozzáadása
|
add-vpn = VPN hozzáadása
|
||||||
airplane-on = A repülőgép üzemmód be van kapcsolva
|
airplane-on = A repülőgép üzemmód be van kapcsolva
|
||||||
cable-unplugged = Kábel kihúzva
|
cable-unplugged = Kábel kihúzva
|
||||||
connect = Csatlakozás
|
connect = Csatlakozás
|
||||||
connected = Csatlakozva
|
connected = Csatlakoztatva
|
||||||
connecting = Csatlakozás…
|
connecting = Csatlakozás…
|
||||||
disconnect = Leválasztás
|
disconnect = Bontás
|
||||||
forget = Elfelejtés
|
forget = Elfelejtés
|
||||||
known-networks = Ismert hálózatok
|
known-networks = Ismert hálózatok
|
||||||
network-and-wireless = Hálózat és Wi-Fi
|
network-and-wireless = Hálózat és Wi-Fi
|
||||||
no-networks = Nem található hálózat
|
no-networks = Nem található hálózat.
|
||||||
no-vpn = Nincs elérhető VPN-kapcsolat
|
no-vpn = Nincs elérhető VPN-kapcsolat
|
||||||
password = Jelszó
|
password = Jelszó
|
||||||
password-confirm = Jelszó megerősítése
|
password-confirm = Jelszó megerősítése
|
||||||
remove = Törlés
|
remove = Eltávolítás
|
||||||
settings = Beállítások
|
settings = Beállítások
|
||||||
username = Felhasználónév
|
username = Felhasználónév
|
||||||
visible-networks = Látható hálózatok
|
visible-networks = Látható hálózatok
|
||||||
identity = Azonosító
|
identity = Azonosító
|
||||||
auth-dialog = Azonosítás szükséges
|
auth-dialog = Azonosítás szükséges
|
||||||
.vpn-description = Írd be a VPN szolgáltatás által követelt felhasználónevet és jelszót.
|
.vpn-description = Írd be a VPN szolgáltatáshoz szükséges felhasználónevet és jelszót.
|
||||||
.wifi-description = Írd be a jelszót vagy a titkosítókulcsot. A router „WPS” gombjának megnyomásával is csatlakozhatsz.
|
.wifi-description = Add meg a jelszót vagy a titkosítókulcsot. A router „WPS” gombjának megnyomásával is csatlakozhatsz.
|
||||||
forget-dialog = El akarod felejteni ezt a Wi-Fi hálózatot?
|
forget-dialog = El akarod felejteni ezt a Wi-Fi hálózatot?
|
||||||
.description = A jelszót ismét meg kell adnod, ha újra csatlakozni szeretnél.
|
.description = A jelszót ismét meg kell adnod, ha újra csatlakozni szeretnél.
|
||||||
network-device-state =
|
network-device-state =
|
||||||
.activated = Csatlakozva
|
.activated = Csatlakoztatva
|
||||||
.config = Csatlakozás…
|
.config = Csatlakozás…
|
||||||
.deactivating = Leválasztás…
|
.deactivating = Bontás…
|
||||||
.disconnected = Leválasztva
|
.disconnected = Kapcsolat bontva
|
||||||
.failed = Csatlakozás sikertelen
|
.failed = Csatlakozás sikertelen
|
||||||
.ip-check = Kapcsolat ellenőrzése
|
.ip-check = Kapcsolat ellenőrzése
|
||||||
.ip-config = IP és router információk lekérése
|
.ip-config = IP és router információk lekérése
|
||||||
.need-auth = Azonosítás szükséges
|
.need-auth = Hitelesítés szükséges
|
||||||
.prepare = Felkészülés a kapcsolódáshoz
|
.prepare = Felkészülés a kapcsolódáshoz
|
||||||
.secondaries = Várakozás egy másodlagos kapcsolatra
|
.secondaries = Várakozás másodlagos kapcsolatra
|
||||||
.unavailable = Nem elérhető
|
.unavailable = Nem elérhető
|
||||||
.unknown = Ismeretlen állapot
|
.unknown = Ismeretlen állapot
|
||||||
.unmanaged = Kezeletlen
|
.unmanaged = Kezeletlen
|
||||||
.unplugged = A kábel ki van húzva
|
.unplugged = Kábel kihúzva
|
||||||
remove-connection-dialog = Törlöd a kapcsolati profilt?
|
remove-connection-dialog = Törlöd a kapcsolati profilt?
|
||||||
.vpn-description = A jelszót újra be kell írnod a jövőbeli használathoz.
|
.vpn-description = A jelszót újra be kell írnod a jövőbeli használathoz.
|
||||||
.wired-description = A profilt újból létre kell hoznod a jövőbeli használathoz.
|
.wired-description = A profilt újból létre kell hoznod a jövőbeli használathoz.
|
||||||
|
|
@ -99,16 +150,15 @@ activate = Aktiválás
|
||||||
confirm = Megerősítés
|
confirm = Megerősítés
|
||||||
enable = Engedélyezés
|
enable = Engedélyezés
|
||||||
bluetooth = Bluetooth
|
bluetooth = Bluetooth
|
||||||
.desc = Bluetooth-eszközök kezelése
|
|
||||||
.status = Ez a rendszer { $aliases } néven látható, amíg a Bluetooth beállítások vannak megnyitva.
|
.status = Ez a rendszer { $aliases } néven látható, amíg a Bluetooth beállítások vannak megnyitva.
|
||||||
.connected = Csatlakozva
|
.connected = Csatlakoztatva
|
||||||
.connecting = Csatlakozás…
|
.connecting = Csatlakozás…
|
||||||
.disconnecting = Leválasztás…
|
.disconnecting = Bontás…
|
||||||
.connect = Csatlakozás
|
.connect = Csatlakozás
|
||||||
.disconnect = Leválasztás
|
.disconnect = Bontás
|
||||||
.forget = Elfelejtés
|
.forget = Elfelejtés
|
||||||
.dbus-error = Hiba történt a DBus-szal való kommunikáció során: { $why }
|
.dbus-error = Hiba történt a DBus-szal való kommunikáció során: { $why }
|
||||||
.disabled = A Bluetooth szolgáltatás ki van kapcsolva
|
.disabled = A Bluetooth szolgáltatás le van tiltva
|
||||||
.inactive = A Bluetooth szolgáltatás nem aktív
|
.inactive = A Bluetooth szolgáltatás nem aktív
|
||||||
.unknown = A Bluetooth szolgáltatást nem sikerült aktiválni. A BlueZ telepítve van?
|
.unknown = A Bluetooth szolgáltatást nem sikerült aktiválni. A BlueZ telepítve van?
|
||||||
bluetooth-paired = Korábban párosított eszközök
|
bluetooth-paired = Korábban párosított eszközök
|
||||||
|
|
@ -117,7 +167,7 @@ bluetooth-paired = Korábban párosított eszközök
|
||||||
bluetooth-confirm-pin = Bluetooth PIN megerősítése
|
bluetooth-confirm-pin = Bluetooth PIN megerősítése
|
||||||
.description = Erősítsd meg, hogy a következő PIN megegyezik a(z) { $device } eszközön megjelenített PIN-kóddal
|
.description = Erősítsd meg, hogy a következő PIN megegyezik a(z) { $device } eszközön megjelenített PIN-kóddal
|
||||||
bluetooth-available = Közeli eszközök
|
bluetooth-available = Közeli eszközök
|
||||||
bluetooth-adapters = Bluetooth adapterek
|
bluetooth-adapters = Bluetooth-adapterek
|
||||||
|
|
||||||
## Accessibility
|
## Accessibility
|
||||||
|
|
||||||
|
|
@ -171,10 +221,9 @@ desktop = Asztal
|
||||||
|
|
||||||
wallpaper = Háttérkép
|
wallpaper = Háttérkép
|
||||||
.change = Háttérkép váltásának gyakorisága
|
.change = Háttérkép váltásának gyakorisága
|
||||||
.desc = Háttérképek, színek és diavetítési beállítások
|
|
||||||
.fit = Háttérkép illeszkedése
|
.fit = Háttérkép illeszkedése
|
||||||
.folder-dialog = Válassz háttérkép mappát
|
.folder-dialog = Válassz mappát a háttérképekhez
|
||||||
.image-dialog = Válassz háttérkép képet
|
.image-dialog = Válassz képet a háttérképnek
|
||||||
.plural = Háttérképek
|
.plural = Háttérképek
|
||||||
.same = Ugyanaz a háttérkép legyen minden kijelzőn
|
.same = Ugyanaz a háttérkép legyen minden kijelzőn
|
||||||
.slide = Diavetítés
|
.slide = Diavetítés
|
||||||
|
|
@ -184,7 +233,7 @@ all-displays = Minden kijelző
|
||||||
colors = Színek
|
colors = Színek
|
||||||
dialog-add = Hozzáadás
|
dialog-add = Hozzáadás
|
||||||
fill = Kitöltés
|
fill = Kitöltés
|
||||||
fit-to-screen = Képernyőhöz igazítás
|
fit-to-screen = Igazítás a képernyőhöz
|
||||||
open-new-folder = Új mappa megnyitása
|
open-new-folder = Új mappa megnyitása
|
||||||
recent-folders = Legutóbbi mappák
|
recent-folders = Legutóbbi mappák
|
||||||
x-minutes =
|
x-minutes =
|
||||||
|
|
@ -202,7 +251,6 @@ never = Soha
|
||||||
## Desktop: Appearance
|
## Desktop: Appearance
|
||||||
|
|
||||||
appearance = Megjelenés
|
appearance = Megjelenés
|
||||||
.desc = Kiemelőszínek és COSMIC témák
|
|
||||||
accent-color = Kiemelőszín
|
accent-color = Kiemelőszín
|
||||||
app-background = Ablakháttér
|
app-background = Ablakháttér
|
||||||
auto = Automatikus
|
auto = Automatikus
|
||||||
|
|
@ -219,20 +267,20 @@ mode-and-colors = Mód és színek
|
||||||
recent-colors = Korábbi színek
|
recent-colors = Korábbi színek
|
||||||
reset-to-default = Visszaállítás alapértelmezettre
|
reset-to-default = Visszaállítás alapértelmezettre
|
||||||
rgb = RGB
|
rgb = RGB
|
||||||
window-hint-accent = Az Aktív ablak kiemelésének színe
|
window-hint-accent = Aktív ablak kiemelésének színe
|
||||||
window-hint-accent-toggle = Témaszín használata az aktív ablak kiemelésére
|
window-hint-accent-toggle = Kiemelőszín használata az aktív ablak kiemelésére
|
||||||
auto-switch = Automatikus váltás világos és sötét mód között
|
auto-switch = Automatikus váltás világos és sötét mód között
|
||||||
.sunrise = Napkeltekor világos módra vált
|
.sunrise = Napkeltekor világos módra váltás
|
||||||
.sunset = Napnyugtakor sötét módra vált
|
.sunset = Napnyugtakor sötét módra váltás
|
||||||
.next-sunrise = Következő napfelkeltekor világos módra vált
|
.next-sunrise = Következő napfelkeltekor világos módra váltás
|
||||||
.next-sunset = Következő napnyugtakor sötét módra vált
|
.next-sunset = Következő napnyugtakor sötét módra váltás
|
||||||
container-background = Felületi elemek háttere
|
container-background = Felületi elemek háttere
|
||||||
.desc-detail = A felületi elemek háttérszínét a navigációs oldalsáv, az oldalsó menü, a párbeszédablakok és hasonló widgetek használják. Alapértelmezés szerint a felületi elemek háttérszíne automatikusan az ablak hátteréből származik.
|
.desc-detail = A felületi elemek háttérszínét a navigációs oldalsáv, az oldalsó menü, a párbeszédablakok és hasonló modulok használják. Alapértelmezés szerint a felületi elemek háttérszíne automatikusan az ablak hátteréből származnak.
|
||||||
.reset = Visszaállítás automatikusra
|
.reset = Visszaállítás automatikusra
|
||||||
.desc = Navigációs oldalsávhoz, oldalsó menühöz, párbeszédablakhoz és hasonló widgetekhez használatos
|
.desc = Navigációs oldalsávhoz, oldalsó menühöz, párbeszédablakhoz és hasonló modulokhoz használandó
|
||||||
control-tint = Vezérlőelemek színezése
|
control-tint = Vezérlőelemek színezése
|
||||||
.desc = Szabványos gombok hátterére, keresési bemenetekre, szövegbevitelre és hasonló összetevőkre használatos
|
.desc = Szabványos gombok hátterére, keresési bemenetekre, szövegbevitelre és hasonló összetevőkre használandó
|
||||||
frosted = Elmosódott üveg hatás a rendszerfelületen
|
frosted = Tejüveg hatás a rendszerfelületen
|
||||||
.desc = A háttér elmosását alkalmazza a panelre, a dokkra, a kisalkalmazásokra, az indítóra és az alkalmazáskönyvtárra
|
.desc = A háttér elmosását alkalmazza a panelre, a dokkra, a kisalkalmazásokra, az indítóra és az alkalmazáskönyvtárra
|
||||||
enable-export = Jelenlegi téma alkalmazása a GNOME-alkalmazásokra
|
enable-export = Jelenlegi téma alkalmazása a GNOME-alkalmazásokra
|
||||||
.desc = Nem minden eszközkészlet támogatja az automatikus váltást. Előfordulhat, hogy a téma módosítása után újra kell indítani a nem COSMIC-alapú alkalmazásokat.
|
.desc = Nem minden eszközkészlet támogatja az automatikus váltást. Előfordulhat, hogy a téma módosítása után újra kell indítani a nem COSMIC-alapú alkalmazásokat.
|
||||||
|
|
@ -262,12 +310,10 @@ monospace-font = Rögzített szélességű betűtípus
|
||||||
## Desktop: Notifications
|
## Desktop: Notifications
|
||||||
|
|
||||||
notifications = Értesítések
|
notifications = Értesítések
|
||||||
.desc = Ne zavarjanak, zárolási képernyő értesítések és alkalmazásonkénti beállítások
|
|
||||||
|
|
||||||
## Desktop: Panel
|
## Desktop: Panel
|
||||||
|
|
||||||
panel = Panel
|
panel = Panel
|
||||||
.desc = Fő rendszersáv menükhöz és kisalkalmazásokhoz
|
|
||||||
add = Hozzáadás
|
add = Hozzáadás
|
||||||
add-applet = Kisalkalmazás hozzáadása
|
add-applet = Kisalkalmazás hozzáadása
|
||||||
all = Összes
|
all = Összes
|
||||||
|
|
@ -310,21 +356,19 @@ panel-missing = A panel konfigurációja hiányzik
|
||||||
## Desktop: Dock
|
## Desktop: Dock
|
||||||
|
|
||||||
dock = Dokk
|
dock = Dokk
|
||||||
.desc = Egy opcionális sáv alkalmazásokhoz és kisalkalmazásokhoz
|
|
||||||
|
|
||||||
## Desktop: Window management
|
## Desktop: Window management
|
||||||
|
|
||||||
window-management = Ablakkezelés
|
window-management = Ablakkezelés
|
||||||
.desc = Super billentyű funkció, ablakkezelési és csempézési beállítások
|
super-key = Super billentyű funkciója
|
||||||
super-key = Super billentyű
|
|
||||||
.launcher = Indító megnyitása
|
.launcher = Indító megnyitása
|
||||||
.workspaces = Munkaterületek megnyitása
|
.workspaces = Munkaterületek megnyitása
|
||||||
.applications = Alkalmazások megnyitása
|
.applications = Alkalmazások megnyitása
|
||||||
.disable = Kikapcsolás
|
.disable = Letiltás
|
||||||
edge-gravity = A lebegő ablakok a közeli szélekhez igazodnak
|
edge-gravity = A lebegő ablakok a közeli szélekhez igazodnak
|
||||||
window-controls = Ablakvezérlés
|
window-controls = Ablakvezérlés
|
||||||
.maximize = Maximalizálás gomb mutatása
|
.maximize = Maximalizálás gomb megjelenítése
|
||||||
.minimize = Minimalizálás gomb mutatása
|
.minimize = Minimalizálás gomb megjelenítése
|
||||||
.active-window-hint = Aktív ablak kiemelése
|
.active-window-hint = Aktív ablak kiemelése
|
||||||
focus-navigation = Fókusznavigáció
|
focus-navigation = Fókusznavigáció
|
||||||
.focus-follows-cursor = Fókusz követi az egeret
|
.focus-follows-cursor = Fókusz követi az egeret
|
||||||
|
|
@ -334,16 +378,15 @@ focus-navigation = Fókusznavigáció
|
||||||
## Desktop: Workspaces
|
## Desktop: Workspaces
|
||||||
|
|
||||||
workspaces = Munkaterületek
|
workspaces = Munkaterületek
|
||||||
.desc = Munkaterületek tájolása és viselkedése
|
|
||||||
workspaces-behavior = Munkaterületek viselkedése
|
workspaces-behavior = Munkaterületek viselkedése
|
||||||
.dynamic = Dinamikus munkaterületek
|
.dynamic = Dinamikus munkaterületek
|
||||||
.dynamic-desc = Az üres munkamenetek automatikus eltávolítása
|
.dynamic-desc = Üres munkaterületek automatikus eltávolítása
|
||||||
.fixed = Megadott számú munkaterület
|
.fixed = Megadott számú munkaterület
|
||||||
.fixed-desc = Munkaterületek hozzáadása vagy eltávolítása az áttekintésben
|
.fixed-desc = Munkaterületek hozzáadása vagy eltávolítása az áttekintésben
|
||||||
workspaces-multi-behavior = Többmonitoros viselkedés
|
workspaces-multi-behavior = Többmonitoros viselkedés
|
||||||
.span = A munkaterületek kiterjednek a kijelzőkre
|
.span = A munkaterületek kiterjednek a kijelzőkre
|
||||||
.separate = A kijelzők külön munkaterülettel rendelkeznek
|
.separate = A kijelzők külön munkaterülettel rendelkeznek
|
||||||
workspaces-overview-thumbnails = Munkaterület-áttekintő bélyegképek
|
workspaces-overview-thumbnails = Munkaterület-áttekintő előnézetek
|
||||||
.show-number = Munkaterület számának megjelenítése
|
.show-number = Munkaterület számának megjelenítése
|
||||||
.show-name = Munkaterület nevének megjelenítése
|
.show-name = Munkaterület nevének megjelenítése
|
||||||
workspaces-orientation = Munkaterületek tájolása
|
workspaces-orientation = Munkaterületek tájolása
|
||||||
|
|
@ -361,7 +404,6 @@ color = Szín
|
||||||
.sidebar = Színprofilok
|
.sidebar = Színprofilok
|
||||||
.temperature = Színhőmérséklet
|
.temperature = Színhőmérséklet
|
||||||
display = Kijelzők
|
display = Kijelzők
|
||||||
.desc = Kijelzők kezelése és éjszakai fény
|
|
||||||
.arrangement = Kijelző elrendezése
|
.arrangement = Kijelző elrendezése
|
||||||
.arrangement-desc = Húzd a kijelzőket az átrendezésükhöz
|
.arrangement-desc = Húzd a kijelzőket az átrendezésükhöz
|
||||||
.enable = Kijelző engedélyezése
|
.enable = Kijelző engedélyezése
|
||||||
|
|
@ -388,7 +430,7 @@ mirroring = Tükrözés
|
||||||
}
|
}
|
||||||
night-light = Éjszakai fény
|
night-light = Éjszakai fény
|
||||||
.auto = Automatikus (naplementétől napkeltéig)
|
.auto = Automatikus (naplementétől napkeltéig)
|
||||||
.desc = Csökkentse a kék fényt melegebb színekkel
|
.desc = Kék fény csökkentése melegebb színekkel
|
||||||
orientation = Tájolás
|
orientation = Tájolás
|
||||||
.standard = Normál
|
.standard = Normál
|
||||||
.rotate-90 = 90 fokos elforgatás
|
.rotate-90 = 90 fokos elforgatás
|
||||||
|
|
@ -410,7 +452,6 @@ dialog = Párbeszédablak
|
||||||
## Sound
|
## Sound
|
||||||
|
|
||||||
sound = Hang
|
sound = Hang
|
||||||
.desc = N/A
|
|
||||||
sound-output = Kimenet
|
sound-output = Kimenet
|
||||||
.volume = Kimeneti hangerő
|
.volume = Kimeneti hangerő
|
||||||
.device = Kimeneti eszköz
|
.device = Kimeneti eszköz
|
||||||
|
|
@ -432,7 +473,6 @@ sound-applications = Alkalmazások
|
||||||
## Power
|
## Power
|
||||||
|
|
||||||
power = Energia és akkumulátor
|
power = Energia és akkumulátor
|
||||||
.desc = Energiabeállítások kezelése
|
|
||||||
battery = Akkumulátor
|
battery = Akkumulátor
|
||||||
.minute =
|
.minute =
|
||||||
{ $value } { $value ->
|
{ $value } { $value ->
|
||||||
|
|
@ -474,12 +514,11 @@ power-saving = Energiagazdálkodási beállítások
|
||||||
|
|
||||||
## Input
|
## Input
|
||||||
|
|
||||||
acceleration-desc = Automatikusan beállítja a követési érzékenységet a sebesség alapján
|
acceleration-desc = Követési érzékenység automatikus beállítása a sebesség alapján
|
||||||
disable-while-typing = Letiltás gépelés közben
|
disable-while-typing = Letiltás gépeléskor
|
||||||
input-devices = Beviteli eszközök
|
input-devices = Beviteli eszközök
|
||||||
.desc = Beviteli eszközök
|
|
||||||
primary-button = Elsődleges gomb
|
primary-button = Elsődleges gomb
|
||||||
.desc = A gombok sorrendjének beállítása
|
.desc = Gombok sorrendjének beállítása
|
||||||
.left = Bal
|
.left = Bal
|
||||||
.right = Jobb
|
.right = Jobb
|
||||||
scrolling = Görgetés
|
scrolling = Görgetés
|
||||||
|
|
@ -496,9 +535,8 @@ fast = Gyors
|
||||||
short = Rövid
|
short = Rövid
|
||||||
long = Hosszú
|
long = Hosszú
|
||||||
keyboard = Billentyűzet
|
keyboard = Billentyűzet
|
||||||
.desc = Bemeneti források, speciális karakterek, gyorsbillentyűk
|
|
||||||
keyboard-sources = Bemeneti források
|
keyboard-sources = Bemeneti források
|
||||||
.desc = A bemeneti források a Super+Space billentyűkombinációval válthatók. Ez testreszabható a gyorsbillentyűk beállításaiban.
|
.desc = A bemeneti források a Super+Szóköz billentyűkombinációval válthatók. Ez testre szabható a gyorsbillentyűk beállításaiban.
|
||||||
.move-up = Mozgatás feljebb
|
.move-up = Mozgatás feljebb
|
||||||
.move-down = Mozgatás lejjebb
|
.move-down = Mozgatás lejjebb
|
||||||
.settings = Beállítások
|
.settings = Beállítások
|
||||||
|
|
@ -520,7 +558,7 @@ keyboard-numlock-boot = Num Lock
|
||||||
.off = Kikapcsolva
|
.off = Kikapcsolva
|
||||||
.set = Num Lock rendszerindítási állapotának beállítása
|
.set = Num Lock rendszerindítási állapotának beállítása
|
||||||
added = Hozzáadva
|
added = Hozzáadva
|
||||||
type-to-search = Írj a kereséshez…
|
type-to-search = Gépelj a kereséshez…
|
||||||
show-extended-input-sources = Bővített bemeneti források megjelenítése
|
show-extended-input-sources = Bővített bemeneti források megjelenítése
|
||||||
|
|
||||||
## Input: Keyboard: Shortcuts
|
## Input: Keyboard: Shortcuts
|
||||||
|
|
@ -532,8 +570,8 @@ cancel = Mégse
|
||||||
command = Parancs
|
command = Parancs
|
||||||
custom = Egyedi
|
custom = Egyedi
|
||||||
debug = Hibakeresés
|
debug = Hibakeresés
|
||||||
disabled = Tiltva
|
disabled = Letiltva
|
||||||
input-source-switch = Billentyűzetkiosztás váltása
|
input-source-switch = Beviteli forrás váltása
|
||||||
migrate-workspace-prev = Munkaterület áthelyezése az előző kimenetre
|
migrate-workspace-prev = Munkaterület áthelyezése az előző kimenetre
|
||||||
migrate-workspace-next = Munkaterület áthelyezése a következő kimenetre
|
migrate-workspace-next = Munkaterület áthelyezése a következő kimenetre
|
||||||
migrate-workspace =
|
migrate-workspace =
|
||||||
|
|
@ -556,11 +594,11 @@ custom-shortcuts = Egyéni gyorsbillentyűk
|
||||||
.none = Nincsenek egyéni gyorsbillentyűk
|
.none = Nincsenek egyéni gyorsbillentyűk
|
||||||
modified = { $count } módosítva
|
modified = { $count } módosítva
|
||||||
nav-shortcuts = Navigáció
|
nav-shortcuts = Navigáció
|
||||||
.prev-output = Az előző kimenet fókuszálása
|
.prev-output = Fókuszálás az előző kimenetre
|
||||||
.next-output = A következő kimenet fókuszálása
|
.next-output = Fókuszálás a következő kimenetre
|
||||||
.last-workspace = Az utolsó munkaterület fókuszálása
|
.last-workspace = Fókuszálás az utolsó munkaterületre
|
||||||
.prev-workspace = Az előző munkaterület fókuszálása
|
.prev-workspace = Fókuszálás az előző munkaterületre
|
||||||
.next-workspace = A következő munkaterület fókuszálása
|
.next-workspace = Fókuszálás a következő munkaterületre
|
||||||
.focus =
|
.focus =
|
||||||
Ablak fókuszálása { $direction ->
|
Ablak fókuszálása { $direction ->
|
||||||
*[down] le
|
*[down] le
|
||||||
|
|
@ -659,7 +697,6 @@ zoom-out = Kicsinyítés
|
||||||
## Input: Mouse
|
## Input: Mouse
|
||||||
|
|
||||||
mouse = Egér
|
mouse = Egér
|
||||||
.desc = Egérsebesség, gyorsítás és természetes görgetés
|
|
||||||
.speed = Egér sebessége
|
.speed = Egér sebessége
|
||||||
.acceleration = Egérgyorsítás engedélyezése
|
.acceleration = Egérgyorsítás engedélyezése
|
||||||
|
|
||||||
|
|
@ -670,24 +707,23 @@ click-behavior = Kattintási viselkedés
|
||||||
.button-areas = Másodlagos kattintás a jobb alsó sarokban, középső kattintás az alsó középső sarokban
|
.button-areas = Másodlagos kattintás a jobb alsó sarokban, középső kattintás az alsó középső sarokban
|
||||||
pinch-to-zoom = Csippentéses nagyítás
|
pinch-to-zoom = Csippentéses nagyítás
|
||||||
.desc = Két ujjal belenagyíthatsz a tartalomba azokban az alkalmazásokban, amik támogatják a nagyítást
|
.desc = Két ujjal belenagyíthatsz a tartalomba azokban az alkalmazásokban, amik támogatják a nagyítást
|
||||||
tap-to-click = Koppints a kattintáshoz
|
tap-to-click = Koppintás a kattintáshoz
|
||||||
.desc = Engedélyezi az egyujjas koppintást az elsődleges kattintáshoz, a kétujjas koppintást a másodlagos kattintáshoz és a háromujjas érintést a középső kattintáshoz
|
.desc = Engedélyezi az egyujjas koppintást az elsődleges kattintáshoz, a kétujjas koppintást a másodlagos kattintáshoz és a háromujjas érintést a középső kattintáshoz
|
||||||
touchpad = Érintőpárna
|
touchpad = Érintőpárna
|
||||||
.acceleration = Az Érintőpárna gyorsításának engedélyezése
|
.acceleration = Az Érintőpárna gyorsításának engedélyezése
|
||||||
.desc = Érintőpárna sebessége, kattintási lehetőségek, gesztusok
|
|
||||||
.speed = Érintőpárna sebessége
|
.speed = Érintőpárna sebessége
|
||||||
|
|
||||||
## Input: Gestures
|
## Input: Gestures
|
||||||
|
|
||||||
gestures = Gesztusok
|
gestures = Gesztusok
|
||||||
.four-finger-down = Négy ujjas csúsztatás lefelé
|
.four-finger-down = Négyujjas csúsztatás lefelé
|
||||||
.four-finger-left = Négy ujjas csúsztatás balra
|
.four-finger-left = Négyujjas csúsztatás balra
|
||||||
.four-finger-right = Négy ujjas csúsztatás jobbra
|
.four-finger-right = Négyujjas csúsztatás jobbra
|
||||||
.four-finger-up = Négy ujjas csúsztatás felfelé
|
.four-finger-up = Négyujjas csúsztatás felfelé
|
||||||
.three-finger-any = Három ujjas csúsztatás bármelyik irányba
|
.three-finger-any = Háromujjas csúsztatás bármelyik irányba
|
||||||
switch-workspaces = Munkaterület váltása
|
switch-workspaces = Munkaterület váltása
|
||||||
.horizontal = Négy ujjas csúsztatás balra/jobbra
|
.horizontal = Négyujjas csúsztatás balra/jobbra
|
||||||
.vertical = Négy ujjas csúsztatás felfelé/lefelé
|
.vertical = Négyujjas csúsztatás felfelé/lefelé
|
||||||
switch-between-windows = Váltás az ablakok között
|
switch-between-windows = Váltás az ablakok között
|
||||||
open-application-library = Alkalmazáskönyvtár megnyitása
|
open-application-library = Alkalmazáskönyvtár megnyitása
|
||||||
open-workspaces-view = Munkaterületek áttekintésének megnyitása
|
open-workspaces-view = Munkaterületek áttekintésének megnyitása
|
||||||
|
|
@ -695,9 +731,7 @@ open-workspaces-view = Munkaterületek áttekintésének megnyitása
|
||||||
## Time & Language
|
## Time & Language
|
||||||
|
|
||||||
time = Idő és nyelv
|
time = Idő és nyelv
|
||||||
.desc = N/A
|
|
||||||
time-date = Dátum és idő
|
time-date = Dátum és idő
|
||||||
.desc = Időzóna, automatikus órabeállítások és időformátum
|
|
||||||
.auto = Beállítás automatikusan
|
.auto = Beállítás automatikusan
|
||||||
.auto-ntp = A dátum és idő automatikusan frissül, ha az időzóna be van állítva
|
.auto-ntp = A dátum és idő automatikusan frissül, ha az időzóna be van állítva
|
||||||
time-zone = Időzóna
|
time-zone = Időzóna
|
||||||
|
|
@ -713,7 +747,6 @@ time-format = Dátum- és időformátum
|
||||||
.sunday = Vasárnap
|
.sunday = Vasárnap
|
||||||
.monday = Hétfő
|
.monday = Hétfő
|
||||||
time-region = Régió és nyelv
|
time-region = Régió és nyelv
|
||||||
.desc = Dátumok, időpontok és számok formázása a régió alapján
|
|
||||||
formatting = Formátum
|
formatting = Formátum
|
||||||
.dates = Dátum
|
.dates = Dátum
|
||||||
.time = Idő
|
.time = Idő
|
||||||
|
|
@ -735,7 +768,6 @@ applications = Alkalmazások
|
||||||
## Applications: Default Applications
|
## Applications: Default Applications
|
||||||
|
|
||||||
default-apps = Alapértelmezett alkalmazások
|
default-apps = Alapértelmezett alkalmazások
|
||||||
.desc = Alapértelmezett böngésző, levelezőprogram, fájlkezelő és egyéb alkalmazások
|
|
||||||
.web-browser = Böngésző
|
.web-browser = Böngésző
|
||||||
.file-manager = Fájlkezelő
|
.file-manager = Fájlkezelő
|
||||||
.mail-client = Levelezőprogram
|
.mail-client = Levelezőprogram
|
||||||
|
|
@ -746,11 +778,11 @@ default-apps = Alapértelmezett alkalmazások
|
||||||
.terminal = Terminál
|
.terminal = Terminál
|
||||||
.other-associations = Egyéb társítások
|
.other-associations = Egyéb társítások
|
||||||
.text-editor = Szövegszerkesztő
|
.text-editor = Szövegszerkesztő
|
||||||
|
.not-installed = Nincs telepítve
|
||||||
|
|
||||||
## Applications: Startup Applications
|
## Applications: Startup Applications
|
||||||
|
|
||||||
startup-apps = Indítási alkalmazások
|
startup-apps = Indítási alkalmazások
|
||||||
.desc = Azoknak az alkalmazásoknak a beállítása, amelyek bejelentkezéskor elindulnak
|
|
||||||
.add = Alkalmazás hozzáadása
|
.add = Alkalmazás hozzáadása
|
||||||
.user = Bejelentkezéskor indított alkalmazások
|
.user = Bejelentkezéskor indított alkalmazások
|
||||||
.none = Nincs indítási alkalmazás hozzáadva
|
.none = Nincs indítási alkalmazás hozzáadva
|
||||||
|
|
@ -761,7 +793,6 @@ startup-apps = Indítási alkalmazások
|
||||||
## Applications: Legacy Applications
|
## Applications: Legacy Applications
|
||||||
|
|
||||||
legacy-applications = X11 alkalmazások támogatása
|
legacy-applications = X11 alkalmazások támogatása
|
||||||
.desc = X11 ablakkezelő rendszer alkalmazásméretezés és globális gyorsbillentyűk
|
|
||||||
legacy-app-global-shortcuts = Globális gyorsbillentyűk X11 alkalmazásokban
|
legacy-app-global-shortcuts = Globális gyorsbillentyűk X11 alkalmazásokban
|
||||||
.desc = A globális gyorsbillentyűk lehetővé teszik, hogy az alkalmazásokban a billentyűleütéseket és egérkattintásokat más alkalmazások is felismerjék, például a „push-to-talk” vagy a „push-to-mute” funkciókhoz. Alapértelmezés szerint a globális gyorsbillentyűk az X11 alkalmazásokban le van tiltva, hogy más alkalmazások ne figyelhessék a billentyű- és egéreseményeket, amelyek érzékeny információkat tartalmazhatnak.
|
.desc = A globális gyorsbillentyűk lehetővé teszik, hogy az alkalmazásokban a billentyűleütéseket és egérkattintásokat más alkalmazások is felismerjék, például a „push-to-talk” vagy a „push-to-mute” funkciókhoz. Alapértelmezés szerint a globális gyorsbillentyűk az X11 alkalmazásokban le van tiltva, hogy más alkalmazások ne figyelhessék a billentyű- és egéreseményeket, amelyek érzékeny információkat tartalmazhatnak.
|
||||||
.none = Nincs billentyű
|
.none = Nincs billentyű
|
||||||
|
|
@ -786,11 +817,10 @@ system = Rendszer és fiókok
|
||||||
## System: About
|
## System: About
|
||||||
|
|
||||||
about = Rendszerinformáció
|
about = Rendszerinformáció
|
||||||
.desc = Eszköznév, hardverinformációk és az operációs rendszer alapértelmezett beállításai
|
|
||||||
about-device = Eszköz neve
|
about-device = Eszköz neve
|
||||||
.desc = Ez a név más hálózati vagy Bluetooth-eszközök számára látható
|
.desc = Ez a név más hálózati vagy Bluetooth-eszközök számára látható
|
||||||
about-hardware = Hardver
|
about-hardware = Hardver
|
||||||
.model = Hardver modell
|
.model = Hardvermodell
|
||||||
.memory = Memória
|
.memory = Memória
|
||||||
.processor = Processzor
|
.processor = Processzor
|
||||||
.graphics = Grafika
|
.graphics = Grafika
|
||||||
|
|
@ -807,12 +837,10 @@ about-related = Kapcsolódó beállítások
|
||||||
## System: Firmware
|
## System: Firmware
|
||||||
|
|
||||||
firmware = Firmware
|
firmware = Firmware
|
||||||
.desc = Firmware részletei
|
|
||||||
|
|
||||||
## System: Users
|
## System: Users
|
||||||
|
|
||||||
users = Felhasználók
|
users = Felhasználók
|
||||||
.desc = Hitelesítés és felhasználói fiókok
|
|
||||||
.admin = Rendszergazda
|
.admin = Rendszergazda
|
||||||
.standard = Normál
|
.standard = Normál
|
||||||
.profile-add = Profilkép kiválasztása
|
.profile-add = Profilkép kiválasztása
|
||||||
|
|
@ -827,12 +855,62 @@ password-mismatch = A jelszónak és a megerősítésének meg kell egyeznie
|
||||||
save = Mentés
|
save = Mentés
|
||||||
amplification = Erősítés
|
amplification = Erősítés
|
||||||
.desc = Lehetővé teszi a hangerő 150%-ra emelését
|
.desc = Lehetővé teszi a hangerő 150%-ra emelését
|
||||||
qr-code-unavailable = QR-kód nem elérhető
|
qr-code-unavailable = Nem érhető el a QR-kód
|
||||||
network-name = Hálózat neve
|
network-name = Hálózat neve
|
||||||
share = Hálózat megosztása
|
share = Hálózat megosztása
|
||||||
scan-to-connect-description = Olvasd be a QR-kódot a hálózathoz való csatlakozáshoz.
|
scan-to-connect-description = Olvasd be a QR-kódot a hálózathoz való csatlakozáshoz.
|
||||||
place-here = Ide helyezd a kisalkalmazásokat
|
place-here = Helyezd ide a kisalkalmazásokat
|
||||||
sound-device-port-unplugged = Nincs csatlakoztatva
|
sound-device-port-unplugged = Nincs csatlakoztatva
|
||||||
sound-hd-audio = HD-hang
|
sound-hd-audio = HD-hang
|
||||||
sound-usb-audio = USB-hang
|
sound-usb-audio = USB-hang
|
||||||
sound-device-profiles = Eszközprofilok
|
sound-device-profiles = Eszközprofilok
|
||||||
|
shadows-floating = Lebegő ablakok
|
||||||
|
.clip = Rendszersarkokhoz illeszkedés és árnyékok alkalmazása
|
||||||
|
shadows-tiling = Csempézett ablakok
|
||||||
|
.clip = Rendszersarkokhoz illeszkedés
|
||||||
|
.shadow = Árnyékok alkalmazása
|
||||||
|
shadow-and-corners = Ablakok árnyéka és sarkai
|
||||||
|
workspaces-overview = Munkaterületek áttekintése
|
||||||
|
.action-on-typing = Művelet gépeléskor
|
||||||
|
.none = Nincs
|
||||||
|
.launcher = Indító megnyitása
|
||||||
|
.applications = Alkalmazások megnyitása
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Egér;Gyorsítás;Görgetés;
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Értesítés;Zárolás;Ne zavarjanak;
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Automatikus;Indítási alkalmazás;
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Kiemelő;Szín;Ikon;Betűkészlet;Téma;
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Dokk;Panel;Kisalkalmazás;
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Panel;Kisalkalmazás;
|
||||||
|
xdg-entry-time-language-comment = Rendszerdátum, idő, régió és a nyelv kezelése
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Asztal;
|
||||||
|
xdg-entry-system-keywords = COSMIC;Rendszer;Információk;Fiókok;Firmware;
|
||||||
|
xdg-entry-about-keywords = COSMIC;Névjegy
|
||||||
|
xdg-entry-panel = Panel
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Akadálymentesség;Képernyő;Olvasó;Nagyító;Kontraszt;Szín;
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Idő;Zóna;
|
||||||
|
xdg-entry-desktop-comment = Háttérkép, megjelenés, panel, dokk, ablakkezelés és munkaterület-beállítások
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
xdg-entry-network-keywords = COSMIC;Hálózat;Vezeték;Nélküli;WiFi;VPN;
|
||||||
|
xdg-entry-system-comment = Rendszerinformációk, fiókok és firmware-frissítések
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;Rendszer;Idő;Dátum;Régió;Nyelv;
|
||||||
|
xdg-entry-input-keywords = COSMIC;Bevitel;Billentyűzet;Egér;Egerek;
|
||||||
|
xdg-entry-sound-keywords = COSMIC;Hang;Figyelmeztetés;PipeWire;
|
||||||
|
xdg-entry-power-keywords = COSMIC;Energia;Akkumulátor;
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Alapértelmezett;Alkalmazások;
|
||||||
|
xdg-entry-keywords = COSMIC;Beállítások;
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Régió;Nyelv;Dátum;Formátum;Idő;Területi;Beállítások;
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Alapértelmezett;Alkalmazások;Indítás;X11;Támogatás;
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Billentyűzet;Beviteli;Forrás;Gyorsbillentyűk;
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Kijelző;
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Vezetékes;LAN;Hálózat;Kapcsolat;
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Alkalmazás;Játék;Támogatás;
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;Érintőpárna;Mozdulat;
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;Hálózat;Kapcsolat;
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Munkaterület;Tájolás;Áttekintés;Monitor;
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Háttérkép;Háttér;Diavetítés;
|
||||||
|
xdg-entry-users-keywords = COSMIC;Felhasználó;Fiók;
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Hálózat;Kapcsolat;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-comment = Beállításalkalmazás a COSMIC asztalhoz
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;Ablak;Kezelés;Csempézés;Super;BIllentyű;
|
||||||
|
no-search-results = Nem található a keresésnek megfelelő hálózat.
|
||||||
|
|
|
||||||
820
i18n/id/cosmic_settings.ftl
vendored
820
i18n/id/cosmic_settings.ftl
vendored
|
|
@ -0,0 +1,820 @@
|
||||||
|
app = Pengaturan COSMIC
|
||||||
|
ok = OKE
|
||||||
|
dbus-connection-error = Gagal menyambungkan ke DBus
|
||||||
|
unknown = Tidak diketahui
|
||||||
|
number = { $number }
|
||||||
|
add-network = Tambahkan jaringan
|
||||||
|
.profile = Tambahkan profil
|
||||||
|
add-vpn = Tambahkan VPN
|
||||||
|
airplane-on = Mode pesawat nyala.
|
||||||
|
connect = Sambungkan
|
||||||
|
cable-unplugged = Kabel tercabut
|
||||||
|
connected = Tersambung
|
||||||
|
connecting = Menyambungkan…
|
||||||
|
disconnect = Putuskan
|
||||||
|
forget = Lupakan
|
||||||
|
known-networks = Jaringan yang diketahui
|
||||||
|
network-and-wireless = Jaringan & nirkabel
|
||||||
|
network-name = Nama Jaringan
|
||||||
|
no-networks = Tidak ada jaringan yang ditemukan.
|
||||||
|
no-vpn = Tidak ada sambungan VPN yang tersedia.
|
||||||
|
password = Kata sandi
|
||||||
|
password-confirm = Konfirmasikan kata sandi
|
||||||
|
qr-code-unavailable = Kode QR tidak tersedia
|
||||||
|
remove = Hapus
|
||||||
|
scan-to-connect-description = Pindai kode QR untuk menyambungkan ke jaringan ini.
|
||||||
|
settings = Pengaturan
|
||||||
|
share = Bagikan jaringan
|
||||||
|
username = Nama pengguna
|
||||||
|
visible-networks = Jaringan yang terlihat
|
||||||
|
identity = Identitas
|
||||||
|
auth-dialog = Autentikasi diperlukan
|
||||||
|
.vpn-description = Masukkan nama pengguna dan kata sandi yang dibutuhkan oleh layanan VPN.
|
||||||
|
.wifi-description = Masukkan kata sandi atau kunci enkripsi. Anda juga dapat menyambungkan dengan menekan tombol “WPS” pada router.
|
||||||
|
forget-dialog = Lupakan jaringan Wi-Fi ini?
|
||||||
|
.description = Anda akan perlu memasukkan kata sandi lagi untuk menggunakan jaringan Wi-Fi ini di masa mendatang.
|
||||||
|
network-device-state =
|
||||||
|
.activated = Tersambung
|
||||||
|
.config = Menyambungkan
|
||||||
|
.deactivating = Memutuskan
|
||||||
|
.disconnected = Terputus
|
||||||
|
.failed = Gagal tersambung
|
||||||
|
.ip-check = Memeriksa sambungan
|
||||||
|
.ip-config = Meminta info IP dan routing
|
||||||
|
.need-auth = Memerlukan autentikasi
|
||||||
|
.prepare = Bersiap tersambung
|
||||||
|
.secondaries = Menunggu untuk sambungan kedua
|
||||||
|
.unavailable = Tidak tersedia
|
||||||
|
.unknown = Status tidak diketahui
|
||||||
|
.unmanaged = Tidak terkelola
|
||||||
|
.unplugged = Kabel tercabut
|
||||||
|
remove-connection-dialog = Hapus profil sambungan?
|
||||||
|
.vpn-description = Anda akan perlu memasukkan kata sandi lagi untuk menggunakan jaringan ini di masa mendatang.
|
||||||
|
.wired-description = Anda akan perlu membuat ulang profil ini untuk menggunakannya di masa mendantang.
|
||||||
|
vpn = VPN
|
||||||
|
.connections = Sambungan VPN
|
||||||
|
.error = Gagal menambahkan konfigurasi VPN
|
||||||
|
.remove = Hapus profil sambungan
|
||||||
|
.select-file = Pilih berkas konfigurasi VPN
|
||||||
|
vpn-error = Galat VPN
|
||||||
|
.config = Gagal menambahkan konfigurasi VPN
|
||||||
|
.connect = Gagal menyambungkan ke VPN
|
||||||
|
.connection-editor = Penyunting sambungan gagal
|
||||||
|
.connection-settings = Gagal mendapatkan pengaturan untuk sambungan aktif
|
||||||
|
.updating-state = Gagal memperbarui status pengelola jaringan
|
||||||
|
.wireguard-config-path = Jalur berkas tidak valid untuk konfigurasi WireGuard
|
||||||
|
.wireguard-config-path-desc = Berkas yang dipiih harus di sistem berkas lokal.
|
||||||
|
.wireguard-device = Gagal membuat perangkat WireGuard
|
||||||
|
.with-password =
|
||||||
|
Gagal mengatur { $field ->
|
||||||
|
*[username] nama pengguna
|
||||||
|
[password] kata sandi
|
||||||
|
[password-flags] penanda kata sandi
|
||||||
|
} VPN dengan nmcli
|
||||||
|
wired = Berkabel
|
||||||
|
.adapter = Adaptor berkabel { $id }
|
||||||
|
.connections = Sambungan berkabel
|
||||||
|
.devices = Perangkat berkabel
|
||||||
|
.remove = Hapus profil sambungan
|
||||||
|
wifi = Wi-Fi
|
||||||
|
.adapter = Adaptor Wi-Fi { $id }
|
||||||
|
.forget = Lupakan jaringan ini
|
||||||
|
wireguard-dialog = Tambahkan perangkat WireGuard
|
||||||
|
.description = Pilih nama perangkat untuk konfigurasi WireGuard.
|
||||||
|
online-accounts = Akun daring
|
||||||
|
.desc = Tambahkan akun, IMAP dan SMTP, masuk perusahaan
|
||||||
|
activate = Aktifkan
|
||||||
|
confirm = Konfirmasikan
|
||||||
|
enable = Aktifkan
|
||||||
|
bluetooth = Bluetooth
|
||||||
|
.status = Sistem ini terlihat sebagai { $aliases } saat pengaturan Bluetooth dibuka.
|
||||||
|
.connected = Tersambung
|
||||||
|
.connecting = Menyambungkan
|
||||||
|
.disconnecting = Memutuskan
|
||||||
|
.connect = Sambungkan
|
||||||
|
.disconnect = Putuskan
|
||||||
|
.forget = Lupakan
|
||||||
|
.dbus-error = Terjadi galat saat berinteraksi dengan DBus: { $why }
|
||||||
|
.disabled = Layanan Bluetooth dinonaktifkan
|
||||||
|
.inactive = Layanan Bluetooh tidak aktif
|
||||||
|
.unknown = Layanan Bluetooth tidak dapat diaktifkan. Apakah BlueZ terpasang?
|
||||||
|
bluetooth-paired = Perangkat yang tersambung sebelumnya
|
||||||
|
.connect = Sambungkan
|
||||||
|
.battery = Baterai { $percentage }%
|
||||||
|
bluetooth-confirm-pin = Konfirmasikan PIN Bluetooth
|
||||||
|
.description = Silakan konfirmasikan bahwa PIN berikut cocok dengan PIN yang ditampilkan pada { $device }
|
||||||
|
bluetooth-available = Perangkat terdekat
|
||||||
|
bluetooth-adapters = Adaptor Bluetooth
|
||||||
|
accessibility = Aksesibilitas
|
||||||
|
.vision = Penglihatan
|
||||||
|
.on = Nyala
|
||||||
|
.off = Mati
|
||||||
|
.unavailable = Tidak tersedia
|
||||||
|
.screen-reader = Pembaca layar
|
||||||
|
.high-contrast = Mode kontras tinggi
|
||||||
|
.invert-colors = Balikkan warna
|
||||||
|
.color-filters = Filter warna
|
||||||
|
hearing = Pendengaran
|
||||||
|
.mono = Mainkan audio stereo sebagai mono
|
||||||
|
default = Bawaan
|
||||||
|
magnifier = Kaca Pembesar
|
||||||
|
.controls =
|
||||||
|
Atau gunakan pintasan ini: { $zoom_in ->
|
||||||
|
[zero] { "" }
|
||||||
|
*[other]
|
||||||
|
{ "" }
|
||||||
|
{ $zoom_in } untuk perbesar,
|
||||||
|
}{ $zoom_out ->
|
||||||
|
[zero] { "" }
|
||||||
|
*[other]
|
||||||
|
{ "" }
|
||||||
|
{ $zoom_out } untuk perkecil,
|
||||||
|
}
|
||||||
|
Super + gulir menggunakan tetikus anda
|
||||||
|
.scroll_controls = Aktifkan tetikus atau zum papan sentuh dengan Super + gulir
|
||||||
|
.show_overlay = Tampilkan lapisan kaca pembesar
|
||||||
|
.increment = Zum tambahan
|
||||||
|
.signin = Mulai kaca pembesar saat masuk
|
||||||
|
.applet = Ubah kaca pembesar nyala/mati dalam applet di panel
|
||||||
|
.movement = Tampilan yang dizum bergerak
|
||||||
|
.continuous = Terus menerus dengan penunjuk
|
||||||
|
.onedge = Saat penunjuk mencapai tepi
|
||||||
|
.centered = Untuk mempertahankan penunjuk berada di tengah
|
||||||
|
workspaces-behavior = Perilaku ruang kerja
|
||||||
|
.dynamic = Ruang kerja dinamis
|
||||||
|
.dynamic-desc = Menghapus ruang kerja kosong secara otomatis.
|
||||||
|
.fixed = Jumlah ruang kerja tetap
|
||||||
|
.fixed-desc = Tambahkan atau hapus ruang kerja di ikhtisar.
|
||||||
|
color-filter = Jenis filter warna
|
||||||
|
.unknown = Filter aktif tidak diketahui
|
||||||
|
.greyscale = Skala abu-abu
|
||||||
|
.deuteranopia = Hijau/Merah (kelemahan hijau, Deuteranopia)
|
||||||
|
.protanopia = Merah/Hijau (kelemahan merah, Protanopia)
|
||||||
|
.tritanopia = Biru/Kuning (kelemahan biru, Tritanopia)
|
||||||
|
desktop = Desktop
|
||||||
|
wallpaper = Wallpaper
|
||||||
|
.change = Ubah gambar setiap
|
||||||
|
.fit = Sesuaikan wallpaper
|
||||||
|
.folder-dialog = Pilih map wallpaper
|
||||||
|
.image-dialog = Pilih gambar wallpaper
|
||||||
|
.plural = Wallpaper
|
||||||
|
.same = Wallpaper yang sama di semua layar
|
||||||
|
.slide = Tayangan salindia
|
||||||
|
add-color = Tambahkan warna
|
||||||
|
add-image = Tambahkan gambar
|
||||||
|
all-displays = Semua layar
|
||||||
|
colors = Warna
|
||||||
|
dialog-add = Tambahkan
|
||||||
|
fill = Isi
|
||||||
|
fit-to-screen = Sesuaikan dengan layar
|
||||||
|
open-new-folder = Buka map baru
|
||||||
|
recent-folders = Map terbaru
|
||||||
|
x-minutes =
|
||||||
|
{ $number } { $number ->
|
||||||
|
[one] menit
|
||||||
|
*[other] menit
|
||||||
|
}
|
||||||
|
x-hours =
|
||||||
|
{ $number } { $number ->
|
||||||
|
[one] jam
|
||||||
|
*[other] jam
|
||||||
|
}
|
||||||
|
never = Tidak pernah
|
||||||
|
appearance = Tampilan
|
||||||
|
accent-color = Warna aksen
|
||||||
|
app-background = Latar belakang jendela
|
||||||
|
auto = Otomatis
|
||||||
|
close = Tutup
|
||||||
|
color-picker = Pemilih warna
|
||||||
|
copied-to-clipboard = Disalin ke papan klip
|
||||||
|
copy-to-clipboard = Salin ke papan klip
|
||||||
|
dark = Gelap
|
||||||
|
export = Ekspor
|
||||||
|
hex = Heks
|
||||||
|
import = Impor
|
||||||
|
light = Terang
|
||||||
|
mode-and-colors = Mode dan warna
|
||||||
|
recent-colors = Warna terbaru
|
||||||
|
reset-to-default = Atur ulang ke bawaan
|
||||||
|
rgb = RGB
|
||||||
|
window-hint-accent = Warna petunjuk jendela aktif
|
||||||
|
window-hint-accent-toggle = Gunakan warna aksen tema sebagai petunjuk jendela aktif
|
||||||
|
auto-switch = Mengalihkan antara mode terang dan gelap secara otomatis
|
||||||
|
.sunrise = Mengalihkan ke mode terang saat matahari terbit
|
||||||
|
.sunset = Mengalihkan ke mode gelap saat matahari terbenam
|
||||||
|
.next-sunrise = Mengalihkan ke mode terang saat matahari terbit selanjutnya
|
||||||
|
.next-sunset = Mengalihkan ke mode gelap saat matahari terbenam selanjutnya
|
||||||
|
shadows-floating = Jendela mengapung
|
||||||
|
.clip = Cocokkan sudut sistem dan terapkan bayangan
|
||||||
|
shadows-tiling = Jendela berubin
|
||||||
|
.clip = Cocokkan sudut sistem
|
||||||
|
.shadow = Terapkan bayangan
|
||||||
|
container-background = Latar belakang kontainer
|
||||||
|
.desc-detail = Warna latar belakang kontainer digunakan untuk bilah sisi navigasi, laci samping, dialog dan widget serupa. Secara bawaan, warna latar belakang kontainer diambil dari latar belakang jendela secara otomatis.
|
||||||
|
.reset = Atur ulang ke otomatis
|
||||||
|
.desc = Digunakan untuk bilah sisi navigasi, laci samping, dialog dan widget serupa
|
||||||
|
control-tint = Warna komponen kontrol
|
||||||
|
.desc = Digunakan untuk latar belakang tombol standar, masukan pencarian, masukan teks, dan komponen serupa
|
||||||
|
frosted = Efek kaca buram pada antarmuka sistem
|
||||||
|
.desc = Menerapkan blur latar belakang ke panel, dok, applet, peluncur, dan pustaka aplikasi
|
||||||
|
enable-export = Terapkan tema saat ini ke aplikasi GNOME
|
||||||
|
.desc = Tidak semua alat kit mendukung peralihan otomatis. Aplikasi non-COSMIC mungkin perlu dimulai ulang seletah perubahan tema.
|
||||||
|
icon-theme = Tema ikon
|
||||||
|
.desc = Menerapkan serangkaian ikon yang berbeda ke aplikasi
|
||||||
|
text-tint = Warna teks antarmuka
|
||||||
|
.desc = Digunakan untuk mendapatkan warna teks antarmuka yang memiliki kontras yang cukup pada berbagai permukaan
|
||||||
|
style = Gaya
|
||||||
|
.round = Bulat
|
||||||
|
.slightly-round = Sedikit bulat
|
||||||
|
.square = Persegi
|
||||||
|
interface-density = Kepadatan antarmuka
|
||||||
|
.comfortable = Nyaman
|
||||||
|
.compact = Kompak
|
||||||
|
.spacious = Luas
|
||||||
|
window-management-appearance = Pengelolaan jendela
|
||||||
|
.active-hint = Ukuran petunjuk jendela aktif
|
||||||
|
.gaps = Jarak sekitar jendela berubin
|
||||||
|
experimental-settings = Pengaturan eksperimental
|
||||||
|
icons-and-toolkit = Tema ikon dan alat kit
|
||||||
|
interface-font = Huruf sistem
|
||||||
|
monospace-font = Huruf monospace
|
||||||
|
shadow-and-corners = Bayangan dan sudut jendela
|
||||||
|
notifications = Notifikasi
|
||||||
|
panel = Panel
|
||||||
|
add = Tambahkan
|
||||||
|
add-applet = Tambahkan applet
|
||||||
|
all = Semua
|
||||||
|
applets = Applet
|
||||||
|
center-segment = Segmen tengah
|
||||||
|
place-here = Letakkan applet di sini
|
||||||
|
replace = Ganti
|
||||||
|
replace-shortcut-dialog = Ganti pintasan?
|
||||||
|
.desc = { $shortcut } digunakan oleh { $name }. Jika anda menggantikannya, { $name } akan dinonaktifkan.
|
||||||
|
end-segment = Segmen akhir
|
||||||
|
large = Besar
|
||||||
|
no-applets-found = Tidak ada applet yang ditemukan...
|
||||||
|
panel-bottom = Bawah
|
||||||
|
panel-left = Kiri
|
||||||
|
panel-right = Kanan
|
||||||
|
panel-top = Atas
|
||||||
|
search-applets = Cari applet...
|
||||||
|
small = Kecil
|
||||||
|
start-segment = Segmen awal
|
||||||
|
panel-appearance = Tampilan
|
||||||
|
.match = Cocokkan dekstop
|
||||||
|
.light = Terang
|
||||||
|
.dark = Gelap
|
||||||
|
panel-behavior-and-position = Perilaku dan posisi
|
||||||
|
.autohide = Sembunyikan panel secara otomatis
|
||||||
|
.dock-autohide = Sembunyikan dok secara otomatis
|
||||||
|
.position = Posisi di layar
|
||||||
|
.display = Tampilkan di layar
|
||||||
|
panel-style = Gaya
|
||||||
|
.anchor-gap = Jarak antara panel dan tepi layar
|
||||||
|
.dock-anchor-gap = Jarak antara dok dan tepi layar
|
||||||
|
.extend = Luaskan panel ke tepi layar
|
||||||
|
.dock-extend = Luaskan dok ke tepi layar
|
||||||
|
.appearance = Tampilan
|
||||||
|
.size = Ukuran
|
||||||
|
.background-opacity = Opasitas latar belakang
|
||||||
|
panel-applets = Konfigurasi
|
||||||
|
.dock-desc = Konfigurasikan applet dok
|
||||||
|
.desc = Konfigurasikan applet panel
|
||||||
|
panel-missing = Konfigurasi panel hilang
|
||||||
|
.desc = Berkas konfigurasi panel hilang karena penggunaan konfigurasi kustom atau berkas tersebut rusak.
|
||||||
|
.fix = Atur ulang ke bawaan
|
||||||
|
dock = Dok
|
||||||
|
window-management = Pengelolaan jendela
|
||||||
|
super-key = Tindakan tombol super
|
||||||
|
.launcher = Buka Peluncur
|
||||||
|
.workspaces = Buka Ruang Kerja
|
||||||
|
.applications = Buka Aplikasi
|
||||||
|
.disable = Nonaktifkan
|
||||||
|
edge-gravity = Jendela mengapung bergerak ke tepi terdekat
|
||||||
|
window-controls = Kontrol jendela
|
||||||
|
.maximize = Tampilkan tombol maksimalkan
|
||||||
|
.minimize = Tampilkan tombol minimalkan
|
||||||
|
.active-window-hint = Tampilkan petunjuk jendela aktif
|
||||||
|
focus-navigation = Navigasi fokus
|
||||||
|
.focus-follows-cursor = Fokus mengikuti kursor
|
||||||
|
.focus-follows-cursor-delay = Fokus mengikuti penundaan kursor dalam md
|
||||||
|
.cursor-follows-focus = Kursor mengikuti fokus
|
||||||
|
workspaces = Ruang kerja
|
||||||
|
workspaces-multi-behavior = Perilaku multi-monitor
|
||||||
|
.span = Ruang kerja mencakup layar
|
||||||
|
.separate = Layar memiliki ruang kerja terpisah
|
||||||
|
workspaces-overview-thumbnails = Gambaran ikhtisar ruang kerja
|
||||||
|
.show-number = Tampilkan angka ruang kerja
|
||||||
|
.show-name = Tampilkan nama ruang kerja
|
||||||
|
workspaces-orientation = Orientasi ruang kerja
|
||||||
|
.vertical = Vertikal
|
||||||
|
.horizontal = Horisontal
|
||||||
|
hot-corner = Sudut Panas
|
||||||
|
.top-left-corner = Aktifkan sudut panas kiri atas untuk Ruang kerja
|
||||||
|
-requires-restart = Memerlukan mulai ulang
|
||||||
|
color = Warna
|
||||||
|
.depth = Kedalaman warna
|
||||||
|
.profile = Profil warna
|
||||||
|
.sidebar = Profil Warna
|
||||||
|
.temperature = Suhu warna
|
||||||
|
display = Layar
|
||||||
|
.arrangement = Susunan layar
|
||||||
|
.arrangement-desc = Seret layar untuk menyusun ulang posisinya
|
||||||
|
.enable = Aktifkan layar
|
||||||
|
.external = Layar eksternal { $size } { $output }
|
||||||
|
.laptop = Layar laptop { $size }
|
||||||
|
.options = Opsi layar
|
||||||
|
.refresh-rate = Kecepatan penyegaran
|
||||||
|
.resolution = Resolusi
|
||||||
|
.scale = Skala
|
||||||
|
.additional-scale-options = Opsi skala tambahan
|
||||||
|
mirroring = Pencerminan
|
||||||
|
.id = Mencerminkan { $id }
|
||||||
|
.dont = Jangan cerminkan
|
||||||
|
.mirror = Cerminkan { $display }
|
||||||
|
.project =
|
||||||
|
Proyekkan ke { $display ->
|
||||||
|
[all] semua layar
|
||||||
|
*[other] { $display }
|
||||||
|
}
|
||||||
|
.project-count =
|
||||||
|
Memproyekkan ke { $count } { $count ->
|
||||||
|
[1] layar
|
||||||
|
*[other] layar
|
||||||
|
} lainnya
|
||||||
|
night-light = Cahaya malam
|
||||||
|
.auto = Otomatis (terbenam ke terbit)
|
||||||
|
.desc = Mengurangi cahaya biru dengan warna hangat
|
||||||
|
orientation = Orientasi
|
||||||
|
.standard = Standar
|
||||||
|
.rotate-90 = Putar 90°
|
||||||
|
.rotate-180 = Putar 180°
|
||||||
|
.rotate-270 = Putar 270°
|
||||||
|
vrr = Kecepatan penyegaran variabel
|
||||||
|
.enabled = Diaktifkan
|
||||||
|
.force = Selalu
|
||||||
|
.auto = Otomatis
|
||||||
|
.disabled = Dinonaktifkan
|
||||||
|
scheduling = Penjadwalan
|
||||||
|
.manual = Jadwal manual
|
||||||
|
dialog = Dialog
|
||||||
|
.title = Pertahankan pengaturan layar ini?
|
||||||
|
.keep-changes = Pertahankan perubahan
|
||||||
|
.change-prompt = Pengaturan perubahan akan dikembalikan secara otomatis dalam { $time } detik.
|
||||||
|
.revert-settings = Pengaturan pengembalian
|
||||||
|
sound = Suara
|
||||||
|
sound-output = Keluaran
|
||||||
|
.volume = Volume keluaran
|
||||||
|
.device = Perangkat keluaran
|
||||||
|
.level = Tingkat keluaran
|
||||||
|
.config = Konfigurasi
|
||||||
|
.balance = Seimbang
|
||||||
|
.left = Kiri
|
||||||
|
.right = Kanan
|
||||||
|
sound-input = Masukan
|
||||||
|
.volume = Volume masukan
|
||||||
|
.device = Perangkat masukan
|
||||||
|
.level = Tingkat masukan
|
||||||
|
amplification = Amplifikasi
|
||||||
|
.desc = Memungkinkan meningkatkan volume ke 150%
|
||||||
|
sound-alerts = Peringatan
|
||||||
|
.volume = Volume peringatan
|
||||||
|
.sound = Suara peringatan
|
||||||
|
sound-applications = Aplikasi
|
||||||
|
.desc = Volume dan pengaturan aplikasi
|
||||||
|
sound-device-port-unplugged = Tercabut
|
||||||
|
sound-hd-audio = Audio HD
|
||||||
|
sound-usb-audio = Audio USB
|
||||||
|
sound-device-profiles = Profil perangkat
|
||||||
|
power = Daya & baterai
|
||||||
|
battery = Baterai
|
||||||
|
.minute =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] menit
|
||||||
|
*[other] menit
|
||||||
|
}
|
||||||
|
.hour =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] jam
|
||||||
|
*[other] jam
|
||||||
|
}
|
||||||
|
.day =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] hari
|
||||||
|
*[other] hari
|
||||||
|
}
|
||||||
|
.less-than-minute = Kurang dari satu menit
|
||||||
|
.and = dan
|
||||||
|
.remaining-time =
|
||||||
|
{ $time } hingga { $action ->
|
||||||
|
[full] penuh
|
||||||
|
*[other] kosong
|
||||||
|
}
|
||||||
|
connected-devices = Perangkat yang tersambung
|
||||||
|
.unknown = Perangkat yang tidak diketahui
|
||||||
|
power-mode = Mode daya
|
||||||
|
.battery = Masa pakai baterai diperluas
|
||||||
|
.battery-desc = Penggunaan daya berkurang dan kinerja senyap
|
||||||
|
.balanced = Seimbang
|
||||||
|
.balanced-desc = Kinerja senyap dan penggunaan daya sedang
|
||||||
|
.performance = Kinerja tinggi
|
||||||
|
.performance-desc = Kinerja puncak dan penggunaan daya
|
||||||
|
.no-backend = Backend tidak ditemukan. Pasang system76-power atau power-profiles-daemon.
|
||||||
|
acceleration-desc = Menyesuaikan sensitivitas pelacakan berdasarkan kecepatan secara otomatis
|
||||||
|
disable-while-typing = Nonaktifkan saat mengetik
|
||||||
|
slow = Lambat
|
||||||
|
fast = Cepat
|
||||||
|
short = Pendek
|
||||||
|
long = Panjang
|
||||||
|
added = Ditambahkan
|
||||||
|
type-to-search = Ketik untuk mencari...
|
||||||
|
show-extended-input-sources = Tampilkan sumber masukan yang diperluaskan
|
||||||
|
add-another-keybinding = Tambahkan pintasan tombol lainnya
|
||||||
|
cancel = Batalkan
|
||||||
|
command = Perintah
|
||||||
|
custom = Kustom
|
||||||
|
debug = Awakutu
|
||||||
|
disabled = Dinonaktifkan
|
||||||
|
input-source-switch = Alihkan sumber masukan bahasa papan ketik
|
||||||
|
migrate-workspace-prev = Migrasikan ruang kerja ke keluaran sebelumnya
|
||||||
|
migrate-workspace-next = Migrasikan ruang kerja ke keluaran selanjutnya
|
||||||
|
navigate = Navigasikan
|
||||||
|
shortcut-name = Nama pintasan
|
||||||
|
system-controls = Kontrol sistem
|
||||||
|
terminate = Akhiri
|
||||||
|
toggle-stacking = Ubah penumpukan jendela
|
||||||
|
type-key-combination = Ketik kombinasi tombol
|
||||||
|
modified = { $count } dimodifikasi
|
||||||
|
zoom-in = Perbesar
|
||||||
|
zoom-out = Perkecil
|
||||||
|
switch-between-windows = Alihkan antar jendela
|
||||||
|
open-application-library = Buka Pustaka Aplikasi
|
||||||
|
open-workspaces-view = Buka Ikhtisar Ruang Kerja
|
||||||
|
install-additional-languages = Pasang bahasa tambahan
|
||||||
|
region = Wilayah
|
||||||
|
applications = Aplikasi
|
||||||
|
system = Sistem & akun
|
||||||
|
add-user = Tambahkan pengguna
|
||||||
|
change-password = Ubah kata sandi
|
||||||
|
remove-user = Hapus pengguna
|
||||||
|
full-name = Nama lengkap
|
||||||
|
invalid-username = Nama pengguna tidak valid
|
||||||
|
password-mismatch = Kata sandi dan konfirmasi harus cocok
|
||||||
|
save = Simpan
|
||||||
|
administrator = Administrator
|
||||||
|
.desc = Administrator dapat mengubah pengaturan untuk semua pengguna, menambahkan atau menghapus pengguna lainnya
|
||||||
|
users = Pengguna
|
||||||
|
.admin = Admin
|
||||||
|
.standard = Standar
|
||||||
|
.profile-add = Pilih gambar profil
|
||||||
|
firmware = Firmware
|
||||||
|
about-related = Pengaturan terkait
|
||||||
|
.support = Dapatkan dukungan
|
||||||
|
about-os = Sistem operasi
|
||||||
|
.os = Sistem operasi
|
||||||
|
.os-architecture = Arsitektur sistem operasi
|
||||||
|
.kernel = Versi kernel
|
||||||
|
.desktop-environment = Lingkungan desktop
|
||||||
|
.windowing-system = Sistem penjendelaan
|
||||||
|
about-hardware = Perangkat keras
|
||||||
|
.model = Model perangkat keras
|
||||||
|
.memory = Memori
|
||||||
|
.processor = Prosesor
|
||||||
|
.graphics = Grafis
|
||||||
|
.disk-capacity = Kapasitas cakram
|
||||||
|
about-device = Nama perangkat
|
||||||
|
.desc = Nama ini akan muncul ke jaringan lainnya atau perangkat Bluetooth
|
||||||
|
about = Tentang
|
||||||
|
legacy-applications = Kompatibilitas aplikasi X11
|
||||||
|
add-language = Tambahkan bahasa
|
||||||
|
.context = Tambahkan bahasa
|
||||||
|
preferred-languages = Bahasa pilihan
|
||||||
|
.desc = Urutan bahasa menentukan bahasa mana yang digunakan untuk antarmuka pengguna. Perubahan akan berlaku saat masuk selanjutnya.
|
||||||
|
formatting = Pemformatan
|
||||||
|
.dates = Tanggal
|
||||||
|
.time = Waktu
|
||||||
|
.date-and-time = Tanggal & waktu
|
||||||
|
.numbers = Angka
|
||||||
|
.measurement = Pengukuran
|
||||||
|
.paper = Kertas
|
||||||
|
time-region = Wilayah & bahasa
|
||||||
|
time-zone = Zona waktu
|
||||||
|
.auto = Zona waktu otomatis
|
||||||
|
.auto-info = Memerlukan layanan lokasi dan akses internet
|
||||||
|
time-date = Tanggal & waktu
|
||||||
|
.auto = Atur secara otomatis
|
||||||
|
.auto-ntp = Tanggal & waktu akan diperbarui secara otomatis saat zona waktu diatur
|
||||||
|
time = Waktu & bahasa
|
||||||
|
switch-workspaces = Alihkan ruang kerja
|
||||||
|
.horizontal = Geser empat jari ke kiri/kanan
|
||||||
|
.vertical = Geser empat jari ke atas/bawah
|
||||||
|
input-devices = Perangkat masukan
|
||||||
|
primary-button = Tombol utama
|
||||||
|
.desc = Mengatur urutan tombol fisik
|
||||||
|
.left = Kiri
|
||||||
|
.right = Kanan
|
||||||
|
scrolling = Pengguliran
|
||||||
|
.two-finger = Gulir dengan dua jari
|
||||||
|
.edge = Gulir di sepanjang tepi dengan satu jari
|
||||||
|
.speed = Kecepatan pengguliran
|
||||||
|
.natural = Pengguliran natural
|
||||||
|
.natural-desc = Gulir konten, bukan tampilan
|
||||||
|
keyboard = Papan ketik
|
||||||
|
keyboard-sources = Sumber Masukan
|
||||||
|
.desc = Sumber masukan dapat dialihkan menggunakan kombinasi tombol Super+Spasi. Ini dapat disesuaikan di pengaturan pintasan papan ketik.
|
||||||
|
.move-up = Pindahkan ke atas
|
||||||
|
.move-down = Pindahkan ke bawah
|
||||||
|
.settings = Pengaturan
|
||||||
|
.view-layout = Tampilkan tata letak papan ketik
|
||||||
|
.remove = Hapus
|
||||||
|
.add = Tambahkan sumber masukan
|
||||||
|
keyboard-special-char = Entri Karakter Spesial
|
||||||
|
.alternate = Ganti tombol karakter
|
||||||
|
.compose = Tombol compose
|
||||||
|
.compose-desc = Tombol compose memungkinkan berbagai macam karakter untuk memasukkan. Untuk menggunakannya, tekan compose dan kemudian serangkaian karakter. Misalnya, tombol compose diikuti dengan C dan o akan memasukkan ©, sedangkan tombol compose diikuti dengan a dan ‘ akan memasukkan á.
|
||||||
|
.caps = Tombol Caps Lock
|
||||||
|
keyboard-typing-assist = Pengetikan
|
||||||
|
.repeat-rate = Kecepatan pengulangan
|
||||||
|
.repeat-delay = Penundaan pengulangan
|
||||||
|
keyboard-numlock-boot = Numlock
|
||||||
|
.boot-state = Status saat boot
|
||||||
|
.last-boot = Boot terakhir
|
||||||
|
.on = Nyala
|
||||||
|
.off = Mati
|
||||||
|
.set = Atur status boot numlock
|
||||||
|
keyboard-shortcuts = Pintasan papan ketik
|
||||||
|
.desc = Tampilkan dan sesuaikan pintasan
|
||||||
|
power-saving = Opsi penghematan daya
|
||||||
|
.turn-off-screen-after = Matikan layar setelah
|
||||||
|
.auto-suspend = Hentikan otomatis
|
||||||
|
.auto-suspend-ac = Hentikan otomatis saat dicolok
|
||||||
|
.auto-suspend-battery = Hentikan otomatis saat daya baterai
|
||||||
|
custom-shortcuts = Pintasan kustom
|
||||||
|
.add = Tambahkan pintasan
|
||||||
|
.context = Tambahkan pintasan kustom
|
||||||
|
.none = Tidak ada pintasan kustom
|
||||||
|
manage-windows = Kelola jendela
|
||||||
|
.close = Tutup jendela
|
||||||
|
.maximize = Maksimalkan jendela
|
||||||
|
.fullscreen = Layar penuh jendela
|
||||||
|
.minimize = Minimalkan jendela
|
||||||
|
.resize-inwards = Ukur ulang jendela ke dalam
|
||||||
|
.resize-outwards = Ukur ulang jendela ke luar
|
||||||
|
.toggle-sticky = Ubah jendela lengket
|
||||||
|
tap-to-click = Ketuk untuk klik
|
||||||
|
.desc = Mengaktifkan ketukan satu jari untuk klik utama, ketukan dua jari untuk klik kedua, dan ketukan tiga jari untuk klik tengah
|
||||||
|
touchpad = Papan Sentuh
|
||||||
|
.acceleration = Aktifkan akselerasi papan sentuh
|
||||||
|
.speed = Kecepatan papan sentuh
|
||||||
|
mouse = Tetikus
|
||||||
|
.speed = Kecepatan tetikus
|
||||||
|
.acceleration = Aktifkan akselerasi tetikus
|
||||||
|
click-behavior = Perilaku Klik
|
||||||
|
.click-finger = Klik kedua dengan dua jari dan klik tengah dengan tiga jari
|
||||||
|
.button-areas = Klik kedua di sudut kanan bawah dan klik tengah di tengah bawah
|
||||||
|
pinch-to-zoom = Jepit untuk memperbesar
|
||||||
|
.desc = Gunakan dua jari untuk memperbesar konten, untuk aplikasi yang mendukung zum
|
||||||
|
gestures = Gerakan
|
||||||
|
.four-finger-down = Geser empat jari ke bawah
|
||||||
|
.four-finger-left = Geser empat jari ke kiri
|
||||||
|
.four-finger-right = Geser empat jari ke kanan
|
||||||
|
.four-finger-up = Geser empat jari ke atas
|
||||||
|
.three-finger-any = Geser tiga jari ke segala arah
|
||||||
|
migrate-workspace =
|
||||||
|
Migrasikan ruang kerja ke keluaran { $direction ->
|
||||||
|
*[down] bawah
|
||||||
|
[left] kiri
|
||||||
|
[right] kanan
|
||||||
|
[up] atas
|
||||||
|
}
|
||||||
|
window-tiling = Pengubinan jendela
|
||||||
|
.horizontal = Atur orientasi horisontal
|
||||||
|
.vertical = Atur orientasi vertikal
|
||||||
|
.swap-window = Tukar jendela
|
||||||
|
.toggle-tiling = Ubah pengubinan jendela
|
||||||
|
.toggle-stacking = Ubah penumpukan jendela
|
||||||
|
.toggle-floating = Ubah pengapungan jendela
|
||||||
|
.toggle-orientation = Ubah orientasi
|
||||||
|
time-format = Format tanggal & waktu
|
||||||
|
.twenty-four = Waktu 24 jam
|
||||||
|
.show-seconds = Tampilkan detik
|
||||||
|
.first = Hari pertama dalam mingguan
|
||||||
|
.show-date = Tampilkan tanggal di applet waktu
|
||||||
|
.friday = Jum'at
|
||||||
|
.saturday = Sabtu
|
||||||
|
.sunday = Minggu
|
||||||
|
.monday = Senin
|
||||||
|
default-apps = Aplikasi Bawaan
|
||||||
|
.web-browser = Peramban web
|
||||||
|
.file-manager = Pengelola berkas
|
||||||
|
.mail-client = Klien surel
|
||||||
|
.music = Musik
|
||||||
|
.video = Video
|
||||||
|
.photos = Foto
|
||||||
|
.calendar = Kalender
|
||||||
|
.terminal = Terminal
|
||||||
|
.other-associations = Asosiasi lainnya
|
||||||
|
.text-editor = Penyunting Teks
|
||||||
|
.not-installed = Tidak dipasang
|
||||||
|
startup-apps = Aplikasi pemulaian
|
||||||
|
.add = Tambahkan aplikasi
|
||||||
|
.user = Aplikasi yang diluncurkan saat anda masuk
|
||||||
|
.none = Tidak ada aplikasi pemulaian yang ditambahkan
|
||||||
|
.remove-dialog-title = Hapus { $name }?
|
||||||
|
.remove-dialog-description = Hapus aplikasi pemulaian ini?
|
||||||
|
.add-startup-app = Tambahkan aplikasi pemulaian
|
||||||
|
legacy-app-global-shortcuts = Pintasan global di aplikasi X11
|
||||||
|
.desc = Pintasan global memungkinkan penekanan tombol papan ketik dan tetikus yang dilakukan dalam aplikasi dikenali oleh aplikasi lain untuk fitur seperti tekan untuk bicara atau tekan untuk membisukan. Secara bawaan, pintasan global dinonaktifkan di aplikasi X11 untuk memastikan aplikasi lain tidak dapat memantau peristiwa papan ketik dan tetikus yang berisi informasi sensitif.
|
||||||
|
.none = Tidak ada tombol
|
||||||
|
.modifiers = Pengubah (Super, Shift, Control, Alt)
|
||||||
|
.combination = Semua tombol beserta pengubah Super, Control atau Alt ditekan
|
||||||
|
.all = Semua tombol
|
||||||
|
.mouse = Peristiwa tombol tetikus di aplikasi X11
|
||||||
|
legacy-app-scaling = Penskalaan aplikasi sistem jendela X11
|
||||||
|
.scaled-gaming = Optimalkan untuk permainan dan aplikasi layar penuh
|
||||||
|
.gaming-description = Aplikasi X11 mungkin tampak sedikit lebih besar/kecil dibandingkan dengan aplikasi Wayland
|
||||||
|
.scaled-applications = Optimalkan untuk aplikasi
|
||||||
|
.applications-description = Permainan dan aplikasi X11 layar penuh mungkin tidak cocok dengan resolusi layar anda
|
||||||
|
.scaled-compatibility = Mode kompatibilitas maksimum
|
||||||
|
.compatibility-description = Aplikasi X11 mungkin tampak buram pada layar HiDPI
|
||||||
|
.preferred-display = Layar pilihan untuk permainan dan aplikasi X11 layar penuh
|
||||||
|
.no-display = Tidak ada
|
||||||
|
system-shortcut = Sistem
|
||||||
|
.app-library = Buka pustaka aplikasi
|
||||||
|
.brightness-down = Kurangi kecerahan layar
|
||||||
|
.brightness-up = Tingkatkan kecerahan layar
|
||||||
|
.display-toggle = Ubah layar internal
|
||||||
|
.home-folder = Buka map beranda
|
||||||
|
.keyboard-brightness-down = Kurangi kecerahan papan ketik
|
||||||
|
.keyboard-brightness-up = Tingkatkan kecerahan papan ketik
|
||||||
|
.launcher = Buka Peluncur
|
||||||
|
.log-out = Keluar
|
||||||
|
.lock-screen = Kunci layar
|
||||||
|
.mute = Matikan keluaran audio
|
||||||
|
.mute-mic = Matikan masukan mikrofon
|
||||||
|
.play-pause = Putar/jeda
|
||||||
|
.play-next = Lagu selanjutnya
|
||||||
|
.play-prev = Lagu sebelumnya
|
||||||
|
.poweroff = Matikan daya
|
||||||
|
.screenshot = Ambil tangkapan layar
|
||||||
|
.suspend = Hentikan
|
||||||
|
.terminal = Buka terminal
|
||||||
|
.touchpad-toggle = Ubah papan sentuh
|
||||||
|
.volume-lower = Kurangi volume keluaran audio
|
||||||
|
.volume-raise = Tingkatkan volume keluaran audio
|
||||||
|
.web-browser = Buka peramban web
|
||||||
|
.window-switcher = Alihkan antar jendela yang dibuka
|
||||||
|
.window-switcher-previous = Alihkan antar jendela yang dibuka secara terbalik
|
||||||
|
.workspace-overview = Buka ikhtisar ruang kerja
|
||||||
|
nav-shortcuts = Navigasi
|
||||||
|
.prev-output = Fokus keluaran sebelumnya
|
||||||
|
.next-output = Fokus keluaran selanjutnya
|
||||||
|
.last-workspace = Fokus ruang kerja terakhir
|
||||||
|
.prev-workspace = Fokus ruang kerja sebelumnya
|
||||||
|
.next-workspace = Fokus ruang kerja selanjutnya
|
||||||
|
.focus =
|
||||||
|
Fokus jendela { $direction ->
|
||||||
|
*[down] bawah
|
||||||
|
[in] dalam
|
||||||
|
[left] kiri
|
||||||
|
[out] luar
|
||||||
|
[right] kanan
|
||||||
|
[up] atas
|
||||||
|
}
|
||||||
|
.output =
|
||||||
|
Alihkan ke keluaran { $direction ->
|
||||||
|
*[down] bawah
|
||||||
|
[left] kiri
|
||||||
|
[right] kanan
|
||||||
|
[up] atas
|
||||||
|
}
|
||||||
|
.workspace = Alihkan ke ruang kerja { $num }
|
||||||
|
move-windows = Pindahkan jendela
|
||||||
|
.direction =
|
||||||
|
Pindahkan jendela { $direction ->
|
||||||
|
*[down] bawah
|
||||||
|
[left] kiri
|
||||||
|
[right] kanan
|
||||||
|
[up] atas
|
||||||
|
}
|
||||||
|
.display =
|
||||||
|
Pindahkan jendela satu monitor { $direction ->
|
||||||
|
*[down] bawah
|
||||||
|
[left] kiri
|
||||||
|
[right] kanan
|
||||||
|
[up] atas
|
||||||
|
}
|
||||||
|
.workspace =
|
||||||
|
Pindahkan jendela satu ruang kerja { $direction ->
|
||||||
|
*[below] bawah
|
||||||
|
[left] kiri
|
||||||
|
[right] kanan
|
||||||
|
[above] atas
|
||||||
|
}
|
||||||
|
.workspace-num = Pindahkan jendela ke ruang kerja { $num }
|
||||||
|
.prev-workspace = Pindahkan jendela ke ruang kerja sebelumnya
|
||||||
|
.next-workspace = Pindahkan jendela ke ruang kerja selanjutnya
|
||||||
|
.last-workspace = Pindahkan jendela ke ruang kerja terakhir
|
||||||
|
.next-display = Pindahkan jendela ke layar selanjutnya
|
||||||
|
.prev-display = Pindahkan jendela ke layar sebelumnya
|
||||||
|
.send-to-prev-workspace = Pindahkan jendela ke ruang kerja sebelumnya
|
||||||
|
.send-to-next-workspace = Pindahkan jendela ke ruang kerja selanjutnya
|
||||||
|
workspaces-overview = Ikhtisar ruang kerja
|
||||||
|
.action-on-typing = Tindakan saat mengetik
|
||||||
|
.none = Tidak Ada
|
||||||
|
.launcher = Buka Peluncur
|
||||||
|
.applications = Buka Aplikasi
|
||||||
|
xdg-entry-touchpad = Papan Sentuh
|
||||||
|
xdg-entry-wired = Berkabel
|
||||||
|
xdg-entry-startup-apps-comment = Konfigurasikan aplikasi yang berjalan saat masuk
|
||||||
|
xdg-entry-region-language = Wilayah & Bahasa
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Tetikus;Akselerasi;Pengguliran;
|
||||||
|
xdg-entry-bluetooth-comment = Kelola perangkat Bluetooth
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Notifikasi;Kunci;
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Pemulaian;Aplikasi;
|
||||||
|
xdg-entry-default-apps-comment = Peramban web, klien surat, peramban berkas, dan aplikasi lain bawaan
|
||||||
|
xdg-entry-keyboard-comment = Sumber masukan, pengalihan, entri karakter spesial, pintasan
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Berkabel;LAN;Jaringan;Sambungan;
|
||||||
|
xdg-entry-power = Daya & Baterai
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Aksen;Warna;Ikon;Huruf;Tema
|
||||||
|
xdg-entry-mouse = Tetikus
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Dok;Panel;Applet
|
||||||
|
xdg-entry-mouse-comment = Kecepatan, akselerasi, dan pengguliran natural tetikus
|
||||||
|
xdg-entry-system = Sistem & Akun
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Panel;Applet
|
||||||
|
xdg-entry-window-management = Pengelolaan Jendela
|
||||||
|
xdg-entry-a11y = Aksesibilitas
|
||||||
|
xdg-entry-time-language-comment = Kelola tanggal, waktu, wilayah, dan bahasa sistem
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Desktop;
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Aplikasi;Permainan;Kompatibilitas;
|
||||||
|
xdg-entry-displays-comment = Kelola pengaturan konfigurasi layar
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;Papan Sentuh;Gerakan;
|
||||||
|
xdg-entry-time-language = Waktu & Bahasa
|
||||||
|
xdg-entry-users = Pengguna
|
||||||
|
xdg-entry-system-keywords = COSMIC;Sistem;Info;Akun;Firmware;
|
||||||
|
xdg-entry-default-apps = Aplikasi Bawaan
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;Jaringan;Sambungan;
|
||||||
|
xdg-entry-applications-comment = Pengaturan aplikasi bawaan, aplikasi pemulaian, dan kompatibilitas aplikasi X11
|
||||||
|
xdg-entry-about-keywords = COSMIC;Tentang
|
||||||
|
xdg-entry-panel = Panel
|
||||||
|
xdg-entry-notifications = Notifikasi
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Aksesibilitas;A11y;Layar;Pembaca;Kaca Pembesar;Kontras;Warna;
|
||||||
|
xdg-entry-wireless-comment = Sambungan Wi-Fi dan profil sambungan
|
||||||
|
xdg-entry-desktop = Desktop
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Waktu;Zona;
|
||||||
|
xdg-entry-desktop-comment = Pengaturan wallpaper, tampilan, panel, dok, pengelolaan jendela dan ruang kerja
|
||||||
|
xdg-entry-wallpaper = Wallpaper
|
||||||
|
xdg-entry-keyboard = Papan Ketik
|
||||||
|
xdg-entry-a11y-comment = Pembaca layar, kaca pembesar, kontras tinggi, dan filter warna
|
||||||
|
xdg-entry-displays = Layar
|
||||||
|
xdg-entry-network = Jaringan & Nirkabel
|
||||||
|
xdg-entry-date-time = Tanggal & Waktu
|
||||||
|
xdg-entry-users-comment = Akun autentikasi dan pengguna
|
||||||
|
xdg-entry-input-comment = Pengaturan papan ketik dan tetikus
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
xdg-entry-dock-comment = Bilah opsional untuk aplikasi dan applet
|
||||||
|
xdg-entry-network-keywords = COSMIC;Jaringan;Nirkabel;WiFi;VPN;
|
||||||
|
xdg-entry-wallpaper-comment = Opsi gambar wallpaper, warna, dan tayangan salindia
|
||||||
|
xdg-entry-dock = Dok
|
||||||
|
xdg-entry-startup-apps = Aplikasi Pemulaian
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Ruang Kerja;Orientasi;Ikhtisar;Monitor;
|
||||||
|
xdg-entry-system-comment = Informasi sistem, akun, dan pembaruan firmware
|
||||||
|
xdg-entry-x11-applications-comment = Penskalaan aplikasi sistem jendela X11, tampilan utama, dan pintasan global
|
||||||
|
xdg-entry-region-language-comment = Format tanggal, waktu, dan angka berdasarkan wilayah Anda
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Wallpaper;Latar Belakang;Tayangan Salindia;
|
||||||
|
xdg-entry-users-keywords = COSMIC;Pengguna;Akun;
|
||||||
|
xdg-entry-about-comment = Nama perangkat, informasi perangkat keras, bawaan sistem operasi
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Jaringan;Sambungan;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-appearance-comment = Warna aksen dan tema
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;Sistem;Waktu;Tanggal;Wilayah;Bahasa;
|
||||||
|
xdg-entry-input-keywords = COSMIC;Masukan;Papan Ketik;Tetikus;Tetikus;
|
||||||
|
xdg-entry-comment = Aplikasi pengaturan untuk desktop COSMIC
|
||||||
|
xdg-entry-notifications-comment = Pengaturan Jangan Ganggu, notifikasi layar kunci, dan per-aplikasi
|
||||||
|
xdg-entry-applications = Aplikasi
|
||||||
|
xdg-entry-sound-keywords = COSMIC;Suara;Audio;Peringatan;Pipewire;
|
||||||
|
xdg-entry-power-keywords = COSMIC;Daya;Baterai
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Bawaan;Aplikasi
|
||||||
|
xdg-entry-keywords = COSMIC;Pengaturan;
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Wilayah;Bahasa;Tanggal;Format;Waktu;Lokal;Lokalisasi;
|
||||||
|
xdg-entry-about = Tentang
|
||||||
|
xdg-entry-input = Perangkat Masukan
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Bawaan;Aplikasi;Pemulaian;X11;Kompatibilitas
|
||||||
|
xdg-entry-sound-comment = Pengaturan audio untuk perangkat, peringatan, dan aplikasi
|
||||||
|
xdg-entry-touchpad-comment = Kecepatan papan sentuh, opsi klik, dan gerakan
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Papan Ketik;Masukan;Sumber;Pintasan;
|
||||||
|
xdg-entry-vpn-comment = Sambungan VPN dan profil sambungan
|
||||||
|
xdg-entry-appearance = Tampilan
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;Jendela;Pengelolaan;Pengubinan;Super;Tombol;
|
||||||
|
xdg-entry-workspaces-comment = Orientasi ruang kerja, ikhtisar, dan perilaku multi-monitor
|
||||||
|
xdg-entry-network-comment = Kelola sambungan jaringan
|
||||||
|
xdg-entry-panel-comment = Bilah sistem primer untuk menu dan applet
|
||||||
|
xdg-entry-sound = Suara
|
||||||
|
xdg-entry-power-comment = Opsi mode daya dan penghematan daya
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Layar;
|
||||||
|
xdg-entry-workspaces = Ruang Kerja
|
||||||
|
xdg-entry-date-time-comment = Zona waktu, pengaturan jam otomatis, dan pemformatan waktu
|
||||||
|
xdg-entry-x11-applications = Kompatibilitas Aplikasi X11
|
||||||
|
xdg-entry-window-management-comment = Tindakan tombol Super, opsi kontrol jendela, dan pengubinan jendela tambahan
|
||||||
|
xdg-entry-wired-comment = Sambungan berkabel dan profil sambungan
|
||||||
|
no-search-results = Tidak ada jaringan yang sesuai pencarian anda.
|
||||||
7
i18n/is/cosmic_settings.ftl
vendored
7
i18n/is/cosmic_settings.ftl
vendored
|
|
@ -20,13 +20,6 @@ dbus-connection-error = Náði ekki að tengjast DBus
|
||||||
ok = Í lagi
|
ok = Í lagi
|
||||||
unknown = Óþekkt
|
unknown = Óþekkt
|
||||||
number = { $number }
|
number = { $number }
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] Kapaltengdar
|
|
||||||
[wifi] Wi-Fi
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] óþekktar
|
|
||||||
} tengingar og tengisnið.
|
|
||||||
add-network = Add network
|
add-network = Add network
|
||||||
.profile = Bæta við notandasniði
|
.profile = Bæta við notandasniði
|
||||||
add-vpn = Bæta við VPN
|
add-vpn = Bæta við VPN
|
||||||
|
|
|
||||||
66
i18n/it/cosmic_settings.ftl
vendored
66
i18n/it/cosmic_settings.ftl
vendored
|
|
@ -4,15 +4,67 @@ ok = OK
|
||||||
unknown = Sconosciuto
|
unknown = Sconosciuto
|
||||||
number = { $number }
|
number = { $number }
|
||||||
|
|
||||||
|
## Freedesktop desktop entries
|
||||||
|
|
||||||
|
xdg-entry-about = Informazioni su
|
||||||
|
xdg-entry-about-comment = Nome del dispositivo, informazioni sull'hardware e sul sistema operativo
|
||||||
|
xdg-entry-a11y = Accessibilità
|
||||||
|
xdg-entry-a11y-comment = Impostazioni accessibilità
|
||||||
|
xdg-entry-appearance = Aspetto
|
||||||
|
xdg-entry-appearance-comment = Colore d'accento e temi
|
||||||
|
xdg-entry-applications = Applicazioni
|
||||||
|
xdg-entry-applications-comment = Gestione delle impostazioni delle applicazioni
|
||||||
|
xdg-entry-bluetooth-comment = Gestione dispositivi Bluetooth
|
||||||
|
xdg-entry-date-time = Data e Ora
|
||||||
|
xdg-entry-date-time-comment = Fuso orario, impostazione automatica dell'ora e del formato
|
||||||
|
xdg-entry-default-apps = Applicazioni predefinite
|
||||||
|
xdg-entry-default-apps-comment = Browser web predefinito, client di posta, esplora file e altre applicazioni
|
||||||
|
xdg-entry-desktop = Desktop
|
||||||
|
xdg-entry-displays = Schermo
|
||||||
|
xdg-entry-displays-comment = Opzioni dello schermo, impostazioni e luce notturna
|
||||||
|
xdg-entry-dock = Dock
|
||||||
|
xdg-entry-dock-comment = Una barra opzionale per le applicazioni e le applet
|
||||||
|
xdg-entry-input = Dispositivi di immissione
|
||||||
|
xdg-entry-input-comment = Tastiera, mouse, ecc.
|
||||||
|
xdg-entry-keyboard = Tastiera
|
||||||
|
xdg-entry-keyboard-comment = Sorgenti di immissione, switch, caratteri speciali e scorciatoie
|
||||||
|
xdg-entry-mouse = Mouse
|
||||||
|
xdg-entry-mouse-comment = Velocità del cursore, accelerazione e scorrimento naturale
|
||||||
|
xdg-entry-network = Rete e connessioni Wi-Fi
|
||||||
|
xdg-entry-network-comment = Gestisci le connessioni di rete
|
||||||
|
xdg-entry-notifications = Notifiche
|
||||||
|
xdg-entry-notifications-comment = Non disturbare, notifiche su schermata di blocco e impostazioni per applicazioni
|
||||||
|
xdg-entry-panel = Pannello
|
||||||
|
xdg-entry-panel-comment = Barra di sistema principale per il menù e le applet
|
||||||
|
xdg-entry-power = Alimentazione e batteria
|
||||||
|
xdg-entry-power-comment = Modalità di alimentazione e opzioni risparmio energia
|
||||||
|
xdg-entry-region-language = Regione e lingua
|
||||||
|
xdg-entry-region-language-comment = Formato della data, dell'ora e dei numeri in base alla regione
|
||||||
|
xdg-entry-sound = Audio
|
||||||
|
xdg-entry-sound-comment = Impostazioni audio per dispositivi, allarmi e applicazioni
|
||||||
|
xdg-entry-startup-apps = Applicazioni all'avvio
|
||||||
|
xdg-entry-startup-apps-comment = Configura le applicazioni da avviare automaticamente al login
|
||||||
|
xdg-entry-system = Sistema e account
|
||||||
|
xdg-entry-time-language = Ora e lingua
|
||||||
|
xdg-entry-touchpad = Touchpad
|
||||||
|
xdg-entry-touchpad-comment = Velocità del touchpad, opzioni di tocco e gesti
|
||||||
|
xdg-entry-users = Utenti
|
||||||
|
xdg-entry-users-comment = Autenticazione e account utenti
|
||||||
|
xdg-entry-vpn-comment = Connessioni VPN e profili di connessione
|
||||||
|
xdg-entry-wallpaper = Sfondo
|
||||||
|
xdg-entry-wallpaper-comment = Immagine di sfondo, colori e opzioni di transizione
|
||||||
|
xdg-entry-window-management = Gestione delle finestre
|
||||||
|
xdg-entry-window-management-comment = Azioni del tasto Super, opzioni del controllo delle finestre, e opzioni aggiuntive del tiling delle finestre
|
||||||
|
xdg-entry-wired = Cablato
|
||||||
|
xdg-entry-wired-comment = Connessioni cablate e profili
|
||||||
|
xdg-entry-wireless-comment = Connessioni Wi-Fi e profili di connessione
|
||||||
|
xdg-entry-workspaces = Spazi di lavoro
|
||||||
|
xdg-entry-workspaces-comment = Orientamento e comportamento degli spazi di lavoro
|
||||||
|
xdg-entry-x11-applications = Compatibilità applicazioni X11
|
||||||
|
xdg-entry-x11-applications-comment = Scaling applicazioni X11 e shortcut globali
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
Connessione { $variant ->
|
|
||||||
[wired] Ethernet
|
|
||||||
[wifi] Wi-Fi
|
|
||||||
[vpn] VPN
|
|
||||||
*[other] Sconosciuto
|
|
||||||
} e profili di connessione.
|
|
||||||
add-network = Aggiungi rete
|
add-network = Aggiungi rete
|
||||||
.profile = Aggiungi profilo
|
.profile = Aggiungi profilo
|
||||||
add-vpn = Aggiungi VPN
|
add-vpn = Aggiungi VPN
|
||||||
|
|
|
||||||
7
i18n/ja/cosmic_settings.ftl
vendored
7
i18n/ja/cosmic_settings.ftl
vendored
|
|
@ -3,13 +3,6 @@ unknown = 不明
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] 有線の
|
|
||||||
[wifi] Wi-Fiの
|
|
||||||
[vpn] VPNの
|
|
||||||
*[other] 不明な
|
|
||||||
}接続と接続プロファイル。
|
|
||||||
add-network = ネットワークを追加
|
add-network = ネットワークを追加
|
||||||
.profile = プロファイルを追加
|
.profile = プロファイルを追加
|
||||||
add-vpn = VPNを追加
|
add-vpn = VPNを追加
|
||||||
|
|
|
||||||
635
i18n/kab/cosmic_settings.ftl
vendored
635
i18n/kab/cosmic_settings.ftl
vendored
|
|
@ -0,0 +1,635 @@
|
||||||
|
xdg-entry-a11y = Tuffart
|
||||||
|
xdg-entry-about-keywords = COSMIC;Ɣef
|
||||||
|
xdg-entry-a11y-keywords = Cosmic;Tuffart;A11y;Agdil;Ameɣri;Asemɣer;Agnil;Ini;
|
||||||
|
xdg-entry-a11y-comment = Ameɣri n ugdil, asemɣer, agnil afellay, akked tistayin n yini
|
||||||
|
xdg-entry-about-comment = Isem n yibenk, talɣut ɣef warrum akked iɣewwaṛen imezwar n unagraw n wammud
|
||||||
|
xdg-entry-appearance-comment = Initen n uɣdebbu akked isental
|
||||||
|
xdg-entry-keywords = COSMIC;Iɣewwaṛen;
|
||||||
|
xdg-entry-about = Ɣef
|
||||||
|
xdg-entry-appearance = Timeẓri
|
||||||
|
xdg-entry-bluetooth-comment = Sefrek ibenkan n Bluetooth
|
||||||
|
xdg-entry-default-apps-comment = Iminig n web amezwer, amsaɣ n yimayl, iminig n yifuyla, akked yisnasen nniḍen
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Aɣdebbu;Ini;Tignit;Tasefsit;Asentel
|
||||||
|
xdg-entry-default-apps = Isnasen imezwar
|
||||||
|
xdg-entry-applications-comment = Isnasen imezwar, isnasen n usekker akked iɣewwaṛen n umṣada n yisnasen X11
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Asrag;Tamennaḍt;
|
||||||
|
xdg-entry-date-time = Azemz akked usrag
|
||||||
|
xdg-entry-applications = Isnasen
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Amezwer;Asnas;Asekker;X11;Amṣada
|
||||||
|
xdg-entry-date-time-comment = Tamennaḍt tasragant, iɣewwaṛen n temrilt tawurmant akked umasal n usrag
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Taɣerdayt;Asɣiwel;Adrurem;
|
||||||
|
xdg-entry-keyboard-comment = Iɣbula n unekcum, asenfel, anekcum n isekkilen uzzigen, inegzumen
|
||||||
|
xdg-entry-mouse = Taɣerdayt
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Adekkan;Agalis;Tappleṭ
|
||||||
|
xdg-entry-mouse-comment = Arured n tɣerdayt, asɣiwel, d udrurem agaman
|
||||||
|
xdg-entry-keyboard = Anasiw
|
||||||
|
xdg-entry-input-comment = Iɣewwaṛen n unasiw akked tɣerdayt
|
||||||
|
xdg-entry-dock-comment = Afeggag anefrunan i isnasen akked teplaḍin
|
||||||
|
xdg-entry-dock = Adekkan
|
||||||
|
xdg-entry-input = Ibenkan n unekcum
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Anasiw;Anekcum;Aɣbalu;Inegzumen;
|
||||||
|
xdg-entry-startup-apps-comment = Swel isnasen i yettwaselkamen deg tuqqna
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Asekker;Asnas;
|
||||||
|
xdg-entry-system = Anagraw akked Imiḍanen
|
||||||
|
xdg-entry-time-language-comment = Sefrek azemz n unagraw, asrag, tamnaḍt akked tutlayt
|
||||||
|
xdg-entry-users = Iseqdacen
|
||||||
|
xdg-entry-system-keywords = COSMIC;Anagraw;Talɣut;Imiḍanen;Afreɣẓan;
|
||||||
|
xdg-entry-users-comment = Asesteb akked imiḍanen n iseqdacen
|
||||||
|
xdg-entry-system-comment = Talɣut n unagraw, imiḍanen akked ileqman n ufreɣẓan
|
||||||
|
xdg-entry-users-keywords = COSMIC;Aseqdac;Amiḍan;
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;Anagraw;Asrag;Azemz;Tamnaḍt;Tutlayt;
|
||||||
|
xdg-entry-wired = S ugatu
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Agatu;LAN;Aẓeṭṭa;Tuqqna;
|
||||||
|
xdg-entry-window-management = Asefrek n yisfuyla
|
||||||
|
xdg-entry-wallpaper = Aɣrab n ugdil
|
||||||
|
xdg-entry-wallpaper-comment = Tugniwin n uɣrab n ugdil, initen akked tigri n tugna
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Aɣrab n ugdil;Agilal;Tigri n tugna;
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Aẓeṭṭa;Tuqqna;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-vpn-comment = Tuqqniwin VPN akked imeɣna n tuqqna
|
||||||
|
xdg-entry-wired-comment = Tuqqniwin ugatu akked imeɣna n tuqqniwin
|
||||||
|
workspaces-orientation = Taɣda n tallunin n umahil
|
||||||
|
.vertical = Ubdid
|
||||||
|
.horizontal = Aglawan
|
||||||
|
sound-applications = Isnasen
|
||||||
|
.desc = Iblaɣen akked iɣewwaṛen n usnas
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Asnas;Urar;Amṣada;
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;Aẓeṭṭa;Tuqqna;
|
||||||
|
xdg-entry-wireless-comment = Tuqqniwin Wi-Fi akked imeɣna n tuqqna
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Tallunt n umahil;Taɣda;Askan amatu;Agdil;
|
||||||
|
xdg-entry-workspaces-comment = Taɣda n tallunt n umahil, askan amatu akked tiddin n uget n yigdilen
|
||||||
|
xdg-entry-workspaces = Tallunin n umahil
|
||||||
|
xdg-entry-x11-applications = Amṣada n Isnasen X11
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Tanarit;
|
||||||
|
xdg-entry-displays-comment = Sefrek iɣewwaṛen n twila n ubeqqeḍ
|
||||||
|
xdg-entry-notifications = Ilɣa
|
||||||
|
xdg-entry-desktop = Tanarit
|
||||||
|
xdg-entry-desktop-comment = Aɣrab n ugdil, timeẓri, agalis, adekkan, asefrek n yisfuyla akked yiɣewwaṛen n tallunt n umahil
|
||||||
|
xdg-entry-displays = Ibeqqiḍen
|
||||||
|
xdg-entry-network = Aẓeṭṭa akked tuqqna war agatu
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
xdg-entry-network-keywords = COSMIC;Aẓeṭṭa;War agatu;WiFi;VPN;
|
||||||
|
xdg-entry-comment = Asnas iɣewwaṛen n tnarit COSMIC
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Amezwer;Asnas
|
||||||
|
xdg-entry-network-comment = Sefrek tuqqniwin n uẓeṭṭa
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Abeqqeḍ;
|
||||||
|
xdg-entry-region-language = Tamnaḍt akked Tutlayt
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Alɣu;Asekkeṛ;
|
||||||
|
xdg-entry-power = Tazmart akked uẓru
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Agalis;Tappleṭ
|
||||||
|
xdg-entry-power-keywords = COSMIC;Tanezmart;Aẓru
|
||||||
|
xdg-entry-panel-comment = Afeggag n unagraw agejdan i wumuɣen akked teplaḍin
|
||||||
|
xdg-entry-power-comment = Iskaren n tnezmart akked tnefrunin n uḥraz n tnezmart
|
||||||
|
keyboard-typing-assist = Tira
|
||||||
|
.repeat-rate = Atug n wallus
|
||||||
|
.repeat-delay = Amzegran n wallus
|
||||||
|
sound-alerts = Ilɣa
|
||||||
|
.volume = Ableɣ n yilɣa
|
||||||
|
.sound = Imesli n yilɣa
|
||||||
|
color = Ini
|
||||||
|
.depth = Talqayt n yini
|
||||||
|
.profile = Amaɣnu n yini
|
||||||
|
.sidebar = Imeɣna n yini
|
||||||
|
.temperature = Taẓɣelt n yini
|
||||||
|
xdg-entry-startup-apps = Isnasen n tnekra
|
||||||
|
xdg-entry-region-language-comment = Msel izemzen, isragen akked yemḍanen almend n temnaḍt-ik·im
|
||||||
|
xdg-entry-sound-keywords = Cosmic;Imesli;Ameslaw;Alɣu;Pipewire;
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Tamnaḍt;Tutlayt;Azemz;Amasal;Asrag;Iɣewwaṛen idiganen;Asideg;
|
||||||
|
xdg-entry-sound-comment = Iɣewwaṛen n umeslaw i yibenkan, ilɣa akked yisnasen
|
||||||
|
cancel = Sefsex
|
||||||
|
save = Sekles
|
||||||
|
replace = Semselsi
|
||||||
|
light = Aceɛlal
|
||||||
|
dark = Aɣmayan
|
||||||
|
appearance = Timeẓri
|
||||||
|
settings = Iɣewwaṛen
|
||||||
|
username = Isem n useqdac
|
||||||
|
remove = Kkes
|
||||||
|
password = Awal uffir
|
||||||
|
connect = Qqen
|
||||||
|
close = Mdel
|
||||||
|
confirm = Sentem
|
||||||
|
forget-dialog = Ttu aẓeṭṭa-agi Wi-Fi?
|
||||||
|
.description = Ilaq ad tsekcemeḍ awal uffir tikkelt-nniḍen i useqdec n uẓeṭṭa-agi Wi-Fi ɣer zdat.
|
||||||
|
identity = Tamagit
|
||||||
|
password-confirm = Sentem awal uffir
|
||||||
|
connected = Yettwaqqen
|
||||||
|
dock = Adekkan
|
||||||
|
applets = Tiplaḍin
|
||||||
|
add = Rnu
|
||||||
|
panel = Agalis
|
||||||
|
import = Kter
|
||||||
|
xdg-entry-time-language = Asrag & Tutlayt
|
||||||
|
xdg-entry-panel = Agalis
|
||||||
|
xdg-entry-sound = Imesli
|
||||||
|
all = Akk
|
||||||
|
add-applet = Rnu tappleṭ
|
||||||
|
notifications = Ilɣa
|
||||||
|
shadow-and-corners = Tili akked tiɣemmar n usfaylu
|
||||||
|
interface-font = Tasefsit n unagraw
|
||||||
|
monospace-font = Tasefsit n tallunt tasuft
|
||||||
|
icons-and-toolkit = Isental n tignitin d ifecka
|
||||||
|
experimental-settings = iɣewwaṛen urmitan
|
||||||
|
window-management-appearance = Asefrek n yisfuyla
|
||||||
|
.active-hint = Tiddi n umatar n usfaylu urmid
|
||||||
|
.gaps = Ilem yezzin ɣef isfuyla yefsren
|
||||||
|
interface-density = Taneẓẓi n ugrudem
|
||||||
|
.comfortable = Amfiman
|
||||||
|
.compact = Akussim
|
||||||
|
.spacious = Wessiɛen
|
||||||
|
style = Aɣanib
|
||||||
|
.round = Imdewweṛ
|
||||||
|
.slightly-round = Imdewweṛ cwiṭ
|
||||||
|
.square = Amkuẓ
|
||||||
|
text-tint = Sbeɣ n uḍris n ugrudem
|
||||||
|
.desc = Yettwaseqdec iwakken ad d-yawi initen n uḍris n ugrudem i yesɛan agnil akken iwata deg tugett n tjummiwin
|
||||||
|
icon-theme = Asentel n tignit
|
||||||
|
.desc = Ad yesnes tagrumma n tignitin yemgaraden ɣef isnasen
|
||||||
|
frosted = Asemdu n usmaɣ deg ugrudem n unagraw.
|
||||||
|
.desc = Snes asluɣu n ugilal ɣer ugalis, adekkan, tiplaḍin, ameskar, d temkarḍit n usnas
|
||||||
|
enable-export = Snes asentel amiran i yisnasen n GNOME
|
||||||
|
.desc = Mačči akk ifecka sefraken asnifel awurman. Isnasen ur nelli n COSMIC zemrent ad sran ales n tnekra seld asnifel n usentel.
|
||||||
|
control-tint = Sbeɣ n isger usenqed
|
||||||
|
.desc = Yettwaseqdec i ugilal n teqfalin tizeɣt, isekcemen n unadi, isekcemen n uḍris, d isegran yettemcabin
|
||||||
|
container-background = Agilal n umagbar
|
||||||
|
.desc-detail = Ini n ugilal n umagbar yettwaseqdec i ufeggag adisan n tunigin, leqjeṛ n yidis, idiwenniyen akked yiwiǧiten am wigi. S wudem amezwer, ini n ugilal n umagbar yettwasuddem-d s wudem awurman seg ugilal n usfaylu.
|
||||||
|
.reset = Ales awennez ɣer uwarman
|
||||||
|
.desc = Yettwaseqdec i ufeggag n yidis n yinig, leqjeṛ n yidis, idiwenniyen akked iwiǧiten am wigi
|
||||||
|
shadows-floating = Asfaylu yettifliwen
|
||||||
|
.clip = Semṣada akked tɣmar n unagraw arnu snes tili
|
||||||
|
auto-switch = Snifel s wudem awurman gar uskar aceɛlal d uɣmayan
|
||||||
|
.sunrise = Ad isnifel ɣer waskar aceɛlal deg walluy
|
||||||
|
.sunset = Ad isnifel ɣer waskar aɣmayan deg uɣelluy
|
||||||
|
.next-sunrise = Ad isnifel ɣer waskar aceɛlal deg walluy id-iteddun
|
||||||
|
.next-sunset = Ad isnifel ɣer waskar aɣmayan deg uɣelluy id-iteddun
|
||||||
|
window-hint-accent-toggle = Seqdec ini n uɣdebbu am unamal n usfaylu urmid
|
||||||
|
window-hint-accent = Ini n unamal n usfaylu urmid
|
||||||
|
rgb = RGB
|
||||||
|
reset-to-default = Ales awennez ɣer umezwer
|
||||||
|
recent-colors = Initen n melmi kan
|
||||||
|
mode-and-colors = Askar akked yiniten
|
||||||
|
hex = Hex
|
||||||
|
export = Sifeḍ
|
||||||
|
copy-to-clipboard = Nɣel ɣer tecfawit
|
||||||
|
copied-to-clipboard = Yettwanɣel ɣer tecfawit
|
||||||
|
color-picker = Amelqaḍ n yini
|
||||||
|
auto = Awurman
|
||||||
|
app-background = Agilal n usfaylu
|
||||||
|
accent-color = Ini n uɣdebbu
|
||||||
|
never = Werǧin
|
||||||
|
x-hours =
|
||||||
|
{ $number } { $number ->
|
||||||
|
[one] usrag
|
||||||
|
*[other] n yisragen
|
||||||
|
}
|
||||||
|
x-minutes =
|
||||||
|
{ $number } { $number ->
|
||||||
|
[one] tasdat
|
||||||
|
*[other] n tesdatin
|
||||||
|
}
|
||||||
|
recent-folders = Ikaramen n melmi kan
|
||||||
|
open-new-folder = Ldi akaram amaynut
|
||||||
|
fit-to-screen = Sezg ɣer ugdil
|
||||||
|
fill = Taččart
|
||||||
|
dialog-add = Rnu
|
||||||
|
colors = Initen
|
||||||
|
all-displays = Akk igdilen
|
||||||
|
add-image = Rnu tugna
|
||||||
|
add-color = Rnu ini
|
||||||
|
wallpaper = Aɣrab n ugdil
|
||||||
|
.change = Snifel tugna yal
|
||||||
|
.fit = Tugna n uɣrab n ugdil tettwasemsawi
|
||||||
|
.folder-dialog = Fren akaram n uɣrab n ugdil
|
||||||
|
.image-dialog = Fren tugna n uɣrab n ugdil
|
||||||
|
.plural = iɣerban n ugdil
|
||||||
|
.same = Yiwen uɣrab n ugdil deg yibeqqeḍen meṛṛa
|
||||||
|
.slide = Tigri
|
||||||
|
desktop = Tanarit
|
||||||
|
color-filter = Anaw n testayt n yini
|
||||||
|
.unknown = Tastayt tarussint turmidt
|
||||||
|
.greyscale = Tafesna n imiɣed
|
||||||
|
.deuteranopia = Adal/Azeggaɣ (adal ur yeǧhid ara, Dutiranupya)
|
||||||
|
.protanopia = Azeggaɣ/Adal (azeggaɣ ur yeǧhid ara, Prutanupya)
|
||||||
|
.tritanopia = Azegzaw/Awṛaɣ (azegzaw ur yeǧhid ara, Tritanupya)
|
||||||
|
default = Amezwer
|
||||||
|
accessibility = Tuffart
|
||||||
|
.vision = Tamuɣli
|
||||||
|
.on = Yermed
|
||||||
|
.off = Yensa
|
||||||
|
.unavailable = Ur yewjid ara
|
||||||
|
.screen-reader = Imeɣri n ugdil
|
||||||
|
.high-contrast = Askar n ugnil afellay
|
||||||
|
.invert-colors = Tti initen
|
||||||
|
.color-filters = Tistayin n yini
|
||||||
|
bluetooth-adapters = Imezgayen n Bluetooth
|
||||||
|
bluetooth-available = Ibenkan iqeṛben
|
||||||
|
bluetooth-confirm-pin = Sentem Tangalt Bluetooth PIN
|
||||||
|
.description = Ma ulac aɣilif, Sentem d akken tangalt PIN i d-itteddun temṣada akked tin i d-yettwaseknen deg { $device }
|
||||||
|
bluetooth-paired = Ibenkan yeqqnen yakan
|
||||||
|
.connect = Qqen
|
||||||
|
.battery = Aẓru { $percentage }%
|
||||||
|
bluetooth = Bluetooth
|
||||||
|
.status = Anagraw-agi yettban-d am { $aliases } mi ara ldin yiɣewwaṛen n Bluetooth.
|
||||||
|
.connected = Iqqen
|
||||||
|
.connecting = Tuqqna
|
||||||
|
.disconnecting = Tuffɣa si tuqqna
|
||||||
|
.connect = Qqen
|
||||||
|
.disconnect = Ffeɣ seg tuqqna
|
||||||
|
.forget = Ttu
|
||||||
|
.dbus-error = Teḍra-d tuccḍa deg temyigawt akked DBus: { $why }
|
||||||
|
.disabled = Ameẓlu n Bluetooth yensa
|
||||||
|
.inactive = Ameẓlu Bluetooth ur yermed ara
|
||||||
|
.unknown = Ameẓlu n Bluetooth ur yezmir ara ad yermed. Yettwasbedd BlueZ?
|
||||||
|
enable = Sermed
|
||||||
|
activate = Rmed
|
||||||
|
online-accounts = Imiḍanen ɣef uẓeṭṭa
|
||||||
|
.desc = Rnu imiḍanen, IMPA akked SMTP, inekcam n tuqqna n tkebbanit
|
||||||
|
wireguard-dialog = Rnu ibenk WireGuard
|
||||||
|
.description = Fren isem n yibenk i twila n WireGuard.
|
||||||
|
wifi = Wi-Fi
|
||||||
|
.adapter = Amezgay n Wi-Fi { $id }
|
||||||
|
.forget = Ttu aẓeṭṭa-agi
|
||||||
|
wired = S ugatu
|
||||||
|
.adapter = Amezgay n ugatu { $id }
|
||||||
|
.connections = Tuqqniwin s ugatu
|
||||||
|
.devices = Ibenkan n ugatu
|
||||||
|
.remove = Kkes amaɣnu n tuqqna
|
||||||
|
vpn-error = Tuccḍa n VPN
|
||||||
|
.config = Ur teddi ara tmerna n twila VPN
|
||||||
|
.connect = Tecceḍ tuqqna ɣer VPN
|
||||||
|
.connection-editor = Amaẓrag n tuqqna ur yeddi ara
|
||||||
|
.connection-settings = Yecceḍ wawway n iɣewwaṛen i tuqqniwin turmidin
|
||||||
|
.updating-state = Yecceḍ uleqqem n waddad n umsefrak n uzeṭṭa
|
||||||
|
.wireguard-config-path = Abrid n ufaylu d armeɣtu i twila n WireGuard
|
||||||
|
.wireguard-config-path-desc = Afaylu yettwafernen ilaq ad yili deg unagraw adigan.
|
||||||
|
.wireguard-device = Yecceḍ usnulfu n yibenk WireGuard
|
||||||
|
.with-password =
|
||||||
|
Ur yizmir ara ad isbadu { $field ->
|
||||||
|
*[username] isem n useqdac
|
||||||
|
[password] awal uffir
|
||||||
|
[password-flags] tikbabin n wawal uffir
|
||||||
|
} n VPN s nmcli
|
||||||
|
vpn = VPN
|
||||||
|
.connections = Tuqqniwin VPN
|
||||||
|
.error = Timerna n twila VPN ur teddi ara
|
||||||
|
.remove = Kkes amaɣnu n tuqqna
|
||||||
|
.select-file = Fren afaylu n twila VPN
|
||||||
|
remove-connection-dialog = Kkes amaɣnu n tuqqna?
|
||||||
|
.vpn-description = Yessefk ad teskecmeḍ awal uffir tikkelt-nniḍen akken ad tesqedceḍ aẓeṭṭa-agi deg yimal.
|
||||||
|
.wired-description = Ilaq ad talseḍ asnulfu n umaɣnu-agi akken ad t-tesqedceḍ deg yimal.
|
||||||
|
network-device-state =
|
||||||
|
.activated = Iqqen
|
||||||
|
.config = Tuqqna
|
||||||
|
.deactivating = Tuffɣa seg tuqqna
|
||||||
|
.disconnected = Yeffeɣ seg tuqqna
|
||||||
|
.failed = Tuqqna ur teddi ara
|
||||||
|
.ip-check = Aselken n tuqqna
|
||||||
|
.ip-config = Asuter n IP akked talɣut n uɛeddi
|
||||||
|
.need-auth = Yesra asesteb
|
||||||
|
.prepare = Aheggi i tuqqna
|
||||||
|
.secondaries = Araǧu n tuqqna tis snat
|
||||||
|
.unavailable = Ulac-it
|
||||||
|
.unknown = Addad arussin
|
||||||
|
.unmanaged = Ur yettwasefrak ara
|
||||||
|
.unplugged = Agatu yettwakkes
|
||||||
|
auth-dialog = Asesteb yettwasra
|
||||||
|
.vpn-description = Sekcem isem n useqdac akked wawal uffir yettwasran sɣur umeẓlu VPN.
|
||||||
|
.wifi-description = Sekcem awal uffir neɣ tasarut n uwgelhen. Tzemreḍ daɣen ad teqqneḍ s usiti ɣef tqeffalt “WPS” deg umeglay.
|
||||||
|
visible-networks = Izeḍwa yettbanen
|
||||||
|
share = Bḍu aẓeṭṭa
|
||||||
|
qr-code-unavailable = Tangalt QR ulac-itt
|
||||||
|
no-vpn = Ulac tuqqniwin VPN iwejden.
|
||||||
|
no-networks = Ulac iẓeḍwa yettwafen.
|
||||||
|
network-name = Isem n uẓeṭṭa
|
||||||
|
network-and-wireless = Aẓeṭṭa & war agatu
|
||||||
|
known-networks = Iẓeḍwa yettwassnen
|
||||||
|
forget = Ttu
|
||||||
|
disconnect = Ffeɣ seg tuqqna
|
||||||
|
connecting = Tuqqna…
|
||||||
|
cable-unplugged = Agatu yettwakkes
|
||||||
|
airplane-on = Askar n temsrifegt yermed.
|
||||||
|
add-vpn = Rnu VPN
|
||||||
|
add-network = Rnu aẓeṭṭa
|
||||||
|
.profile = Rnu amaɣnu
|
||||||
|
app = Iɣewwaṛen n COSMIC
|
||||||
|
number = { $number }
|
||||||
|
unknown = Arussin
|
||||||
|
ok = IH
|
||||||
|
dbus-connection-error = Ur izmir ara ad yeqqen ɣer DBus
|
||||||
|
zoom-out = Simẓi
|
||||||
|
zoom-in = Semɣeṛ
|
||||||
|
replace-shortcut-dialog = Semselsi anegzum?
|
||||||
|
.desc = { $shortcut } yettwaseqdec sɣur { $name }. Ma tsemselsiḍ-t, { $name } ad yettwsens.
|
||||||
|
window-tiling = Afser n yisfuyla
|
||||||
|
.horizontal = Sbadu taɣda taglawant
|
||||||
|
.vertical = Sbadu taɣda tubdidt
|
||||||
|
.swap-window = Asfaylu n usemmeskel
|
||||||
|
.toggle-tiling = Qluqel afsar n usfaylu
|
||||||
|
.toggle-stacking = Qluqel asettef n usfaylu
|
||||||
|
.toggle-floating = Qluqel asfaylu yettifliwen
|
||||||
|
.toggle-orientation = Qluqel taɣda
|
||||||
|
manage-windows = Sefrek isfuyla
|
||||||
|
.close = Mdel asfaylu
|
||||||
|
.maximize = Semɣer asfaylu
|
||||||
|
.fullscreen = Asfaylu n ugdil aččuran
|
||||||
|
.minimize = Semẓi asfaylu
|
||||||
|
.resize-inwards = Ales tiddi n usfaylu ɣer daxel
|
||||||
|
.resize-outwards = Ales tiddit n usfaylu ɣer berra
|
||||||
|
.toggle-sticky = Rmed/Sens asfaylu usbiḍ
|
||||||
|
modified = { $count } ttwasniflen
|
||||||
|
custom-shortcuts = Inegzumen yugnen
|
||||||
|
.add = Rnu anegzum
|
||||||
|
.context = Rnu anegzum yugnen
|
||||||
|
.none = Ulac inegzumen yugnen
|
||||||
|
type-key-combination = Aru asuddes n tsarut
|
||||||
|
toggle-stacking = Rmed/Sens asettef n isfuyla
|
||||||
|
terminate = Egg tagara
|
||||||
|
system-controls = Isenqaden n unagraw
|
||||||
|
shortcut-name = Isem n unegzum
|
||||||
|
navigate = Inig
|
||||||
|
migrate-workspace =
|
||||||
|
Inig tallunt n umahil ɣer tuffɣa { $direction ->
|
||||||
|
*[down] ukessar
|
||||||
|
[left] uzelmaḍ
|
||||||
|
[right] uyeffus
|
||||||
|
[up] usawen
|
||||||
|
}
|
||||||
|
migrate-workspace-next = Inig tallunt n umahil ɣer tuffɣa tuḍfirt
|
||||||
|
migrate-workspace-prev = Inig tallunt n umahil ɣer tuffɣa tuzwirt
|
||||||
|
input-source-switch = Beddel tutlayt n usekcem n unasiw
|
||||||
|
disabled = Insa
|
||||||
|
debug = Seɣti
|
||||||
|
custom = Yugnen
|
||||||
|
command = Taladna
|
||||||
|
add-another-keybinding = Rnu yiwen n unegzum n unasiw nniḍen
|
||||||
|
keyboard-shortcuts = Inegzumen n unasiw
|
||||||
|
.desc = Wali sakin sagen inegzumen
|
||||||
|
show-extended-input-sources = Sken tiɣbula n unekcum leqqayen
|
||||||
|
type-to-search = Aru iwakken ad tnadiḍ…
|
||||||
|
added = Yettwarna
|
||||||
|
keyboard-sources = Iɣbula n unekcum
|
||||||
|
.desc = Iɣbula n unekcum zemren ad ttwasneflen s useqdec n usuddes n tsarut Super+Space. Ayagi yezmer ad yettuwennez deg yiɣewwaṛen n unegzum n unasiw..
|
||||||
|
.move-up = Ddu d asawen
|
||||||
|
.move-down = Ddu d akessar
|
||||||
|
.settings = Iɣewwaṛen
|
||||||
|
.view-layout = Wali taneɣruft n unasiw
|
||||||
|
.remove = Kkes
|
||||||
|
.add = Rnu aɣbalu n unekcum
|
||||||
|
keyboard = Anasiw
|
||||||
|
long = Aɣezfan
|
||||||
|
short = Awezlan
|
||||||
|
fast = Arurad
|
||||||
|
slow = Ẓẓay
|
||||||
|
scrolling = Adrurem
|
||||||
|
.two-finger = Drurem s sin iḍudan
|
||||||
|
.edge = Drurem arma d iri s yiwen uḍad
|
||||||
|
.speed = Arured n udrurem
|
||||||
|
.natural = Adrurem agaman
|
||||||
|
.natural-desc = Drurem agbur, deg wadeg n tmeẓri
|
||||||
|
primary-button = Taqeffalt tagejdant
|
||||||
|
.desc = Ad yesbadu amizzwer n tqeffalin tifekkanin
|
||||||
|
.left = Azelmaḍ
|
||||||
|
.right = Ayeffus
|
||||||
|
input-devices = ibenkan n unekcum
|
||||||
|
disable-while-typing = Sens ticki tettaruḍ
|
||||||
|
acceleration-desc = Seggem s wudem awurman aḥulfu n uneḍfar ilmend n urured
|
||||||
|
power-saving = Tinefrunin n uḥraz n tnezmart
|
||||||
|
.turn-off-screen-after = Sexsi agdil seld
|
||||||
|
.auto-suspend = Aseḥbes deg leɛḍil s wudem awurman
|
||||||
|
.auto-suspend-ac = Aseḥbes deg leɛḍil s wudem awurman mi ara yeqqen
|
||||||
|
.auto-suspend-battery = Aseḥbes deg leɛḍil s wudem awurman ɣef tezmer n uẓru
|
||||||
|
power-mode = Askar n tezmart
|
||||||
|
.battery = Asiɣzef n tudert n uẓru
|
||||||
|
.battery-desc = Aḥraz n tezmart d tmellit tasusamt
|
||||||
|
.balanced = Awliwal
|
||||||
|
.balanced-desc = Timellit tasussamt akked useqdec alemmas n tezmert
|
||||||
|
.performance = Timellit tafellayt
|
||||||
|
.performance-desc = Taqacuct useqdec n tmellit d tezmert
|
||||||
|
.no-backend = Ameẓlu n deffir ur yettwaf ara. Sbedd system76-power neɣ power-profiles-daemon.
|
||||||
|
connected-devices = Ibenkan yeqqnen
|
||||||
|
.unknown = Ibenk arussin
|
||||||
|
battery = Aẓru
|
||||||
|
.minute =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] tasdat
|
||||||
|
*[other] n tesdatin
|
||||||
|
}
|
||||||
|
.hour =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] asrag
|
||||||
|
*[other] n yisragen
|
||||||
|
}
|
||||||
|
.day =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] wass
|
||||||
|
*[other] n wussan
|
||||||
|
}
|
||||||
|
.less-than-minute = Ur tettaweḍ ara tesdat
|
||||||
|
.and = akked
|
||||||
|
.remaining-time =
|
||||||
|
{ $time } alamma { $action ->
|
||||||
|
[full] yeččur
|
||||||
|
*[other] ifuk
|
||||||
|
}
|
||||||
|
power = Tazmert d uẓru
|
||||||
|
sound-device-profiles = Imuɣna n yibenk
|
||||||
|
sound-usb-audio = Imesli USB
|
||||||
|
sound-hd-audio = Imesli HD
|
||||||
|
amplification = Asedfu
|
||||||
|
.desc = Ad yesireg ableɣ alama d 150%
|
||||||
|
sound-input = Anekcam
|
||||||
|
.volume = Ableɣ n unekcum
|
||||||
|
.device = Ibenk n unekcum
|
||||||
|
.level = Aswir n unekcum
|
||||||
|
sound-output = Tuffɣa
|
||||||
|
.volume = Ableɣ n tuffɣa
|
||||||
|
.device = Ibenk n tuffɣa
|
||||||
|
.level = Aswir n tuffɣa
|
||||||
|
.config = Twila
|
||||||
|
.balance = Awliwel
|
||||||
|
.left = Azelmaḍ
|
||||||
|
.right = Ayeffus
|
||||||
|
sound = Imesli
|
||||||
|
dialog = Tanaka n udiwenni
|
||||||
|
.title = Eǧǧ iɣewwaren-agi n ubeqqeḍ?
|
||||||
|
.keep-changes = Eǧǧ ibeddilen
|
||||||
|
.change-prompt = Isenfal n yiɣewwaṛen ad ttwasfesxen s wudem awurman deg { $time } n tsinin.
|
||||||
|
.revert-settings = Err-d iɣewwaṛen
|
||||||
|
scheduling = Asɣiwes
|
||||||
|
.manual = Asɣiwes s ufus
|
||||||
|
vrr = Atug n usismeḍ n umutti
|
||||||
|
.enabled = Yettwarmed
|
||||||
|
.force = Yal tikelt
|
||||||
|
.auto = S wudem awarman
|
||||||
|
.disabled = Ittwarermed
|
||||||
|
orientation = Taɣda
|
||||||
|
.standard = Tizeɣt
|
||||||
|
.rotate-90 = Zzi s 90°
|
||||||
|
.rotate-180 = Zzi s 180°
|
||||||
|
.rotate-270 = Zzi s 270°
|
||||||
|
night-light = Tafat n yiḍ
|
||||||
|
.auto = Awurman (seg uɣelluy ɣer walluy)
|
||||||
|
.desc = Senqes tafat tazegzawt s yiniten yeḥman
|
||||||
|
-requires-restart = Yesra asenker tikelt-nniḍen
|
||||||
|
workspaces-multi-behavior = Tiddin n uget n yigdilen
|
||||||
|
.span = Tallunin n umahil tteddunt ɣef ddeqs n yigdilen
|
||||||
|
.separate = Igdilen sɛan tallunin n umahil i yiman-nsent
|
||||||
|
workspaces-behavior = Tiddin n tallunt n umahil
|
||||||
|
.dynamic = Tallunin n umahil s wudem asmussaw
|
||||||
|
.dynamic-desc = Kkes s wudem awurman tallunin n umahil tilmawin
|
||||||
|
.fixed = Amḍan usbiḍ n tallunin n umahil
|
||||||
|
.fixed-desc = Rnu neɣ kkes tallunin n umahil deg teskant.
|
||||||
|
workspaces-overview = Taskant n tallunin n umahil
|
||||||
|
.action-on-typing = Tigawt deg tira
|
||||||
|
.none = Ula yiwen
|
||||||
|
.launcher = Ldi Amsekkar
|
||||||
|
.applications = Ldi Isnasen
|
||||||
|
workspaces = Tallunin n umahil
|
||||||
|
focus-navigation = Asaḍas n yinig
|
||||||
|
.focus-follows-cursor = Asaḍas i uḍfar n teḥnaccaḍt
|
||||||
|
.focus-follows-cursor-delay = Asaḍas i uḍfar n teḥnaccaḍt s usmezger s mili-tasint
|
||||||
|
.cursor-follows-focus = Taḥnaccaṭ teḍfer asaḍas
|
||||||
|
window-controls = Isenqaden n usfaylu
|
||||||
|
.maximize = Sken taqeffalt n usemɣer
|
||||||
|
.minimize = Sken taqeffalt n usemẓi
|
||||||
|
.active-window-hint = Sken amatar n usfaylu urmid
|
||||||
|
edge-gravity = Ajbad n yisfuyla yettifliwen ɣer yiran iqerben
|
||||||
|
super-key = Tigawt n tsarut Super
|
||||||
|
.launcher = Ldi amsekkar
|
||||||
|
.workspaces = Ldi tallunin n umahil
|
||||||
|
.applications = Ldi isnasen
|
||||||
|
.disable = Sens
|
||||||
|
window-management = Amsefrak n yisfuyla
|
||||||
|
panel-missing = Tawila n ugalis ulac-itt
|
||||||
|
.desc = Afaylu n twila n ugalis ulac-it ɣef sebba n useqdec n twila yugnen neɣ yexṣer.
|
||||||
|
.fix = Ales awennez ɣer umezwer
|
||||||
|
panel-applets = Tawila
|
||||||
|
.dock-desc = Swel tiplaḍin n udekkan
|
||||||
|
.desc = Swel tiplaḍin n ugalis
|
||||||
|
panel-style = Aɣanib
|
||||||
|
.anchor-gap = Ilem gar ugalis d yiran n ugdil
|
||||||
|
.dock-anchor-gap = Ilem gar udekkan d yiran n ugdil
|
||||||
|
.extend = Seɣzef agalis ɣer yiran n ugdil
|
||||||
|
.dock-extend = Seɣzef adekkan ɣer yiran n ugdil
|
||||||
|
.appearance = Timeẓriwt
|
||||||
|
.size = Teɣzi
|
||||||
|
.background-opacity = Tiḍullest n ugilal
|
||||||
|
panel-behavior-and-position = Tiddin akked wadigen
|
||||||
|
.autohide = Ffer s wudem awurman agalis
|
||||||
|
.dock-autohide = Ffer s wudem awurman adekkan
|
||||||
|
.position = Ideg deg ugdil
|
||||||
|
.display = Sken deg ubeqqeḍ
|
||||||
|
panel-appearance = Timeẓriwt
|
||||||
|
.match = Amṣada d tnarit
|
||||||
|
.light = Aceɛlal
|
||||||
|
.dark = Aɣmayan
|
||||||
|
start-segment = Aḥric n tazwara
|
||||||
|
small = Ameẓyan
|
||||||
|
search-applets = Nadi tiplaḍin…
|
||||||
|
panel-top = Uksawen
|
||||||
|
panel-right = Ayeffus
|
||||||
|
panel-left = Azelmaḍ
|
||||||
|
panel-bottom = Ukessar
|
||||||
|
no-applets-found = Ulac tiplaḍin yettwafen...
|
||||||
|
large = Meqqer
|
||||||
|
end-segment = Aḥric n taggara
|
||||||
|
place-here = Sers tiplaḍin dagi
|
||||||
|
center-segment = Aḥric alemmas
|
||||||
|
no-search-results = Ulac ifuyla inmeɣran akked unadi-ik·im.
|
||||||
|
password-mismatch = Awal uffir akked usentem ilaq ad mṣadan
|
||||||
|
invalid-username = Isem n useqdac d armeɣtu
|
||||||
|
full-name = Isem ummid
|
||||||
|
remove-user = Kkes aseqdac
|
||||||
|
change-password = Asnifel n wawal uffir
|
||||||
|
add-user = Rnu aseqdac
|
||||||
|
administrator = Anedbal
|
||||||
|
.desc = Inedbalen zemren ad beddlen iɣewwaṛen i yiseqdacen meṛṛa, ad rnun neɣ ad kksen iseqdacen-nniḍen
|
||||||
|
users = Iseqdacen
|
||||||
|
.admin = Anedbal
|
||||||
|
.standard = Tizeɣt
|
||||||
|
.profile-add = Fren tugna n umaɣnu
|
||||||
|
firmware = Afreɣẓan
|
||||||
|
about-related = Iɣewwaṛen icudden
|
||||||
|
.support = Awi-d tallelt
|
||||||
|
about-os = Anagraw n wammud
|
||||||
|
.os = Anagraw n wammud
|
||||||
|
.os-architecture = Tasegda n unagraw n wammud
|
||||||
|
.kernel = Lqem n yiɣes
|
||||||
|
.desktop-environment = Twennaḍt n tnarit
|
||||||
|
.windowing-system = Anagraw n yisfuyla
|
||||||
|
about-hardware = Arrum
|
||||||
|
.model = Tamudemt n warrum
|
||||||
|
.memory = Takatut
|
||||||
|
.processor = Asekkar
|
||||||
|
.graphics = Udlifen
|
||||||
|
.disk-capacity = Akettur n uḍebsi
|
||||||
|
about-device = Isem n yibenk
|
||||||
|
.desc = Isem-agi yettban-d deg ibenkan-nniḍen n uẓeṭṭa neɣ n Bluetooth
|
||||||
|
about = Ɣef
|
||||||
|
system = Anagraw akked imiḍanen
|
||||||
|
legacy-applications = Amṣada n yisnasen X11
|
||||||
|
startup-apps = Isnasen n usekker
|
||||||
|
.add = Rnu asnas
|
||||||
|
.user = Isnasen ttwasnekren mi ara tkecmeḍ
|
||||||
|
.none = Ulac isnasen n usekker yettwarnan
|
||||||
|
.remove-dialog-title = Kkes { $name }?
|
||||||
|
.remove-dialog-description = Kkes asnas-agi n usekker?
|
||||||
|
.add-startup-app = Rnu asnas n usekker
|
||||||
|
default-apps = Isnasen imezwar
|
||||||
|
.web-browser = Iminig n web
|
||||||
|
.file-manager = Amsefrak n ifuyla
|
||||||
|
.mail-client = Amsaɣ n yimayl
|
||||||
|
.music = Aẓawan
|
||||||
|
.video = Tavidyut
|
||||||
|
.photos = Tiwlafin
|
||||||
|
.calendar = Awitay
|
||||||
|
.terminal = Ixef
|
||||||
|
.other-associations = Tidukliwin-nniḍen
|
||||||
|
.text-editor = Amaẓrag n uḍris
|
||||||
|
.not-installed = Ur yettusbedd ara
|
||||||
|
applications = Isnasen
|
||||||
|
region = Tamnaḍt
|
||||||
|
install-additional-languages = Sbedd tutlayin nniḍen
|
||||||
|
add-language = Rnu tutlayt
|
||||||
|
.context = Rnu tutlayt
|
||||||
|
preferred-languages = Tutlayin timenyafin
|
||||||
|
.desc = Amizzwer n tutlayin yemmal-d anta tutlayt i yettwasqedcen i ugrudem n useqdac. Isenfal ad ddun deg tuqqna tuḍfirt.
|
||||||
|
formatting = Amsal
|
||||||
|
.dates = Izemzen
|
||||||
|
.time = Akud
|
||||||
|
.date-and-time = Azemz & akud
|
||||||
|
.numbers = Uṭṭunen
|
||||||
|
.measurement = Akat
|
||||||
|
.paper = Lkaɣeḍ
|
||||||
|
time-region = Tamnaḍt akked tutlayt
|
||||||
|
time-format = Amasal n uzemz akked usrag
|
||||||
|
.twenty-four = akud n 24 n yisragen
|
||||||
|
.show-seconds = Sken tasinin
|
||||||
|
.first = Ass amezwaru n dduṛt
|
||||||
|
.show-date = Sken azemz deg tappleṭ n wakud
|
||||||
|
.friday = Sem
|
||||||
|
.saturday = Sed
|
||||||
|
.sunday = Acer
|
||||||
|
.monday = Arim
|
||||||
|
time-zone = Tamnaḍt n wakud
|
||||||
|
.auto = Tamnaḍt n wakud tawurmant
|
||||||
|
.auto-info = Yesra imeẓla n wadig akked unekcum ɣer internet
|
||||||
|
time-date = Azemz akked wakud
|
||||||
|
.auto = Sbadu s wudem awurman
|
||||||
|
.auto-ntp = Azemz akked wakud ad ttwaleqqmen s wudem awurman ticki ara tesbaduḍ tamnaḍt n wakud
|
||||||
|
time = Akkud akked tutlayt
|
||||||
|
open-workspaces-view = Taskant n tallunin n umahil yeldin
|
||||||
|
open-application-library = Ldi tamkarḍit n yisnasen
|
||||||
|
switch-between-windows = Senfel gar isfuyla
|
||||||
|
switch-workspaces = Senfel tallunin n umahil
|
||||||
|
.horizontal = Aḍummu n kuẓ n yiḍudan ɣer zelmaḍ/yefus
|
||||||
|
.vertical = Aḍummu n kuẓ n yiḍudan ɣer usawen/ukessar
|
||||||
|
touchpad = Talwiḥt n unnal
|
||||||
|
.acceleration = Rmed tasɣiwelt n telwiḥt n unnal
|
||||||
|
.speed = Arurad n telwiḥt n unnal
|
||||||
|
click-behavior = Tiddin n usiti
|
||||||
|
.click-finger = Asiti wis sin s sin iḍudan akked d usiti alemmas s kraḍ n yiḍudan
|
||||||
|
.button-areas = Asiti wis sin deg teɣmert tayeffust n wadda akked usiti alemmas di tlemmast n wadda
|
||||||
|
mouse = Taɣerdayt
|
||||||
|
.speed = Arured n tɣerdayt
|
||||||
|
.acceleration = Rmed asɣiwel n tɣerdayt
|
||||||
820
i18n/kk/cosmic_settings.ftl
vendored
820
i18n/kk/cosmic_settings.ftl
vendored
|
|
@ -0,0 +1,820 @@
|
||||||
|
app = COSMIC баптаулары
|
||||||
|
dbus-connection-error = DBus-қа қосылу сәтсіз аяқталды
|
||||||
|
ok = ОК
|
||||||
|
unknown = Белгісіз
|
||||||
|
number = { $number }
|
||||||
|
add-network = Желіні қосу
|
||||||
|
.profile = Профильді қосу
|
||||||
|
add-vpn = VPN қосу
|
||||||
|
airplane-on = Ұшақ режимі іске қосулы.
|
||||||
|
cable-unplugged = Кабель ажыратылған
|
||||||
|
connect = Қосылу
|
||||||
|
connected = Қосылды
|
||||||
|
connecting = Қосылуда…
|
||||||
|
disconnect = Ажырату
|
||||||
|
forget = Ұмыту
|
||||||
|
known-networks = Белгілі желілер
|
||||||
|
network-and-wireless = Желі және сымсыз байланыс
|
||||||
|
network-name = Желі атауы
|
||||||
|
no-networks = Желілер табылмады.
|
||||||
|
no-vpn = Қолжетімді VPN байланыстары жоқ.
|
||||||
|
password = Пароль
|
||||||
|
password-confirm = Парольді растау
|
||||||
|
qr-code-unavailable = QR коды қолжетімсіз
|
||||||
|
remove = Өшіру
|
||||||
|
scan-to-connect-description = Осы желіге қосылу үшін QR кодын сканерлеңіз.
|
||||||
|
settings = Баптаулар
|
||||||
|
share = Желімен бөлісу
|
||||||
|
username = Пайдаланушы аты
|
||||||
|
visible-networks = Көрінетін желілер
|
||||||
|
identity = Сәйкестендіру
|
||||||
|
auth-dialog = Аутентификация қажет
|
||||||
|
.vpn-description = VPN қызметіне қажетті пайдаланушы атын және парольді енгізіңіз.
|
||||||
|
.wifi-description = Парольді немесе шифрлеу кілтін енгізіңіз. Сондай-ақ роутердегі «WPS» батырмасын басу арқылы қосылуға болады.
|
||||||
|
forget-dialog = Осы Wi-Fi желісін ұмыту керек пе?
|
||||||
|
.description = Болашақта осы Wi-Fi желісін пайдалану үшін парольді қайта енгізу қажет болады.
|
||||||
|
network-device-state =
|
||||||
|
.activated = Қосылды
|
||||||
|
.config = Қосылуда
|
||||||
|
.deactivating = Ажыратылуда
|
||||||
|
.disconnected = Ажыратылған
|
||||||
|
.failed = Қосылу сәтсіз аяқталды
|
||||||
|
.ip-check = Байланысты тексеру
|
||||||
|
.ip-config = IP және маршруттау ақпаратын сұрау
|
||||||
|
.need-auth = Аутентификация қажет
|
||||||
|
.prepare = Қосылуға дайындалу
|
||||||
|
.secondaries = Қосымша байланысты күту
|
||||||
|
.unavailable = Қолжетімсіз
|
||||||
|
.unknown = Белгісіз күй
|
||||||
|
.unmanaged = Басқарылмайтын
|
||||||
|
.unplugged = Кабель ажыратылған
|
||||||
|
remove-connection-dialog = Байланыс профилін өшіру керек пе?
|
||||||
|
.vpn-description = Болашақта осы желіні пайдалану үшін парольді қайта енгізу қажет болады.
|
||||||
|
.wired-description = Болашақта оны пайдалану үшін осы профильді қайта жасау қажет болады.
|
||||||
|
vpn = VPN
|
||||||
|
.connections = VPN байланыстары
|
||||||
|
.error = VPN конфигурациясын қосу сәтсіз аяқталды
|
||||||
|
.remove = Байланыс профилін өшіру
|
||||||
|
.select-file = VPN конфигурациялық файлын таңдаңыз
|
||||||
|
vpn-error = VPN қатесі
|
||||||
|
.config = VPN конфигурациясын қосу сәтсіз аяқталды
|
||||||
|
.connect = VPN-ге қосылу сәтсіз аяқталды
|
||||||
|
.connection-editor = Байланыс редакторының жұмысы сәтсіз аяқталды
|
||||||
|
.connection-settings = Белсенді байланыстар үшін баптауларды алу сәтсіз аяқталды
|
||||||
|
.updating-state = Желі менеджерінің күйін жаңарту сәтсіз аяқталды
|
||||||
|
.wireguard-config-path = WireGuard конфигурациясы үшін файл жолы жарамсыз
|
||||||
|
.wireguard-config-path-desc = Таңдалған файл жергілікті файлдық жүйеде болуы тиіс.
|
||||||
|
.wireguard-device = WireGuard құрылғысын жасау сәтсіз аяқталды
|
||||||
|
.with-password =
|
||||||
|
VPN { $field ->
|
||||||
|
*[username] пайдаланушы атын
|
||||||
|
[password] паролін
|
||||||
|
[password-flags] пароль жалаушаларын
|
||||||
|
} nmcli арқылы орнату сәтсіз аяқталды
|
||||||
|
wired = Сымды
|
||||||
|
.adapter = Сымды адаптер { $id }
|
||||||
|
.connections = Сымды байланыстар
|
||||||
|
.devices = Сымды құрылғылар
|
||||||
|
.remove = Байланыс профилін өшіру
|
||||||
|
wifi = Wi-Fi
|
||||||
|
.adapter = Wi-Fi адаптері { $id }
|
||||||
|
.forget = Осы желіні ұмыту
|
||||||
|
wireguard-dialog = WireGuard құрылғысын қосу
|
||||||
|
.description = WireGuard конфигурациясы үшін құрылғы атауын таңдаңыз.
|
||||||
|
online-accounts = Желілік тіркелгілер
|
||||||
|
.desc = Тіркелгілерді, IMAP және SMTP, кәсіпорындық кіру мәліметтерін қосу
|
||||||
|
activate = Белсендіру
|
||||||
|
confirm = Растау
|
||||||
|
enable = Іске қосу
|
||||||
|
bluetooth = Bluetooth
|
||||||
|
.status = Bluetooth баптаулары ашық болған кезде бұл жүйе { $aliases } ретінде көрінеді.
|
||||||
|
.connected = Қосылған
|
||||||
|
.connecting = Қосылуда
|
||||||
|
.disconnecting = Ажыратылуда
|
||||||
|
.connect = Қосылу
|
||||||
|
.disconnect = Ажырату
|
||||||
|
.forget = Ұмыту
|
||||||
|
.dbus-error = DBus-пен өзара әрекеттесу кезінде қате орын алды: { $why }
|
||||||
|
.disabled = Bluetooth қызметі сөндірулі
|
||||||
|
.inactive = Bluetooth қызметі белсенді емес
|
||||||
|
.unknown = Bluetooth қызметін іске қосу мүмкін болмады. BlueZ орнатылған ба?
|
||||||
|
bluetooth-paired = Бұрын қосылған құрылғылар
|
||||||
|
.connect = Қосылу
|
||||||
|
.battery = Батарея заряды { $percentage }%
|
||||||
|
bluetooth-confirm-pin = Bluetooth PIN кодын растау
|
||||||
|
.description = Келесі PIN коды { $device } құрылғысында көрсетілген кодқа сәйкес келетінін растаңыз
|
||||||
|
bluetooth-available = Жақын маңдағы құрылғылар
|
||||||
|
bluetooth-adapters = Bluetooth адаптерлері
|
||||||
|
accessibility = Арнайы мүмкіндіктер
|
||||||
|
.vision = Көру қабілеті
|
||||||
|
.on = Іске қосулы
|
||||||
|
.off = Өшірулі
|
||||||
|
.unavailable = Қолжетімсіз
|
||||||
|
.screen-reader = Экрандық диктор
|
||||||
|
.high-contrast = Жоғары контраст режимі
|
||||||
|
.invert-colors = Түстерді инверсиялау
|
||||||
|
.color-filters = Түс сүзгілері
|
||||||
|
hearing = Есту қабілеті
|
||||||
|
.mono = Стерео аудионы моно ретінде ойнату
|
||||||
|
default = Әдепкі
|
||||||
|
magnifier = Үлкейткіш
|
||||||
|
.controls =
|
||||||
|
Немесе келесі жарлықтарды қолданыңыз: { $zoom_in ->
|
||||||
|
[zero] { "" }
|
||||||
|
*[other]
|
||||||
|
{ "" }
|
||||||
|
{ $zoom_in } үлкейту үшін,
|
||||||
|
}{ $zoom_out ->
|
||||||
|
[zero] { "" }
|
||||||
|
*[other]
|
||||||
|
{ "" }
|
||||||
|
{ $zoom_out } кішірейту үшін,
|
||||||
|
}
|
||||||
|
Super + тышқанмен айналдыру
|
||||||
|
.scroll_controls = Super + айналдыру арқылы тышқан немесе тачпадпен үлкейтуді іске қосу
|
||||||
|
.show_overlay = Үлкейткіш қабатын көрсету
|
||||||
|
.increment = Масштаб қадамы
|
||||||
|
.signin = Жүйеге кіргенде үлкейткішті іске қосу
|
||||||
|
.applet = Панельдегі апплетте үлкейткішті қосу/сөндіру
|
||||||
|
.movement = Үлкейтілген көріністің жылжуы
|
||||||
|
.continuous = Курсормен бірге үздіксіз
|
||||||
|
.onedge = Курсор жиекке жеткенде
|
||||||
|
.centered = Курсорды ортада ұстау үшін
|
||||||
|
color-filter = Түс фильтрінің түрі
|
||||||
|
.unknown = Белгісіз фильтр белсенді
|
||||||
|
.greyscale = Сұр түстер шкаласы
|
||||||
|
.deuteranopia = Жасыл/Қызыл (жасыл түсті нашар қабылдау, дейтеранопия)
|
||||||
|
.protanopia = Қызыл/Жасыл (қызыл түсті нашар қабылдау, протанопия)
|
||||||
|
.tritanopia = Көк/Сары (көк түсті нашар қабылдау, тританопия)
|
||||||
|
desktop = Жұмыс үстелі
|
||||||
|
wallpaper = Тұсқағаз
|
||||||
|
.change = Суретті келесі уақыт сайын ауыстыру
|
||||||
|
.fit = Тұсқағазды сыйдыру
|
||||||
|
.folder-dialog = Тұсқағаз бумасын таңдаңыз
|
||||||
|
.image-dialog = Тұсқағаз суретін таңдаңыз
|
||||||
|
.plural = Тұсқағаздар
|
||||||
|
.same = Барлық экрандарда бірдей тұсқағаз
|
||||||
|
.slide = Слайдшоу
|
||||||
|
add-color = Түс қосу
|
||||||
|
add-image = Сурет қосу
|
||||||
|
all-displays = Барлық дисплейлер
|
||||||
|
colors = Түстер
|
||||||
|
dialog-add = Қосу
|
||||||
|
fill = Толтыру
|
||||||
|
fit-to-screen = Экранға сыйдыру
|
||||||
|
open-new-folder = Жаңа буманы ашу
|
||||||
|
recent-folders = Соңғы бумалар
|
||||||
|
x-minutes =
|
||||||
|
{ $number } { $number ->
|
||||||
|
[one] минут
|
||||||
|
*[other] минут
|
||||||
|
}
|
||||||
|
x-hours =
|
||||||
|
{ $number } { $number ->
|
||||||
|
[one] сағат
|
||||||
|
*[other] сағат
|
||||||
|
}
|
||||||
|
never = Ешқашан
|
||||||
|
appearance = Сыртқы түрі
|
||||||
|
accent-color = Акцент түсі
|
||||||
|
app-background = Терезе фоны
|
||||||
|
auto = Автоматты түрде
|
||||||
|
close = Жабу
|
||||||
|
color-picker = Түс таңдаушы
|
||||||
|
copied-to-clipboard = Алмасу буферіне көшірілді
|
||||||
|
copy-to-clipboard = Алмасу буферіне көшіру
|
||||||
|
dark = Қараңғы
|
||||||
|
export = Экспорттау
|
||||||
|
hex = Он алтылық
|
||||||
|
import = Импорттау
|
||||||
|
light = Жарық
|
||||||
|
mode-and-colors = Режим мен түстер
|
||||||
|
recent-colors = Соңғы түстер
|
||||||
|
reset-to-default = Әдепкі күйге қайтару
|
||||||
|
rgb = RGB
|
||||||
|
window-hint-accent = Белсенді терезенің тұспал түсі
|
||||||
|
window-hint-accent-toggle = Теманың акцентті түсін белсенді терезенің тұспалы ретінде қолдану
|
||||||
|
auto-switch = Жарық және қараңғы режимдер арасында автоматты түрде ауысу
|
||||||
|
.sunrise = Күн шыққанда жарық режиміне ауысады
|
||||||
|
.sunset = Күн батқанда қараңғы режиміне ауысады
|
||||||
|
.next-sunrise = Келесі күн шыққанда жарық режиміне ауысады
|
||||||
|
.next-sunset = Келесі күн батқанда қараңғы режиміне ауысады
|
||||||
|
shadows-floating = Қалқымалы терезелер
|
||||||
|
.clip = Жүйелік бұрыштарға сәйкестендіру және көлеңкелерді іске асыру
|
||||||
|
shadows-tiling = Плиткалы терезелер
|
||||||
|
.clip = Жүйелік бұрыштарға сәйкестендіру
|
||||||
|
.shadow = Көлеңкелерді іске асыру
|
||||||
|
container-background = Контейнер фоны
|
||||||
|
.desc-detail = Контейнердің фон түсі навигацияның бүйірлік панелі, бүйірлік тартпа, сұхбат терезелері және ұқсас виджеттер үшін қолданылады. Әдепкі бойынша, контейнердің фон түсі терезе фонынан автоматты түрде алынады.
|
||||||
|
.reset = Авто күйіне қайтару
|
||||||
|
.desc = Навигацияның бүйірлік панелі, бүйірлік тартпа, сұхбат терезелері және ұқсас виджеттер үшін қолданылады
|
||||||
|
control-tint = Басқару компоненттерінің реңкі
|
||||||
|
.desc = Стандартты батырмалардың фоны, іздеу өрістері, мәтін енгізу өрістері және ұқсас компоненттер үшін қолданылады
|
||||||
|
frosted = Жүйелік интерфейстегі күңгірт шыны эффектісі
|
||||||
|
.desc = Панель, док, апплеттер, іске қосқыш және қолданбалар кітапханасына фонның бұлыңғырлығын іске асырады
|
||||||
|
enable-export = Ағымдағы тақырыпты GNOME қолданбаларына іске асыру
|
||||||
|
.desc = Барлық интерфейс жиынтықтары автоматты түрде ауысуды қолдамайды. COSMIC-ке жатпайтын қолданбаларды тақырып өзгергеннен кейін қайта іске қосу қажет болуы мүмкін.
|
||||||
|
icon-theme = Таңбашалар тақырыбы
|
||||||
|
.desc = Қолданбаларға басқа таңбашалар жиынтығын іске асырады
|
||||||
|
text-tint = Интерфейс мәтінінің реңкі
|
||||||
|
.desc = Әртүрлі беттерде жеткілікті контрасты бар интерфейс мәтінінің түстерін алу үшін қолданылады
|
||||||
|
style = Стиль
|
||||||
|
.round = Дөңгелек
|
||||||
|
.slightly-round = Сәл дөңгелектелген
|
||||||
|
.square = Шаршы
|
||||||
|
interface-density = Интерфейс тығыздығы
|
||||||
|
.comfortable = Ыңғайлы
|
||||||
|
.compact = Ықшам
|
||||||
|
.spacious = Кең
|
||||||
|
window-management-appearance = Терезелерді басқару
|
||||||
|
.active-hint = Белсенді терезенің тұспал өлшемі
|
||||||
|
.gaps = Плиткалы терезелердің айналасындағы аралықтар
|
||||||
|
experimental-settings = Эксперименттік баптаулар
|
||||||
|
icons-and-toolkit = Таңбашалар мен интерфейс жиынтығының темалары
|
||||||
|
interface-font = Жүйелік қаріп
|
||||||
|
monospace-font = Ені біркелкі қаріп
|
||||||
|
shadow-and-corners = Терезе көлеңкесі мен бұрыштары
|
||||||
|
notifications = Хабарландырулар
|
||||||
|
panel = Панель
|
||||||
|
add = Қосу
|
||||||
|
add-applet = Апплет қосу
|
||||||
|
all = Барлығы
|
||||||
|
applets = Апплеттер
|
||||||
|
center-segment = Ортаңғы сегмент
|
||||||
|
place-here = Апплеттерді осында орналастырыңыз
|
||||||
|
end-segment = Соңғы сегмент
|
||||||
|
large = Үлкен
|
||||||
|
no-applets-found = Апплеттер табылмады...
|
||||||
|
panel-bottom = Төменде
|
||||||
|
panel-left = Сол жақта
|
||||||
|
panel-right = Оң жақта
|
||||||
|
panel-top = Жоғарыда
|
||||||
|
search-applets = Апплеттерді іздеу...
|
||||||
|
small = Кіші
|
||||||
|
start-segment = Бастапқы сегмент
|
||||||
|
panel-appearance = Көрініс
|
||||||
|
.match = Жұмыс үстеліне сәйкестендіру
|
||||||
|
.light = Жарық
|
||||||
|
.dark = Күңгірт
|
||||||
|
panel-behavior-and-position = Мінез-құлқы және орындары
|
||||||
|
.autohide = Панельді автоматты түрде жасыру
|
||||||
|
.dock-autohide = Докты автоматты түрде жасыру
|
||||||
|
.position = Экрандағы орны
|
||||||
|
.display = Дисплейде көрсету
|
||||||
|
panel-style = Стиль
|
||||||
|
.anchor-gap = Панель мен экран шеттерінің арасындағы аралық
|
||||||
|
.dock-anchor-gap = Док пен экран шеттерінің арасындағы аралық
|
||||||
|
.extend = Панельді экран шеттеріне дейін созу
|
||||||
|
.dock-extend = Докты экран шеттеріне дейін созу
|
||||||
|
.appearance = Көрініс
|
||||||
|
.size = Өлшемі
|
||||||
|
.background-opacity = Фон мөлдірлігі
|
||||||
|
panel-applets = Конфигурация
|
||||||
|
.dock-desc = Док апплеттерін баптау
|
||||||
|
.desc = Панель апплеттерін баптау
|
||||||
|
panel-missing = Панель конфигурациясы табылмады
|
||||||
|
.desc = Арнайы баптауды қолдану немесе бүліну салдарынан панельдің баптау файлы табылмады.
|
||||||
|
.fix = Әдепкі күйге қайтару
|
||||||
|
dock = Док
|
||||||
|
window-management = Терезелерді басқару
|
||||||
|
super-key = Super пернесінің әрекеті
|
||||||
|
.launcher = Іске қосқышты ашу
|
||||||
|
.workspaces = Жұмыс орындарын ашу
|
||||||
|
.applications = Қолданбаларды ашу
|
||||||
|
.disable = Сөндіру
|
||||||
|
edge-gravity = Қалқымалы терезелер жақын маңдағы шеттерге тартылады
|
||||||
|
window-controls = Терезе басқару элементтері
|
||||||
|
.maximize = Жазық қылу батырмасын көрсету
|
||||||
|
.minimize = Қайыру батырмасын көрсету
|
||||||
|
.active-window-hint = Белсенді терезе нұсқауын көрсету
|
||||||
|
focus-navigation = Фокус навигациясы
|
||||||
|
.focus-follows-cursor = Фокус курсорға ілеседі
|
||||||
|
.focus-follows-cursor-delay = Фокустың курсорға ілесу кідірісі (мс)
|
||||||
|
.cursor-follows-focus = Курсор фокусқа ілеседі
|
||||||
|
workspaces = Жұмыс орындары
|
||||||
|
workspaces-behavior = Жұмыс орындарының мінез-құлқы
|
||||||
|
.dynamic = Динамикалық жұмыс орындары
|
||||||
|
.dynamic-desc = Бос жұмыс орындарын автоматты түрде өшіреді.
|
||||||
|
.fixed = Жұмыс орындарының бекітілген саны
|
||||||
|
.fixed-desc = Шолу кезінде жұмыс орындарын қосу немесе өшіру.
|
||||||
|
workspaces-multi-behavior = Көпмониторлы режимнің мінез-құлқы
|
||||||
|
.span = Жұмыс орындары дисплейлерге жайылады
|
||||||
|
.separate = Дисплейлерде жеке жұмыс орындары болады
|
||||||
|
workspaces-overview-thumbnails = Жұмыс орындарына шолу нобайлары
|
||||||
|
.show-number = Жұмыс орнының нөмірін көрсету
|
||||||
|
.show-name = Жұмыс орнының атын көрсету
|
||||||
|
workspaces-orientation = Жұмыс орындарының бағыты
|
||||||
|
.vertical = Вертикалды
|
||||||
|
.horizontal = Горизонталды
|
||||||
|
hot-corner = Белсенді бұрыш
|
||||||
|
.top-left-corner = Жұмыс орындары үшін жоғарғы сол жақ белсенді бұрышты іске қосу
|
||||||
|
-requires-restart = Қайта іске қосуды талап етеді
|
||||||
|
color = Түс
|
||||||
|
.depth = Түс тереңдігі
|
||||||
|
.profile = Түс профилі
|
||||||
|
.sidebar = Түс профильдері
|
||||||
|
.temperature = Түс температурасы
|
||||||
|
display = Экрандар
|
||||||
|
.arrangement = Экрандардың орналасуы
|
||||||
|
.arrangement-desc = Экрандардың орнын ауыстыру үшін оларды сүйреңіз
|
||||||
|
.enable = Экранды іске қосу
|
||||||
|
.external = { $size } { $output } сыртқы экран
|
||||||
|
.laptop = { $size } ноутбук экраны
|
||||||
|
.options = Экран опциялары
|
||||||
|
.refresh-rate = Жаңарту жиілігі
|
||||||
|
.resolution = Ажыратымдылығы
|
||||||
|
.scale = Масштаб
|
||||||
|
.additional-scale-options = Қосымша масштабтау опциялары
|
||||||
|
mirroring = Айналау
|
||||||
|
.id = Айналау { $id }
|
||||||
|
.dont = Айналамау
|
||||||
|
.mirror = { $display } айналау
|
||||||
|
.project =
|
||||||
|
{ $display ->
|
||||||
|
[all] барлық дисплейлерге
|
||||||
|
*[other] { $display } дисплейіне
|
||||||
|
} көрсету
|
||||||
|
.project-count =
|
||||||
|
Басқа { $count } { $count ->
|
||||||
|
[1] дисплейге
|
||||||
|
*[other] дисплейлерге
|
||||||
|
} көрсетуде
|
||||||
|
night-light = Түнгі жарық
|
||||||
|
.auto = Автоматты (күн батқаннан күн шыққанға дейін)
|
||||||
|
.desc = Жылырақ түстер арқылы көк жарықты азайту
|
||||||
|
orientation = Бағыты
|
||||||
|
.standard = Стандартты
|
||||||
|
.rotate-90 = 90° бұру
|
||||||
|
.rotate-180 = 180° бұру
|
||||||
|
.rotate-270 = 270° бұру
|
||||||
|
vrr = Өзгермелі жаңарту жиілігі
|
||||||
|
.enabled = Іске қосылған
|
||||||
|
.force = Әрқашан
|
||||||
|
.auto = Автоматты
|
||||||
|
.disabled = Сөндірілген
|
||||||
|
scheduling = Кесте
|
||||||
|
.manual = Қолмен орнатылған кесте
|
||||||
|
dialog = Сұхбат терезесі
|
||||||
|
.title = Дисплейдің осы баптауларын сақтау керек пе?
|
||||||
|
.keep-changes = Өзгерістерді сақтау
|
||||||
|
.change-prompt = Баптаулардағы өзгерістер { $time } секундтан кейін автоматты түрде кері қайтарылады.
|
||||||
|
.revert-settings = Баптауларды кері қайтару
|
||||||
|
sound = Дыбыс
|
||||||
|
sound-output = Шығыс
|
||||||
|
.volume = Шығыс дыбыс деңгейі
|
||||||
|
.device = Шығыс құрылғысы
|
||||||
|
.level = Шығыс деңгейі
|
||||||
|
.config = Конфигурация
|
||||||
|
.balance = Баланс
|
||||||
|
.left = Сол жақ
|
||||||
|
.right = Оң жақ
|
||||||
|
sound-input = Кіріс
|
||||||
|
.volume = Кіріс дыбыс деңгейі
|
||||||
|
.device = Кіріс құрылғысы
|
||||||
|
.level = Кіріс деңгейі
|
||||||
|
amplification = Күшейту
|
||||||
|
.desc = Дыбыс деңгейін 150%-ға дейін көтеруге мүмкіндік береді
|
||||||
|
sound-alerts = Ескертулер
|
||||||
|
.volume = Ескертулердің дыбыс деңгейі
|
||||||
|
.sound = Ескертулер дыбысы
|
||||||
|
sound-applications = Қолданбалар
|
||||||
|
.desc = Қолданбалардың дыбыс деңгейі мен баптаулары
|
||||||
|
sound-device-port-unplugged = Ажыратылған
|
||||||
|
sound-hd-audio = HD аудио
|
||||||
|
sound-usb-audio = USB аудио
|
||||||
|
sound-device-profiles = Құрылғы профильдері
|
||||||
|
power = Қуат және батарея
|
||||||
|
battery = Батарея
|
||||||
|
.minute =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] минут
|
||||||
|
*[other] минут
|
||||||
|
}
|
||||||
|
.hour =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] сағат
|
||||||
|
*[other] сағат
|
||||||
|
}
|
||||||
|
.day =
|
||||||
|
{ $value } { $value ->
|
||||||
|
[one] күн
|
||||||
|
*[other] күн
|
||||||
|
}
|
||||||
|
.less-than-minute = Бір минуттан аз
|
||||||
|
.and = және
|
||||||
|
.remaining-time =
|
||||||
|
{ $time } { $action ->
|
||||||
|
[full] толық толғанға
|
||||||
|
*[other] таусылғанға
|
||||||
|
} дейін
|
||||||
|
connected-devices = Қосылған құрылғылар
|
||||||
|
.unknown = Белгісіз құрылғы
|
||||||
|
power-mode = Қуат режимі
|
||||||
|
.battery = Батареяның жұмыс уақытын ұзарту
|
||||||
|
.battery-desc = Қуат тұтынуды азайту және дыбыссыз жұмыс істеу
|
||||||
|
.balanced = Теңгерілген
|
||||||
|
.balanced-desc = Тыныш жұмыс және қалыпты қуат тұтыну
|
||||||
|
.performance = Жоғары өнімділік
|
||||||
|
.performance-desc = Ең жоғары өнімділік пен қуат тұтыну
|
||||||
|
.no-backend = Бэкенд табылмады. system76-power немесе power-profiles-daemon бағдарламасын орнатыңыз.
|
||||||
|
power-saving = Қуатты үнемдеу опциялары
|
||||||
|
.turn-off-screen-after = Экранды келесі уақыттан кейін сөндіру
|
||||||
|
.auto-suspend = Автоматты түрде күту режиміне өту
|
||||||
|
.auto-suspend-ac = Желіге қосулы кезде автоматты түрде күту режиміне өту
|
||||||
|
.auto-suspend-battery = Батареядан жұмыс істегенде автоматты түрде күту режиміне өту
|
||||||
|
acceleration-desc = Жылдамдыққа байланысты бақылау сезімталдығын автоматты түрде реттейді
|
||||||
|
disable-while-typing = Теру кезінде сөндіру
|
||||||
|
input-devices = Енгізу құрылғылары
|
||||||
|
primary-button = Негізгі батырма
|
||||||
|
.desc = Физикалық батырмалардың ретін орнатады
|
||||||
|
.left = Сол жақ
|
||||||
|
.right = Оң жақ
|
||||||
|
scrolling = Айналдыру
|
||||||
|
.two-finger = Екі саусақпен айналдыру
|
||||||
|
.edge = Бір саусақпен жиек бойымен айналдыру
|
||||||
|
.speed = Айналдыру жылдамдығы
|
||||||
|
.natural = Табиғи айналдыру
|
||||||
|
.natural-desc = Көріністің орнына мазмұнды айналдыру
|
||||||
|
slow = Баяу
|
||||||
|
fast = Жылдам
|
||||||
|
short = Қысқа
|
||||||
|
long = Ұзақ
|
||||||
|
keyboard = Пернетақта
|
||||||
|
keyboard-sources = Енгізу көздері
|
||||||
|
.desc = Енгізу көздерін Super+Space пернелер жарлығы арқылы ауыстыруға болады. Бұл баптауды пернетақта жарлықтарының баптауларында өзгертуге болады.
|
||||||
|
.move-up = Жоғары жылжыту
|
||||||
|
.move-down = Төмен жылжыту
|
||||||
|
.settings = Баптаулар
|
||||||
|
.view-layout = Пернетақта жаймасын қарау
|
||||||
|
.remove = Өшіру
|
||||||
|
.add = Енгізу көзін қосу
|
||||||
|
keyboard-special-char = Арнайы таңбаларды енгізу
|
||||||
|
.alternate = Балама таңбалар пернесі
|
||||||
|
.compose = Compose пернесі
|
||||||
|
.compose-desc = Compose пернесі таңбалардың алуан түрін енгізуге мүмкіндік береді. Оны пайдалану үшін, compose пернесін, содан кейін таңбалар тізбегін басыңыз. Мысалы, compose пернесінен кейін C және o басылса, © таңбасы енгізіледі, ал compose пернесінен кейін a және ‘ басылса, á таңбасы енгізіледі.
|
||||||
|
.caps = Caps Lock пернесі
|
||||||
|
keyboard-typing-assist = Теру
|
||||||
|
.repeat-rate = Қайталау жиілігі
|
||||||
|
.repeat-delay = Қайталау кідірісі
|
||||||
|
keyboard-numlock-boot = Numlock
|
||||||
|
.boot-state = Жүктелген кездегі күйі
|
||||||
|
.last-boot = Соңғы жүктелу
|
||||||
|
.on = Қосулы
|
||||||
|
.off = Сөндірулі
|
||||||
|
.set = Numlock-тың жүктелу кезіндегі күйін орнату
|
||||||
|
added = Қосылды
|
||||||
|
type-to-search = Іздеу үшін теріңіз...
|
||||||
|
show-extended-input-sources = Кеңейтілген енгізу көздерін көрсету
|
||||||
|
keyboard-shortcuts = Пернетақта жарлықтары
|
||||||
|
.desc = Жарлықтарды көру және теңшеу
|
||||||
|
add-another-keybinding = Басқа пернелер жарлығын қосу
|
||||||
|
cancel = Бас тарту
|
||||||
|
command = Команда
|
||||||
|
custom = Таңдауыңызша
|
||||||
|
debug = Жөндеу
|
||||||
|
disabled = Сөндірулі
|
||||||
|
input-source-switch = Пернетақта тілін енгізу көзін ауыстыру
|
||||||
|
migrate-workspace-prev = Жұмыс орнын алдыңғы шығысқа көшіру
|
||||||
|
migrate-workspace-next = Жұмыс орнын келесі шығысқа көшіру
|
||||||
|
migrate-workspace =
|
||||||
|
Жұмыс орнын шығысқа көшіру: { $direction ->
|
||||||
|
*[down] төмен
|
||||||
|
[left] солға
|
||||||
|
[right] оңға
|
||||||
|
[up] жоғары
|
||||||
|
}
|
||||||
|
navigate = Навигация
|
||||||
|
replace = Алмастыру
|
||||||
|
shortcut-name = Жарлық атауы
|
||||||
|
system-controls = Жүйені басқару элементтері
|
||||||
|
terminate = Аяқтау
|
||||||
|
toggle-stacking = Терезелерді жинақтауды ауыстыру
|
||||||
|
type-key-combination = Пернелер жарлығын теріңіз
|
||||||
|
custom-shortcuts = Арнайы жарлықтар
|
||||||
|
.add = Жарлық қосу
|
||||||
|
.context = Арнайы жарлық қосу
|
||||||
|
.none = Арнайы жарлықтар жоқ
|
||||||
|
modified = { $count } өзгертілді
|
||||||
|
nav-shortcuts = Навигация
|
||||||
|
.prev-output = Алдыңғы шығысқа фокустау
|
||||||
|
.next-output = Келесі шығысқа фокустау
|
||||||
|
.last-workspace = Соңғы жұмыс орнына фокустау
|
||||||
|
.prev-workspace = Алдыңғы жұмыс орнына фокустау
|
||||||
|
.next-workspace = Келесі жұмыс орнына фокустау
|
||||||
|
.focus =
|
||||||
|
Терезеге фокустау: { $direction ->
|
||||||
|
*[down] төменгі
|
||||||
|
[in] ішкі
|
||||||
|
[left] сол жақтағы
|
||||||
|
[out] сыртқы
|
||||||
|
[right] оң жақтағы
|
||||||
|
[up] жоғарыдағы
|
||||||
|
}
|
||||||
|
.output =
|
||||||
|
Шығысқа ауысу: { $direction ->
|
||||||
|
*[down] төменгі
|
||||||
|
[left] сол жақтағы
|
||||||
|
[right] оң жақтағы
|
||||||
|
[up] жоғарғы
|
||||||
|
}
|
||||||
|
.workspace = Жұмыс орнына ауысу: { $num }
|
||||||
|
manage-windows = Терезелерді басқару
|
||||||
|
.close = Терезені жабу
|
||||||
|
.maximize = Терезені жаймалау
|
||||||
|
.fullscreen = Терезені толық экранға шығару
|
||||||
|
.minimize = Терезені жию
|
||||||
|
.resize-inwards = Терезе өлшемін ішке қарай өзгерту
|
||||||
|
.resize-outwards = Терезе өлшемін сыртқа қарай өзгерту
|
||||||
|
.toggle-sticky = Жабысқақ терезе режимін ауыстыру
|
||||||
|
move-windows = Терезелерді жылжыту
|
||||||
|
.direction =
|
||||||
|
Терезені { $direction ->
|
||||||
|
*[down] төмен
|
||||||
|
[left] солға
|
||||||
|
[right] оңға
|
||||||
|
[up] жоғары
|
||||||
|
} жылжыту
|
||||||
|
.display =
|
||||||
|
Терезені бір мониторға { $direction ->
|
||||||
|
*[down] төмен
|
||||||
|
[left] солға
|
||||||
|
[right] оңға
|
||||||
|
[up] жоғары
|
||||||
|
} жылжыту
|
||||||
|
.workspace =
|
||||||
|
Терезені бір жұмыс орнына { $direction ->
|
||||||
|
*[below] төмен
|
||||||
|
[left] солға
|
||||||
|
[right] оңға
|
||||||
|
[above] жоғары
|
||||||
|
} жылжыту
|
||||||
|
.workspace-num = Терезені { $num } жұмыс орнына жылжыту
|
||||||
|
.prev-workspace = Терезені алдыңғы жұмыс орнына жылжыту
|
||||||
|
.next-workspace = Терезені келесі жұмыс орнына жылжыту
|
||||||
|
.last-workspace = Терезені соңғы жұмыс орнына жылжыту
|
||||||
|
.next-display = Терезені келесі экранға жылжыту
|
||||||
|
.prev-display = Терезені алдыңғы экранға жылжыту
|
||||||
|
.send-to-prev-workspace = Терезені алдыңғы жұмыс орнына жіберу
|
||||||
|
.send-to-next-workspace = Терезені келесі жұмыс орнына жіберу
|
||||||
|
system-shortcut = Жүйе
|
||||||
|
.app-library = Қолданбалар кітапханасын ашу
|
||||||
|
.brightness-down = Экран жарықтығын азайту
|
||||||
|
.brightness-up = Экран жарықтығын арттыру
|
||||||
|
.display-toggle = Ішкі экранды ауыстырып қосу
|
||||||
|
.home-folder = Үй бумасын ашу
|
||||||
|
.keyboard-brightness-down = Пернетақта жарықтығын азайту
|
||||||
|
.keyboard-brightness-up = Пернетақта жарықтығын арттыру
|
||||||
|
.launcher = Launcher-ді ашу
|
||||||
|
.log-out = Шығу
|
||||||
|
.lock-screen = Экранды бұғаттау
|
||||||
|
.mute = Дыбысты өшіру
|
||||||
|
.mute-mic = Микрофон дыбысын өшіру
|
||||||
|
.play-pause = Ойнату/кідірту
|
||||||
|
.play-next = Келесі трек
|
||||||
|
.play-prev = Алдыңғы трек
|
||||||
|
.poweroff = Қуатты өшіру
|
||||||
|
.screenshot = Скриншот түсіру
|
||||||
|
.suspend = Күту режимі
|
||||||
|
.terminal = Терминалды ашу
|
||||||
|
.touchpad-toggle = Тачпадты ауыстырып қосу
|
||||||
|
.volume-lower = Дыбыс деңгейін азайту
|
||||||
|
.volume-raise = Дыбыс деңгейін арттыру
|
||||||
|
.web-browser = Веб-браузерді ашу
|
||||||
|
.window-switcher = Ашық терезелер арасында ауысу
|
||||||
|
.window-switcher-previous = Ашық терезелер арасында кері ретпен ауысу
|
||||||
|
.workspace-overview = Жұмыс орындары шолуын ашу
|
||||||
|
window-tiling = Терезелерді қатар орналастыру
|
||||||
|
.horizontal = Горизонталды бағытты орнату
|
||||||
|
.vertical = Вертикалды бағытты орнату
|
||||||
|
.swap-window = Терезелердің орнын ауыстыру
|
||||||
|
.toggle-tiling = Терезелерді қатар орналастыруды ауыстырып қосу
|
||||||
|
.toggle-stacking = Терезелерді жинақтауды ауыстырып қосу
|
||||||
|
.toggle-floating = Терезелердің еркін қозғалуын ауыстырып қосу
|
||||||
|
.toggle-orientation = Бағытты ауыстырып қосу
|
||||||
|
replace-shortcut-dialog = Жарлықты алмастыру керек пе?
|
||||||
|
.desc = { $shortcut } жарлығын { $name } қолдануда. Оны алмастырсаңыз, { $name } сөндіріледі.
|
||||||
|
zoom-in = Үлкейту
|
||||||
|
zoom-out = Кішірейту
|
||||||
|
mouse = Тышқан
|
||||||
|
.speed = Тышқан жылдамдығы
|
||||||
|
.acceleration = Тышқан үдеуін іске қосу
|
||||||
|
click-behavior = Шерту әрекеті
|
||||||
|
.click-finger = Екі саусақпен қосымша шерту және үш саусақпен ортаңғы шерту
|
||||||
|
.button-areas = Төменгі оң жақ бұрышта қосымша шерту және төменгі ортада ортаңғы шерту
|
||||||
|
pinch-to-zoom = Үлкейту үшін жақындату
|
||||||
|
.desc = Мазмұнды үлкейту үшін екі саусақты қолданыңыз (үлкейтуді қолдайтын қолданбалар үшін)
|
||||||
|
tap-to-click = Шерту үшін тигізу
|
||||||
|
.desc = Негізгі шерту үшін бір саусақпен, қосымша шерту үшін екі саусақпен және ортаңғы шерту үшін үш саусақпен тигізуді іске қосады
|
||||||
|
touchpad = Тачпад
|
||||||
|
.acceleration = Тачпад үдеуін іске қосу
|
||||||
|
.speed = Тачпад жылдамдығы
|
||||||
|
gestures = Қимылдар
|
||||||
|
.four-finger-down = Төрт саусақпен төмен қарай сырғыту
|
||||||
|
.four-finger-left = Төрт саусақпен солға қарай сырғыту
|
||||||
|
.four-finger-right = Төрт саусақпен оңға қарай сырғыту
|
||||||
|
.four-finger-up = Төрт саусақпен жоғары қарай сырғыту
|
||||||
|
.three-finger-any = Үш саусақпен кез келген бағытқа сырғыту
|
||||||
|
switch-workspaces = Жұмыс орындарын ауыстыру
|
||||||
|
.horizontal = Төрт саусақпен солға/оңға сырғыту
|
||||||
|
.vertical = Төрт саусақпен жоғары/төмен сырғыту
|
||||||
|
switch-between-windows = Терезелер арасында ауысу
|
||||||
|
open-application-library = Қолданбалар кітапханасын ашу
|
||||||
|
open-workspaces-view = Жұмыс орындары шолуын ашу
|
||||||
|
time = Уақыт және тіл
|
||||||
|
time-date = Күн және уақыт
|
||||||
|
.auto = Автоматты түрде орнату
|
||||||
|
.auto-ntp = Уақыт белдеуі орнатылған кезде күн және уақыт автоматты түрде жаңартылады
|
||||||
|
time-zone = Уақыт белдеуі
|
||||||
|
.auto = Автоматты уақыт белдеуі
|
||||||
|
.auto-info = Орналасқан жер қызметтері мен интернетке қол жеткізуді қажет етеді
|
||||||
|
time-format = Күн және уақыт пішімі
|
||||||
|
.twenty-four = 24 сағаттық уақыт
|
||||||
|
.show-seconds = Секундтарды көрсету
|
||||||
|
.first = Аптаның бірінші күні
|
||||||
|
.show-date = Уақыт апплетінде күнді көрсету
|
||||||
|
.friday = Жұма
|
||||||
|
.saturday = Сенбі
|
||||||
|
.sunday = Жексенбі
|
||||||
|
.monday = Дүйсенбі
|
||||||
|
time-region = Аймақ және тіл
|
||||||
|
formatting = Пішімдеу
|
||||||
|
.dates = Күндер
|
||||||
|
.time = Уақыт
|
||||||
|
.date-and-time = Күн және уақыт
|
||||||
|
.numbers = Сандар
|
||||||
|
.measurement = Өлшем бірліктері
|
||||||
|
.paper = Қағаз
|
||||||
|
preferred-languages = Таңдаулы тілдер
|
||||||
|
.desc = Тілдердің реті пайдаланушы интерфейсі үшін қай тіл қолданылатынын анықтайды. Өзгерістер келесі рет жүйеге кіргенде іске асады.
|
||||||
|
add-language = Тілді қосу
|
||||||
|
.context = Тілді қосу
|
||||||
|
install-additional-languages = Қосымша тілдерді орнату
|
||||||
|
region = Аймақ
|
||||||
|
applications = Қолданбалар
|
||||||
|
default-apps = Әдепкі қолданбалар
|
||||||
|
.web-browser = Веб-браузер
|
||||||
|
.file-manager = Файлдар менеджері
|
||||||
|
.mail-client = Пошта клиенті
|
||||||
|
.music = Музыка
|
||||||
|
.video = Видео
|
||||||
|
.photos = Фотосуреттер
|
||||||
|
.calendar = Күнтізбе
|
||||||
|
.terminal = Терминал
|
||||||
|
.other-associations = Басқа қауымдастықтар
|
||||||
|
.text-editor = Мәтіндік редактор
|
||||||
|
.not-installed = Орнатылмаған
|
||||||
|
startup-apps = Автоқосылатын қолданбалар
|
||||||
|
.add = Қолданбаны қосу
|
||||||
|
.user = Жүйеге кіргенде іске қосылатын қолданбалар
|
||||||
|
.none = Ешқандай автоқосылатын қолданба қосылмаған
|
||||||
|
.remove-dialog-title = { $name } өшіру керек пе?
|
||||||
|
.remove-dialog-description = Бұл автоқосылатын қолданбаны өшіру керек пе?
|
||||||
|
.add-startup-app = Автоқосылатын қолданбаны қосу
|
||||||
|
legacy-applications = X11 қолданбаларының үйлесімділігі
|
||||||
|
legacy-app-global-shortcuts = X11 қолданбаларындағы глобалды жарлықтар
|
||||||
|
.desc = Глобалды жарлықтар қолданбаларда орындалатын перне басу және тышқан батырмасы оқиғаларын «сөйлеу үшін басу» немесе «дыбысты өшіру үшін басу» сияқты функциялар үшін басқа қолданбалардың тануына мүмкіндік береді. Әдепкі бойынша, басқа қолданбалар құпия ақпараты бар пернетақта мен тышқан оқиғаларын бақылай алмауы үшін X11 қолданбаларында глобалды жарлықтар сөндірілген.
|
||||||
|
.none = Пернелер жоқ
|
||||||
|
.modifiers = Түрлендіргіштер (Super, Shift, Control, Alt)
|
||||||
|
.combination = Super, Control немесе Alt түрлендіргіштері басылып тұрғандағы барлық пернелер
|
||||||
|
.all = Барлық пернелер
|
||||||
|
.mouse = X11 қолданбаларындағы тышқан батырмасының оқиғалары
|
||||||
|
legacy-app-scaling = X11 терезелер жүйесі қолданбаларының масштабталуы
|
||||||
|
.scaled-gaming = Ойындар мен толық экранды қолданбалар үшін оңтайландыру
|
||||||
|
.gaming-description = X11 қолданбалары Wayland қолданбаларымен салыстырғанда сәл үлкенірек/кішірек көрінуі мүмкін
|
||||||
|
.scaled-applications = Қолданбалар үшін оңтайландыру
|
||||||
|
.applications-description = Ойындар мен толық экранды X11 қолданбалары экран ажыратымдылығына сәйкес келмеуі мүмкін
|
||||||
|
.scaled-compatibility = Максималды үйлесімділік режимі
|
||||||
|
.compatibility-description = X11 қолданбалары HiDPI экрандарында бұлдыр болып көрінуі мүмкін
|
||||||
|
.preferred-display = Ойындар мен толық экранды X11 қолданбалары үшін таңдаулы экран
|
||||||
|
.no-display = Жоқ
|
||||||
|
system = Жүйе және тіркелгілер
|
||||||
|
about = Осы туралы
|
||||||
|
about-device = Құрылғы атауы
|
||||||
|
.desc = Бұл атау басқа желілік немесе Bluetooth құрылғыларына көрінеді
|
||||||
|
about-hardware = Аппараттық қамтама
|
||||||
|
.model = Аппараттық модель
|
||||||
|
.memory = Жад
|
||||||
|
.processor = Процессор
|
||||||
|
.graphics = Графика
|
||||||
|
.disk-capacity = Диск сыйымдылығы
|
||||||
|
about-os = Операциялық жүйе
|
||||||
|
.os = Операциялық жүйе
|
||||||
|
.os-architecture = Операциялық жүйе архитектурасы
|
||||||
|
.kernel = Ядро нұсқасы
|
||||||
|
.desktop-environment = Жұмыс үстелі ортасы
|
||||||
|
.windowing-system = Терезелер жүйесі
|
||||||
|
about-related = Қатысты параметрлер
|
||||||
|
.support = Қолдау алу
|
||||||
|
firmware = Микробағдарлама
|
||||||
|
users = Пайдаланушылар
|
||||||
|
.admin = Әкімші
|
||||||
|
.standard = Стандартты
|
||||||
|
.profile-add = Профиль суретін таңдау
|
||||||
|
administrator = Әкімші
|
||||||
|
.desc = Әкімшілер барлық пайдаланушылар үшін параметрлерді өзгерте алады, басқа пайдаланушыларды қоса алады және өшіре алады
|
||||||
|
add-user = Пайдаланушыны қосу
|
||||||
|
change-password = Парольді өзгерту
|
||||||
|
remove-user = Пайдаланушыны өшіру
|
||||||
|
full-name = Толық аты-жөні
|
||||||
|
invalid-username = Пайдаланушы аты жарамсыз
|
||||||
|
password-mismatch = Пароль мен оны растау сәйкес келуі керек
|
||||||
|
save = Сақтау
|
||||||
|
workspaces-overview = Жұмыс орындарын шолу
|
||||||
|
.action-on-typing = Терк кезіндегі әрекет
|
||||||
|
.none = Ешнәрсе
|
||||||
|
.launcher = Жөнелткішті ашу
|
||||||
|
.applications = Қолданбаларды ашу
|
||||||
|
xdg-entry-touchpad = Тачпад
|
||||||
|
xdg-entry-wired = Сымды
|
||||||
|
xdg-entry-startup-apps-comment = Жүйеге кіргенде іске қосылатын қолданбаларды баптау
|
||||||
|
xdg-entry-region-language = Аймақ және тіл
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;Тышқан;Үдеу;Айналдыру;
|
||||||
|
xdg-entry-bluetooth-comment = Bluetooth құрылғыларын басқару
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;Хабарландыру;Құлыптау;
|
||||||
|
xdg-entry-startup-apps-keywords = COSMIC;Автоқосылу;Қолданба;
|
||||||
|
xdg-entry-default-apps-comment = Әдепкі веб-браузер, пошта клиенті, файлдық браузер және басқа да қолданбалар
|
||||||
|
xdg-entry-keyboard-comment = Енгізу көздері, ауыстыру, арнайы таңбаларды енгізу, жарлықтар
|
||||||
|
xdg-entry-wired-keywords = COSMIC;Сымды;LAN;Желі;Қосылым;
|
||||||
|
xdg-entry-power = Қуат және батарея
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;Акцент;Түс;Таңбаша;Қаріп;Тема
|
||||||
|
xdg-entry-mouse = Тышқан
|
||||||
|
xdg-entry-dock-keywords = COSMIC;Док;Панель;Апплет
|
||||||
|
xdg-entry-mouse-comment = Тышқан жылдамдығы, үдеуі және табиғи айналдыру
|
||||||
|
xdg-entry-system = Жүйе және тіркелгілер
|
||||||
|
xdg-entry-panel-keywords = COSMIC;Панель;Апплет
|
||||||
|
xdg-entry-window-management = Терезелерді басқару
|
||||||
|
xdg-entry-a11y = Арнайы мүмкіндіктер
|
||||||
|
xdg-entry-time-language-comment = Жүйелік күн, уақыт, аймақ және тілді басқару
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;Жұмыс үстелі;
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;Қолданба;Ойын;Үйлесімділік;
|
||||||
|
xdg-entry-displays-comment = Экран конфигурациясының баптауларын басқару
|
||||||
|
xdg-entry-touchpad-keywords = COSMIC;Тачпад;Қимыл;
|
||||||
|
xdg-entry-time-language = Уақыт және тіл
|
||||||
|
xdg-entry-users = Пайдаланушылар
|
||||||
|
xdg-entry-system-keywords = COSMIC;Жүйе;Ақпарат;Тіркелгілер;Микробағдарлама;
|
||||||
|
xdg-entry-default-apps = Әдепкі қолданбалар
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;Желі;Қосылым;
|
||||||
|
xdg-entry-applications-comment = Әдепкі қолданбалар, автоқосылатын қолданбалар және X11 қолданбаларының үйлесімділік баптаулары
|
||||||
|
xdg-entry-about-keywords = COSMIC;Осы туралы
|
||||||
|
xdg-entry-panel = Панель
|
||||||
|
xdg-entry-notifications = Хабарландырулар
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;Арнайы мүмкіндіктер;A11y;Экран;Диктор;Лупа;Контраст;Түс;
|
||||||
|
xdg-entry-wireless-comment = Wi-Fi қосылымдары және қосылымдар профильдері
|
||||||
|
xdg-entry-desktop = Жұмыс үстелі
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;Уақыт;Белдеу;
|
||||||
|
xdg-entry-desktop-comment = Тұсқағаз, сыртқы түрі, панель, док, терезелерді басқару және жұмыс орындарының баптаулары
|
||||||
|
xdg-entry-wallpaper = Тұсқағаз
|
||||||
|
xdg-entry-keyboard = Пернетақта
|
||||||
|
xdg-entry-a11y-comment = Экрандық диктор, лупа, жоғары контраст және түс сүзгілері
|
||||||
|
xdg-entry-displays = Экрандар
|
||||||
|
xdg-entry-network = Желі және сымсыз байланыс
|
||||||
|
xdg-entry-date-time = Күн және уақыт
|
||||||
|
xdg-entry-users-comment = Аутентификация және пайдаланушы тіркелгілері
|
||||||
|
xdg-entry-input-comment = Пернетақта мен тышқан баптаулары
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
|
||||||
|
xdg-entry-dock-comment = Қолданбалар мен апплеттерге арналған қосымша панель
|
||||||
|
xdg-entry-network-keywords = COSMIC;Желі;Сымсыз;WiFi;VPN;
|
||||||
|
xdg-entry-wallpaper-comment = Тұсқағаз суреттері, түстері және слайдшоу опциялары
|
||||||
|
xdg-entry-dock = Док
|
||||||
|
xdg-entry-startup-apps = Автоқосылатын қолданбалар
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;Жұмыс орны;Бағдар;Шолу;Монитор;
|
||||||
|
xdg-entry-system-comment = Жүйе туралы ақпарат, тіркелгілер және микробағдарлама жаңартулары
|
||||||
|
xdg-entry-x11-applications-comment = X11 терезе жүйесінің қолданбаларын масштабтау, негізгі экран және глобалды жарлықтар
|
||||||
|
xdg-entry-region-language-comment = Күндерді, уақытты және сандарды аймағыңызға сәйкес пішімдеу
|
||||||
|
xdg-entry-wallpaper-keywords = COSMIC;Тұсқағаз;Фон;Слайдшоу;
|
||||||
|
xdg-entry-users-keywords = COSMIC;Пайдаланушы;Тіркелгі;
|
||||||
|
xdg-entry-about-comment = Құрылғы аты, жабдық туралы ақпарат, операциялық жүйенің әдепкі параметрлері
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;Желі;Байланыс;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-appearance-comment = Акцентті түстер және темалар
|
||||||
|
xdg-entry-time-language-keywords = COSMIC;Жүйе;Уақыт;Күн;Аймақ;Тіл;
|
||||||
|
xdg-entry-input-keywords = COSMIC;Енгізу;Пернетақта;Тышқан;Тышқандар;
|
||||||
|
xdg-entry-comment = COSMIC жұмыс үстеліне арналған баптаулар қолданбасы
|
||||||
|
xdg-entry-notifications-comment = "Мазаламаңыз" режимі, экранды құлыптау хабарландырулары және әр қолданбаға арналған баптаулар
|
||||||
|
xdg-entry-applications = Қолданбалар
|
||||||
|
xdg-entry-sound-keywords = COSMIC;Дыбыс;Аудио;Ескерту;Pipewire;
|
||||||
|
xdg-entry-power-keywords = COSMIC;Қуат;Батарея
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;Әдепкі;Қолданба
|
||||||
|
xdg-entry-keywords = COSMIC;Баптаулар;
|
||||||
|
xdg-entry-region-language-keywords = COSMIC;Аймақ;Тіл;Күн;Пішім;Уақыт;Локаль;Локализация;
|
||||||
|
xdg-entry-about = Осы туралы
|
||||||
|
xdg-entry-input = Енгізу құрылғылары
|
||||||
|
xdg-entry-applications-keywords = COSMIC;Әдепкі;Қолданба;Автоқосылу;X11;Үйлесімділік
|
||||||
|
xdg-entry-sound-comment = Құрылғылар, ескертулер және қолданбаларға арналған аудио баптаулары
|
||||||
|
xdg-entry-touchpad-comment = Тачпад жылдамдығы, шерту опциялары және қимылдар
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;Пернетақта;Енгізу;Көз;Жарлықтар;
|
||||||
|
xdg-entry-vpn-comment = VPN байланыстары және байланыс профильдері
|
||||||
|
xdg-entry-appearance = Сыртқы түрі
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;Терезе;Басқару;Қатар қою;Super;Перне;
|
||||||
|
xdg-entry-workspaces-comment = Жұмыс орнының бағдары, шолу және бірнеше монитордағы әрекеті
|
||||||
|
xdg-entry-network-comment = Желілік байланыстарды басқару
|
||||||
|
xdg-entry-panel-comment = Мәзірлер мен апплеттерге арналған негізгі жүйелік панель
|
||||||
|
xdg-entry-sound = Дыбыс
|
||||||
|
xdg-entry-power-comment = Қуат режимдері мен қуатты үнемдеу опциялары
|
||||||
|
xdg-entry-displays-keywords = COSMIC;Экран;
|
||||||
|
xdg-entry-workspaces = Жұмыс орындары
|
||||||
|
xdg-entry-date-time-comment = Уақыт белдеуі, сағатты автоматты баптау және уақыт пішімі
|
||||||
|
xdg-entry-x11-applications = X11 қолданбаларының үйлесімділігі
|
||||||
|
xdg-entry-window-management-comment = Super пернесінің әрекеті, терезелерді басқару опциялары және терезелерді қатар қоюдың қосымша опциялары
|
||||||
|
xdg-entry-wired-comment = Сымды қосылымдар және қосылымдар профильдері
|
||||||
|
no-search-results = Сіздің іздеуіңізге ешбір желі сәйкес келмейді.
|
||||||
7
i18n/kn/cosmic_settings.ftl
vendored
7
i18n/kn/cosmic_settings.ftl
vendored
|
|
@ -6,13 +6,6 @@ number = { $number }
|
||||||
|
|
||||||
## Network & Wireless
|
## Network & Wireless
|
||||||
|
|
||||||
connections-and-profiles =
|
|
||||||
{ $variant ->
|
|
||||||
[wired] ತಂತಿ
|
|
||||||
[wifi] ವೈ-ಫೈ
|
|
||||||
[vpn] ವಿ.ಪಿ.ಎನ್
|
|
||||||
*[other] ಅಜ್ಞಾತ
|
|
||||||
} ಸಂಪರ್ಕಗಳು ಮತ್ತು ಸಂಪರ್ಕ ಪ್ರೊಫೈಲ್ಗಳು.
|
|
||||||
add-network = ನೆಟ್ವರ್ಕ್ ಸೇರಿಸಿ
|
add-network = ನೆಟ್ವರ್ಕ್ ಸೇರಿಸಿ
|
||||||
.profile = ಪ್ರೊಫೈಲ್ ಸೇರಿಸಿ
|
.profile = ಪ್ರೊಫೈಲ್ ಸೇರಿಸಿ
|
||||||
add-vpn = ವಿ.ಪಿ.ಎನ್ ಸೇರಿಸಿ
|
add-vpn = ವಿ.ಪಿ.ಎನ್ ಸೇರಿಸಿ
|
||||||
|
|
|
||||||
766
i18n/ko/cosmic_settings.ftl
vendored
766
i18n/ko/cosmic_settings.ftl
vendored
|
|
@ -0,0 +1,766 @@
|
||||||
|
app = COSMIC 설정
|
||||||
|
desktop = 데스크톱
|
||||||
|
dbus-connection-error = DBus 연결에 실패했습니다
|
||||||
|
time-region = 지역 & 언어
|
||||||
|
panel-left = 좌측
|
||||||
|
connect = 연결
|
||||||
|
super-key = Super 키 동작
|
||||||
|
.launcher = 런처 열기
|
||||||
|
.workspaces = 작업 공간 열기
|
||||||
|
.applications = 앱 열기
|
||||||
|
.disable = 비활성화
|
||||||
|
x-minutes = { $number }분
|
||||||
|
vrr = 가변 주사율
|
||||||
|
.enabled = 활성화
|
||||||
|
.force = 항상
|
||||||
|
.auto = 자동
|
||||||
|
.disabled = 비활성화
|
||||||
|
window-hint-accent = 활성 창 강조 색상
|
||||||
|
power = 전원 & 배터리
|
||||||
|
fit-to-screen = 화면 채우기
|
||||||
|
control-tint = 컨트롤 컴포넌트 색조
|
||||||
|
.desc = 표준 버튼, 검색 입력란, 텍스트 입력란 및 유사한 컴포넌트의 배경에 사용됩니다
|
||||||
|
time-date = 날짜 및 시간
|
||||||
|
.auto = 자동으로 설정
|
||||||
|
.auto-ntp = 시간대가 설정되면 날짜 및 시간이 자동으로 업데이트됩니다
|
||||||
|
save = 저장
|
||||||
|
toggle-stacking = 창 스태킹 전환
|
||||||
|
panel-top = 상단
|
||||||
|
no-applets-found = 애플릿을 찾을 수 없음...
|
||||||
|
region = 지역
|
||||||
|
zoom-in = 확대
|
||||||
|
place-here = 여기에 애플릿 배치
|
||||||
|
-requires-restart = 재시작 필요
|
||||||
|
workspaces-orientation = 작업 공간 방향
|
||||||
|
.vertical = 세로
|
||||||
|
.horizontal = 가로
|
||||||
|
acceleration-desc = 속도에 따라 트래킹 감도를 자동으로 조절합니다
|
||||||
|
all-displays = 모든 화면
|
||||||
|
scheduling = 일정
|
||||||
|
.manual = 수동 예약
|
||||||
|
frosted = 시스템 인터페이스의 반투명 유리 효과
|
||||||
|
.desc = 패널, 독, 애플릿, 런처 및 앱 라이브러리에 배경 흐림 효과를 적용합니다
|
||||||
|
password = 암호
|
||||||
|
about-hardware = 하드웨어
|
||||||
|
.model = 하드웨어 모델
|
||||||
|
.memory = 메모리
|
||||||
|
.processor = 프로세서
|
||||||
|
.graphics = 그래픽
|
||||||
|
.disk-capacity = 디스크 용량
|
||||||
|
short = 짧게
|
||||||
|
vpn = VPN
|
||||||
|
.connections = VPN 연결
|
||||||
|
.error = VPN 설정 추가 실패
|
||||||
|
.remove = 연결 프로필 제거
|
||||||
|
.select-file = VPN 설정 파일 선택
|
||||||
|
power-mode = 전원 모드
|
||||||
|
.battery = 배터리 절약
|
||||||
|
.battery-desc = 낮은 전력 소비로 소음 없이 작동합니다
|
||||||
|
.balanced = 균형 잡힘
|
||||||
|
.balanced-desc = 적절한 전력 소비와 성능을 유지합니다
|
||||||
|
.performance = 고성능
|
||||||
|
.performance-desc = 최대로 전력을 소비하여 최고의 성능을 냅니다
|
||||||
|
.no-backend = 백엔드를 찾을 수 없습니다. system76-power 또는 power-profiles-daemon을 설치하세요.
|
||||||
|
wired = 유선
|
||||||
|
.adapter = 유선 어댑터 { $id }
|
||||||
|
.connections = 유선 연결
|
||||||
|
.devices = 유선 장치
|
||||||
|
.remove = 연결 프로필 제거
|
||||||
|
bluetooth-available = 주변 장치
|
||||||
|
cable-unplugged = 케이블 분리됨
|
||||||
|
color-picker = 색상 추출기
|
||||||
|
interface-font = 시스템 글꼴
|
||||||
|
forget-dialog = 이 Wi-Fi 네트워크를 지우시겠습니까?
|
||||||
|
.description = 나중에 이 Wi-Fi 네트워크를 다시 사용하려면 암호를 다시 입력해야 합니다.
|
||||||
|
remove = 제거
|
||||||
|
default = 기본
|
||||||
|
zoom-out = 축소
|
||||||
|
hot-corner = 핫 코너
|
||||||
|
.top-left-corner = 왼쪽 상단 핫 코너를 작업 공간용으로 사용
|
||||||
|
keyboard-typing-assist = 입력
|
||||||
|
.repeat-rate = 반복 주기
|
||||||
|
.repeat-delay = 반복 지연
|
||||||
|
edge-gravity = 플로팅 창이 인접한 가장자리에 붙음
|
||||||
|
bluetooth = 블루투스
|
||||||
|
.status = 블루투스 설정이 열려있는 동안 시스템이 { $aliases }(으)로 표시됩니다.
|
||||||
|
.connected = 연결됨
|
||||||
|
.connecting = 연결 중
|
||||||
|
.disconnecting = 연결 해제 중
|
||||||
|
.connect = 연결
|
||||||
|
.disconnect = 연결 해제
|
||||||
|
.forget = 지우기
|
||||||
|
.dbus-error = D-Bus 통신 중 오류가 발생했습니다: { $why }
|
||||||
|
.disabled = 블루투스 서비스가 비활성화 되었습니다.
|
||||||
|
.inactive = 블루투스 서비스가 시작되지 않았습니다.
|
||||||
|
.unknown = 블루투스 서비스를 시작할 수 없습니다. BlueZ가 설치됐나요?
|
||||||
|
amplification = 증폭
|
||||||
|
.desc = 음량을 150%까지 올릴 수 있게 합니다.
|
||||||
|
recent-colors = 최근 색상
|
||||||
|
about-os = 운영 체제
|
||||||
|
.os = 운영 체제
|
||||||
|
.os-architecture = 운영 체제 아키텍처
|
||||||
|
.kernel = 커널 버전
|
||||||
|
.desktop-environment = 데스크톱 환경
|
||||||
|
.windowing-system = 창 시스템
|
||||||
|
panel-behavior-and-position = 동작 및 위치
|
||||||
|
.autohide = 자동으로 패널 숨기기
|
||||||
|
.dock-autohide = 자동으로 독 숨기기
|
||||||
|
.position = 화면 상 위치
|
||||||
|
.display = 화면에 표시
|
||||||
|
add-language = 언어 추가
|
||||||
|
.context = 언어 추가
|
||||||
|
password-mismatch = 암호가 일치하지 않습니다
|
||||||
|
accessibility = 접근성
|
||||||
|
.vision = 시각
|
||||||
|
.on = 켜짐
|
||||||
|
.off = 꺼짐
|
||||||
|
.unavailable = 사용 불가
|
||||||
|
.screen-reader = 스크린 리더
|
||||||
|
.high-contrast = 고대비
|
||||||
|
.invert-colors = 색상 반전
|
||||||
|
.color-filters = 색상 필터
|
||||||
|
firmware = 펌웨어
|
||||||
|
container-background = 컨테이너 배경
|
||||||
|
.desc-detail = 컨테이너 배경색은 탐색 사이드바, 사이드 드로어, 대화 상자 및 유사한 위젯에 사용됩니다. 기본적으로 컨테이너 배경색은 창 배경색에서 자동으로 파생됩니다.
|
||||||
|
.reset = 자동으로 재설정
|
||||||
|
.desc = 탐색 사이드바, 사이드 드로어, 대화 상자 및 유사한 위젯에 사용됩니다
|
||||||
|
primary-button = 주 버튼
|
||||||
|
.desc = 물리적 버튼의 순서 설정
|
||||||
|
.left = 왼쪽
|
||||||
|
.right = 오른쪽
|
||||||
|
sound-alerts = 알림
|
||||||
|
.volume = 알림 음량
|
||||||
|
.sound = 알림 소리
|
||||||
|
icon-theme = 아이콘 테마
|
||||||
|
.desc = 앱에 다른 아이콘 모음 적용
|
||||||
|
import = 가져오기
|
||||||
|
keyboard-shortcuts = 단축키
|
||||||
|
.desc = 단축키 사용자 정의 및 보기
|
||||||
|
switch-between-windows = 창 간 전환
|
||||||
|
text-tint = 인터페이스 텍스트 색조
|
||||||
|
.desc = 다양한 배경 위에서 충분한 대비를 확보할 수 있는 인터페이스 텍스트 색상을 생성하는 데 사용됩니다
|
||||||
|
online-accounts = 온라인 계정
|
||||||
|
.desc = 계정, IMAP 및 SMTP, 기업용 로그인 추가
|
||||||
|
open-workspaces-view = 작업 공간 개요 열기
|
||||||
|
all = 모두
|
||||||
|
remove-user = 사용자 제거
|
||||||
|
unknown = 알 수 없음
|
||||||
|
sound-input = 입력
|
||||||
|
.volume = 입력 음량
|
||||||
|
.device = 입력 장치
|
||||||
|
.level = 입력 수준
|
||||||
|
add-another-keybinding = 다른 키 바인딩 추가
|
||||||
|
copy-to-clipboard = 클립보드에 복사
|
||||||
|
monospace-font = 고정 폭 글꼴
|
||||||
|
experimental-settings = 실험적 설정
|
||||||
|
recent-folders = 최근 폴더
|
||||||
|
color-filter = 색상 필터 유형
|
||||||
|
.unknown = 알 수 없는 필터 활성화됨
|
||||||
|
.greyscale = 회색조
|
||||||
|
.deuteranopia = 녹색/빨간색 (녹색 색약, 제2색각 이상)
|
||||||
|
.protanopia = 빨간색/녹색 (적색 색약, 제1색각 이상)
|
||||||
|
.tritanopia = 파란색/노란색 (청색 색약, 제3색각 이상)
|
||||||
|
migrate-workspace =
|
||||||
|
작업 공간을 { $direction ->
|
||||||
|
*[down] 아래쪽
|
||||||
|
[left] 왼쪽
|
||||||
|
[right] 오른쪽
|
||||||
|
[up] 위쪽
|
||||||
|
} 디스플레이로 이동
|
||||||
|
connecting = 연결 중…
|
||||||
|
battery = 배터리
|
||||||
|
.minute = { $value }분
|
||||||
|
.hour = { $value }시간
|
||||||
|
.day = { $value }일
|
||||||
|
.less-than-minute = 1분 미만
|
||||||
|
.and = 및
|
||||||
|
.remaining-time =
|
||||||
|
{ $action ->
|
||||||
|
[full] 완충까지
|
||||||
|
*[other] 방전까지
|
||||||
|
}
|
||||||
|
{ $time }
|
||||||
|
search-applets = 애플릿 검색...
|
||||||
|
export = 내보내기
|
||||||
|
window-management = 창 관리
|
||||||
|
pinch-to-zoom = 핀치하여 확대/축소
|
||||||
|
.desc = 확대/축소를 지원하는 앱에서 두 손가락을 사용하여 콘텐츠를 확대하거나 축소합니다
|
||||||
|
wifi = Wi-Fi
|
||||||
|
.adapter = Wi-Fi 어댑터 { $id }
|
||||||
|
.forget = 해당 네트워크 지우기
|
||||||
|
x-hours = { $number }시간
|
||||||
|
added = 추가됨
|
||||||
|
input-source-switch = 키보드 언어 입력 소스 전환
|
||||||
|
focus-navigation = 포커스 탐색
|
||||||
|
.focus-follows-cursor = 포커스가 커서를 따름
|
||||||
|
.focus-follows-cursor-delay = 포커스가 커서를 따를 때의 지연 시간(ms)
|
||||||
|
.cursor-follows-focus = 커서가 포커스를 따름
|
||||||
|
full-name = 성명
|
||||||
|
app-background = 창 배경
|
||||||
|
panel-right = 우측
|
||||||
|
appearance = 외관
|
||||||
|
mouse = 마우스
|
||||||
|
.speed = 마우스 속도
|
||||||
|
.acceleration = 마우스 가속 활성화
|
||||||
|
dock = 독
|
||||||
|
keyboard-sources = 입력 소스
|
||||||
|
.desc = Super+Space 키 조합을 사용하여 입력 소스를 전환할 수 있습니다. 이는 키보드 단축키 설정에서 사용자 지정할 수 있습니다.
|
||||||
|
.move-up = 위로 이동
|
||||||
|
.move-down = 아래로 이동
|
||||||
|
.settings = 설정
|
||||||
|
.view-layout = 키보드 레이아웃 보기
|
||||||
|
.remove = 제거
|
||||||
|
.add = 입력 소스 추가
|
||||||
|
nav-shortcuts = 탐색
|
||||||
|
.prev-output = 이전 디스플레이로 포커스 이동
|
||||||
|
.next-output = 다음 디스플레이로 포커스 이동
|
||||||
|
.last-workspace = 마지막 작업 공간으로 포커스 이동
|
||||||
|
.prev-workspace = 이전 작업 공간으로 포커스 이동
|
||||||
|
.next-workspace = 다음 작업 공간으로 포커스 이동
|
||||||
|
.focus =
|
||||||
|
{ $direction ->
|
||||||
|
*[down] 아래쪽
|
||||||
|
[in] 안쪽
|
||||||
|
[left] 왼쪽
|
||||||
|
[out] 바깥쪽
|
||||||
|
[right] 오른쪽
|
||||||
|
[up] 위쪽
|
||||||
|
} 창으로 포커스 이동
|
||||||
|
.output =
|
||||||
|
{ $direction ->
|
||||||
|
*[down] 아래쪽
|
||||||
|
[left] 왼쪽
|
||||||
|
[right] 오른쪽
|
||||||
|
[up] 위쪽
|
||||||
|
} 디스플레이로 전환
|
||||||
|
.workspace = 작업 공간 { $num }(으)로 전환
|
||||||
|
hearing = 청각
|
||||||
|
.mono = 스테레오 오디오를 모노로 재생
|
||||||
|
preferred-languages = 선호하는 언어
|
||||||
|
.desc = 언어 순서에 따라 사용자 인터페이스에 표시될 언어가 결정됩니다. 변경 사항은 다음 로그인 후에 적용됩니다.
|
||||||
|
display = 디스플레이
|
||||||
|
.arrangement = 디스플레이 배치
|
||||||
|
.arrangement-desc = 디스플레이를 드래그하여 다시 배치하세요
|
||||||
|
.enable = 디스플레이 사용
|
||||||
|
.external = { $size } { $output } 외부 디스플레이
|
||||||
|
.laptop = { $size } 노트북 디스플레이
|
||||||
|
.options = 디스플레이 옵션
|
||||||
|
.refresh-rate = 주사율
|
||||||
|
.resolution = 해상도
|
||||||
|
.scale = 배율
|
||||||
|
.additional-scale-options = 추가 배율 옵션
|
||||||
|
panel-style = 스타일
|
||||||
|
.anchor-gap = 패널과 화면 모서리 사이의 간격
|
||||||
|
.dock-anchor-gap = 독과 화면 모서리 사이의 간격
|
||||||
|
.extend = 화면 모서리까지 패널 확장
|
||||||
|
.dock-extend = 화면 모서리까지 독 확장
|
||||||
|
.appearance = 외관
|
||||||
|
.size = 크기
|
||||||
|
.background-opacity = 배경 투명도
|
||||||
|
username = 사용자 이름
|
||||||
|
light = 라이트
|
||||||
|
panel-appearance = 외관
|
||||||
|
.match = 시스템과 동기화
|
||||||
|
.light = 라이트
|
||||||
|
.dark = 다크
|
||||||
|
replace-shortcut-dialog = 단축키를 대체할까요?
|
||||||
|
.desc = { $shortcut }은 { $name }이 사용 중 입니다. 대체 시 { $name }는 비활성화됩니다.
|
||||||
|
rgb = RGB
|
||||||
|
about-device = 장치 이름
|
||||||
|
.desc = 이 이름은 네트워크 혹은 블루투스 장치에 표시됨
|
||||||
|
no-vpn = 사용 가능한 VPN 연결이 없습니다.
|
||||||
|
start-segment = 시작 영역
|
||||||
|
identity = 식별자
|
||||||
|
reset-to-default = 기본값으로 되돌리기
|
||||||
|
disconnect = 연결 해제
|
||||||
|
ok = 확인
|
||||||
|
debug = 디버그
|
||||||
|
sound = 소리
|
||||||
|
number = { $number }
|
||||||
|
shortcut-name = 단축키 이름
|
||||||
|
style = 스타일
|
||||||
|
.round = 둥글게
|
||||||
|
.slightly-round = 약간 둥글게
|
||||||
|
.square = 각지게
|
||||||
|
panel-applets = 구성
|
||||||
|
.dock-desc = 독 애플릿 구성
|
||||||
|
.desc = 패널 애플릿 구성
|
||||||
|
qr-code-unavailable = QR 코드를 사용할 수 없음
|
||||||
|
small = 작게
|
||||||
|
notifications = 알림
|
||||||
|
window-tiling = 창 타일링
|
||||||
|
.horizontal = 가로 방향 설정
|
||||||
|
.vertical = 세로 방향 설정
|
||||||
|
.swap-window = 창 교체
|
||||||
|
.toggle-tiling = 창 타일링 전환
|
||||||
|
.toggle-stacking = 창 스태킹 전환
|
||||||
|
.toggle-floating = 창 플로팅 전환
|
||||||
|
.toggle-orientation = 방향 전환
|
||||||
|
change-password = 암호 변경
|
||||||
|
disable-while-typing = 키 입력 중에는 비활성화하기
|
||||||
|
long = 길게
|
||||||
|
copied-to-clipboard = 클립보드로 복사됨
|
||||||
|
bluetooth-confirm-pin = 블루투스 PIN 확인
|
||||||
|
.description = { $device }에 표시된 PIN 번호가 다음과 일치하는지 확인하세요
|
||||||
|
startup-apps = 시작 앱
|
||||||
|
.add = 앱 추가
|
||||||
|
.user = 로그인 시 실행되는 앱
|
||||||
|
.none = 추가된 시작 앱이 없습니다
|
||||||
|
.remove-dialog-title = { $name }을(를) 제거할까요?
|
||||||
|
.remove-dialog-description = 이 시작 앱을 제거할까요?
|
||||||
|
.add-startup-app = 시작 앱 추가
|
||||||
|
legacy-app-scaling = X11 창 시스템 앱 배율 조정
|
||||||
|
.scaled-gaming = 게임 및 전체 화면 앱에 최적화
|
||||||
|
.gaming-description = X11 앱이 Wayland 앱에 비해 약간 크거나 작게 보일 수 있습니다
|
||||||
|
.scaled-applications = 일반 앱에 최적화
|
||||||
|
.applications-description = 게임 및 전체 화면 X11 앱이 디스플레이 해상도와 일치하지 않을 수 있습니다
|
||||||
|
.scaled-compatibility = 최대 호환성 모드
|
||||||
|
.compatibility-description = 고해상도(HiDPI) 화면에서 X11 앱이 흐릿하게 보일 수 있습니다
|
||||||
|
.preferred-display = 게임 및 전체 화면 X11 앱에 우선 사용할 디스플레이
|
||||||
|
.no-display = 없음
|
||||||
|
night-light = 야간 조명
|
||||||
|
.auto = 자동 (일몰부터 일출까지)
|
||||||
|
.desc = 따뜻한 색을 사용하여 블루라이트를 줄입니다
|
||||||
|
about = 정보
|
||||||
|
input-devices = 입력 장치
|
||||||
|
custom-shortcuts = 사용자 정의 단축키
|
||||||
|
.add = 단축키 추가
|
||||||
|
.context = 사용자 정의 단축키 추가
|
||||||
|
.none = 사용자 정의 단축키 없음
|
||||||
|
visible-networks = 사용 가능한 네트워크
|
||||||
|
applets = 애플릿
|
||||||
|
terminate = 종료
|
||||||
|
window-hint-accent-toggle = 활성 창 강조에 테마 강조 색상 사용
|
||||||
|
type-to-search = 입력하여 검색…
|
||||||
|
workspaces-behavior = 작업 공간 동작
|
||||||
|
.dynamic = 동적 작업 공간
|
||||||
|
.dynamic-desc = 비어있는 작업 공간을 자동으로 제거합니다.
|
||||||
|
.fixed = 고정된 작업 공간 개수
|
||||||
|
.fixed-desc = 개요에 작업 공간을 추가하거나 제거합니다.
|
||||||
|
wireguard-dialog = WireGuard 장치 추가
|
||||||
|
.description = WireGuard 설정을 위해 사용할 장치 이름을 지정하세요.
|
||||||
|
remove-connection-dialog = 연결 프로필을 제거할까요?
|
||||||
|
.vpn-description = 나중에 이 네트워크를 다시 사용하려면 암호를 다시 입력해야 합니다.
|
||||||
|
.wired-description = 나중에 다시 사용하려면 프로필을 다시 생성해야 합니다.
|
||||||
|
workspaces = 작업 공간
|
||||||
|
password-confirm = 암호 확인
|
||||||
|
move-windows = 창 이동
|
||||||
|
.direction =
|
||||||
|
{ $direction ->
|
||||||
|
*[down] 아래쪽
|
||||||
|
[left] 왼쪽
|
||||||
|
[right] 오른쪽
|
||||||
|
[up] 위쪽
|
||||||
|
} 으로 창 이동
|
||||||
|
.display =
|
||||||
|
{ $direction ->
|
||||||
|
*[down] 아래쪽
|
||||||
|
[left] 왼쪽
|
||||||
|
[right] 오른쪽
|
||||||
|
[up] 위쪽
|
||||||
|
} 모니터로 창 이동
|
||||||
|
.workspace =
|
||||||
|
{ $direction ->
|
||||||
|
*[below] 아래쪽
|
||||||
|
[left] 왼쪽
|
||||||
|
[right] 오른쪽
|
||||||
|
[above] 위쪽
|
||||||
|
} 작업 공간으로 창 이동
|
||||||
|
.workspace-num = 작업 공간 { $num }(으)로 창 이동
|
||||||
|
.prev-workspace = 이전 작업 공간으로 창 이동
|
||||||
|
.next-workspace = 다음 작업 공간으로 창 이동
|
||||||
|
.last-workspace = 마지막 작업 공간으로 창 이동
|
||||||
|
.next-display = 다음 디스플레이로 창 이동
|
||||||
|
.prev-display = 이전 디스플레이로 창 이동
|
||||||
|
.send-to-prev-workspace = 이전 작업 공간으로 창 이동
|
||||||
|
.send-to-next-workspace = 다음 작업 공간으로 창 이동
|
||||||
|
switch-workspaces = 작업 공간 전환
|
||||||
|
.horizontal = 네 손가락으로 왼쪽/오른쪽 스와이프
|
||||||
|
.vertical = 네 손가락으로 위/아래 스와이프
|
||||||
|
applications = 앱
|
||||||
|
system-controls = 시스템 제어
|
||||||
|
auto-switch = 라이트 모드와 다크 모드간 자동 전환
|
||||||
|
.sunrise = 일출 시 라이트 테마로 전환
|
||||||
|
.sunset = 일몰 시 다크 테마로 전환
|
||||||
|
.next-sunrise = 다음 일출 시 라이트 테마로 전환
|
||||||
|
.next-sunset = 다음 일몰 시 다크 테마로 전환
|
||||||
|
dark = 다크
|
||||||
|
add-vpn = VPN 추가
|
||||||
|
cancel = 취소
|
||||||
|
keyboard-numlock-boot = Num Lock
|
||||||
|
.boot-state = 부팅 시 상태
|
||||||
|
.last-boot = 마지막 부팅 시 상태 유지
|
||||||
|
.on = 켜짐
|
||||||
|
.off = 꺼짐
|
||||||
|
.set = Num Lock 부팅 상태 설정
|
||||||
|
about-related = 관련된 설정
|
||||||
|
.support = 도움 받기
|
||||||
|
tap-to-click = 터치하여 클릭
|
||||||
|
.desc = 한 손가락으로 두드려 기본 클릭, 두 손가락으로 보조 클릭, 세 손가락으로 중앙 클릭을 사용합니다
|
||||||
|
interface-density = 인터페이스 밀도
|
||||||
|
.comfortable = 보통
|
||||||
|
.compact = 좁게
|
||||||
|
.spacious = 넓게
|
||||||
|
open-application-library = 앱 라이브러리 열기
|
||||||
|
connected = 연결됨
|
||||||
|
slow = 느리게
|
||||||
|
network-name = 네트워크 이름
|
||||||
|
large = 크게
|
||||||
|
panel = 패널
|
||||||
|
confirm = 확인
|
||||||
|
auth-dialog = 인증 필요
|
||||||
|
.vpn-description = VPN 서비스를 위해 사용자 이름과 암호를 입력하세요.
|
||||||
|
.wifi-description = 암호 또는 암호화 키를 입력하세요. 공유기의 "WPS" 버튼을 눌러 연결할 수도 있습니다.
|
||||||
|
add-user = 사용자 추가
|
||||||
|
enable = 활성화
|
||||||
|
add-image = 이미지 추가
|
||||||
|
migrate-workspace-next = 작업 공간을 다음 디스플레이로 이동
|
||||||
|
airplane-on = 비행기 모드가 켜져 있습니다.
|
||||||
|
formatting = 형식
|
||||||
|
.dates = 날짜
|
||||||
|
.time = 시간
|
||||||
|
.date-and-time = 날짜 및 시간
|
||||||
|
.numbers = 숫자
|
||||||
|
.measurement = 단위
|
||||||
|
.paper = 용지
|
||||||
|
disabled = 비활성화됨
|
||||||
|
add-applet = 애플릿 추가
|
||||||
|
show-extended-input-sources = 확장 입력 소스 표시
|
||||||
|
mode-and-colors = 모드 및 색상
|
||||||
|
users = 사용자
|
||||||
|
.admin = 관리자
|
||||||
|
.standard = 기본
|
||||||
|
.profile-add = 프로필 이미지 선택
|
||||||
|
forget = 지우기
|
||||||
|
center-segment = 중앙 영역
|
||||||
|
panel-missing = 패널 설정 파일을 찾을 수 없음
|
||||||
|
.desc = 사용자 정의 설정을 사용 중이거나 파일이 손상되어 패널 설정 파일을 찾을 수 없습니다.
|
||||||
|
.fix = 기본값으로 재설정
|
||||||
|
invalid-username = 유효하지 않은 사용자 이름
|
||||||
|
mirroring = 미러링
|
||||||
|
.id = 미러링 { $id }
|
||||||
|
.dont = 미러링 안 함
|
||||||
|
.mirror = { $display } 미러링
|
||||||
|
.project =
|
||||||
|
{ $display ->
|
||||||
|
[all] 모든 디스플레이
|
||||||
|
*[other] { $display }
|
||||||
|
}에 투사
|
||||||
|
.project-count = 다른 { $count }개의 디스플레이에 투사 중
|
||||||
|
orientation = 방향
|
||||||
|
.standard = 기본
|
||||||
|
.rotate-90 = 90° 회전
|
||||||
|
.rotate-180 = 180° 회전
|
||||||
|
.rotate-270 = 270° 회전
|
||||||
|
auto = 자동
|
||||||
|
end-segment = 끝 영역
|
||||||
|
bluetooth-adapters = 블루투스 어댑터
|
||||||
|
legacy-applications = X11 앱 호환성
|
||||||
|
time-format = 날짜 & 시간 형식
|
||||||
|
.twenty-four = 24시간 형식
|
||||||
|
.show-seconds = 초 표시
|
||||||
|
.first = 한 주의 시작 요일
|
||||||
|
.show-date = 시간 애플릿에 날짜 표시
|
||||||
|
.friday = 금요일
|
||||||
|
.saturday = 토요일
|
||||||
|
.sunday = 일요일
|
||||||
|
.monday = 월요일
|
||||||
|
accent-color = 강조 색상
|
||||||
|
type-key-combination = 키 조합 입력
|
||||||
|
never = 사용 안 함
|
||||||
|
install-additional-languages = 추가 언어 설치
|
||||||
|
settings = 설정
|
||||||
|
sound-output = 출력
|
||||||
|
.volume = 출력 음량
|
||||||
|
.device = 출력 장치
|
||||||
|
.level = 출력 수준
|
||||||
|
.config = 구성
|
||||||
|
.balance = 균형
|
||||||
|
.left = 좌
|
||||||
|
.right = 우
|
||||||
|
window-controls = 창 제어
|
||||||
|
.maximize = 최대화 버튼 표시
|
||||||
|
.minimize = 최소화 버튼 표시
|
||||||
|
.active-window-hint = 활성 창 강조 표시
|
||||||
|
window-management-appearance = 창 관리
|
||||||
|
.active-hint = 활성 창 강조 크기
|
||||||
|
.gaps = 타일링된 창 간 간격
|
||||||
|
migrate-workspace-prev = 작업 공간을 이전 디스플레이로 이동
|
||||||
|
keyboard = 키보드
|
||||||
|
legacy-app-global-shortcuts = X11 앱의 전역 단축키
|
||||||
|
.desc = 전역 단축키를 사용하면 눌러서 말하기 또는 눌러서 음소거와 같은 기능을 위해, 특정 앱에서 수행된 키 입력 및 마우스 버튼 이벤트를 다른 앱이 인식할 수 있습니다. 기본적으로 X11 앱에서는 다른 앱이 민감한 정보가 포함된 키보드 및 마우스 이벤트를 감시하지 못하도록 전역 단축키 기능이 비활성화되어 있습니다.
|
||||||
|
.none = 키 없음
|
||||||
|
.modifiers = 조합 키 (Super, Shift, Control, Alt)
|
||||||
|
.combination = Super, Control 또는 Alt 조합 키를 누르는 동안의 모든 키 조합
|
||||||
|
.all = 모든 키
|
||||||
|
.mouse = X11 앱의 마우스 버튼 이벤트
|
||||||
|
activate = 활성화
|
||||||
|
replace = 대체
|
||||||
|
connected-devices = 연결된 장치
|
||||||
|
.unknown = 알 수 없는 장치
|
||||||
|
icons-and-toolkit = 아이콘 및 툴킷 테마 설정
|
||||||
|
sound-applications = 앱
|
||||||
|
.desc = 앱 음량 및 설정
|
||||||
|
time-zone = 시간대
|
||||||
|
.auto = 자동 시간대
|
||||||
|
.auto-info = 위치 서비스와 인터넷 연결 필요
|
||||||
|
dialog-add = 추가
|
||||||
|
fast = 빠르게
|
||||||
|
add-color = 색상 추가
|
||||||
|
add-network = 네트워크 추가
|
||||||
|
.profile = 프로필 추가
|
||||||
|
touchpad = 터치패드
|
||||||
|
.acceleration = 터치패드 가속 활성화
|
||||||
|
.speed = 터치패드 속도
|
||||||
|
command = 명령
|
||||||
|
gestures = 제스처
|
||||||
|
.four-finger-down = 네 손가락을 아래로 스와이프
|
||||||
|
.four-finger-left = 네 손가락을 왼쪽으로 스와이프
|
||||||
|
.four-finger-right = 네 손가락을 오른쪽으로 스와이프
|
||||||
|
.four-finger-up = 네 손가락을 위로 스와이프
|
||||||
|
.three-finger-any = 세 손가락을 아무 방향으로 스와이프
|
||||||
|
system = 시스템 & 계정
|
||||||
|
no-networks = 네트워크를 찾을 수 없습니다.
|
||||||
|
open-new-folder = 새 폴더 열기
|
||||||
|
panel-bottom = 하단
|
||||||
|
share = 네트워크 공유
|
||||||
|
add = 추가
|
||||||
|
time = 시간 & 언어
|
||||||
|
fill = 채우기
|
||||||
|
custom = 사용자 정의
|
||||||
|
bluetooth-paired = 이전에 연결된 장치
|
||||||
|
.connect = 연결
|
||||||
|
.battery = 배터리 { $percentage }%
|
||||||
|
dialog = 확인 창
|
||||||
|
.title = 이 디스플레이 설정을 유지하시겠습니까?
|
||||||
|
.keep-changes = 변경 사항 유지
|
||||||
|
.change-prompt = { $time }초 후에 설정 변경 사항이 자동으로 복구됩니다.
|
||||||
|
.revert-settings = 설정 복구
|
||||||
|
navigate = 탐색
|
||||||
|
workspaces-overview-thumbnails = 작업 공간 개요 썸네일
|
||||||
|
.show-number = 작업 공간 번호 표시
|
||||||
|
.show-name = 작업 공간 이름 표시
|
||||||
|
color = 색상
|
||||||
|
.depth = 색 깊이
|
||||||
|
.profile = 색 프로필
|
||||||
|
.sidebar = 색 프로필
|
||||||
|
.temperature = 색 온도
|
||||||
|
hex = Hex
|
||||||
|
magnifier = 돋보기
|
||||||
|
.controls =
|
||||||
|
또는 다음 단축키를 사용하세요: { $zoom_in ->
|
||||||
|
[zero] { "" }
|
||||||
|
*[other]
|
||||||
|
{ "" }
|
||||||
|
확대하려면 { $zoom_in },
|
||||||
|
}{ $zoom_out ->
|
||||||
|
[zero] { "" }
|
||||||
|
*[other]
|
||||||
|
{ "" }
|
||||||
|
축소하려면 { $zoom_out },
|
||||||
|
}
|
||||||
|
Super + 마우스 휠 스크롤
|
||||||
|
.scroll_controls = Super + 마우스 휠 스크롤로 마우스 또는 터치패드 확대/축소 활성화
|
||||||
|
.show_overlay = 돋보기 오버레이 표시
|
||||||
|
.increment = 확대 단위
|
||||||
|
.signin = 로그인 시 돋보기 시작
|
||||||
|
.applet = 패널 애플릿에서 돋보기 켜기/끄기 전환
|
||||||
|
.movement = 확대 화면 이동 방식
|
||||||
|
.continuous = 포인터를 따라 연속 이동
|
||||||
|
.onedge = 포인터가 가장자리에 닿을 때 이동
|
||||||
|
.centered = 포인터를 항상 중앙에 유지
|
||||||
|
colors = 색상
|
||||||
|
administrator = 관리자
|
||||||
|
.desc = 관리자는 모든 사용자의 설정을 변경할 수 있으며, 다른 사용자를 추가하거나 제거할 수 있습니다
|
||||||
|
scan-to-connect-description = 이 네트워크에 연결하려면 QR 코드를 스캔하세요.
|
||||||
|
modified = { $count } 수정됨
|
||||||
|
known-networks = 알려진 네트워크
|
||||||
|
network-and-wireless = 네트워크 & 무선
|
||||||
|
close = 닫기
|
||||||
|
sound-device-port-unplugged = 분리됨
|
||||||
|
sound-hd-audio = HD 오디오
|
||||||
|
sound-usb-audio = USB 오디오
|
||||||
|
sound-device-profiles = 장치 프로필
|
||||||
|
workspaces-multi-behavior = 다중 모니터 동작
|
||||||
|
.span = 작업 공간을 모든 디스플레이에 확장
|
||||||
|
.separate = 디스플레이마다 개별 작업 공간 사용
|
||||||
|
system-shortcut = 시스템
|
||||||
|
.app-library = 앱 라이브러리 열기
|
||||||
|
.brightness-down = 디스플레이 밝기 낮추기
|
||||||
|
.brightness-up = 디스플레이 밝기 높이기
|
||||||
|
.display-toggle = 내장 디스플레이 켜기/끄기
|
||||||
|
.home-folder = 홈 폴더 열기
|
||||||
|
.keyboard-brightness-down = 키보드 밝기 낮추기
|
||||||
|
.keyboard-brightness-up = 키보드 밝기 높이기
|
||||||
|
.launcher = 런처 열기
|
||||||
|
.log-out = 로그아웃
|
||||||
|
.lock-screen = 화면 잠금
|
||||||
|
.mute = 오디오 출력 음소거
|
||||||
|
.mute-mic = 마이크 입력 음소거
|
||||||
|
.play-pause = 재생/일시 정지
|
||||||
|
.play-next = 다음 곡
|
||||||
|
.play-prev = 이전 곡
|
||||||
|
.poweroff = 전원 끄기
|
||||||
|
.screenshot = 스크린샷 찍기
|
||||||
|
.suspend = 절전
|
||||||
|
.terminal = 터미널 열기
|
||||||
|
.touchpad-toggle = 터치패드 켜기/끄기
|
||||||
|
.volume-lower = 오디오 출력 음량 낮추기
|
||||||
|
.volume-raise = 오디오 출력 음량 높이기
|
||||||
|
.web-browser = 웹 브라우저 열기
|
||||||
|
.window-switcher = 열린 창 사이 전환
|
||||||
|
.window-switcher-previous = 열린 창 사이 역순으로 전환
|
||||||
|
.workspace-overview = 작업 공간 개요 열기
|
||||||
|
network-device-state =
|
||||||
|
.activated = 연결됨
|
||||||
|
.config = 연결 중
|
||||||
|
.deactivating = 연결 해제 중
|
||||||
|
.disconnected = 연결 끊김
|
||||||
|
.failed = 연결 실패
|
||||||
|
.ip-check = 연결 확인 중
|
||||||
|
.ip-config = IP 및 라우팅 정보 요청 중
|
||||||
|
.need-auth = 인증 필요
|
||||||
|
.prepare = 연결 준비 중
|
||||||
|
.secondaries = 보조 연결 대기 중
|
||||||
|
.unavailable = 사용 불가
|
||||||
|
.unknown = 알 수 없는 상태
|
||||||
|
.unmanaged = 관리되지 않음
|
||||||
|
.unplugged = 케이블 분리됨
|
||||||
|
vpn-error = VPN 에러
|
||||||
|
.config = VPN 설정 추가 실패
|
||||||
|
.connect = VPN 연결 실패
|
||||||
|
.connection-editor = 연결 편집기 실행 실패
|
||||||
|
.connection-settings = 활성 연결 설정을 가져오지 못했습니다
|
||||||
|
.updating-state = 네트워크 관리자 상태를 업데이트하지 못했습니다
|
||||||
|
.wireguard-config-path = WireGuard 설정 파일 경로가 잘못되었습니다
|
||||||
|
.wireguard-config-path-desc = 선택한 파일은 로컬 파일 시스템에 있어야 합니다.
|
||||||
|
.wireguard-device = WireGuard 장치를 생성하지 못했습니다
|
||||||
|
.with-password =
|
||||||
|
nmcli를 통한 VPN { $field ->
|
||||||
|
*[username] 사용자 이름
|
||||||
|
[password] 암호
|
||||||
|
[password-flags] 암호 플래그
|
||||||
|
} 설정 실패
|
||||||
|
wallpaper = 배경화면
|
||||||
|
.change = 이미지 변경 주기
|
||||||
|
.fit = 배경화면 맞춤 방식
|
||||||
|
.folder-dialog = 배경화면 폴더 선택
|
||||||
|
.image-dialog = 배경화면 이미지 선택
|
||||||
|
.plural = 배경화면
|
||||||
|
.same = 모든 디스플레이에 동일한 배경화면 사용
|
||||||
|
.slide = 슬라이드쇼
|
||||||
|
shadows-floating = 플로팅 창
|
||||||
|
.clip = 시스템 모서리 곡률 맞춤 및 그림자 적용
|
||||||
|
shadows-tiling = 타일링 창
|
||||||
|
.clip = 시스템 모서리 곡률 맞춤
|
||||||
|
.shadow = 그림자 적용
|
||||||
|
enable-export = 현재 테마를 GNOME 앱에 적용
|
||||||
|
.desc = 모든 툴킷이 테마 자동 전환을 지원하지는 않습니다. COSMIC 이외의 앱은 테마를 변경한 후 앱을 다시 시작해야 할 수도 있습니다.
|
||||||
|
shadow-and-corners = 창 그림자 및 모서리
|
||||||
|
manage-windows = 창 관리
|
||||||
|
.close = 닫기
|
||||||
|
.maximize = 최대화
|
||||||
|
.fullscreen = 전체 화면
|
||||||
|
.minimize = 최소화
|
||||||
|
.resize-inwards = 창 안쪽으로 크기 조절
|
||||||
|
.resize-outwards = 창 바깥쪽으로 크기 조절
|
||||||
|
.toggle-sticky = 고정 창 전환
|
||||||
|
click-behavior = 클릭 동작
|
||||||
|
.click-finger = 두 손가락으로 보조 클릭, 세 손가락으로 중앙 클릭
|
||||||
|
.button-areas = 오른쪽 아래 모서리에서 보조 클릭, 하단 중앙에서 중앙 클릭
|
||||||
|
default-apps = 기본 앱
|
||||||
|
.web-browser = 웹 브라우저
|
||||||
|
.file-manager = 파일 관리자
|
||||||
|
.mail-client = 메일 클라이언트
|
||||||
|
.music = 음악
|
||||||
|
.video = 동영상
|
||||||
|
.photos = 사진
|
||||||
|
.calendar = 캘린더
|
||||||
|
.terminal = 터미널
|
||||||
|
.other-associations = 기타 연결 프로그램
|
||||||
|
.text-editor = 텍스트 편집기
|
||||||
|
.not-installed = 설치되지 않음
|
||||||
|
power-saving = 절전 옵션
|
||||||
|
.turn-off-screen-after = 다음 시간 후 화면 끄기
|
||||||
|
.auto-suspend = 자동 절전 모드
|
||||||
|
.auto-suspend-ac = 전원 연결 시 자동 절전 모드
|
||||||
|
.auto-suspend-battery = 배터리 사용 시 자동 절전 모드
|
||||||
|
scrolling = 스크롤
|
||||||
|
.two-finger = 두 손가락으로 스크롤
|
||||||
|
.edge = 가장자리를 따라 한 손가락으로 스크롤
|
||||||
|
.speed = 스크롤 속도
|
||||||
|
.natural = 자연스러운 스크롤
|
||||||
|
.natural-desc = 화면이 아닌 콘텐츠 자체가 움직이도록 스크롤합니다
|
||||||
|
keyboard-special-char = 특수 문자 입력
|
||||||
|
.alternate = 대체 문자 키
|
||||||
|
.compose = 조합 키
|
||||||
|
.compose-desc = 조합 키를 사용하면 매우 다양한 특수 문자를 입력할 수 있습니다. 조합 키를 먼저 누른 다음, 정해진 순서대로 문자들을 입력하세요. 예를 들어, 조합 키를 누른 후 C와 o를 차례로 누르면 ©가 입력되고, a와 '를 누르면 á가 입력됩니다.
|
||||||
|
.caps = Caps Lock 키
|
||||||
|
xdg-entry-wired = 유선
|
||||||
|
xdg-entry-mouse-keywords = COSMIC;마우스;가속;스크롤;
|
||||||
|
xdg-entry-bluetooth-comment = 블루투스 장치 관리
|
||||||
|
xdg-entry-notifications-keywords = COSMIC;알림;잠금;
|
||||||
|
xdg-entry-default-apps-comment = 기본 웹 브라우저와 메일 클라이언트, 파일 탐색기 및 다른 앱
|
||||||
|
xdg-entry-keyboard-comment = 입력 소스, 전환, 특수 문자 모음, 단축키
|
||||||
|
xdg-entry-wired-keywords = COSMIC;유선;LAN;네트워크;연결;
|
||||||
|
xdg-entry-power = 전원 & 배터리
|
||||||
|
xdg-entry-appearance-keywords = COSMIC;강조;색상;아이콘;글꼴;테마
|
||||||
|
xdg-entry-mouse = 마우스
|
||||||
|
xdg-entry-dock-keywords = COSMIC;독;패널;애플릿
|
||||||
|
xdg-entry-mouse-comment = 마우스 속도와 가속 및 자연스러운 스크롤
|
||||||
|
xdg-entry-panel-keywords = COSMIC;패널;애플릿
|
||||||
|
xdg-entry-window-management = 창 관리
|
||||||
|
xdg-entry-a11y = 접근성
|
||||||
|
xdg-entry-desktop-keywords = COSMIC;데스크톱;
|
||||||
|
xdg-entry-x11-applications-keywords = COSMIC;X11;앱;게임;호환성;
|
||||||
|
xdg-entry-displays-comment = 표시 구성 관리 설정
|
||||||
|
xdg-entry-default-apps = 기본 앱
|
||||||
|
xdg-entry-wireless-keywords = COSMIC;WiFi;Wi-Fi;네트워크;연결;
|
||||||
|
xdg-entry-applications-comment = 기본 앱과 시작 앱 및 X11 앱 호환성 설정
|
||||||
|
xdg-entry-about-keywords = COSMIC;정보
|
||||||
|
xdg-entry-panel = 패널
|
||||||
|
xdg-entry-notifications = 알림
|
||||||
|
xdg-entry-a11y-keywords = COSMIC;접근성;접근성;스크린;리더;돋보기;대비;색상;
|
||||||
|
xdg-entry-wireless-comment = Wi-Fi 연결 및 연결 프로필
|
||||||
|
xdg-entry-desktop = 데스크톱
|
||||||
|
xdg-entry-date-time-keywords = COSMIC;시간;대;
|
||||||
|
xdg-entry-desktop-comment = 바탕화면과 외관, 패널, 독, 창 관리 및 작업 공간 설정
|
||||||
|
xdg-entry-wallpaper = 배경화면
|
||||||
|
xdg-entry-keyboard = 키보드
|
||||||
|
xdg-entry-a11y-comment = 스크린 리더, 돋보기, 고대비, 색상 필터
|
||||||
|
xdg-entry-displays = 표시
|
||||||
|
xdg-entry-network = 네트워크 & 무선
|
||||||
|
xdg-entry-date-time = 날짜 & 시간
|
||||||
|
xdg-entry-input-comment = 키보드와 마우스 설정
|
||||||
|
xdg-entry-bluetooth-keywords = COSMIC;블루투스;
|
||||||
|
xdg-entry-dock-comment = 앱과 애플릿을 위한 선택적 바
|
||||||
|
xdg-entry-network-keywords = COSMIC;네트워크;무선;WiFi;VPN;
|
||||||
|
xdg-entry-dock = 독
|
||||||
|
xdg-entry-wireless = Wi-Fi
|
||||||
|
xdg-entry-workspaces-keywords = COSMIC;작업 공간;방향;개요;모니터;
|
||||||
|
xdg-entry-users-keywords = COSMIC;사용자;계정;
|
||||||
|
xdg-entry-about-comment = 장치 이름, 하드웨어 정보, 운영체제 기본값
|
||||||
|
xdg-entry-vpn-keywords = COSMIC;VPN;네트워크;연결;OpenVPN;OpenConnect;
|
||||||
|
xdg-entry-appearance-comment = 강조 색상과 테마
|
||||||
|
xdg-entry-input-keywords = COSMIC;입력;키보드;마우스;마우스;
|
||||||
|
xdg-entry-comment = COSMIC 데스크톱을 위한 설정 앱
|
||||||
|
xdg-entry-notifications-comment = 방해 금지와 잠금 화면 알림 및 애플리케이션별 설정
|
||||||
|
xdg-entry-applications = 앱
|
||||||
|
xdg-entry-power-keywords = COSMIC;전원;배터리
|
||||||
|
xdg-entry-default-apps-keywords = COSMIC;기본;앱
|
||||||
|
xdg-entry-keywords = COSMIC;설정;
|
||||||
|
xdg-entry-about = 정보
|
||||||
|
xdg-entry-input = 입력 장치
|
||||||
|
xdg-entry-applications-keywords = COSMIC;기본;앱;시작;X11;호환성
|
||||||
|
xdg-entry-keyboard-keywords = COSMIC;키보드;입력;소스;단축키;
|
||||||
|
xdg-entry-vpn-comment = VPN 연결 및 연결 프로필
|
||||||
|
xdg-entry-appearance = 외관
|
||||||
|
xdg-entry-window-management-keywords = COSMIC;창;관리;타일링;Super;키;
|
||||||
|
xdg-entry-workspaces-comment = 작업 공간 방향과 개요 및 다중 모니터 동작
|
||||||
|
xdg-entry-network-comment = 네트워크 연결 관리
|
||||||
|
xdg-entry-power-comment = 전원 모드 및 절전 옵션
|
||||||
|
xdg-entry-displays-keywords = COSMIC;표시;
|
||||||
|
xdg-entry-workspaces = 작업 공간
|
||||||
|
xdg-entry-date-time-comment = 시간대와 자동 시계 설정 및 시간 형식
|
||||||
|
xdg-entry-x11-applications = X11 앱 호환성
|
||||||
|
xdg-entry-wired-comment = 유선 연결 및 연결 프로필
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue