Compare commits

...
Sign in to create a new pull request.

134 commits

Author SHA1 Message Date
Votre Nom
52ce463a59 window-management: toggle for macOS-style window controls position
Adds a new toggler "Place buttons on the left (macOS style)" in
*Desktop → Window Management → Window controls*, next to the existing
show_maximize / show_minimize controls. When enabled, writes
`WindowControlsPosition::Start` into the `CosmicTk` config
(com.system76.CosmicTk); when disabled, writes `End` (default).

All libcosmic-based applications rebuilt against a libcosmic that
exposes `WindowControlsPosition` pick up the change live through the
existing cosmic-config subscription.

Includes:
- new Message variant WindowControlsPositionStart(bool) + handler
- `window-controls.position-start` fluent key added in en + fr locales
- Cargo.toml: activate local [patch] override to libcosmic (dev only,
  not suitable for upstream merge)

Requires: libcosmic >= 5c331935 (header_bar WindowControlsPosition).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 15:09:01 +02:00
Lysander Treumann
48eae39858 Incorporates format suggestions from 'cargo fmt --all --check',
Improves error messages when PageInner.size is unexpectedly None
2026-04-21 13:54:15 -06:00
Lysander Treumann
ba5fb65b44 Changes the PageInner.size field to have no explicit default. It is only initialized (not None) when PageInner.panel_config is initialized. This implementation fails faster and more verbose, when program is in an unintended state. 2026-04-21 13:54:15 -06:00
Lysander Treumann
95a82c0d69 Changes behavior of the panel/dock size slider
- from: new size is committed as soon as the slider position is changed (triggers panel/dock restart),
- to: new size is committed only when slider is released.
2026-04-21 13:54:15 -06:00
Oleksiy Buell
c06b184ecf
feat(workspaces): add workspace wrapping toggle 2026-04-20 15:14:37 +02:00
Daniel Fox Franke
d0fa882596
feat(keyboard): add "swap with control" for caps lock key 2026-04-20 15:12:52 +02:00
Vukašin Vojinović
2b7fd9b8e2 chore: update CI 2026-04-16 15:25:34 -06:00
Vukašin Vojinović
eb55cd020f chore: clippy 2026-04-16 15:25:34 -06:00
Vukašin Vojinović
96ce377ebf chore: update libcosmic 2026-04-16 15:25:34 -06:00
Jeremy Soller
09c4d04b49
i18n: translation update from Hosted Weblate (#1934) 2026-04-14 09:51:32 -06:00
Hosted Weblate
f4e8a920ff
i18n: translation updates from weblate
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: Amadɣas <massiin@proton.me>
Co-authored-by: Asier Saratsua Garmendia <asier.sarasua@gmail.com>
Co-authored-by: Because789 <hubiontheroad@yahoo.com>
Co-authored-by: ButterflyOfFire <boffire@users.noreply.hosted.weblate.org>
Co-authored-by: David Carvalho <david.snt.carvalho@gmail.com>
Co-authored-by: Deleted User <noreply+129037@weblate.org>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Geeson Wan <wang14240@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Hugo Carvalho <hugokarvalho@hotmail.com>
Co-authored-by: Julien Brouillard <julienbrouillard1@gmail.com>
Co-authored-by: Jun Hwi Ku <siguning@gmail.com>
Co-authored-by: Michael Murphy <michael@mmurphy.dev>
Co-authored-by: Thomas Worofsky <thomas.worofsky@gmail.com>
Co-authored-by: Urocissa Caerulea.Tw <urocissa.tw@proton.me>
Co-authored-by: Vilius Paliokas <viliuspaliokas@gmail.com>
Co-authored-by: Walter William Beckerleg Bruckman <spayk.99@protonmail.com>
Co-authored-by: defaultUser822 <defaultuser822@users.noreply.hosted.weblate.org>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: taijuin Lee <taijuin@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: 麋麓 BigELK176 <BigELK176@gmail.com>
Co-authored-by: 김유빈 <k.sein1016@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/de/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/es_419/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ga/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kab/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ko/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/lt/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hant/
Translation: Pop OS/COSMIC Settings
2026-04-12 18:50:07 +02:00
Ashley Wulber
3639bafcfa chore: update libcosmic after reexports were removed 2026-04-10 16:39:09 +02:00
Hojjat
04da80bb90 chore: adapt to libcosmic row/column changes
Co-authored-by: Vukašin Vojinović <150025636+git-f0x@users.noreply.github.com>
2026-04-07 13:36:05 -06:00
Hojjat
251162f846 chore: update libcosmic 2026-04-07 13:36:05 -06:00
Ashley Wulber
285718ac72
fix: fonts such as Droid Sans not being rendered 2026-04-03 22:27:53 +02:00
Jonah Grasso
5384a8b1c5
Spelling corrections in TESTING.md (#1946)
Fixed a few spelling errors.

- [x] 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.
- [x] I understand these changes in full and will be able to respond to
review comments.
- [x] My change is accurately described in the commit message.
- [x] My contribution is tested and working as described.
- [x] I have read the [Developer Certificate of
Origin](https://developercertificate.org/) and certify my contribution
under its conditions.
2026-04-03 13:41:30 -06:00
Hojjat
59ccde22fa chore: update libcosmic 2026-04-02 20:14:03 -04:00
Hojjat
a82f24ed39 fix(power): ellipsize connected device name 2026-04-02 20:14:03 -04:00
Hojjat
dbc755a0d6 fix(display): ellipsize display output name in tabs 2026-04-02 20:14:03 -04:00
Hojjat
76495af986 fix(wallpaper): ellipsize display output name in tabs 2026-04-02 20:14:03 -04:00
md
91a4a8a588 fix(appearance): sync UI state with theme config on import and reset 2026-04-02 17:46:06 -04:00
Shane Stanley
18ff4d01de
fix: use more permissive denylist for bare shortcut key validation 2026-04-02 21:26:18 +02:00
Ashley Wulber
98fc3d5952
fix(sound): allow text for left and right to take up more space if ne… (#1941)
…eded

- [x] 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.
- [x] I understand these changes in full and will be able to respond to
review comments.
- [x] My change is accurately described in the commit message.
- [x] My contribution is tested and working as described.
- [x] I have read the [Developer Certificate of
Origin](https://developercertificate.org/) and certify my contribution
under its conditions.
2026-03-31 16:20:32 -06:00
manascb1344
7dc9530a3e
fix(about): deduplicate OpenGL GPU name variants in About page (#1906)
Fixes #1814

## Problem
When a system has an NVIDIA GPU, wgpu enumerates it twice:
- Via Vulkan backend: `"NVIDIA GeForce RTX 3080 Ti Laptop GPU"`
- Via OpenGL backend: `"NVIDIA GeForce RTX 3080 Ti Laptop
GPU/PCIe/SSE2"`

The OpenGL variant includes a renderer suffix (`/PCIe/SSE2`) which
causes the name-based deduplication to fail, resulting in duplicate GPU
entries in Settings -> System -> About.

## Solution
Add `normalize_gpu_name()` helper that strips OpenGL renderer suffixes
(everything after `/`) before comparing names for deduplication. This
ensures both Vulkan and OpenGL representations of the same GPU are
correctly identified as duplicates.

## Changes
- `cosmic-settings/src/pages/system/info.rs`:
  - Added `normalize_gpu_name()` function with doc comment
- Modified `wgpu_graphics()` to use normalized names for `seen_names`
HashSet

## Testing
- [x] `cargo fmt --check` passes
- [x] `cargo clippy --all-features` passes (no new warnings)
- [x] `cargo test --all-features` passes (3/3 tests)
- [x] `just check-features` passes
- [x] Manual testing: Verified on system with NVIDIA GPU that duplicate
entries no longer appear

## Checklist
- [x] I have disclosed use of any AI generated code in my commit
messages.
- [x] I understand these changes in full and will be able to respond to
review comments.
- [x] My change is accurately described in the commit message.
- [x] My contribution is tested and working as described.
- [x] I have read the Developer Certificate of Origin and certify my
contribution under its conditions.

Signed-off-by: manascb1344 <zephop76593@gmail.com>
2026-03-24 16:06:17 -06:00
Michael Murphy
4597822df4
i18n: translation update from Hosted Weblate (#1923) 2026-03-23 20:12:54 +01:00
Jacob Kauffmann
ca581c2c3a docs (QA): Add Bluetooth checklist items 2026-03-23 20:09:08 +01:00
Hojjat
0b9a8cd9c8 fix(bluetooth): call connect() after pair() for unpaired devices
Calling pair() works for keyboards since they do a PIN confirmation
afterward and connect later. For headphones we can connect right away.
Calling pair and connect works for both.
2026-03-23 20:09:08 +01:00
Michael Murphy
1e8bce8395
Merge branch 'master' into weblate-pop-os-cosmic-settings 2026-03-23 19:58:54 +01:00
Hosted Weblate
c2d9959e41
i18n: translation updates from weblate
Co-authored-by: Amadɣas <massiin@proton.me>
Co-authored-by: Aman Alam <aalam@users.noreply.hosted.weblate.org>
Co-authored-by: Arve Eriksson <031299870@telia.com>
Co-authored-by: Baurzhan Muftakhidinov <baurthefirst@gmail.com>
Co-authored-by: ButterflyOfFire <boffire@users.noreply.hosted.weblate.org>
Co-authored-by: David Carvalho <david.snt.carvalho@gmail.com>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Fedorov Alexei <aleksejfedorov963@gmail.com>
Co-authored-by: Geeson Wan <wang14240@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
Co-authored-by: Julien Brouillard <julienbrouillard1@gmail.com>
Co-authored-by: Michael Murphy <michael@mmurphy.dev>
Co-authored-by: VandaL <vandalhj@gmail.com>
Co-authored-by: Walter William Beckerleg Bruckman <spayk.99@protonmail.com>
Co-authored-by: Zahid Rizky Fakhri <zahidrizkyfakhri@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Димко <Dymkovych@proton.me>
Co-authored-by: 麋麓 BigELK176 <BigELK176@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/de/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fi/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/id/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kab/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pa/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ru/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hant/
Translation: Pop OS/COSMIC Settings
2026-03-23 19:10:06 +01:00
Michael Murphy
9ae465c00f
i18n: translation update from Hosted Weblate (#1900) 2026-03-23 16:16:39 +01:00
Hosted Weblate
ffc53eb55f
i18n: translation updates from weblate
Co-authored-by: Amadɣas <massiin@proton.me>
Co-authored-by: Aman Alam <aalam@users.noreply.hosted.weblate.org>
Co-authored-by: Arve Eriksson <031299870@telia.com>
Co-authored-by: Baurzhan Muftakhidinov <baurthefirst@gmail.com>
Co-authored-by: David Carvalho <david.snt.carvalho@gmail.com>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Fedorov Alexei <aleksejfedorov963@gmail.com>
Co-authored-by: Geeson Wan <wang14240@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
Co-authored-by: Julien Brouillard <julienbrouillard1@gmail.com>
Co-authored-by: Michael Murphy <michael@mmurphy.dev>
Co-authored-by: VandaL <vandalhj@gmail.com>
Co-authored-by: Walter William Beckerleg Bruckman <spayk.99@protonmail.com>
Co-authored-by: Zahid Rizky Fakhri <zahidrizkyfakhri@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Димко <Dymkovych@proton.me>
Co-authored-by: 麋麓 BigELK176 <BigELK176@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/de/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fi/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/id/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kab/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pa/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ru/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hant/
Translation: Pop OS/COSMIC Settings
2026-03-22 16:09:58 +00:00
Hojjat
28fb6cc4af fix(bluetooth): call pair() for unpaired devices before connecting 2026-03-20 17:51:24 +01:00
mikairyuu
243d302447
fix(bluetooth): show connected devices without pairing bonds
BlueZ exposes `Paired` and `Connected` as separate states, but the
Bluetooth page currently conflates them in a few places.

As a result, devices that connect successfully without creating a
pairing bond can fail to appear as connected in COSMIC Settings.

This patch separates those two concepts in the UI/state handling:
- initialize a device as connected from `Connected`, not from
  `Connected && Paired`,
- do not let `Paired` updates mutate connection state,
- treat paired or currently connected devices as "known" devices in
  the main device list,
- keep `Forget` available only for actually paired devices.

## User-visible effect

This fixes cases such as the DualShock 3, where the controller is
successfully connected but does not show up as connected in the
Bluetooth settings page.

## Notes

This also matches the behavior already used in
`cosmic-applet-bluetooth`, which treats `Connected` and `Paired` as
separate states and reports a device as connected based on
`is_connected()`, not on pairing state.

A follow-up could rename the section/title to better reflect that it
now contains paired-or-connected devices rather than only paired ones.

- [x] I have disclosed use of any AI generated code in my commit
messages.
- [x] I understand these changes in full and will be able to respond to
review comments.
- [x] My change is accurately described in the commit message.
- [x] My contribution is tested and working as described.
- [x] I have read the [Developer Certificate of
Origin](https://developercertificate.org/) and certify my contribution
under its conditions.
2026-03-19 20:53:31 +01:00
Hojjat
9118be4093 fix: scroll speed slider 2026-03-17 22:12:19 -04:00
Hojjat
5c20aa9a75 fix: keyboard repeat delay and rate sliders 2026-03-17 22:12:19 -04:00
Ashley Wulber
cf7fc32adf
feat: libcosmic iced 0.14 rebase 2026-03-17 21:56:55 +01:00
manascb1344
0020132e63
feat(wifi): add search functionality for filtering WiFi networks 2026-03-13 23:02:38 +01:00
Andrei Ivanou
415e1d8832 fix(bluetooth): improve device list UX and transitions 2026-03-13 20:54:03 +01:00
Jeremy Soller
b3e3738189
i18n: translation update from Hosted Weblate (#1899) 2026-03-09 10:30:46 -06:00
Jeremy Soller
2252964196
Merge branch 'master' into weblate-pop-os-cosmic-settings 2026-03-09 10:30:34 -06:00
Hosted Weblate
40ef4c4539
i18n: translation updates from weblate
Co-authored-by: Amadɣas <massiin@proton.me>
Co-authored-by: Aman Alam <aalam@users.noreply.hosted.weblate.org>
Co-authored-by: Blubberland <github@alias.kardansch.de>
Co-authored-by: Deleted User <noreply+129037@weblate.org>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
Co-authored-by: Michael Murphy <michael@mmurphy.dev>
Co-authored-by: Vilius Paliokas <viliuspaliokas@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/de/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fi/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kab/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/lt/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pa/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translation: Pop OS/COSMIC Settings
2026-03-09 17:04:17 +01:00
Hosted Weblate
536cee276f i18n: translation updates from weblate
Co-authored-by: Amadɣas <massiin@proton.me>
Co-authored-by: Aman Alam <aalam@users.noreply.hosted.weblate.org>
Co-authored-by: Blubberland <github@alias.kardansch.de>
Co-authored-by: Deleted User <noreply+129037@weblate.org>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
Co-authored-by: Michael Murphy <michael@mmurphy.dev>
Co-authored-by: Vilius Paliokas <viliuspaliokas@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/de/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fi/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kab/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/lt/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pa/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translation: Pop OS/COSMIC Settings
2026-03-09 09:56:06 -06:00
Josh Megnauth
c299b6bc67 chore: Use slab! and with_capacity more
COSMIC Setting's code is a mix of `crate::slab!` and manually creating
a Slab. Newer code seems to use the macro, so I replaced the older code
with the macro for consistency and cleanliness.
2026-03-03 16:04:43 +01:00
Michael Murphy
aae22f862c
i18n: translation update from Hosted Weblate (#1888) 2026-03-03 16:04:08 +01:00
Hosted Weblate
5e31a1ee56
i18n: translation updates from weblate
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translation: Pop OS/COSMIC Settings
2026-03-03 00:53:45 +01:00
Michael Murphy
b5a3a9311b
i18n: translation update from Hosted Weblate
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for [Pop OS/COSMIC
Settings](https://hosted.weblate.org/projects/pop-os/cosmic-settings/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/pop-os/cosmic-settings/horizontal-auto.svg)
2026-03-02 17:06:43 +01:00
Hosted Weblate
8df385b2a6
i18n: translation updates from weblate
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Michael Murphy <michael@mmurphy.dev>
Co-authored-by: Walter William Beckerleg Bruckman <spayk.99@protonmail.com>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/oc/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translation: Pop OS/COSMIC Settings
2026-03-02 17:04:52 +01:00
Amadɣas
41639a3aa8
i18n(kab): update translations from Weblate
Currently translated at 71.9% (246 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kab/
2026-03-02 16:26:37 +01:00
Aindriú Mac Giolla Eoin
d5140ebde6
i18n(ga): update translations from Weblate
Currently translated at 100.0% (342 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ga/
2026-03-02 16:26:37 +01:00
Jiri Grönroos
8d5a7c3e60
i18n(fi): update translations from Weblate
Currently translated at 18.4% (63 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fi/
2026-03-02 16:26:37 +01:00
lorduskordus
d0dcf83115
i18n(cs): update translations from Weblate
Currently translated at 100.0% (342 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
2026-03-02 16:26:37 +01:00
Mattias Eriksson
4a15250a9e
i18n(sv): update translations from Weblate
Currently translated at 100.0% (342 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
2026-03-02 16:26:37 +01:00
Arve Eriksson
ec0daf0d2e
i18n(sv): update translations from Weblate
Currently translated at 100.0% (342 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
2026-03-02 16:26:37 +01:00
bittin1ddc447d824349b2
6eb529f662
i18n(sv): update translations from Weblate
Currently translated at 100.0% (342 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
2026-03-02 16:26:37 +01:00
Amadɣas
99977a2fde
i18n(kab): update translations from Weblate
Currently translated at 20.7% (71 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kab/
2026-03-02 16:26:37 +01:00
Ettore Atalan
92f40bc77d
i18n(de): update translations from Weblate
Currently translated at 100.0% (342 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/de/
2026-03-02 16:26:37 +01:00
Aindriú Mac Giolla Eoin
ec806474d9
i18n(ga): update translations from Weblate
Currently translated at 100.0% (342 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ga/
2026-03-02 16:26:37 +01:00
Walter William Beckerleg Bruckman
754b657abf
i18n(zh-CN): update translations from Weblate
Currently translated at 100.0% (342 of 342 strings)

Translation: Pop OS/COSMIC Settings
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hans/
2026-03-02 16:26:37 +01:00
Hosted Weblate
ef72008559
i18n: translation updates from weblate
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: Arve Eriksson <031299870@telia.com>
Co-authored-by: Geeson Wan <wang14240@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Hosted Weblate user 130202 <yakup@users.noreply.hosted.weblate.org>
Co-authored-by: Julien Brouillard <julienbrouillard1@gmail.com>
Co-authored-by: Konstantinos <kostas.lampropoulos94@gmail.com>
Co-authored-by: VandaL <vandalhj@gmail.com>
Co-authored-by: Walter William Beckerleg Bruckman <spayk.99@protonmail.com>
Co-authored-by: Zahid Rizky Fakhri <zahidrizkyfakhri@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: yakup <mtopac2018@gmail.com>
Co-authored-by: Димко <Term0@ukr.net>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/el/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ga/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/id/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/tr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hans/
Translation: Pop OS/COSMIC Settings
2026-03-02 16:26:31 +01:00
Michael Murphy
2524f48c5e
i18n: translation update from Hosted Weblate 2026-02-27 22:17:17 +01:00
Hosted Weblate
23021c519b
i18n: translation updates from weblate
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: Arve Eriksson <031299870@telia.com>
Co-authored-by: Geeson Wan <wang14240@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Julien Brouillard <julienbrouillard1@gmail.com>
Co-authored-by: Konstantinos <kostas.lampropoulos94@gmail.com>
Co-authored-by: VandaL <vandalhj@gmail.com>
Co-authored-by: Zahid Rizky Fakhri <zahidrizkyfakhri@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: yakup <mtopac2018@gmail.com>
Co-authored-by: Димко <Term0@ukr.net>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/el/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ga/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/id/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/tr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hans/
Translation: Pop OS/COSMIC Settings
2026-02-27 18:10:14 +01:00
Hosted Weblate
2d25dce518 i18n: translation updates from weblate
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: Baurzhan Muftakhidinov <baurthefirst@gmail.com>
Co-authored-by: David Carvalho <david.snt.carvalho@gmail.com>
Co-authored-by: Fedorov Alexei <aleksejfedorov963@gmail.com>
Co-authored-by: Geeson Wan <wang14240@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mattias Eriksson <snaggen@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Димко <Term0@ukr.net>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ga/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ru/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hans/
Translation: Pop OS/COSMIC Settings
2026-02-25 14:53:08 +01:00
Hosted Weblate
bd9ae61de2 i18n: translation updates from weblate
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/
Translation: Pop OS/COSMIC Settings
2026-02-25 00:05:09 +01:00
Hosted Weblate
ab95afb0c8 i18n: translation updates from weblate
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: David Carvalho <david.snt.carvalho@gmail.com>
Co-authored-by: Fedorov Alexei <aleksejfedorov963@gmail.com>
Co-authored-by: Feike Donia <feikedonia@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Languages add-on <noreply-addon-languages@weblate.org>
Co-authored-by: VandaL <vandalhj@gmail.com>
Co-authored-by: Vilius Paliokas <viliuspaliokas@gmail.com>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Димко <Term0@ukr.net>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ga/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/lt/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/nl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ru/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translation: Pop OS/COSMIC Settings
2026-02-24 23:58:32 +01:00
Jacob Kauffmann
bf9c82e0c1 i18n: un-capitalize "desktop" to match other apps 2026-02-24 15:38:38 -07:00
Michael Aaron Murphy
d5d1dd59cc i18n: remove periods and untranslated keys 2026-02-24 15:38:38 -07:00
Michael Aaron Murphy
935c31bff4 i18n(en): update comment for main desktop entry 2026-02-24 15:38:38 -07:00
Michael Aaron Murphy
5c00ea5483 i18n(en): remove deprecated keys 2026-02-24 15:38:38 -07:00
Michael Aaron Murphy
4d3d579bbe refactor: use xdg entry comment as page descriptions 2026-02-24 15:38:38 -07:00
Michael Aaron Murphy
d1224aaa5e i18n: generate desktop entries with xdgen 2026-02-24 15:38:38 -07:00
md
28c3510671 fix(wallpaper): prevent adding same image path multiple times 2026-02-23 17:09:36 -07:00
Vukašin Vojinović
eb8d0e349f fix(daytime): improve accuracy of northern_tilt 2026-02-20 12:46:57 +01:00
Vukašin Vojinović
787c5ed49f chore: clippy 2026-02-20 12:46:57 +01:00
Vukašin Vojinović
6e022755f1 chore: update dependencies 2026-02-20 12:46:57 +01:00
Vukašin Vojinović
91e14abe49 chore: use jiff instead of chrono where possible
`chrono` can't fully be removed until `sunrise` supports `jiff`.
Also updates `sunrise` and adapts to changes by handling polar days.
2026-02-20 12:46:57 +01:00
Djo
2019f1c33c
fix(shortcuts): fix shortcut replacement button (#1846)
Co-authored-by: Levi Portenier <levi@system76.com>
2026-02-18 16:39:29 -07:00
Nick Ludwig
52553ca482
fix(appearance): switch light and dark despite suspend/time change 2026-02-17 20:25:25 +01:00
Michael Aaron Murphy
0a1f4901cd release: 1.0.7 2026-02-17 11:02:57 -07:00
Hosted Weblate
a5ea3dc62c i18n: translation updates from weblate
Co-authored-by: Baurzhan Muftakhidinov <baurthefirst@gmail.com>
Co-authored-by: Benmak Kizuna <benmakworkshop@gmail.com>
Co-authored-by: David Carvalho <david.snt.carvalho@gmail.com>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Fedorov Alexei <aleksejfedorov963@gmail.com>
Co-authored-by: Feike Donia <feikedonia@proton.me>
Co-authored-by: Geeson Wan <wang14240@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Julien Brouillard <julienbrouillard1@gmail.com>
Co-authored-by: Mattias Eriksson <snaggen@gmail.com>
Co-authored-by: Zahid Rizky Fakhri <zahidrizkyfakhri@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Димко <Term0@ukr.net>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/be/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/de/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/id/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/nl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ru/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hans/
Translation: Pop OS/COSMIC Settings
2026-02-17 09:49:40 -07:00
Hojjat Abdollahi
408b9aa5af
fix(region): set the language via AccountsService when reordering languages 2026-02-16 21:44:01 +01:00
Jeremy Soller
cd03bdadc7 Add pull request template 2026-02-13 12:35:27 -07:00
Oleksiy Buell
b46a55d423
fix(appearance): 'Reset to default' not appearing 2026-02-12 19:58:57 +01:00
nicole mikołajczyk
a0245a29e8
fix(region): only display 'Install additional languages' if gnome-language-selector is available 2026-02-12 19:58:19 +01:00
Lukas
f5f6d3e8f0
fix(network): show missing WPA3-only networks 2026-02-12 19:56:21 +01:00
Michael Aaron Murphy
1139e34928 fix(sound): only consider active routes when setting volume and mute-ness 2026-02-12 13:54:54 -05:00
Lysander Treumann
9db1681e0d Added updated Cargo.lock 2026-02-11 15:23:45 -07:00
Lysander Treumann
fde0ae0beb Added branch action-on-typing to workspace.dependencies.cosmic-comp-config, which (unless merged) contains necessary changes to build cosmic-settings. 2026-02-11 15:23:45 -07:00
Lysander Treumann
46090ae210 Added "action on typing" setting to workspaces settings page.
Added language information for action on typing for: English, German, Spanish, Swedish
2026-02-11 15:23:45 -07:00
Hosted Weblate
ceed2b9ac1 i18n: translation updates from weblate
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: Baurzhan Muftakhidinov <baurthefirst@gmail.com>
Co-authored-by: David Carvalho <david.snt.carvalho@gmail.com>
Co-authored-by: Fedorov Alexei <aleksejfedorov963@gmail.com>
Co-authored-by: Feike Donia <feikedonia@proton.me>
Co-authored-by: Geeson Wan <wang14240@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Julien Brouillard <julienbrouillard1@gmail.com>
Co-authored-by: Jun Hwi Ku <siguning@gmail.com>
Co-authored-by: Languages add-on <noreply-addon-languages@weblate.org>
Co-authored-by: Mattias Eriksson <snaggen@gmail.com>
Co-authored-by: VandaL <vandalhj@gmail.com>
Co-authored-by: Yelysei <yelysei.matviienko@proton.me>
Co-authored-by: Zahid Rizky Fakhri <zahidrizkyfakhri@gmail.com>
Co-authored-by: jickson john <jickson.john@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Димко <Term0@ukr.net>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ga/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/id/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ko/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/nl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ru/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hans/
Translation: Pop OS/COSMIC Settings
2026-02-09 14:25:50 -07:00
hammerlink
e5f8731eb2
fix(shortcuts): reset input after shortcut replace cancellation 2026-02-06 13:38:36 +01:00
Ashley Wulber
55b502dff3 fix: update connection if the secret channel is not available, but password is 2026-02-02 15:11:36 -05:00
Yolan Romailler
4a311f15a4 feature(keyboard): support user-defined xkb layouts
Signed-off-by: Yolan Romailler <AnomalRoil@users.noreply.github.com>
2026-02-02 13:01:56 -07:00
llvvrui
3182327417
fix(startup-apps): ensure delete dialog shows when triggered from search 2026-02-02 09:43:57 +01:00
Hosted Weblate
5ded31bef1 i18n: translation updates from weblate
Co-authored-by: BeMeritus <bemerituss@gmail.com>
Co-authored-by: David Carvalho <david.snt.carvalho@gmail.com>
Co-authored-by: Hafidz Nasruddin <hafidz@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Yelysei <yelysei.matviienko@proton.me>
Co-authored-by: Zahid Rizky Fakhri <zahidrizkyfakhri@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Димко <Term0@ukr.net>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/id/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translation: Pop OS/COSMIC Settings
2026-01-30 18:58:44 -07:00
Md istekhar
18beed5712
fix(default-apps): Avoid creating dropdowns for empty categories 2026-01-30 00:01:11 +01:00
Jeremy Soller
c654b6764b Update depedendencies 2026-01-29 15:26:43 -07:00
Jeremy Soller
43bd2f7e74 Enable tokio::process feature 2026-01-29 15:26:43 -07:00
Jeremy Soller
be8a904c97 Add just to check features CI dependencies 2026-01-29 15:26:43 -07:00
Jeremy Soller
9d56b0d551 Add cosmic-comp-config feature 2026-01-29 15:26:43 -07:00
Jeremy Soller
7c9f04adcc Fix compilation without wgpu feature 2026-01-29 15:26:43 -07:00
Jeremy Soller
13a7271dde Fix compilation without wayland feature 2026-01-29 15:26:43 -07:00
Jeremy Soller
585ff2760e Add CI test for features 2026-01-29 15:26:43 -07:00
Ashley Wulber
f48bcde63b improv: network authentication 2026-01-29 13:45:02 -05:00
Lysander Treumann
2924fea3ac
fix(wallpaper): save rotation_frequency setting to disk 2026-01-29 17:26:02 +01:00
lucamosca1
eec172cdae Update com.system76.CosmicSettings.StartupApps.desktop ITA 2026-01-27 10:33:07 -07:00
lucamosca1
56dea23d77 Update com.system76.CosmicSettings.Users.policy Fixed 2026-01-27 10:33:07 -07:00
lucamosca1
85f35c45c1 Update com.system76.CosmicSettings.Users.policy ITA 2026-01-27 10:33:07 -07:00
Hosted Weblate
d1a29cfbf6 i18n: translation updates from weblate
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: Aman Alam <aalam@users.noreply.hosted.weblate.org>
Co-authored-by: Arve Eriksson <031299870@telia.com>
Co-authored-by: Baurzhan Muftakhidinov <baurthefirst@gmail.com>
Co-authored-by: David Carvalho <david.snt.carvalho@gmail.com>
Co-authored-by: Eduardo Braga <eduardocbraga@hotmail.com>
Co-authored-by: Geeson Wan <wang14240@gmail.com>
Co-authored-by: Gyro Zeppeli <omazurenko@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Julien Brouillard <julienbrouillard1@gmail.com>
Co-authored-by: Jun Hwi Ku <siguning@gmail.com>
Co-authored-by: VandaL <vandalhj@gmail.com>
Co-authored-by: Yelysei <yelysei.matviienko@proton.me>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: gift983 <983649@my.leicestercollege.ac.uk>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: lorduskordus <lorduskordus@gmail.com>
Co-authored-by: summoner001 <summoner@disroot.org>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Димко <Term0@ukr.net>
Co-authored-by: 김유빈 <k.sein1016@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/cs/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/fr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ga/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/kk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/ko/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/sv/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/uk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-settings/zh_Hans/
Translation: Pop OS/COSMIC Settings
2026-01-27 10:32:42 -07:00
Ashley Wulber
6b4a3d565c
fix(secret): fail early if secret connection fails (#1777) 2026-01-23 13:26:46 -07:00
lucamosca1
1839ad375f Update com.system76.CosmicSettings.Time.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
a552e72438 Update com.system76.CosmicSettings.Sound.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
cd7b39826b Update com.system76.CosmicSettings.LegacyApplications.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
d8387de321 Update com.system76.CosmicSettings.Power.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
b91f2a0b05 Update com.system76.CosmicSettings.Users.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
12ed26a81e Update com.system76.CosmicSettings.Panel.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
a3579ea1a6 Update com.system76.CosmicSettings.Mouse.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
bc68d44393 Update com.system76.CosmicSettings.Sound.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
c8bd8f603d Update com.system76.CosmicSettings.Keyboard.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
8ed5d82499 Update com.system76.CosmicSettings.WindowManagement.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
19a6bc96e6 Update com.system76.CosmicSettings.Vpn.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
56b141d8ee Update com.system76.CosmicSettings.Time.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
f114253293 Update com.system76.CosmicSettings.Notifications.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
9f475ee222 Update com.system76.CosmicSettings.Wireless.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
360c10aaf5 Update com.system76.CosmicSettings.RegionLanguage.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
cc71d557c3 Update com.system76.CosmicSettings.Touchpad.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
74727e6e6a Update com.system76.CosmicSettings.Wallpaper.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
b81cb0ceae Update com.system76.CosmicSettings.Network.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
00d8ea41e4 Update com.system76.CosmicSettings.Wired.desktop
Fixed french label
2026-01-22 18:42:35 +01:00
lucamosca1
9f4882c48c Update com.system76.CosmicSettings.Desktop.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
407c1cfad1 Update com.system76.CosmicSettings.Dock.desktop 2026-01-22 18:42:35 +01:00
lucamosca1
d3d0bff3fb Update com.system76.CosmicSettings.System.desktop 2026-01-22 18:42:35 +01:00
lorduskordus
8c504103fd i18n(cs): Update Czech translation 2026-01-22 17:27:08 +01:00
Doods
45ca79e0b2 chore(wallpaper): Remove unused Message variant 2026-01-21 16:13:12 +01:00
Gerseneck
38a0f54769 i18n(zh_CN): updated translations in desktop entries 2026-01-21 16:11:13 +01:00
186 changed files with 13770 additions and 6853 deletions

8
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View 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.

View file

@ -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

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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" }

View file

@ -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.

View file

@ -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
View 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();
});
}

View file

@ -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);

View file

@ -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(&section.title) .title(&section.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)
}) })

View file

@ -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 = &section.descriptions; let descriptions = &section.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(&section.title) .title(&section.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(&section.title) .title(&section.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)
}) })
} }

View file

@ -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(&section.title) .title(&section.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)

View file

@ -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(&section.title).font(cosmic::font::bold()); let title = text::body(&section.title).font(cosmic::font::bold());
let description = widget::text::body(&section.descriptions[desc]); let description = text::body(&section.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(&section.descriptions[none]).radio(
widget::radio( EavesdroppingKeyboardMode::None,
text::body(&section.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(&section.descriptions[modifiers]).radio(
.width(Length::Fill)
.into(),
]))
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&section.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(&section.descriptions[combination]).radio(
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&section.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(&section.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(&section.descriptions[all]), ))
EavesdroppingKeyboardMode::All, .add(
Some(page.comp_config_xwayland_eavesdropping.keyboard), settings::item::builder(&section.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(
&section.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 = &section.descriptions; let descriptions = &section.descriptions;
widget::settings::section() widget::settings::section()
.title(&section.title) .title(&section.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(

View file

@ -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");

View file

@ -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) {

View file

@ -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

View file

@ -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))
}) })
) )

View file

@ -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()
} }

View file

@ -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()

View file

@ -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(&section.title) .title(&section.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)
}) })

View file

@ -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 = &section.descriptions; let descriptions = &section.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 = &section.descriptions; let descriptions = &section.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 = &section.descriptions; let descriptions = &section.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 = &section.descriptions; let descriptions = &section.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 = &section.descriptions; let descriptions = &section.descriptions;
settings::item::builder(&descriptions[labels["auto_switch"]]) settings::item::builder(&descriptions[labels["auto_switch"]])

View file

@ -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();

View file

@ -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

View file

@ -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(&section.title) .title(&section.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> {

View file

@ -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,

View file

@ -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(&section.title) .title(&section.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(&section.title) .title(&section.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 = &section.descriptions; let descriptions = &section.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();
} }

View file

@ -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> {

View file

@ -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)
}
} }

View file

@ -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(),
); );

View file

@ -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))
} }
}), }),

View file

@ -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(&section.title) .title(&section.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(&section.title) .title(&section.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)
}) })

View file

@ -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 = &section.descriptions;
settings::section()
.title(&section.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 = &section.descriptions; let descriptions = &section.descriptions;
settings::section() settings::section()
.title(&section.title) .title(&section.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 = &section.descriptions; let descriptions = &section.descriptions;
settings::section() settings::section()
.title(&section.title) .title(&section.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 = &section.descriptions;
settings::section()
.title(&section.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)
}) })

View file

@ -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(),

View file

@ -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 = &section.descriptions; let descriptions = &section.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(

View file

@ -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,
}; };

View file

@ -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(&section.title) .title(&section.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"))

View file

@ -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() {

View file

@ -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)

View file

@ -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)

View file

@ -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() {

View file

@ -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 = &section.descriptions; let descriptions = &section.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()
} }

View file

@ -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() {

View file

@ -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() {

View file

@ -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() {

View file

@ -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() {

View file

@ -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"))
} }
} }

View file

@ -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(&section.title) .title(&section.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(&section.title) .title(&section.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])

View file

@ -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(&section.title) .title(&section.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)

View file

@ -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,

View file

@ -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],

View file

@ -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(),
]); ]);

View file

@ -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(&section.descriptions[wifi_txt]) let wifi_enable = widget::settings::item::builder(&section.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(&section.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(&section.descriptions[known_networks_txt]),
widget::settings::section()
.title(&section.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 {
(&section.descriptions[connected_txt], None) (&section.descriptions[connected_txt], None)
} else if page.connecting.contains(&network.ssid) { } else if page.connecting.contains(&network.ssid) {
(&section.descriptions[connecting_txt], None) (&section.descriptions[connecting_txt], None)
} else { } else {
( (
&section.descriptions[connect_txt], &section.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 {
(&section.descriptions[connected_txt], None)
} else if page.connecting.contains(&network.ssid) {
(&section.descriptions[connecting_txt], None)
} else {
(
&section.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()),
&section.descriptions[disconnect_txt],
)
}))
.push(popup_button(
Message::Settings(network.ssid.clone()),
&section.descriptions[settings_txt],
))
.push_maybe(is_known.then(|| {
popup_button(
Message::QRCodeRequest(network.ssid.clone()),
&section.descriptions[share_txt],
)
}))
.push_maybe(is_known.then(|| {
popup_button(
Message::ForgetRequest(network.ssid.clone()),
&section.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(
&section.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(
&section.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) {
(&section.descriptions[connecting_txt], None)
} else {
(
&section.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));
} }
}; };

View file

@ -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();

View file

@ -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()
}; };

View file

@ -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(&section.title)) .push(text::heading(&section.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);
} }

View file

@ -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(&section.title) .title(&section.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(&section.title) .title(&section.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 = &section.descriptions; let descriptions = &section.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()
}) })

View file

@ -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(&section.title) .title(&section.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 = &section.descriptions; let desc = &section.descriptions;
settings::section() settings::section()
.title(&section.title) .title(&section.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()
}) })
} }

View file

@ -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
} }
} }

View file

@ -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 = &section.descriptions; let descriptions = &section.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)
}) })

View file

@ -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(&section.title)
.push( // Time zone select
.add(crate::widget::go_next_with_item(
&section.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(&section.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(),
} }
} }

View file

@ -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"))
} }
} }

View file

@ -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()
}

View file

@ -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)

View file

@ -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
}),
)
} }

View file

@ -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<()> {

View file

@ -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,
} }
}) })
} }

View file

@ -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)
} }

View file

@ -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()
} }

View file

@ -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

View file

@ -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,
) )

View file

@ -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,

View file

@ -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
View file

@ -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

View file

@ -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)

View file

@ -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 = لا توجد شبكات تطابق بحثك.

View file

@ -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%.

View file

@ -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 = Добавяне на ВЧМ

View file

@ -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í.

View file

@ -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

View file

@ -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

View file

@ -0,0 +1 @@
share = Κοινοποίηση δικτύου

View file

@ -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 cant 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 cant 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

View file

@ -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

View file

@ -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.

View file

@ -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
View file

View file

@ -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.

View file

@ -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 laffichage
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, lheure, 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.

View file

@ -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

View file

@ -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ú. Bfhé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ú. Bfhé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 = C panel-left = Ar ch
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] c [left] ar ch
[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] c [left] ar ch
[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] c [left] ar ch
[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] c [left] ar ch
[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] c [left] ar ch
[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] c [left] ar ch
[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 dimeachtaí 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 dimeachtaí 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, dfholáirimh agus dfheidhmchlá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.

View file

@ -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 = वी.पी.एन जोड़ें

View file

@ -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.

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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を追加

View file

@ -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

View file

@ -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 = Сіздің іздеуіңізге ешбір желі сәйкес келмейді.

View file

@ -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 = ವಿ.ಪಿ.ಎನ್ ಸೇರಿಸಿ

View file

@ -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