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
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v6
- name: install toolchain
run: rustup toolchain install 1.80.1 --component rustfmt
run: rustup toolchain install 1.90.0 --component rustfmt
- name: fmt
run: cargo fmt --all --check
@ -27,9 +27,9 @@ jobs:
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
- uses: actions/checkout@v3
- uses: actions/checkout@v6
- name: install toolchain
run: rustup toolchain install 1.80.1 --component clippy
run: rustup toolchain install 1.90.0 --component clippy
- name: clippy
run: cargo clippy --all-features
@ -39,8 +39,20 @@ jobs:
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
- uses: actions/checkout@v3
- uses: actions/checkout@v6
- name: install toolchain
run: rustup show
- name: test
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
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Install desktop-file-utils
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"
[workspace.package]
rust-version = "1.85"
rust-version = "1.90"
[workspace.dependencies]
cosmic-randr = { git = "https://github.com/pop-os/cosmic-randr" }
tokio = { version = "1.49.0", features = ["macros"] }
iced_winit = { git = "https://github.com/pop-os/libcosmic", default-features = false }
[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"
[workspace.dependencies.cosmic-config]
@ -54,21 +62,32 @@ debug = true
# [patch.'https://github.com/pop-os/cosmic-text']
# cosmic-text = { git = "https://github.com/pop-os/cosmic-text//", rev = "b017d7c" }
# [patch.'https://github.com/pop-os/cosmic-protocols']
# 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" }
[patch.'https://github.com/pop-os/cosmic-protocols']
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" }
# [patch.'https://github.com/pop-os/cosmic-settings-daemon']
# cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daemon//", branch = "input_nobuild" }
# For development and testing purposes
# [patch.'https://github.com/pop-os/libcosmic']
# libcosmic = { path = "../libcosmic" }
# cosmic-config = { path = "../libcosmic/cosmic-config" }
# cosmic-theme = { path = "../libcosmic/cosmic-theme" }
# iced_futures = { path = "../libcosmic/iced/futures" }
[patch.'https://github.com/pop-os/libcosmic']
libcosmic = { path = "../libcosmic" }
cosmic-config = { path = "../libcosmic/cosmic-config" }
cosmic-theme = { path = "../libcosmic/cosmic-theme" }
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']
# cosmic-dbus-networkmanager = { path = "../dbus-settings-bindings/networkmanager" }
# upower_dbus = { path = "../dbus-settings-bindings/upower" }
# 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.
#### Bluetooth
- [ ] Bluetooth device connects.
- [ ] Paired device can be disconnected & reconnected.
- [ ] Paired device can be forgotten & connecting again works.
### Desktop
#### Wallpaper
@ -32,7 +38,7 @@ This document provides a regression testing checklist for COSMIC Settings and th
#### Dock
- [ ] 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.
- [ ] All Style settings take effect as expected.
@ -63,13 +69,13 @@ TBD after devices/profiles are fixed.
#### 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
#### 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 seconds takes effect in Settings preview and on top panel.
- [ ] Changing first day of week takes effect in Calendar applet.

View file

@ -1,18 +1,22 @@
[package]
name = "cosmic-settings"
version = "1.0.2"
version = "1.0.7"
edition = "2024"
license = "GPL-3.0-only"
publish = false
[build-dependencies]
xdgen = "0.1"
[dependencies]
accounts-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
anyhow = "1.0"
ashpd = { version = "0.12", default-features = false, features = [
"tokio",
], optional = true }
chrono = "0.4.42"
clap = { version = "4.5.54", features = ["derive"] }
chrono = "0.4"
jiff = "0.2"
clap = { version = "4.5.59", features = ["derive"] }
color-eyre = "0.6.5"
cosmic-bg-config.workspace = 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-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"
eyre = "0.6.12"
freedesktop-desktop-entry = "0.8.1"
futures = "0.3.31"
futures = "0.3.32"
hostname-validator = "1.1.1"
hostname1-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings", optional = true }
i18n-embed-fl = "0.10.0"
@ -56,31 +60,32 @@ indexmap = "2.13.0"
itertools = "0.14.0"
itoa = "1.0.17"
libcosmic.workspace = true
iced_winit.workspace = 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 }
notify = "8.2.0"
regex = "1.12.2"
regex = "1.12.3"
ron = "0.12"
rust-embed = "8.9.0"
rust-embed = "8.11.0"
sctk = { workspace = true, optional = true }
secure-string = "0.3.0"
serde = { version = "1.0.228", features = ["derive"] }
slab = "0.4.11"
slab = "0.4.12"
slotmap = "1.1.1"
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 }
tokio = { workspace = true, features = ["fs", "io-util", "sync"] }
tokio = { workspace = true, features = ["fs", "io-util", "process", "sync"] }
tracing = "0.1.44"
tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
udev = { version = "0.9.3", 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 }
url = "2.5.8"
xkb-data = "0.2.1"
xkb-data = "0.2.2"
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",
], optional = true }
zbus_polkit = { version = "5.0.0", optional = true }
@ -92,6 +97,7 @@ gettext-rs = { version = "0.7.7", features = [
], optional = true }
num-traits = "0.2"
pwhash = "1"
which = "8.0.0"
[dependencies.icu]
version = "2.1.1"
@ -112,6 +118,7 @@ gettext = ["dep:gettext-rs"]
# Default features for Linux
linux = [
"cosmic-comp-config",
"page-accessibility",
"page-about",
"page-bluetooth",
@ -133,9 +140,9 @@ linux = [
# Pages
page-accessibility = [
"cosmic-comp-config",
"dep:sctk",
"dep:cosmic-protocols",
"dep:cosmic-comp-config",
"dep:cosmic-settings-config",
"dep:cosmic-settings-daemon-config",
"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-display = ["dep:udev"]
page-input = [
"cosmic-comp-config",
"gettext",
"dep:cosmic-comp-config",
"dep:cosmic-settings-config",
"dep:udev",
"dep:xkeysym",
"wayland",
]
page-legacy-applications = ["dep:cosmic-comp-config"]
page-legacy-applications = ["cosmic-comp-config", "dep:cosmic-randr"]
page-networking = [
"dep:cosmic-settings-network-manager-subscription",
"xdg-portal",
@ -167,18 +174,25 @@ page-networking = [
"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-users = ["xdg-portal", "dep:accounts-zbus", "dep:zbus", "dep:zbus_polkit"]
page-window-management = ["dep:cosmic-settings-config"]
page-workspaces = ["dep:cosmic-comp-config"]
page-window-management = ["cosmic-comp-config", "dep:cosmic-settings-config"]
page-workspaces = ["cosmic-comp-config"]
# Other features
a11y = ["libcosmic/a11y"]
ashpd = ["dep:ashpd"]
cosmic-comp-config = ["dep:cosmic-comp-config"]
dbus-config = ["libcosmic/dbus-config", "cosmic-config/dbus"]
single-instance = ["libcosmic/single-instance"]
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"]
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,
},
};
#[cfg(any(feature = "page-window-management", feature = "page-accessibility"))]
#[cfg(feature = "cosmic-comp-config")]
use cosmic_comp_config::CosmicCompConfig;
#[cfg(feature = "wayland")]
use cosmic_panel_config::CosmicPanelConfig;
@ -99,6 +99,7 @@ impl SettingsApp {
PageCommands::Displays => self.pages.page_id::<display::Page>(),
#[cfg(feature = "wayland")]
PageCommands::Dock => self.pages.page_id::<desktop::dock::Page>(),
#[cfg(feature = "wayland")]
PageCommands::DockApplet => self.pages.page_id::<desktop::dock::applets::Page>(),
#[cfg(feature = "page-input")]
PageCommands::Input => self.pages.page_id::<input::Page>(),
@ -114,6 +115,7 @@ impl SettingsApp {
PageCommands::Network => self.pages.page_id::<networking::Page>(),
#[cfg(feature = "wayland")]
PageCommands::Panel => self.pages.page_id::<desktop::panel::Page>(),
#[cfg(feature = "wayland")]
PageCommands::PanelApplet => {
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();
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),
#[cfg(feature = "wayland")]
PanelConfig(Box<CosmicPanelConfig>),
#[cfg(any(feature = "page-window-management", feature = "page-accessibility"))]
#[cfg(feature = "cosmic-comp-config")]
CompConfig(Box<CosmicCompConfig>),
SearchActivate,
SearchActivateWith(String),
@ -356,7 +358,7 @@ impl cosmic::Application for SettingsApp {
Message::PanelConfig(Box::new(update.config))
}),
page.subscription(self.core()).map(Message::PageMessage),
#[cfg(any(feature = "page-window-management", feature = "page-accessibility"))]
#[cfg(feature = "cosmic-comp-config")]
self.core()
.watch_config::<CosmicCompConfig>("com.system76.CosmicComp")
.map(|update| {
@ -684,6 +686,13 @@ impl cosmic::Application for SettingsApp {
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")]
@ -778,7 +787,7 @@ impl cosmic::Application for SettingsApp {
return Task::batch(tasks);
}
#[cfg(any(feature = "page-window-management", feature = "page-accessibility"))]
#[cfg(feature = "cosmic-comp-config")]
Message::CompConfig(comp_config) => {
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) {
self.sub_page_view(sub_pages)
} else {
return self.page_container(row::row());
return self.page_container(cosmic::widget::space());
};
container(view).into()
@ -1048,7 +1057,7 @@ impl SettingsApp {
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)
.align_y(iced::Alignment::End)
.push(page_header);

View file

@ -3,8 +3,8 @@ use std::fmt::Write;
use cosmic::{
Apply,
iced::{Element, Length},
iced_core::text::Wrapping,
iced::core::text::Wrapping,
iced::{Element, Length, stream},
surface,
widget::{self, icon, settings, svg, text},
};
@ -129,9 +129,9 @@ impl page::Page<crate::pages::Message> for Page {
Ok((tx, mut rx)) => {
self.wayland_thread = Some(tx);
return cosmic::Task::stream(cosmic::iced_futures::stream::channel(
return cosmic::Task::stream(stream::channel(
1,
|mut sender| async move {
|mut sender: futures::channel::mpsc::Sender<crate::pages::Message>| async move {
while let Some(event) = rx.recv().await {
let _ = sender
.send(crate::pages::Message::AccessibilityMagnifier(
@ -219,19 +219,18 @@ pub fn magnifier(
.add(
settings::item::builder(&descriptions[magnifier])
.description(&descriptions[controls])
.control(
widget::toggler(page.magnifier_state).on_toggle(Message::SetMagnifier),
),
.toggler(page.magnifier_state, 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(
&descriptions[increment],
widget::dropdown::popup_dropdown(
@ -247,10 +246,10 @@ pub fn magnifier(
},
),
))
.add(settings::item(
&descriptions[signin],
widget::toggler(page.zoom_config.start_on_login).on_toggle(Message::SetSignin),
))
.add(
settings::item::builder(&descriptions[signin])
.toggler(page.zoom_config.start_on_login, Message::SetSignin),
)
.apply(Element::from)
.map(crate::pages::Message::AccessibilityMagnifier)
})
@ -300,36 +299,21 @@ pub fn view_movement() -> section::Section<crate::pages::Message> {
settings::section()
.title(&section.title)
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&descriptions[continuous]),
ZoomMovement::Continuously,
Some(page.zoom_config.view_moves),
Message::SetMovement,
)
.width(Length::Fill)
.into(),
]))
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&descriptions[onedge]),
ZoomMovement::OnEdge,
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(),
]))
.add(settings::item::builder(&descriptions[continuous]).radio(
ZoomMovement::Continuously,
Some(page.zoom_config.view_moves),
Message::SetMovement,
))
.add(settings::item::builder(&descriptions[onedge]).radio(
ZoomMovement::OnEdge,
Some(page.zoom_config.view_moves),
Message::SetMovement,
))
.add(settings::item::builder(&descriptions[centered]).radio(
ZoomMovement::Centered,
Some(page.zoom_config.view_moves),
Message::SetMovement,
))
.apply(Element::from)
.map(crate::pages::Message::AccessibilityMagnifier)
})

View file

@ -1,10 +1,11 @@
use cosmic::{
Task,
Apply, Element, Task,
cosmic_theme::{CosmicPalette, ThemeBuilder},
iced_core::text::Wrapping,
iced::core::text::Wrapping,
iced::stream,
surface,
theme::CosmicTheme,
widget::{dropdown, settings, text, toggler},
widget::{dropdown, settings, text},
};
pub use cosmic_comp_config::ZoomMovement;
use cosmic_config::CosmicConfigEntry;
@ -127,9 +128,9 @@ impl page::Page<crate::pages::Message> for Page {
Ok((tx, mut rx)) => {
self.wayland_thread = Some(tx);
return cosmic::Task::stream(cosmic::iced_futures::stream::channel(
return cosmic::Task::stream(stream::channel(
1,
|mut sender| async move {
|mut sender: futures::channel::mpsc::Sender<super::Message>| async move {
while let Some(event) = rx.recv().await {
let _ = sender
.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| {
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()
.title(&section.title)
.add(
@ -209,31 +226,13 @@ pub fn vision() -> section::Section<crate::pages::Message> {
},
),
)
.add({
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]
};
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(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(
settings::item::builder(&descriptions[high_contrast])
.toggler(page.theme.is_high_contrast, |enable| {
@ -241,21 +240,19 @@ pub fn vision() -> section::Section<crate::pages::Message> {
}),
)
.add(
settings::item::builder(&descriptions[invert_colors]).control(
toggler(page.screen_inverted).on_toggle_maybe(
page.wayland_available
.is_some_and(|ver| ver >= 2)
.then_some(|set| Message::SetScreenInverted(set).into()),
),
settings::item::builder(&descriptions[invert_colors]).toggler_maybe(
page.screen_inverted,
page.wayland_available
.is_some_and(|ver| ver >= 2)
.then_some(|set| Message::SetScreenInverted(set).into()),
),
)
.add(
settings::item::builder(&descriptions[color_filters]).control(
toggler(page.screen_filter_active).on_toggle_maybe(
page.wayland_available
.is_some_and(|ver| ver >= 2)
.then_some(|set| Message::SetScreenFilterActive(set).into()),
),
settings::item::builder(&descriptions[color_filters]).toggler_maybe(
page.screen_filter_active,
page.wayland_available
.is_some_and(|ver| ver >= 2)
.then_some(|set| Message::SetScreenFilterActive(set).into()),
),
)
.add({
@ -303,13 +300,11 @@ pub fn hearing() -> section::Section<crate::pages::Message> {
settings::section()
.title(&section.title)
.add(
cosmic::Element::from(
settings::item::builder(&descriptions[mono])
.toggler(page.daemon_config.mono_sound, Message::SetSoundMono),
)
.map(crate::pages::Message::Accessibility),
settings::item::builder(&descriptions[mono])
.toggler(page.daemon_config.mono_sound, Message::SetSoundMono),
)
.into()
.apply(Element::from)
.map(crate::pages::Message::Accessibility)
})
}

View file

@ -10,7 +10,9 @@ use std::{
};
use cosmic::{
Apply, Element, Task, surface,
Apply, Element, Task,
iced::Alignment,
surface,
widget::{self, dropdown, icon, settings},
};
use cosmic_config::{ConfigGet, ConfigSet};
@ -103,7 +105,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("default-apps", "preferences-default-applications-symbolic")
.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> {
@ -282,146 +284,265 @@ impl Page {
fn apps() -> Section<crate::pages::Message> {
Section::default().view::<Page>(move |_binder, page, section| {
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()
.title(&section.title)
.add({
let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER];
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)),
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "web-browser"),
widget::text(fl!("default-apps", "not-installed")),
)
.icons(Cow::Borrowed(&meta.icons)),
)
.min_item_width(300.0)
.align_items(Alignment::Center)
} else {
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({
let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER];
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)),
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "file-manager"),
widget::text(fl!("default-apps", "not-installed")),
)
.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({
let meta = &mime_apps.apps[DROPDOWN_MAIL];
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)),
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "mail-client"),
widget::text(fl!("default-apps", "not-installed")),
)
.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({
let meta = &mime_apps.apps[DROPDOWN_MUSIC];
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)),
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "music"),
widget::text(fl!("default-apps", "not-installed")),
)
.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({
let meta = &mime_apps.apps[DROPDOWN_VIDEO];
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)),
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "video"),
widget::text(fl!("default-apps", "not-installed")),
)
.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({
let meta = &mime_apps.apps[DROPDOWN_PHOTO];
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)),
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "photos"),
widget::text(fl!("default-apps", "not-installed")),
)
.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({
let meta = &mime_apps.apps[DROPDOWN_CALENDAR];
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)),
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "calendar"),
widget::text(fl!("default-apps", "not-installed")),
)
.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({
let meta = &mime_apps.apps[DROPDOWN_TERMINAL];
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)),
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "terminal"),
widget::text(fl!("default-apps", "not-installed")),
)
.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({
let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR];
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)),
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "text-editor"),
widget::text(fl!("default-apps", "not-installed")),
)
.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)
.map(crate::pages::Message::DefaultApps)

View file

@ -12,16 +12,15 @@ use std::{
use cosmic::{
Apply, Element, Task,
cosmic_config::{self, ConfigGet, ConfigSet},
iced::Length,
iced::stream,
surface,
widget::{self, dropdown, text},
widget::{self, dropdown, settings, text},
};
use cosmic_comp_config::{EavesdroppingKeyboardMode, XwaylandDescaling, XwaylandEavesdropping};
use cosmic_randr_shell::List;
use cosmic_settings_page::Section;
use cosmic_settings_page::{self as page, section};
use futures::SinkExt;
use slab::Slab;
use slotmap::SlotMap;
use tokio::sync::oneshot;
use tracing::error;
@ -104,7 +103,7 @@ impl page::Page<crate::pages::Message> for Page {
"preferences-X11-applications-symbolic",
)
.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> {
@ -136,9 +135,9 @@ impl page::Page<crate::pages::Message> for Page {
});
// 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,
|mut sender| async move {
|mut sender: futures::channel::mpsc::Sender<_>| async move {
while let Some(message) = rx.recv().await {
if let cosmic_randr::Message::ManagerDone = message
&& !refresh_pending.swap(true, Ordering::SeqCst)
@ -265,89 +264,75 @@ impl Page {
}
pub fn legacy_application_global_shortcuts() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let desc = descriptions.insert(fl!("legacy-app-global-shortcuts", "desc"));
let none = descriptions.insert(fl!("legacy-app-global-shortcuts", "none"));
let modifiers = descriptions.insert(fl!("legacy-app-global-shortcuts", "modifiers"));
let combination = descriptions.insert(fl!("legacy-app-global-shortcuts", "combination"));
let all = descriptions.insert(fl!("legacy-app-global-shortcuts", "all"));
let mouse = descriptions.insert(fl!("legacy-app-global-shortcuts", "mouse"));
crate::slab!(descriptions {
desc = fl!("legacy-app-global-shortcuts", "desc");
none = fl!("legacy-app-global-shortcuts", "none");
modifiers = fl!("legacy-app-global-shortcuts", "modifiers");
combination = fl!("legacy-app-global-shortcuts", "combination");
all = fl!("legacy-app-global-shortcuts", "all");
mouse = fl!("legacy-app-global-shortcuts", "mouse");
});
Section::default()
.title(fl!("legacy-app-global-shortcuts"))
.descriptions(descriptions)
.view::<Page>(move |_binder, page, section| {
let title = widget::text::body(&section.title).font(cosmic::font::bold());
let description = widget::text::body(&section.descriptions[desc]);
let title = text::body(&section.title).font(cosmic::font::bold());
let description = text::body(&section.descriptions[desc]);
let content = widget::settings::section::<'_, crate::pages::Message>()
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&section.descriptions[none]),
EavesdroppingKeyboardMode::None,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|t| Message::SetXwaylandKeyboardMode(t).into(),
)
.width(Length::Fill)
.into(),
]))
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&section.descriptions[modifiers]),
let content = settings::section::<'_, crate::pages::Message>()
.add(settings::item::builder(&section.descriptions[none]).radio(
EavesdroppingKeyboardMode::None,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|t| Message::SetXwaylandKeyboardMode(t).into(),
))
.add(
settings::item::builder(&section.descriptions[modifiers]).radio(
EavesdroppingKeyboardMode::Modifiers,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|t| Message::SetXwaylandKeyboardMode(t).into(),
)
.width(Length::Fill)
.into(),
]))
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&section.descriptions[combination]),
),
)
.add(
settings::item::builder(&section.descriptions[combination]).radio(
EavesdroppingKeyboardMode::Combinations,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|t| Message::SetXwaylandKeyboardMode(t).into(),
)
.width(Length::Fill)
.into(),
]))
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&section.descriptions[all]),
EavesdroppingKeyboardMode::All,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|t| Message::SetXwaylandKeyboardMode(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()),
));
),
)
.add(settings::item::builder(&section.descriptions[all]).radio(
EavesdroppingKeyboardMode::All,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
|t| Message::SetXwaylandKeyboardMode(t).into(),
))
.add(
settings::item::builder(&section.descriptions[mouse])
.toggler(page.comp_config_xwayland_eavesdropping.pointer, |t| {
Message::SetXwaylandMouseButtonMode(t).into()
}),
);
widget::column::with_capacity(3)
.push(title)
.push(description)
.push(content)
.spacing(cosmic::theme::active().cosmic().spacing.space_xxs)
.spacing(cosmic::theme::spacing().space_xxs)
.apply(cosmic::Element::from)
.map(Into::into)
})
}
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()
.title(fl!("legacy-app-scaling"))
@ -356,42 +341,33 @@ pub fn legacy_application_scaling() -> Section<crate::pages::Message> {
let descriptions = &section.descriptions;
widget::settings::section()
.title(&section.title)
.add(widget::settings::item_row(vec![
widget::radio(
widget::column()
.push(text::body(&descriptions[gaming]))
.push(text::caption(&descriptions[gaming_desc])),
XwaylandDescaling::Fractional,
Some(page.comp_config_descale_xwayland),
Message::SetXwaylandDescaling,
)
.width(Length::Fill)
.into(),
]))
.add(widget::settings::item_row(vec![
widget::radio(
widget::column()
.push(text::body(&descriptions[apps]))
.push(text::caption(&descriptions[apps_desc])),
XwaylandDescaling::Enabled,
Some(page.comp_config_descale_xwayland),
Message::SetXwaylandDescaling,
)
.width(Length::Fill)
.into(),
]))
.add(widget::settings::item_row(vec![
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::builder(&descriptions[gaming])
.description(&descriptions[gaming_desc])
.radio(
XwaylandDescaling::Fractional,
Some(page.comp_config_descale_xwayland),
Message::SetXwaylandDescaling,
),
)
.add(
widget::settings::item::builder(&descriptions[apps])
.description(&descriptions[apps_desc])
.radio(
XwaylandDescaling::Enabled,
Some(page.comp_config_descale_xwayland),
Message::SetXwaylandDescaling,
),
)
.add(
widget::settings::item::builder(&descriptions[compat])
.description(&descriptions[compat_desc])
.radio(
XwaylandDescaling::Disabled,
Some(page.comp_config_descale_xwayland),
Message::SetXwaylandDescaling,
),
)
.add(widget::settings::item(
&descriptions[preferred_display],
dropdown::popup_dropdown(

View file

@ -101,7 +101,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> Info {
page::Info::new("startup-apps", "preferences-startup-applications-symbolic")
.title(fl!("startup-apps"))
.description(fl!("startup-apps", "desc"))
.description(fl!("xdg-entry-startup-apps-comment"))
}
fn content(
&self,
@ -132,6 +132,9 @@ impl page::Page<crate::pages::Message> for Page {
}
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 locales = freedesktop_desktop_entry::get_languages_from_env();
@ -262,6 +265,7 @@ impl Page {
if !confirm {
self.app_to_remove = Some(app);
self.target_directory_type = Some(directory_type);
return cosmic::task::message(crate::app::Message::Page(self.entity));
} else {
let mut file_name = app.clone().appid;
file_name.push_str(".desktop");

View file

@ -1,15 +1,14 @@
// Copyright 2024 System76 <info@system76.com>
// SPDX-License-Identifier: GPL-3.0-only
use cosmic::iced::core::text::Wrapping;
use cosmic::iced::{Alignment, Length, color};
use cosmic::iced_core::text::Wrapping;
use cosmic::widget::{self, settings, text};
use cosmic::widget::{self, settings, space::horizontal as horizontal_space, text};
use cosmic::{Apply, Element, Task, theme};
use cosmic_settings_bluetooth_subscription::*;
use cosmic_settings_page::{self as page, Section, section};
use futures::channel::oneshot;
use futures::{SinkExt, StreamExt};
use slab::Slab;
use slotmap::SlotMap;
use std::collections::{HashMap, HashSet};
use std::sync::Arc;
@ -167,7 +166,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("bluetooth", "bluetooth-symbolic")
.title(fl!("bluetooth"))
.description(fl!("bluetooth", "desc"))
.description(fl!("xdg-entry-bluetooth-comment"))
}
fn content(
@ -725,9 +724,9 @@ impl Page {
}
fn status() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let bluetooth = descriptions.insert(fl!("bluetooth"));
crate::slab!(descriptions {
bluetooth = fl!("bluetooth");
});
Section::default()
.descriptions(descriptions)
@ -773,12 +772,10 @@ fn status() -> Section<crate::pages::Message> {
}
widget::list_column()
.add(
bluetooth_toggle.control(
widget::toggler(matches!(status, Active::Enabling | Active::Enabled))
.on_toggle(|active| Message::SetActive(active).into()),
),
)
.add(bluetooth_toggle.toggler(
matches!(status, Active::Enabling | Active::Enabled),
|active| Message::SetActive(active).into(),
))
.apply(Element::from)
})
}
@ -812,7 +809,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
page.model.selected_adapter.as_ref().map(|adapter| {
page.model
.devices_for_adapter(adapter)
.any(|(_, device)| device.paired)
.any(|(_, device)| device.paired || device.is_connected())
}) == Some(true)
&& page.model.active != Active::Disabled
})
@ -823,7 +820,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
page.model
.devices_for_adapter(page.model.selected_adapter.as_ref().unwrap())
.filter_map(|(path, device)| {
if !device.paired {
if !(device.paired || device.is_connected()) {
return None;
}
@ -840,17 +837,19 @@ fn connected_devices() -> Section<crate::pages::Message> {
.position(widget::popover::Position::Bottom)
.on_close(Message::PopupDevice(None))
.popup(
widget::column()
widget::column::with_capacity(2)
.push_maybe(device.is_connected().then(|| {
popup_button(
Some(Message::DisconnectDevice(path.clone())),
&descriptions[device_disconnect],
)
}))
.push(popup_button(
Some(Message::ForgetDevice(path.clone())),
&descriptions[device_forget],
))
.push_maybe(device.paired.then(|| {
popup_button(
Some(Message::ForgetDevice(path.clone())),
&descriptions[device_forget],
)
}))
.width(Length::Fixed(200.0))
.apply(widget::container)
.padding(theme::spacing().space_xxs)
@ -879,7 +878,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
.wrapping(Wrapping::Word)
.into()
},
widget::horizontal_space().into(),
horizontal_space().into(),
match device.enabled {
Active::Enabled => widget::text(&descriptions[device_connected]).into(),
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> {
let mut descriptions = Slab::new();
let device_connecting = descriptions.insert(fl!("bluetooth", "connecting"));
crate::slab!(descriptions {
device_connect = fl!("bluetooth", "connect");
device_connecting = fl!("bluetooth", "connecting");
});
Section::default()
.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
.devices_for_adapter(adapter)
.any(|(_, device)| !device.paired)
.any(|(_, device)| !device.paired || !device.is_connected())
}) == Some(true)
&& page.model.active != Active::Disabled
})
@ -925,7 +925,7 @@ fn available_devices() -> Section<crate::pages::Message> {
page.model
.devices_for_adapter(page.model.selected_adapter.as_ref().unwrap())
.filter_map(|(path, device)| {
if device.paired {
if device.paired || device.is_connected() {
return None::<Element<'_, Message>>;
}
@ -936,21 +936,26 @@ fn available_devices() -> Section<crate::pages::Message> {
let mut items = vec![
widget::icon::from_name(device.icon).size(16).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(
text(&descriptions[device_connecting])
.class(theme::Text::Color(color!(128, 128, 128)))
.into(),
);
}
Some(
widget::mouse_area(settings::item_row(items))
.on_press(Message::ConnectDevice(path.clone()))
.into(),
)
Some(widget::mouse_area(settings::item_row(items)).into())
})
.fold(section, settings::Section::add)
.apply(Element::from)
@ -959,9 +964,9 @@ fn available_devices() -> Section<crate::pages::Message> {
}
fn multiple_adapter() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let device_connected = descriptions.insert(fl!("bluetooth", "connected"));
crate::slab!(descriptions {
device_connected = fl!("bluetooth", "connected");
});
Section::default()
.title(fl!("bluetooth-adapters"))
@ -981,11 +986,9 @@ fn multiple_adapter() -> Section<crate::pages::Message> {
widget::icon::from_name("bluetooth-symbolic")
.size(20)
.into(),
widget::horizontal_space()
.width(theme::spacing().space_xxs)
.into(),
horizontal_space().width(theme::spacing().space_xxs).into(),
text(&adapter.alias).wrapping(Wrapping::Word).into(),
widget::horizontal_space().into(),
horizontal_space().into(),
widget::icon::from_name("go-next-symbolic").into(),
];
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();
if manager.mode().is_dark != is_dark {
if let Err(err) = manager.dark_mode(is_dark) {
return Err(color_eyre::eyre::eyre!(
"Failed to set {} mode: {:?}",
mode_str,
err
));
}
if manager.mode().is_dark != is_dark
&& let Err(err) = manager.dark_mode(is_dark)
{
return Err(color_eyre::eyre::eyre!(
"Failed to set {} mode: {:?}",
mode_str,
err
));
}
manager

View file

@ -2,7 +2,7 @@ use cosmic::app::{ContextDrawer, context_drawer};
use cosmic::config::CosmicTk;
use cosmic::cosmic_config::{Config, ConfigSet};
use cosmic::cosmic_theme::Spacing;
use cosmic::iced_core::{Color, Length};
use cosmic::iced::core::{Color, Length};
use cosmic::widget::{
ColorPickerModel, color_picker::ColorPickerUpdate, container, flex_row, settings, text,
};
@ -42,11 +42,11 @@ pub struct Content {
tk_config: Option<Config>,
comp_config: cosmic_config::Config,
clip_floating: bool,
clip_tiled: bool,
shadow_tiled: bool,
#[cfg(feature = "cosmic-comp-config")]
appearance_conf: cosmic_comp_config::AppearanceConfig,
}
#[cfg(feature = "cosmic-comp-config")]
#[derive(Debug, Clone)]
pub enum CornerMessage {
ClipFloating(bool),
@ -79,6 +79,7 @@ impl From<&theme_manager::Manager> for Content {
fn from(theme_manager: &theme_manager::Manager) -> Self {
let theme = theme_manager.theme();
let comp_config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap();
#[cfg(feature = "cosmic-comp-config")]
let appearance_conf = comp_config
.get::<cosmic_comp_config::AppearanceConfig>("appearance_settings")
.unwrap_or_default();
@ -129,9 +130,8 @@ impl From<&theme_manager::Manager> for Content {
icon_handles: Vec::new(),
tk_config: CosmicTk::config().ok(),
comp_config,
clip_floating: appearance_conf.clip_floating_windows,
clip_tiled: appearance_conf.clip_tiled_windows,
shadow_tiled: appearance_conf.shadow_tiled_windows,
#[cfg(feature = "cosmic-comp-config")]
appearance_conf,
}
}
}
@ -257,6 +257,7 @@ impl Content {
Task::none()
}
#[cfg(feature = "cosmic-comp-config")]
pub fn update_shadow_and_corners(
&mut self,
message: CornerMessage,
@ -264,22 +265,20 @@ impl Content {
) -> Task<app::Message> {
match message {
CornerMessage::ClipFloating(enabled) => {
self.clip_floating = enabled;
self.appearance_conf.clip_floating_windows = enabled;
}
CornerMessage::ClipTiled(enabled) => {
self.clip_tiled = enabled;
self.appearance_conf.clip_tiled_windows = enabled;
}
CornerMessage::ShadowTiled(enabled) => {
self.shadow_tiled = enabled;
self.appearance_conf.shadow_tiled_windows = enabled;
}
}
let conf = cosmic_comp_config::AppearanceConfig {
clip_floating_windows: self.clip_floating,
clip_tiled_windows: self.clip_tiled,
shadow_tiled_windows: self.shadow_tiled,
};
if let Err(err) = self.comp_config.set("appearance_settings", conf) {
if let Err(err) = self
.comp_config
.set("appearance_settings", self.appearance_conf)
{
error!(?err, "Failed to set config 'appearance_settings'");
}
@ -471,6 +470,7 @@ impl Content {
crate::pages::Message::CloseContextDrawer,
),
#[cfg(feature = "cosmic-comp-config")]
ContextView::ShadowAndCorners => context_drawer(
self.shadow_and_corners(),
crate::pages::Message::CloseContextDrawer,
@ -527,13 +527,14 @@ impl Content {
.map(crate::pages::Message::Appearance)
}
#[cfg(feature = "cosmic-comp-config")]
pub fn shadow_and_corners(&self) -> Element<'_, crate::pages::Message> {
let Spacing { space_m, .. } = cosmic::theme::spacing();
cosmic::iced::widget::column![
settings::section().title(fl!("shadows-floating")).add(
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))
})
),
@ -541,13 +542,13 @@ impl Content {
.title(fl!("shadows-tiling"))
.add(
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))
})
)
.add(
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))
})
)

View file

@ -1,18 +1,17 @@
// Copyright 2024 System76 <info@system76.com>
// SPDX-License-Identifier: GPL-3.0-only
use std::rc::Rc;
use std::sync::Arc;
use cosmic::{
Apply, Element, Task,
config::{CosmicTk, FontConfig},
iced_core::text::Wrapping,
widget::{self, settings, svg},
widget,
};
use cosmic_config::ConfigSet;
use crate::app;
use crate::widget::selection_context_item;
use super::{ContextView, Message, drawer};
@ -177,10 +176,6 @@ impl Model {
context_view: &ContextView,
callback: impl Fn(Arc<str>) -> 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 {
ContextView::MonospaceFont => {
(&self.monospace_font_families, &self.monospace_font.family)
@ -193,36 +188,17 @@ impl Model {
families = &self.font_filter;
}
let list = families.iter().fold(widget::list_column(), |list, family| {
let selected = &**family == current_font;
list.add(
settings::item_row(vec![
widget::text::body(&**family)
.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(callback(family.clone())),
)
});
let list = families.iter().fold(
widget::list_column::with_capacity(families.len()),
|list, family| {
let selected = &**family == current_font;
list.add(selection_context_item(
family,
selected,
callback(family.clone()),
))
},
);
list.into()
}

View file

@ -32,11 +32,11 @@ pub fn button(
let theme = theme.cosmic();
let background = Background::Color(theme.palette.neutral_4.into());
cosmic::widget::column()
cosmic::widget::column::with_capacity(2)
.push(
cosmic::widget::button::custom_image_button(
cosmic::widget::column::with_children([
cosmic::widget::row()
cosmic::widget::row::with_capacity(ICON_PREV_ROW)
.extend(
handles
.iter()
@ -47,7 +47,7 @@ pub fn button(
)
.spacing(theme.space_xxxs())
.into(),
cosmic::widget::row()
cosmic::widget::row::with_capacity(ICON_PREV_ROW)
.extend(
handles
.iter()

View file

@ -16,13 +16,13 @@ use cosmic::app::ContextDrawer;
use cosmic::config::CosmicTk;
use cosmic::cosmic_config::{Config, ConfigSet, CosmicConfigEntry};
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")]
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::{
button, color_picker::ColorPickerUpdate, container, horizontal_space, radio, row, settings,
text,
button, color_picker::ColorPickerUpdate, container, row, settings, space::horizontal, text,
};
use cosmic::{Apply, Element, Task, widget};
#[cfg(feature = "wayland")]
@ -30,7 +30,6 @@ use cosmic_panel_config::CosmicPanelConfig;
use cosmic_settings_page::Section;
use cosmic_settings_page::{self as page, section};
use ron::ser::PrettyConfig;
use slab::Slab;
use slotmap::{Key, SlotMap};
use crate::app;
@ -41,6 +40,7 @@ pub enum ContextView {
ApplicationBackground,
ContainerBackground,
ControlComponent,
#[cfg(feature = "cosmic-comp-config")]
ShadowAndCorners,
CustomAccent,
IconsAndToolkit,
@ -123,9 +123,11 @@ pub enum Message {
Autoswitch(bool),
DarkMode(bool),
Density(Density),
ThemeModeUpdate(ThemeMode),
DrawerOpen(ContextView),
DrawerColor(ColorPickerUpdate),
#[cfg(feature = "cosmic-comp-config")]
DrawerCorners(drawer::CornerMessage),
DrawerFont(drawer::FontMessage),
DrawerIcon(drawer::IconMessage),
@ -265,6 +267,7 @@ impl Page {
}
}
#[cfg(feature = "cosmic-comp-config")]
Message::DrawerCorners(message) => {
if let Some(context_view) = self.context_view.as_ref() {
tasks.push(self.drawer.update_shadow_and_corners(message, context_view));
@ -323,6 +326,10 @@ impl Page {
} else {
ThemeBuilder::light()
};
self.roundness = builder.corner_radii.into();
self.density = Density::Standard;
self.theme_manager.set_active_hint(builder.active_hint);
self.theme_manager
@ -479,6 +486,9 @@ impl Page {
tracing::error!(?err, "Error setting dark mode");
}
self.roundness = builder.corner_radii.into();
self.density = Density::Standard;
self.theme_manager
.selected_customizer_mut()
.set_builder(*builder.clone())
@ -488,6 +498,8 @@ impl Page {
self.drawer.reset(&self.theme_manager);
self.can_reset = self.can_reset();
return cosmic::task::future(async move {
app::Message::SetTheme(cosmic::theme::system_preference())
});
@ -530,6 +542,20 @@ impl Page {
self.day_time = day_time;
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);
@ -538,11 +564,7 @@ impl Page {
tasks = tasks.chain(self.theme_manager.build_theme(stage))
}
self.can_reset = if self.theme_manager.mode().is_dark {
*self.theme_manager.builder() != ThemeBuilder::dark()
} else {
*self.theme_manager.builder() != ThemeBuilder::light()
};
self.can_reset = self.can_reset();
tasks
}
@ -598,6 +620,7 @@ impl Page {
}
}
#[cfg(feature = "wayland")]
pub fn update_dock_padding(roundness: Roundness) {
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 {
@ -694,7 +725,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("appearance", "preferences-appearance-symbolic")
.title(fl!("appearance"))
.description(fl!("appearance", "desc"))
.description(fl!("xdg-entry-appearance-comment"))
}
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)
}
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>> {
self.drawer.context_drawer(self.context_view)
}
@ -747,36 +789,21 @@ pub fn interface_density() -> Section<crate::pages::Message> {
settings::section()
.title(&section.title)
.add(settings::item_row(vec![
radio(
text::body(&descriptions[compact]),
Density::Compact,
Some(page.density),
Message::Density,
)
.width(Length::Fill)
.into(),
]))
.add(settings::item_row(vec![
radio(
text::body(&descriptions[comfortable]),
Density::Standard,
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(),
]))
.add(settings::item::builder(&descriptions[compact]).radio(
Density::Compact,
Some(page.density),
Message::Density,
))
.add(settings::item::builder(&descriptions[comfortable]).radio(
Density::Standard,
Some(page.density),
Message::Density,
))
.add(settings::item::builder(&descriptions[spacious]).radio(
Density::Spacious,
Some(page.density),
Message::Density,
))
.apply(Element::from)
.map(crate::pages::Message::Appearance)
})
@ -784,10 +811,10 @@ pub fn interface_density() -> Section<crate::pages::Message> {
#[allow(clippy::too_many_lines)]
pub fn window_management() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let active_hint = descriptions.insert(fl!("window-management-appearance", "active-hint"));
let gaps = descriptions.insert(fl!("window-management-appearance", "gaps"));
crate::slab!(descriptions {
active_hint = fl!("window-management-appearance", "active-hint");
gaps = fl!("window-management-appearance", "gaps");
});
Section::default()
.title(fl!("window-management-appearance"))
@ -855,17 +882,21 @@ pub fn experimental() -> Section<crate::pages::Message> {
Message::DrawerOpen(ContextView::IconsAndToolkit),
);
let shadow_and_corners = crate::widget::go_next_item(
&descriptions[shadow_and_corners_txt],
Message::DrawerOpen(ContextView::ShadowAndCorners),
);
settings::section()
let mut section = settings::section()
.title(&*section.title)
.add(system_font)
.add(mono_font)
.add(icons_and_toolkit)
.add(shadow_and_corners)
.add(icons_and_toolkit);
#[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)
.map(crate::pages::Message::Appearance)
})
@ -873,9 +904,9 @@ pub fn experimental() -> Section<crate::pages::Message> {
#[allow(clippy::too_many_lines)]
pub fn reset_button() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let reset_to_default = descriptions.insert(fl!("reset-to-default"));
crate::slab!(descriptions {
reset_to_default = fl!("reset-to-default");
});
Section::default()
.descriptions(descriptions)
@ -886,7 +917,7 @@ pub fn reset_button() -> Section<crate::pages::Message> {
.on_press(Message::Reset)
.into()
} else {
horizontal_space().width(1).apply(Element::from)
horizontal().width(1.).apply(Element::from)
}
.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::palette::Srgba;
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::{self, button, container, settings, text};
use cosmic::widget::{self, button, container, list, settings, text};
use cosmic::{Apply, Element};
use cosmic_settings_page::Section;
use cosmic_settings_wallpaper as wallpaper;
@ -64,105 +64,117 @@ fn container_background<'a>(
page: &Page,
section: &'a Section<crate::pages::Message>,
labels: &HashMap<String, usize>,
) -> impl Into<Element<'a, Message>> {
) -> list::ListButton<'a, Message> {
let descriptions = &section.descriptions;
let go_next_icon = from_name("go-next-symbolic").handle();
settings::item::builder(&descriptions[labels["container_bg"]])
.description(&descriptions[labels["container_bg_desc"]])
.control(
if page
.drawer
.container_background
.get_applied_color()
.is_some()
{
Element::from(
page.drawer
.container_background
.picker_button(
|_| Message::DrawerOpen(ContextView::ContainerBackground),
Some(24),
)
.width(Length::Fixed(48.0))
.height(Length::Fixed(24.0)),
)
} else {
container(
button::text(&descriptions[labels["auto"]])
.trailing_icon(go_next_icon.clone())
.on_press(Message::DrawerOpen(ContextView::ContainerBackground)),
)
.into()
},
)
list::button(
settings::item::builder(&descriptions[labels["container_bg"]])
.description(&descriptions[labels["container_bg_desc"]])
.control(
if page
.drawer
.container_background
.get_applied_color()
.is_some()
{
Element::from(
page.drawer
.container_background
.picker_button(
|_| Message::DrawerOpen(ContextView::ContainerBackground),
Some(24),
)
.width(Length::Fixed(48.0))
.height(Length::Fixed(24.0)),
)
} else {
container(
button::text(&descriptions[labels["auto"]])
.trailing_icon(go_next_icon.clone())
.on_press(Message::DrawerOpen(ContextView::ContainerBackground)),
)
.into()
},
),
)
.on_press(Message::DrawerOpen(ContextView::ContainerBackground))
}
fn application_background<'a>(
page: &Page,
section: &'a Section<crate::pages::Message>,
labels: &HashMap<String, usize>,
) -> impl Into<Element<'a, Message>> {
) -> list::ListButton<'a, Message> {
let descriptions = &section.descriptions;
settings::item::builder(&descriptions[labels["app_bg"]]).control(
page.drawer
.application_background
.picker_button(
|_| Message::DrawerOpen(ContextView::ApplicationBackground),
Some(24),
)
.width(Length::Fixed(48.0))
.height(Length::Fixed(24.0)),
list::button(
settings::item::builder(&descriptions[labels["app_bg"]]).control(
page.drawer
.application_background
.picker_button(
|_| Message::DrawerOpen(ContextView::ApplicationBackground),
Some(24),
)
.width(Length::Fixed(48.0))
.height(Length::Fixed(24.0)),
),
)
.on_press(Message::DrawerOpen(ContextView::ApplicationBackground))
}
fn control_tint<'a>(
page: &Page,
section: &'a Section<crate::pages::Message>,
labels: &HashMap<String, usize>,
) -> impl Into<Element<'a, Message>> {
) -> list::ListButton<'a, Message> {
let descriptions = &section.descriptions;
settings::item::builder(&descriptions[labels["control_tint"]])
.description(&descriptions[labels["control_tint_desc"]])
.control(
page.drawer
.control_component
.picker_button(
|_| Message::DrawerOpen(ContextView::ControlComponent),
Some(24),
)
.width(Length::Fixed(48.0))
.height(Length::Fixed(24.0)),
)
list::button(
settings::item::builder(&descriptions[labels["control_tint"]])
.description(&descriptions[labels["control_tint_desc"]])
.control(
page.drawer
.control_component
.picker_button(
|_| Message::DrawerOpen(ContextView::ControlComponent),
Some(24),
)
.width(Length::Fixed(48.0))
.height(Length::Fixed(24.0)),
),
)
.on_press(Message::DrawerOpen(ContextView::ControlComponent))
}
fn interface_text<'a>(
page: &Page,
section: &'a Section<crate::pages::Message>,
labels: &HashMap<String, usize>,
) -> impl Into<Element<'a, Message>> {
) -> list::ListButton<'a, Message> {
let descriptions = &section.descriptions;
settings::item::builder(&descriptions[labels["text_tint"]])
.description(&descriptions[labels["text_tint_desc"]])
.control(
page.drawer
.interface_text
.picker_button(
|_| Message::DrawerOpen(ContextView::InterfaceText),
Some(24),
)
.width(Length::Fixed(48.0))
.height(Length::Fixed(24.0)),
)
list::button(
settings::item::builder(&descriptions[labels["text_tint"]])
.description(&descriptions[labels["text_tint_desc"]])
.control(
page.drawer
.interface_text
.picker_button(
|_| Message::DrawerOpen(ContextView::InterfaceText),
Some(24),
)
.width(Length::Fixed(48.0))
.height(Length::Fixed(24.0)),
),
)
.on_press(Message::DrawerOpen(ContextView::InterfaceText))
}
fn auto_switch<'a>(
page: &Page,
section: &'a Section<crate::pages::Message>,
labels: &HashMap<String, usize>,
) -> impl Into<Element<'a, Message>> {
) -> list::ListButton<'a, Message> {
let descriptions = &section.descriptions;
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::{button, container, settings, text};
use cosmic::{Apply, Element};
use cosmic_settings_page::Section;
use slab::Slab;
use super::{Message, Page, Roundness};
#[allow(clippy::too_many_lines)]
pub fn section() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let round = descriptions.insert(fl!("style", "round"));
let slightly_round = descriptions.insert(fl!("style", "slightly-round"));
let square = descriptions.insert(fl!("style", "square"));
crate::slab!(descriptions {
round = fl!("style", "round");
slightly_round = fl!("style", "slightly-round");
square = fl!("style", "square");
});
let dark_round_style = from_name("illustration-appearance-dark-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,
ThemeMode,
};
use cosmic::iced_core::Color;
use cosmic::iced::core::Color;
use cosmic::Task;
use cosmic::theme::ThemeType;
@ -260,6 +260,13 @@ impl Manager {
&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]
pub fn builder(&self) -> &ThemeBuilder {
&self.selected_customizer().builder.0

View file

@ -4,11 +4,10 @@ use cosmic::Apply;
use cosmic::{
Element, Task,
cosmic_config::{ConfigSet, CosmicConfigEntry},
widget::{settings, text, toggler},
widget::{settings, text},
};
use cosmic_panel_config::{CosmicPanelConfig, CosmicPanelContainerConfig};
use cosmic_settings_page::{self as page, Section, section};
use slab::Slab;
use slotmap::SlotMap;
use tracing::error;
@ -158,9 +157,9 @@ impl Default for Page {
}
pub(crate) fn enable() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let dock = descriptions.insert(fl!("dock"));
crate::slab!(descriptions {
dock = fl!("dock");
});
Section::default()
.descriptions(descriptions)
@ -171,16 +170,15 @@ pub(crate) fn enable() -> Section<crate::pages::Message> {
};
settings::section()
.title(&section.title)
.add(settings::item(
&descriptions[dock],
toggler(
.add(
settings::item::builder(&descriptions[dock]).toggler(
container_config
.config_list
.iter()
.any(|e| e.name.as_str() == "Dock"),
)
.on_toggle(Message::EnableDock),
))
Message::EnableDock,
),
)
.apply(Element::from)
.map(crate::pages::Message::Dock)
})
@ -216,7 +214,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("dock", "preferences-dock-symbolic")
.title(fl!("dock"))
.description(fl!("dock", "desc"))
.description(fl!("xdg-entry-dock-comment"))
}
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::id::Internal;
use cosmic::iced_core;
use cosmic::iced_core::clipboard::IconSurface;
use cosmic::iced;
use cosmic::iced::core::clipboard::IconSurface;
use cosmic::widget::{Column, button, column, container, icon, list_column, row, text, text_input};
use cosmic::{
Apply, Element,
cosmic_config::{Config, CosmicConfigEntry},
iced::core::{
Clipboard, Shell, Widget, layout, renderer,
widget::{Operation, Tree, tree},
},
iced::runtime::{Task, core::id::Id},
iced::{
Alignment, Border, Color, Length, Point, Rectangle, Size, Vector, core::window, event,
mouse, overlay, touch,
},
iced_runtime::{Task, core::id::Id},
iced_widget::core::{
Clipboard, Shell, Widget, layout, renderer,
widget::{Operation, Tree, tree},
},
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 content = if is_dragged {
row().height(Length::Fixed(32.0))
row([]).height(Length::Fixed(32.0))
} else {
row::with_children(vec![
icon::from_name("grip-lines-symbolic")
@ -899,30 +899,28 @@ where
}
fn layout(
&self,
&mut self,
tree: &mut Tree,
renderer: &cosmic::Renderer,
limits: &layout::Limits,
) -> layout::Node {
let inner_layout = self
.inner
.as_widget()
.layout(&mut tree.children[0], renderer, limits);
let inner_layout =
self.inner
.as_widget_mut()
.layout(&mut tree.children[0], renderer, limits);
layout::Node::with_children(inner_layout.size(), vec![inner_layout])
}
fn operate(
&self,
&mut self,
tree: &mut Tree,
layout: layout::Layout<'_>,
renderer: &cosmic::Renderer,
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().operate(
self.inner.as_widget_mut().operate(
&mut tree.children[0],
layout.children().next().unwrap(),
renderer,
@ -931,31 +929,31 @@ where
}
#[allow(clippy::too_many_lines, clippy::needless_match)]
fn on_event(
fn update(
&mut self,
tree: &mut Tree,
event: event::Event,
event: &event::Event,
layout: layout::Layout<'_>,
cursor_position: mouse::Cursor,
renderer: &cosmic::Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status {
) {
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],
event.clone(),
event,
layout.children().next().unwrap(),
cursor_position,
renderer,
clipboard,
shell,
viewport,
) {
event::Status::Captured => return event::Status::Captured,
event::Status::Ignored => event::Status::Ignored,
};
);
if shell.is_event_captured() {
return;
}
let height = (layout.bounds().height
- space_xxs as f32 * (self.info.len().saturating_sub(1)) as f32)
@ -967,15 +965,14 @@ where
DraggingState::Dragging(applet) => match &event {
event::Event::Dnd(DndEvent::Source(source_event)) => match source_event {
SourceEvent::Cancelled => {
ret = event::Status::Captured;
shell.capture_event();
if let Some(on_cancel) = self.on_cancel.clone() {
shell.publish(on_cancel);
}
DraggingState::None
}
SourceEvent::Finished => {
ret = event::Status::Captured;
shell.capture_event();
DraggingState::None
}
_ => DraggingState::Dragging(applet),
@ -989,7 +986,7 @@ where
| event::Event::Touch(touch::Event::FingerPressed { .. })
if cursor_position.is_over(layout.bounds()) =>
{
ret = event::Status::Captured;
shell.capture_event();
DraggingState::Pressed(cursor_position.position().unwrap_or_default())
}
@ -1023,24 +1020,25 @@ where
));
let p = applet.path.to_path_buf();
iced_core::clipboard::start_dnd::<
iced::core::clipboard::start_dnd::<
cosmic::Theme,
cosmic::Renderer,
>(
clipboard,
false,
Some(iced_core::clipboard::DndSource::Widget(
Some(iced::core::clipboard::DndSource::Widget(
self.id.clone(),
)),
Some(IconSurface::new(
dnd_icon(applet.clone(), &layout).into(),
iced_core::widget::tree::State::new(state.clone()),
iced_core::Vector::new(0.0, 0.0),
iced::core::widget::tree::State::new(state.clone()),
iced::core::Vector::new(0.0, 0.0),
)),
Box::new(AppletString(p.clone())),
DndAction::Move,
);
ret = event::Status::Captured;
shell.capture_event();
let reordered = self
.info
.iter()
@ -1063,7 +1061,7 @@ where
| event::Event::Touch(
touch::Event::FingerLifted { .. } | touch::Event::FingerLost { .. },
) => {
ret = event::Status::Captured;
shell.capture_event();
DraggingState::None
}
_ => DraggingState::Pressed(start),
@ -1161,8 +1159,6 @@ where
_ => DndOfferState::HandlingOffer,
},
};
ret
}
fn draw(
@ -1189,14 +1185,16 @@ where
fn overlay<'b>(
&'b mut self,
tree: &'b mut Tree,
layout: layout::Layout<'_>,
layout: layout::Layout<'b>,
renderer: &cosmic::Renderer,
viewport: &Rectangle,
translation: Vector,
) -> Option<overlay::Element<'b, Message, cosmic::Theme, cosmic::Renderer>> {
self.inner.as_widget_mut().overlay(
&mut tree.children[0],
layout.children().next().unwrap(),
renderer,
viewport,
translation,
)
}
@ -1243,7 +1241,7 @@ where
_state: &Tree,
layout: layout::Layout<'_>,
_renderer: &cosmic::Renderer,
dnd_rectangles: &mut cosmic::iced_core::clipboard::DndDestinationRectangles,
dnd_rectangles: &mut cosmic::iced::core::clipboard::DndDestinationRectangles,
) {
let Rectangle {
x,

View file

@ -4,10 +4,8 @@ use cosmic::{
cosmic_config::{self, CosmicConfigEntry},
cosmic_theme::Density,
iced::{Alignment, Length},
surface, theme,
widget::{
button, container, dropdown, horizontal_space, icon, row, settings, slider, text, toggler,
},
surface,
widget::{button, container, dropdown, row, settings, slider, space, text},
};
use cosmic::Apply;
@ -17,7 +15,6 @@ use cosmic_panel_config::{
CosmicPanelOuput, PanelAnchor, PanelSize,
};
use cosmic_settings_page::{self as page, Section};
use slab::Slab;
use std::{collections::HashMap, time::Duration};
use crate::pages::desktop::appearance::Roundness;
@ -25,6 +22,7 @@ use crate::pages::desktop::appearance::Roundness;
pub struct PageInner {
pub(crate) config_helper: Option<cosmic_config::Config>,
pub(crate) panel_config: Option<CosmicPanelConfig>,
pub size: Option<PanelSize>,
pub opacity: f32,
pub opacity_changing: bool,
pub outputs: Vec<String>,
@ -42,6 +40,7 @@ impl Default for PageInner {
Self {
config_helper: Option::default(),
panel_config: Option::default(),
size: Option::default(),
opacity: 0.0,
opacity_changing: false,
outputs: vec![fl!("all-displays")],
@ -102,11 +101,11 @@ pub(crate) fn behavior_and_position<
p: &P,
msg_map: T,
) -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let autohide_label = descriptions.insert(p.autohide_label());
let position = descriptions.insert(fl!("panel-behavior-and-position", "position"));
let display = descriptions.insert(fl!("panel-behavior-and-position", "display"));
crate::slab!(descriptions {
autohide_label = p.autohide_label();
position = fl!("panel-behavior-and-position", "position");
display = fl!("panel-behavior-and-position", "display");
});
Section::default()
.title(fl!("panel-behavior-and-position"))
@ -119,10 +118,10 @@ pub(crate) fn behavior_and_position<
};
settings::section()
.title(&section.title)
.add(settings::item(
&descriptions[autohide_label],
toggler(panel_config.autohide.is_some()).on_toggle(Message::AutoHidePanel),
))
.add(
settings::item::builder(&descriptions[autohide_label])
.toggler(panel_config.autohide.is_some(), Message::AutoHidePanel),
)
.add(settings::item(
&descriptions[position],
dropdown::popup_dropdown(
@ -161,13 +160,13 @@ pub(crate) fn style<
p: &P,
msg_map: T,
) -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let gap_label = descriptions.insert(p.gap_label());
let extend_label = descriptions.insert(p.extend_label());
let appearance = descriptions.insert(fl!("panel-style", "appearance"));
let background_opacity = descriptions.insert(fl!("panel-style", "background-opacity"));
let size = descriptions.insert(fl!("panel-style", "size"));
crate::slab!(descriptions {
gap_label = p.gap_label();
extend_label = p.extend_label();
appearance = fl!("panel-style", "appearance");
background_opacity = fl!("panel-style", "background-opacity");
size = fl!("panel-style", "size");
});
Section::default()
.title(fl!("panel-style"))
@ -180,14 +179,14 @@ pub(crate) fn style<
};
settings::section()
.title(&section.title)
.add(settings::item(
&descriptions[gap_label],
toggler(panel_config.anchor_gap).on_toggle(Message::AnchorGap),
))
.add(settings::item(
&descriptions[extend_label],
toggler(panel_config.expand_to_edges).on_toggle(Message::ExtendToEdge),
))
.add(
settings::item::builder(&descriptions[gap_label])
.toggler(panel_config.anchor_gap, Message::AnchorGap),
)
.add(
settings::item::builder(&descriptions[extend_label])
.toggler(panel_config.expand_to_edges, Message::ExtendToEdge),
)
.add(settings::item(
&descriptions[appearance],
dropdown::popup_dropdown(
@ -204,14 +203,15 @@ pub(crate) fn style<
move |a| crate::app::Message::PageMessage(msg_map(a)),
),
))
.add(settings::flex_item(
&descriptions[size],
.add(settings::item::builder(&descriptions[size]).flex_control({
// TODO custom discrete slider variant
row::with_children(vec![
text::body(fl!("small")).into(),
slider(
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::S => 1,
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(),
text::body(fl!("large")).into(),
])
.align_y(Alignment::Center)
.spacing(8),
))
.add(settings::flex_item(
&descriptions[background_opacity],
row::with_capacity(2)
.align_y(Alignment::Center)
.spacing(8)
.push(
text::body(fl!(
"number",
HashMap::from_iter(vec![(
.spacing(8)
.width(Length::Fill)
}))
.add(
settings::item::builder(&descriptions[background_opacity]).flex_control({
row::with_capacity(2)
.align_y(Alignment::Center)
.spacing(8)
.width(Length::Fill)
.push(
text::body(fl!(
"number",
(panel_config.opacity * 100.0) as i32
)])
))
.width(Length::Fixed(22.0))
.align_x(Alignment::Center),
)
.push(
slider(0..=100, (panel_config.opacity * 100.0) as i32, |v| {
Message::OpacityRequest(v as f32 / 100.0)
})
.breakpoints(&[50]),
),
))
HashMap::from_iter(vec![(
"number",
(panel_config.opacity * 100.0) as i32
)])
))
.width(Length::Fixed(22.0))
.align_x(Alignment::Center),
)
.push(
slider(0..=100, (panel_config.opacity * 100.0) as i32, |v| {
Message::OpacityRequest(v as f32 / 100.0)
})
.width(Length::Fill)
.apply(container)
.max_width(250),
)
}),
)
.apply(Element::from)
.map(msg_map)
})
@ -270,9 +279,9 @@ pub(crate) fn style<
pub(crate) fn configuration<P: page::Page<crate::pages::Message> + PanelPage>(
p: &P,
) -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let applets_label = descriptions.insert(p.configure_applets_label());
crate::slab!(descriptions {
applets_label = p.configure_applets_label();
});
Section::default()
.title(fl!("panel-applets"))
@ -285,21 +294,10 @@ pub(crate) fn configuration<P: page::Page<crate::pages::Message> + PanelPage>(
.iter()
.find(|(_, v)| v.id == page.applets_page_id())
{
let control = row::with_children(vec![
horizontal_space().into(),
icon::from_name("go-next-symbolic").size(16).into(),
]);
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)),
)
settings.add(crate::widget::go_next_item(
&descriptions[applets_label],
crate::pages::Message::Page(panel_applets_entity),
))
} else {
settings
};
@ -315,9 +313,9 @@ pub(crate) fn add_panel<
>(
msg_map: T,
) -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let reset_to_default = descriptions.insert(fl!("reset-to-default"));
crate::slab!(descriptions {
reset_to_default = fl!("reset-to-default");
});
Section::default()
.title(fl!("panel-missing"))
@ -338,9 +336,9 @@ pub fn reset_button<
>(
msg_map: T,
) -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let reset_to_default = descriptions.insert(fl!("reset-to-default"));
crate::slab!(descriptions {
reset_to_default = fl!("reset-to-default");
});
Section::default()
.descriptions(descriptions)
@ -348,7 +346,7 @@ pub fn reset_button<
let descriptions = &section.descriptions;
let inner = page.inner();
if inner.system_default == inner.panel_config {
Element::from(horizontal_space().width(1))
Element::from(space())
} else {
button::standard(&descriptions[reset_to_default])
.on_press(Message::ResetPanel)
@ -427,6 +425,7 @@ pub enum Message {
Output(usize),
AnchorGap(bool),
PanelSize(PanelSize),
PanelSizeCommit,
Appearance(usize),
ExtendToEdge(bool),
OpacityRequest(f32),
@ -507,6 +506,7 @@ impl PageInner {
if let Err(err) = default.write_entry(config) {
tracing::error!(?err, "Error resetting panel config.");
}
self.size = Some(default.size.clone());
self.system_default = Some(default.clone());
self.panel_config.clone_from(&self.system_default);
} else {
@ -605,7 +605,16 @@ impl PageInner {
_ = panel_config.set_border_radius(helper, new_radius).unwrap();
}
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
_ = panel_config.set_size_center(helper, None);
_ = panel_config.set_size_wings(helper, None);
@ -668,6 +677,7 @@ impl PageInner {
}
}
Message::PanelConfig(c) => {
self.size = Some(c.size.clone());
self.panel_config = Some(*c);
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
(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(
&format!("{}.Panel", cosmic_panel_config::NAME),
CosmicPanelConfig::VERSION,
@ -98,6 +99,7 @@ impl Default for Page {
inner: PageInner {
config_helper,
panel_config,
size,
container_config,
outputs_map: HashMap::new(),
system_default,
@ -137,7 +139,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("panel", "preferences-panel-symbolic")
.title(fl!("panel"))
.description(fl!("panel", "desc"))
.description(fl!("xdg-entry-panel-comment"))
}
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 RECENT_FOLDERS: &str = "recent-folders";
const BACKGROUNDS_DIR: &str = "backgrounds";
const ROTATION_FREQUENCY: &str = "rotation-frequency";
#[derive(Debug, Default)]
pub struct Config {
@ -24,6 +25,7 @@ pub struct Config {
custom_colors: Vec<wallpaper::Color>,
custom_images: Vec<PathBuf>,
recent_folders: VecDeque<PathBuf>,
pub rotation_frequency: u64,
}
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.state = Some(state);
@ -251,6 +262,21 @@ impl Config {
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>(
&self,
key: &str,
@ -274,4 +300,8 @@ impl Config {
fn update_recent_folders(&self) -> Result<(), cosmic_config::Error> {
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::{
Apply, Element, Task,
iced::core::text::{Ellipsize, EllipsizeHeightLimit},
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::{
iced::Subscription,
widget::{
button, dropdown, list_column, row,
segmented_button::{self, SingleSelectModel},
settings, tab_bar, text, toggler,
settings,
space::horizontal as horizontal_space,
tab_bar, text,
},
};
use cosmic::{
@ -38,7 +41,6 @@ use cosmic_settings_page::{self as page, section};
use cosmic_settings_wallpaper::{self as wallpaper, Entry, ScalingMode};
use image::imageops::FilterType::Lanczos3;
use image::{ImageBuffer, Rgba};
use slab::Slab;
use slotmap::{DefaultKey, Key, SecondaryMap, SlotMap};
use crate::subscription::WallpaperEvent;
@ -80,8 +82,6 @@ pub enum Message {
CacheDisplayImage,
/// Selects an option in the category dropdown menu.
ChangeCategory(Category),
/// Changes the displayed images in the wallpaper view.
ChangeFolder(Context),
/// Emits a wallpaper event.
Event(WallpaperEvent),
/// Handles messages from the color dialog.
@ -182,9 +182,6 @@ pub struct Page {
/// Model for selecting between display outputs.
outputs: SingleSelectModel,
/// Current value of the slideshow rotation frequency.
rotation_frequency: u64,
/// Model for available options for rotation frequencies.
rotation_options: Vec<String>,
@ -216,7 +213,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("wallpaper", "preferences-desktop-wallpaper-symbolic")
.title(fl!("wallpaper"))
.description(fl!("wallpaper", "desc"))
.description(fl!("xdg-entry-wallpaper-comment"))
}
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 {
fn default() -> Self {
let config = Config::new();
let selected_rotation = Self::get_selected_rotation(config.rotation_frequency);
let mut page = Page {
entity: page::Entity::null(),
on_enter_handle: None,
@ -328,10 +328,9 @@ impl Default for Page {
},
wallpaper_service_config: wallpaper::Config::default(),
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")],
outputs: SingleSelectModel::default(),
rotation_frequency: 300,
rotation_options: vec![
// FIX: fluent is inserting extra unicode characters in formatting
fl!("x-minutes", number = 5)
@ -354,7 +353,7 @@ impl Default for Page {
.replace('\u{2069}', ""),
],
selected_fit: 0,
selected_rotation: 0,
selected_rotation,
selection: Context::default(),
update_config: None,
};
@ -366,6 +365,18 @@ impl Default for 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) {
if let Err(why) = self.config.add_recent_folder(folder) {
tracing::error!(?why, "cannot add recent folder to config");
@ -629,10 +640,10 @@ impl Page {
}
/// 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.rotation_frequency = match self.selected_rotation {
let rotation_frequency = match self.selected_rotation {
MINUTES_5 => 300,
MINUTES_10 => 600,
MINUTES_15 => 900,
@ -641,6 +652,8 @@ impl Page {
HOUR_2 => 7200,
_ => 10800,
};
self.config.change_rotation_frequency(rotation_frequency)?;
Ok(())
}
/// Updates configuration for wallpaper image.
@ -661,7 +674,7 @@ impl Page {
let entry = Entry::new(output, wallpaper::Source::Path(path))
.scaling_mode(scaling_mode)
.rotation_frequency(self.rotation_frequency);
.rotation_frequency(self.config.rotation_frequency);
if let Some(old_entry) = old_entry {
entry
@ -681,7 +694,10 @@ impl Page {
.width(Length::Fixed(SIMULATED_WIDTH as f32))
.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::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) => {
match message {
ColorPickerUpdate::ActionFinished => {
@ -841,7 +836,11 @@ impl Page {
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) => {
self.wallpaper_service_config.same_on_all = value;
@ -1112,7 +1111,7 @@ impl Page {
_ => self.selected_rotation = MINUTES_5,
}
self.rotation_frequency = entry.rotation_frequency;
self.config.rotation_frequency = entry.rotation_frequency;
self.cache_display_image();
}
@ -1160,6 +1159,10 @@ impl Context {
}
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);
self.is_custom.insert(key, ());
self.display_images.insert(key, display);
@ -1191,12 +1194,12 @@ impl Context {
#[allow(clippy::too_many_lines)]
pub fn settings() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let same_label = descriptions.insert(fl!("wallpaper", "same"));
let fit_label = descriptions.insert(fl!("wallpaper", "fit"));
let slide_label = descriptions.insert(fl!("wallpaper", "slide"));
let change_label = descriptions.insert(fl!("wallpaper", "change"));
crate::slab!(descriptions {
same_label = fl!("wallpaper", "same");
fit_label = fl!("wallpaper", "fit");
slide_label = fl!("wallpaper", "slide");
change_label = fl!("wallpaper", "change");
});
Section::default()
.descriptions(descriptions)
@ -1255,6 +1258,7 @@ pub fn settings() -> Section<crate::pages::Message> {
} else if page.show_tab_bar {
let element = tab_bar::horizontal(&page.outputs)
.button_alignment(Alignment::Center)
.ellipsize(Ellipsize::End(EllipsizeHeightLimit::Lines(1)))
.on_activate(Message::Output);
children.push(element.into());
@ -1271,18 +1275,17 @@ pub fn settings() -> Section<crate::pages::Message> {
children.push({
let mut column = list_column()
.add(settings::item(
&descriptions[same_label],
toggler(page.wallpaper_service_config.same_on_all)
.on_toggle(Message::SameWallpaper),
.add(settings::item::builder(&descriptions[same_label]).toggler(
page.wallpaper_service_config.same_on_all,
Message::SameWallpaper,
))
.add(settings::item(&descriptions[fit_label], wallpaper_fit));
if show_slideshow_toggle {
column = column.add(settings::item(
&descriptions[slide_label],
toggler(slideshow_enabled).on_toggle(Message::Slideshow),
));
column = column.add(
settings::item::builder(&descriptions[slide_label])
.toggler(slideshow_enabled, Message::Slideshow),
);
}
// 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(cosmic::widget::horizontal_space())
.push(horizontal_space())
.push_maybe(add_button)
.into(),
);

View file

@ -3,9 +3,9 @@
use super::Message;
use cosmic::iced::Radius;
use cosmic::iced_core::Border;
use cosmic::iced_core::{self, Background, Color, Degrees, Length, gradient::Linear};
use cosmic::iced_runtime::core::image::Handle as ImageHandle;
use cosmic::iced::core::Border;
use cosmic::iced::core::{Background, Color, Degrees, Length, gradient::Linear};
use cosmic::iced::runtime::core::image::Handle as ImageHandle;
use cosmic::prelude::*;
use cosmic::widget::{Space, button, container};
use cosmic::{Element, iced};
@ -47,11 +47,12 @@ pub fn color_image<'a, M: 'a>(
height: u16,
border_radius: Option<f32>,
) -> Element<'a, M> {
container(Space::new(width, height))
container(Space::new().width(width).height(height))
.class(cosmic::theme::Container::custom(move |theme| {
container::Style {
icon_color: None,
text_color: None,
snap: true,
background: Some(match &color {
wallpaper::Color::Single([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;
}
Background::Gradient(iced_core::Gradient::Linear(linear))
Background::Gradient(iced::core::Gradient::Linear(linear))
}
}),

View file

@ -5,7 +5,7 @@ use cosmic::{
Apply, Element,
iced::Length,
surface,
widget::{self, settings, toggler},
widget::{self, settings},
};
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_page::Section;
use cosmic_settings_page::{self as page, section};
use slab::Slab;
use slotmap::SlotMap;
use tracing::error;
@ -28,6 +27,7 @@ pub enum Message {
ShowActiveWindowHint(bool),
ShowMaximizeButton(bool),
ShowMinimizeButton(bool),
WindowControlsPositionStart(bool),
SetEdgeSnapThreshold(u32),
Surface(surface::Action),
}
@ -178,6 +178,19 @@ impl Page {
.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) => {
self.show_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",
)
.title(fl!("window-management"))
.description(fl!("window-management", "desc"))
.description(fl!("xdg-entry-window-management-comment"))
}
}
impl page::AutoBind<crate::pages::Message> for Page {}
pub fn window_management() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let super_key = descriptions.insert(fl!("super-key"));
let _launcher = descriptions.insert(fl!("super-key", "launcher"));
let _workspaces = descriptions.insert(fl!("super-key", "workspaces"));
let _applications = descriptions.insert(fl!("super-key", "applications"));
let _disable = descriptions.insert(fl!("super-key", "disable"));
let edge_gravity = descriptions.insert(fl!("edge-gravity"));
crate::slab!(descriptions {
super_key = fl!("super-key");
_launcher = fl!("super-key", "launcher");
_workspaces = fl!("super-key", "workspaces");
_applications = fl!("super-key", "applications");
_disable = fl!("super-key", "disable");
edge_gravity = fl!("edge-gravity");
});
Section::default()
.descriptions(descriptions)
@ -260,23 +272,24 @@ pub fn window_management() -> Section<crate::pages::Message> {
},
),
))
.add(settings::flex_item(
&descriptions[edge_gravity],
toggler(page.edge_snap_threshold != 0).on_toggle(|is_enabled| {
Message::SetEdgeSnapThreshold(if is_enabled { 10 } else { 0 })
}),
))
.add(
settings::item::builder(&descriptions[edge_gravity])
.toggler(page.edge_snap_threshold != 0, |is_enabled| {
Message::SetEdgeSnapThreshold(if is_enabled { 10 } else { 0 })
}),
)
.apply(Element::from)
.map(crate::pages::Message::WindowManagement)
})
}
pub fn window_controls() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let maximize = descriptions.insert(fl!("window-controls", "maximize"));
let minimize = descriptions.insert(fl!("window-controls", "minimize"));
let active_window_hint = descriptions.insert(fl!("window-controls", "active-window-hint"));
crate::slab!(descriptions {
maximize = fl!("window-controls", "maximize");
minimize = fl!("window-controls", "minimize");
active_window_hint = fl!("window-controls", "active-window-hint");
position_start = fl!("window-controls", "position-start");
});
Section::default()
.title(fl!("window-controls"))
@ -286,17 +299,24 @@ pub fn window_controls() -> Section<crate::pages::Message> {
settings::section()
.title(&section.title)
.add(settings::item(
&descriptions[active_window_hint],
toggler(page.show_active_hint).on_toggle(Message::ShowActiveWindowHint),
))
.add(settings::item(
&descriptions[maximize],
toggler(cosmic::config::show_maximize()).on_toggle(Message::ShowMaximizeButton),
))
.add(settings::item(
&descriptions[minimize],
toggler(cosmic::config::show_minimize()).on_toggle(Message::ShowMinimizeButton),
.add(
settings::item::builder(&descriptions[active_window_hint])
.toggler(page.show_active_hint, Message::ShowActiveWindowHint),
)
.add(
settings::item::builder(&descriptions[maximize])
.toggler(cosmic::config::show_maximize(), Message::ShowMaximizeButton),
)
.add(
settings::item::builder(&descriptions[minimize])
.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)
.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> {
let mut descriptions = Slab::new();
let focus_follows_cursor = descriptions.insert(fl!("focus-navigation", "focus-follows-cursor"));
let focus_follows_cursor_delay =
descriptions.insert(fl!("focus-navigation", "focus-follows-cursor-delay"));
let cursor_follows_focus = descriptions.insert(fl!("focus-navigation", "cursor-follows-focus"));
crate::slab!(descriptions {
focus_follows_cursor = fl!("focus-navigation", "focus-follows-cursor");
focus_follows_cursor_delay = fl!("focus-navigation", "focus-follows-cursor-delay");
cursor_follows_focus = fl!("focus-navigation", "cursor-follows-focus");
});
Section::default()
.title(fl!("focus-navigation"))
@ -319,10 +338,10 @@ pub fn focus_navigation() -> Section<crate::pages::Message> {
settings::section()
.title(&section.title)
.add(settings::item(
&descriptions[focus_follows_cursor],
toggler(page.focus_follows_cursor).on_toggle(Message::SetFocusFollowsCursor),
))
.add(
settings::item::builder(&descriptions[focus_follows_cursor])
.toggler(page.focus_follows_cursor, Message::SetFocusFollowsCursor),
)
.add(settings::item(
&descriptions[focus_follows_cursor_delay],
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))
.width(Length::Fixed(80.0)),
))
.add(settings::item(
&descriptions[cursor_follows_focus],
toggler(page.cursor_follows_focus).on_toggle(Message::SetCursorFollowsFocus),
))
.add(
settings::item::builder(&descriptions[cursor_follows_focus])
.toggler(page.cursor_follows_focus, Message::SetCursorFollowsFocus),
)
.apply(Element::from)
.map(crate::pages::Message::WindowManagement)
})

View file

@ -6,28 +6,32 @@
use cosmic::{
Apply, Element,
cosmic_config::{self, ConfigGet, ConfigSet},
iced::Length,
widget::{radio, settings, text},
surface,
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::{self as page, section};
use slab::Slab;
use slotmap::SlotMap;
use tracing::error;
#[derive(Clone, Debug)]
pub enum Message {
SetActionOnTyping(usize),
SetWorkspaceMode(WorkspaceMode),
SetWorkspaceLayout(WorkspaceLayout),
SetWorkspaceWraparound(bool),
SetShowName(bool),
SetShowNumber(bool),
Surface(surface::Action),
}
pub struct Page {
config: cosmic_config::Config,
comp_config: cosmic_config::Config,
comp_workspace_config: WorkspaceConfig,
action_on_typing_selections: Vec<String>,
action_on_typing_active: Option<usize>,
show_workspace_name: bool,
show_workspace_number: bool,
}
@ -43,6 +47,8 @@ impl Default for Page {
WorkspaceConfig::default()
});
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| {
if err.is_err() {
error!(?err, "Failed to read config 'show_workspace_name'");
@ -61,6 +67,12 @@ impl Default for Page {
config,
comp_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_number,
}
@ -73,15 +85,17 @@ impl page::Page<crate::pages::Message> for Page {
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
) -> Option<page::Content> {
Some(vec![
sections.insert(action_on_typing()),
sections.insert(multi_behavior()),
sections.insert(workspace_orientation()),
sections.insert(workspace_navigation()),
])
}
fn info(&self) -> page::Info {
page::Info::new("workspaces", "preferences-workspaces-symbolic")
.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 {
Message::SetWorkspaceMode(value) => {
self.comp_workspace_config.workspace_mode = value;
@ -107,6 +121,16 @@ impl Page {
self.comp_workspace_config.workspace_layout = value;
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) => {
self.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'");
}
}
Message::Surface(a) => {
return cosmic::task::message(crate::app::Message::Surface(a));
}
}
cosmic::iced::Task::none()
}
}
fn multi_behavior() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
fn into_active_selection(action_on_typing: &Action) -> Option<usize> {
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"));
let separate = descriptions.insert(fl!("workspaces-multi-behavior", "separate"));
fn into_action(value: usize) -> Action {
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()
.title(fl!("workspaces-multi-behavior"))
@ -136,36 +214,26 @@ fn multi_behavior() -> Section<crate::pages::Message> {
let descriptions = &section.descriptions;
settings::section()
.title(&section.title)
.add(settings::item_row(vec![
radio(
text::body(&descriptions[span]),
WorkspaceMode::Global,
Some(page.comp_workspace_config.workspace_mode),
Message::SetWorkspaceMode,
)
.width(Length::Fill)
.into(),
]))
.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(),
]))
.add(settings::item::builder(&descriptions[span]).radio(
WorkspaceMode::Global,
Some(page.comp_workspace_config.workspace_mode),
Message::SetWorkspaceMode,
))
.add(settings::item::builder(&descriptions[separate]).radio(
WorkspaceMode::OutputBound,
Some(page.comp_workspace_config.workspace_mode),
Message::SetWorkspaceMode,
))
.apply(Element::from)
.map(crate::pages::Message::DesktopWorkspaces)
})
}
fn workspace_orientation() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let vertical = descriptions.insert(fl!("workspaces-orientation", "vertical"));
let horizontal = descriptions.insert(fl!("workspaces-orientation", "horizontal"));
crate::slab!(descriptions {
vertical = fl!("workspaces-orientation", "vertical");
horizontal = fl!("workspaces-orientation", "horizontal");
});
Section::default()
.title(fl!("workspaces-orientation"))
@ -174,26 +242,37 @@ fn workspace_orientation() -> Section<crate::pages::Message> {
let descriptions = &section.descriptions;
settings::section()
.title(&section.title)
.add(settings::item_row(vec![
radio(
text::body(&descriptions[vertical]),
WorkspaceLayout::Vertical,
Some(page.comp_workspace_config.workspace_layout),
Message::SetWorkspaceLayout,
)
.width(Length::Fill)
.into(),
]))
.add(settings::item_row(vec![
radio(
text::body(&descriptions[horizontal]),
WorkspaceLayout::Horizontal,
Some(page.comp_workspace_config.workspace_layout),
Message::SetWorkspaceLayout,
)
.width(Length::Fill)
.into(),
]))
.add(settings::item::builder(&descriptions[vertical]).radio(
WorkspaceLayout::Vertical,
Some(page.comp_workspace_config.workspace_layout),
Message::SetWorkspaceLayout,
))
.add(settings::item::builder(&descriptions[horizontal]).radio(
WorkspaceLayout::Horizontal,
Some(page.comp_workspace_config.workspace_layout),
Message::SetWorkspaceLayout,
))
.apply(Element::from)
.map(crate::pages::Message::DesktopWorkspaces)
})
}
fn workspace_navigation() -> Section<crate::pages::Message> {
crate::slab!(descriptions {
description = fl!("workspaces-navigation", "wraparound");
});
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)
.map(crate::pages::Message::DesktopWorkspaces)
})

View file

@ -2,14 +2,14 @@
// SPDX-License-Identifier: MPL-2.0
use cosmic::Renderer;
use cosmic::iced_core::renderer::Quad;
use cosmic::iced_core::widget::{Tree, tree};
use cosmic::iced_core::{
use cosmic::iced::core::renderer::Quad;
use cosmic::iced::core::widget::{Tree, tree};
use cosmic::iced::core::{
self as core, Border, Clipboard, Element, Layout, Length, Rectangle, Renderer as IcedRenderer,
Shell, Size, Widget,
};
use cosmic::iced_core::{Point, layout, mouse, renderer, touch};
use cosmic::iced_core::{alignment, event, text};
use cosmic::iced::core::{Point, layout, mouse, renderer, touch};
use cosmic::iced::core::{alignment, text};
use cosmic::widget::segmented_button::{self, SingleSelectModel};
use cosmic_randr_shell::{self as randr, OutputKey};
use randr::Transform;
@ -96,7 +96,7 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
}
fn layout(
&self,
&mut self,
tree: &mut Tree,
_renderer: &Renderer,
limits: &layout::Limits,
@ -157,17 +157,17 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
layout::Node::new(size)
}
fn on_event(
fn update(
&mut self,
tree: &mut Tree,
event: cosmic::iced_core::Event,
event: &cosmic::iced::Event,
layout: Layout<'_>,
cursor: mouse::Cursor,
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status {
) {
let bounds = layout.bounds();
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.offset = (position.x - output_region.x, position.y - output_region.y);
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 {
@ -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(
@ -333,6 +332,7 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
width: 3.0,
},
shadow: Default::default(),
snap: true,
},
core::Background::Color(background.into()),
);
@ -352,6 +352,7 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
..Default::default()
},
shadow: Default::default(),
snap: true,
},
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),
font: cosmic::font::bold(),
bounds: id_bounds.size(),
horizontal_alignment: alignment::Horizontal::Center,
vertical_alignment: alignment::Vertical::Center,
align_x: text::Alignment::Center,
align_y: alignment::Vertical::Center,
shaping: text::Shaping::Basic,
wrapping: text::Wrapping::Word,
ellipsize: text::Ellipsize::None,
},
core::Point {
x: id_bounds.center_x(),

View file

@ -6,10 +6,11 @@ pub mod arrangement;
use crate::{app, pages};
use arrangement::Arrangement;
use cosmic::iced::{Alignment, Length, time};
use cosmic::iced_widget::scrollable::RelativeOffset;
use cosmic::iced::core::text::{Ellipsize, EllipsizeHeightLimit};
use cosmic::iced::widget::scrollable::RelativeOffset;
use cosmic::iced::{Alignment, Length, stream, time};
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_randr_shell::{
@ -18,7 +19,6 @@ use cosmic_randr_shell::{
use cosmic_settings_page::{self as page, Section, section};
use futures::SinkExt;
use indexmap::Equivalent;
use slab::Slab;
use slotmap::{Key, SecondaryMap, SlotMap};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, LazyLock};
@ -231,7 +231,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("display", "preferences-desktop-display-symbolic")
.title(fl!("display"))
.description(fl!("display", "desc"))
.description(fl!("xdg-entry-displays-comment"))
}
#[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.
let (randr_task, randr_handle) = Task::stream(cosmic::iced_futures::stream::channel(
let (randr_task, randr_handle) = Task::stream(stream::channel(
1,
|mut emitter| async move {
|mut emitter: futures::channel::mpsc::Sender<_>| async move {
while let Some(message) = rx.recv().await {
if let cosmic_randr::Message::ManagerDone = message
&& !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.
let (hotplug_task, hotplug_handle) = Task::stream(cosmic::iced_futures::stream::channel(
let (hotplug_task, hotplug_handle) = Task::stream(stream::channel(
1,
|mut emitter| async move {
|mut emitter: futures::channel::mpsc::Sender<pages::Message>| async move {
while let Some(message) = rx.recv().await {
_ = emitter.send(message).await;
}
@ -610,8 +610,8 @@ impl Page {
return cosmic::iced::widget::scrollable::snap_to(
self.display_arrangement_scrollable.clone(),
RelativeOffset {
x: self.last_pan,
y: 0.0,
x: Some(self.last_pan),
y: None,
},
);
}
@ -663,7 +663,10 @@ impl Page {
self.last_pan = 0.5;
cosmic::iced::widget::scrollable::snap_to(
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.
pub fn display_arrangement() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
_ = descriptions.insert(fl!("display", "arrangement"));
let display_arrangement_desc = descriptions.insert(fl!("display", "arrangement-desc"));
crate::slab!(descriptions {
_display_arrangement = fl!("display", "arrangement");
display_arrangement_desc = fl!("display", "arrangement-desc");
});
Section::default()
.title(fl!("display", "arrangement"))
@ -1199,7 +1202,7 @@ pub fn display_arrangement() -> Section<crate::pages::Message> {
space_xxs, space_m, ..
} = cosmic::theme::spacing();
column()
column::with_capacity(2)
.push(
text::body(&descriptions[display_arrangement_desc])
.apply(container)
@ -1227,18 +1230,18 @@ pub fn display_arrangement() -> Section<crate::pages::Message> {
/// View for the display configuration section.
pub fn display_configuration() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let _display = descriptions.insert(fl!("display"));
let refresh_rate = descriptions.insert(fl!("display", "refresh-rate"));
let vrr = descriptions.insert(fl!("vrr"));
let resolution = descriptions.insert(fl!("display", "resolution"));
let scale = descriptions.insert(fl!("display", "scale"));
let additional_scale_options = descriptions.insert(fl!("display", "additional-scale-options"));
let orientation = descriptions.insert(fl!("orientation"));
let enable_label = descriptions.insert(fl!("display", "enable"));
let options_label = descriptions.insert(fl!("display", "options"));
let mirroring_label = descriptions.insert(fl!("mirroring"));
crate::slab!(descriptions {
_display = fl!("display");
refresh_rate = fl!("display", "refresh-rate");
vrr = fl!("vrr");
resolution = fl!("display", "resolution");
scale = fl!("display", "scale");
additional_scale_options = fl!("display", "additional-scale-options");
orientation = fl!("orientation");
enable_label = fl!("display", "enable");
options_label = fl!("display", "options");
mirroring_label = fl!("mirroring");
});
Section::default()
.descriptions(descriptions)
@ -1246,7 +1249,7 @@ pub fn display_configuration() -> Section<crate::pages::Message> {
let descriptions = &section.descriptions;
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];
@ -1348,11 +1351,12 @@ pub fn display_configuration() -> Section<crate::pages::Message> {
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 {
let display_switcher = tab_bar::horizontal(&page.display_tabs)
.button_alignment(Alignment::Center)
.ellipsize(Ellipsize::End(EllipsizeHeightLimit::Lines(1)))
.on_activate(Message::Display);
let mut display_enable = if page
@ -1366,10 +1370,10 @@ pub fn display_configuration() -> Section<crate::pages::Message> {
|| !active_output.enabled
{
list_column()
.add(widget::settings::item(
&descriptions[enable_label],
toggler(active_output.enabled).on_toggle(Message::DisplayToggle),
))
.add(
widget::settings::item::builder(&descriptions[enable_label])
.toggler(active_output.enabled, Message::DisplayToggle),
)
.add(widget::settings::item(
&descriptions[mirroring_label],
widget::dropdown::multi::dropdown(

View file

@ -3,7 +3,7 @@
use super::{Message, NightLight};
use crate::pages;
use cosmic::iced_core::{Alignment, Length};
use cosmic::iced::core::{Alignment, Length};
use cosmic::widget::{
button, column, container, icon, list_column, row, settings, text, toggler, vertical_space,
};

View file

@ -11,12 +11,11 @@ use cosmic::{
cosmic_config::{self, ConfigSet},
iced::{Alignment, Length},
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_settings_page::{self as page, Section, section};
use itertools::Itertools;
use slab::Slab;
use slotmap::{DefaultKey, Key, SlotMap};
static COMPOSE_OPTIONS: &[(&str, &str)] = &[
@ -49,6 +48,7 @@ static CAPS_LOCK_OPTIONS: &[(&str, &str)] = &[
("Backspace", "caps:backspace"),
("Super", "caps:super"),
("Control", "caps:ctrl_modifier"),
("Swap with Control", "ctrl:swapcaps"),
];
#[derive(Clone, Debug)]
@ -84,6 +84,7 @@ pub type Description = String;
pub enum LayoutSource {
Base,
Extra,
Custom,
}
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 {
Self::Compose => "compose:",
Self::AlternateCharacters => "lv3:",
Self::CapsLock => "caps:",
Self::Compose => &["compose:"],
Self::AlternateCharacters => &["lv3:"],
Self::CapsLock => &["caps:", "ctrl:"],
}
}
}
@ -243,15 +244,10 @@ fn special_char_radio_row<'a>(
desc: &'a str,
value: Option<&'static str>,
current_value: Option<&'a str>,
) -> cosmic::Element<'a, Message> {
settings::item_row(vec![
radio(desc, value, Some(current_value), |_| {
Message::SpecialCharacterSelect(value)
})
.width(Length::Fill)
.into(),
])
.into()
) -> list::ListButton<'a, Message> {
settings::item::builder(desc).radio(value, Some(current_value), |_| {
Message::SpecialCharacterSelect(value)
})
}
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 {
page::Info::new("keyboard", "input-keyboard-symbolic")
.title(fl!("keyboard"))
.description(fl!("keyboard", "desc"))
.description(fl!("xdg-entry-keyboard-comment"))
}
fn context_drawer(&self) -> Option<ContextDrawer<'_, crate::pages::Message>> {
@ -332,6 +328,22 @@ impl page::Page<crate::pages::Message> for Page {
)
.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, _)| {
match (a.name(), b.name()) {
// Place US at the top of the list as it's the default
@ -497,10 +509,10 @@ impl Page {
Message::SpecialCharacterSelect(id) => {
if let Some(Context::SpecialCharacter(special_key)) = self.context {
let options = self.xkb.options.as_deref().unwrap_or_default();
let prefix = special_key.prefix();
let prefixes = special_key.prefixes();
let new_options = options
.split(',')
.filter(|x| !x.starts_with(prefix))
.filter(|x| !prefixes.iter().any(|prefix| x.starts_with(prefix)))
.chain(id)
.join(",");
@ -536,9 +548,11 @@ impl Page {
pub fn add_input_source_view(&self) -> Element<'_, crate::pages::Message> {
let space_l = theme::spacing().space_l;
let toggler = settings::item::builder(fl!("show-extended-input-sources")).toggler(
self.show_extended_input_sources,
Message::SetShowExtendedInputSources,
let toggler = settings::section().add(
settings::item::builder(fl!("show-extended-input-sources")).toggler(
self.show_extended_input_sources,
Message::SetShowExtendedInputSources,
),
);
let mut list = widget::list_column();
@ -553,7 +567,7 @@ impl Page {
}
}
widget::column()
widget::column::with_capacity(2)
.spacing(space_l)
.push(toggler)
.push(list)
@ -594,13 +608,13 @@ impl Page {
SpecialKey::AlternateCharacters => (ALTERNATE_CHARACTER_OPTIONS, None),
SpecialKey::CapsLock => (CAPS_LOCK_OPTIONS, None),
};
let prefix = special_key.prefix();
let prefixes = special_key.prefixes();
let current = self
.xkb
.options
.iter()
.flat_map(|x| x.split(','))
.find(|x| x.starts_with(prefix));
.find(|x| prefixes.iter().any(|prefix| x.starts_with(prefix)));
// TODO layout default
@ -637,16 +651,11 @@ impl Page {
let mut list = cosmic::widget::list_column();
for (desc, state) in options {
list = list.add(settings::item_row(vec![
radio(
cosmic::widget::text(desc),
Some(state),
Some(Some(current)),
|_| Message::SetNumlockState(state),
)
.width(Length::Fill)
.into(),
]));
list = list.add(settings::item::builder(desc).radio(
Some(state),
Some(Some(current)),
|_| Message::SetNumlockState(state),
));
}
list.into()
@ -710,11 +719,11 @@ fn input_sources() -> Section<crate::pages::Message> {
}
fn special_character_entry() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let alternate = descriptions.insert(fl!("keyboard-special-char", "alternate"));
let compose = descriptions.insert(fl!("keyboard-special-char", "compose"));
let caps = descriptions.insert(fl!("keyboard-special-char", "caps"));
crate::slab!(descriptions {
alternate = fl!("keyboard-special-char", "alternate");
compose = fl!("keyboard-special-char", "compose");
caps = fl!("keyboard-special-char", "caps");
});
Section::default()
.title(fl!("keyboard-special-char"))
@ -742,9 +751,9 @@ fn special_character_entry() -> Section<crate::pages::Message> {
}
fn keyboard_shortcuts() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let shortcuts_desc = descriptions.insert(fl!("keyboard-shortcuts", "desc"));
crate::slab!(descriptions {
shortcuts_desc = fl!("keyboard-shortcuts", "desc");
});
Section::default()
.title(fl!("keyboard-shortcuts"))
@ -768,14 +777,14 @@ fn keyboard_shortcuts() -> Section<crate::pages::Message> {
}
fn keyboard_typing_assist() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let repeat_delay = descriptions.insert(fl!("keyboard-typing-assist", "repeat-delay"));
let repeat_rate = descriptions.insert(fl!("keyboard-typing-assist", "repeat-rate"));
let short = descriptions.insert(fl!("short"));
let long = descriptions.insert(fl!("long"));
let slow = descriptions.insert(fl!("slow"));
let fast = descriptions.insert(fl!("fast"));
crate::slab!(descriptions {
repeat_delay = fl!("keyboard-typing-assist", "repeat-delay");
repeat_rate = fl!("keyboard-typing-assist", "repeat-rate");
short = fl!("short");
long = fl!("long");
slow = fl!("slow");
fast = fl!("fast");
});
Section::default()
.title(fl!("keyboard-typing-assist"))
@ -785,55 +794,63 @@ fn keyboard_typing_assist() -> Section<crate::pages::Message> {
settings::section()
.title(&section.title)
.add(settings::flex_item(&descriptions[repeat_delay], {
// Delay
let delay_slider = cosmic::widget::slider(
KB_REPEAT_DELAY_MIN..=KB_REPEAT_DELAY_MAX,
page.xkb.repeat_delay,
Message::SetRepeatKeysDelay,
)
.width(Length::Fill)
.breakpoints(&[KB_REPEAT_DELAY_DEFAULT])
.step(50_u32)
.apply(widget::container)
.max_width(250);
.add(
settings::item::builder(&descriptions[repeat_delay])
.flex_control({
// Delay
let delay_slider = cosmic::widget::slider(
KB_REPEAT_DELAY_MIN..=KB_REPEAT_DELAY_MAX,
page.xkb.repeat_delay,
Message::SetRepeatKeysDelay,
)
.width(Length::Fill)
.breakpoints(&[KB_REPEAT_DELAY_DEFAULT])
.step(50_u32)
.apply(widget::container)
.max_width(250);
row::with_capacity(3)
.align_y(Alignment::Center)
.spacing(theme::spacing().space_s)
.push(widget::text::body(&descriptions[short]))
.push(delay_slider)
.push(widget::text::body(&descriptions[long]))
}))
.add(settings::flex_item(&descriptions[repeat_rate], {
// Repeat rate
let rate_slider = cosmic::widget::slider(
KB_REPEAT_RATE_MIN..=KB_REPEAT_RATE_MAX,
page.xkb.repeat_rate,
Message::SetRepeatKeysRate,
)
.width(Length::Fill)
.breakpoints(&[KB_REPEAT_RATE_DEFAULT])
.step(5_u32)
.apply(widget::container)
.max_width(250);
row::with_capacity(3)
.align_y(Alignment::Center)
.spacing(theme::spacing().space_s)
.push(widget::text::body(&descriptions[short]))
.push(delay_slider)
.push(widget::text::body(&descriptions[long]))
})
.align_items(Alignment::Center),
)
.add(
settings::item::builder(&descriptions[repeat_rate])
.flex_control({
// Repeat rate
let rate_slider = cosmic::widget::slider(
KB_REPEAT_RATE_MIN..=KB_REPEAT_RATE_MAX,
page.xkb.repeat_rate,
Message::SetRepeatKeysRate,
)
.width(Length::Fill)
.breakpoints(&[KB_REPEAT_RATE_DEFAULT])
.step(5_u32)
.apply(widget::container)
.max_width(250);
row::with_capacity(3)
.align_y(Alignment::Center)
.spacing(theme::spacing().space_s)
.push(widget::text::body(&descriptions[slow]))
.push(rate_slider)
.push(widget::text::body(&descriptions[fast]))
}))
row::with_capacity(3)
.align_y(Alignment::Center)
.spacing(theme::spacing().space_s)
.push(widget::text::body(&descriptions[slow]))
.push(rate_slider)
.push(widget::text::body(&descriptions[fast]))
})
.align_items(Alignment::Center),
)
.apply(cosmic::Element::from)
.map(crate::pages::Message::Keyboard)
})
}
fn keyboard_num_lock() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let boot_state = descriptions.insert(fl!("keyboard-numlock-boot", "boot-state"));
crate::slab!(descriptions {
boot_state = fl!("keyboard-numlock-boot", "boot-state");
});
Section::default()
.title(fl!("keyboard-numlock-boot"))

View file

@ -3,6 +3,7 @@
use super::{ShortcutMessage, ShortcutModel};
use cosmic::app::ContextDrawer;
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
use cosmic::{Element, Task};
use cosmic_settings_config::shortcuts::Action;
use cosmic_settings_config::shortcuts::action::System as SystemAction;
@ -17,10 +18,13 @@ impl Default for Page {
fn default() -> Self {
Self {
model: super::Model::default().actions(|defaults, keybindings| {
actions().iter().fold(Slab::new(), |mut slab, action| {
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
slab
})
actions().iter().cloned().fold(
Slab::with_capacity(actions().len()),
|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> {
self.model.on_clear();
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
false,
)
.discard()
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
}
#[cfg(feature = "wayland")]
@ -101,7 +102,7 @@ pub const fn actions() -> &'static [Action] {
}
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.
for action in actions() {

View file

@ -5,12 +5,15 @@ use cosmic::app::ContextDrawer;
use cosmic::iced::event::listen_with;
use cosmic::iced::keyboard::key::Named;
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::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_settings_config::shortcuts::{self, Action, Binding, Shortcuts};
use cosmic_settings_page as page;
use iced_winit::conversion;
use slab::Slab;
use slotmap::Key as SlotmapKey;
use std::borrow::Cow;
@ -29,6 +32,7 @@ pub enum ShortcutMessage {
ResetBindings,
ShowShortcut(usize, String),
SubmitBinding(usize),
TabPressed,
Inhibited(bool),
ProtocolUnavailable,
ModifiersChanged(Modifiers),
@ -48,6 +52,7 @@ pub struct ShortcutBinding {
impl ShortcutBinding {
pub fn reset(&mut self) {
self.pending = self.binding.clone();
self.input = self.binding.to_string();
}
}
@ -323,10 +328,10 @@ impl Model {
shortcut.reset();
return Task::batch(vec![
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
widget::text_input::focus(shortcut.id.clone()),
widget::text_input::select_all(shortcut.id.clone())
]);
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
widget::text_input::focus(shortcut.id.clone()),
widget::text_input::select_all(shortcut.id.clone()),
]);
}
// Create a new input and focus it.
@ -341,10 +346,10 @@ impl Model {
}));
return Task::batch(vec![
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
widget::text_input::focus(id.clone()),
widget::text_input::select_all(id)
]);
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
widget::text_input::focus(id.clone()),
widget::text_input::select_all(id),
]);
}
}
ShortcutMessage::ApplyReplace => {
@ -428,7 +433,7 @@ impl Model {
}
return Task::batch(vec![
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
@ -439,12 +444,12 @@ impl Model {
self.editing = Some(id);
shortcut.input = shortcut.binding.to_string();
return Task::batch(vec![
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
widget::text_input::select_all(shortcut.id.clone())
]);
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
widget::text_input::select_all(shortcut.id.clone()),
]);
} else if self.editing == Some(id) {
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
shortcut.binding.keycode = None;
return Task::batch(vec![
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
self.submit_binding(id),
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
]);
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
self.submit_binding(id),
cosmic::widget::text_input::focus(
self.add_keybindings_button_id.clone(),
),
]);
} else if old.alt || old.ctrl || old.shift {
self.editing = None;
shortcut.reset();
return Task::batch(vec![
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
]);
cosmic::widget::text_input::focus(
self.add_keybindings_button_id.clone(),
),
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
]);
}
}
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, _, _) => {
if let Some((short_id, id)) = self.shortcut_context.zip(self.editing)
&& let Some(model) = self.shortcut_models.get_mut(short_id)
@ -556,24 +582,29 @@ impl Model {
if shortcut.pending.modifiers
!= cosmic_settings_config::shortcuts::Modifiers::new()
|| shortcut.pending.key.is_some_and(|key| {
key.is_misc_function_key()
|| matches!(key.raw(), 0x10080001..=0x1008FFFF)
!cosmic_settings_config::shortcuts::is_forbidden_unmodified_keysym(
key,
)
})
{
shortcut.input = shortcut.pending.to_string();
// XX for now avoid applying the keycode
shortcut.binding.keycode = None;
return Task::batch(vec![
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
self.submit_binding(id),
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
]);
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
self.submit_binding(id),
cosmic::widget::text_input::focus(
self.add_keybindings_button_id.clone(),
),
]);
}
return Task::batch(vec![
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
]);
cosmic::widget::text_input::focus(
self.add_keybindings_button_id.clone(),
),
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
]);
}
}
}
@ -586,9 +617,11 @@ impl Model {
binding.reset();
self.editing = None;
return Task::batch(vec![
cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()),
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
]);
cosmic::widget::text_input::focus(
self.add_keybindings_button_id.clone(),
),
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(),
]);
}
return Task::none();
}
@ -597,11 +630,7 @@ impl Model {
&& let Some(shortcut) = model.bindings.get_mut(id)
{
shortcut.pending.keycode = Some(keycode);
shortcut.pending.key =
iced_winit::platform_specific::wayland::keymap::key_to_keysym(
unmodified_keysym,
location,
);
shortcut.pending.key = keymap::key_to_keysym(unmodified_keysym, location);
}
}
}
@ -628,11 +657,10 @@ impl Model {
if matches!(
key,
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;
}
cosmic::iced_winit::conversion::physical_to_scancode(physical_key)
conversion::physical_to_scancode(physical_key)
.map(|code| ShortcutMessage::KeyPressed(code, key, location, modifiers))
}
iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
@ -649,7 +677,7 @@ impl Model {
) {
return None;
}
cosmic::iced_winit::conversion::physical_to_scancode(physical_key)
conversion::physical_to_scancode(physical_key)
.map(|code| ShortcutMessage::KeyReleased(code, key, location))
}
iced::event::Event::Keyboard(iced::keyboard::Event::ModifiersChanged(e)) => {
@ -751,10 +779,7 @@ fn context_drawer<'a>(
show_action: bool,
) -> Element<'a, ShortcutMessage> {
let cosmic::cosmic_theme::Spacing {
space_xxs,
space_xs,
space_l,
..
space_xs, space_l, ..
} = theme::spacing();
let model = &shortcuts[id];
@ -770,7 +795,7 @@ fn context_drawer<'a>(
});
let bindings = model.bindings.iter().enumerate().fold(
widget::list_column().spacing(space_xxs),
widget::list_column(),
|section, (_, (bind_id, shortcut))| {
let editing = editing == Some(bind_id);
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_unfocus(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])
.id(shortcut.id.clone())
.into();
@ -881,6 +907,7 @@ fn shortcut_item(custom: bool, id: usize, data: &ShortcutModel) -> Element<'_, S
settings::item::builder(&data.description)
.flex_control(control)
.align_items(Alignment::Center)
.spacing(16)
.apply(widget::container)
.class(theme::Container::List)

View file

@ -9,13 +9,15 @@ use super::{ShortcutBinding, ShortcutMessage, ShortcutModel};
use cosmic::app::ContextDrawer;
use cosmic::iced::keyboard::key::Named;
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_winit;
use cosmic::widget::{self, button, icon};
use cosmic::{Apply, Element, Task};
use cosmic_settings_config::Binding;
use cosmic_settings_config::shortcuts::{Action, Shortcuts};
use cosmic_settings_page::{self as page, Section, section};
use iced_winit::conversion;
use slab::Slab;
use slotmap::{Key as SlotKey, SlotMap};
@ -67,6 +69,7 @@ pub enum Message {
Shortcut(ShortcutMessage),
/// Open the add shortcut context drawer
ShortcutContext,
TabPressed,
ModifiersChanged(Modifiers),
KeyReleased(u32, Key, Location),
KeyPressed(u32, Key, Location, Modifiers),
@ -112,13 +115,13 @@ impl Page {
Message::KeyEditing(id, enable) => {
if enable {
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) {
self.add_shortcut.editing = None;
return Task::batch(vec![
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);
return Task::batch(vec![
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 {
// make a new empty binding if none exist
@ -163,7 +166,7 @@ impl Page {
);
return Task::batch(vec![
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![
widget::text_input::focus(id.clone()),
widget::text_input::select_all(id.clone()),
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
true,
)
.discard()
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
]);
}
}
@ -189,10 +189,8 @@ impl Page {
}
Message::ReplaceApply => {
if let Some((mut binding, ..)) = self.replace_dialog.pop() {
self.model.config_remove(&binding);
binding.keycode = None;
self.add_shortcut(binding);
if let Some((binding, ..)) = self.replace_dialog.pop() {
self.add_shortcut(binding, true);
if self.replace_dialog.is_empty() {
self.add_shortcut = Default::default();
@ -262,7 +260,8 @@ impl Page {
.keys
.get_mut(self.add_shortcut.editing.unwrap())
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();
@ -271,22 +270,22 @@ impl Page {
{
return Task::batch(vec![
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();
return Task::batch(vec![
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 {
self.add_shortcut = Default::default();
_ = self.model.on_enter();
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, _, _) => {
// if the currently selected shortcut matches, finish selecting shortcut
if self.add_shortcut.editing.is_some()
@ -312,7 +331,7 @@ impl Page {
&& self.add_shortcut.binding.modifiers
!= cosmic_settings_config::shortcuts::Modifiers::new()
|| 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
@ -327,7 +346,7 @@ impl Page {
.keys
.get_mut(self.add_shortcut.editing.unwrap())
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();
@ -336,15 +355,15 @@ impl Page {
{
return Task::batch(vec![
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();
return Task::batch(vec![
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;
return Task::batch(vec![
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 {
self.add_shortcut.binding.keycode = Some(keycode);
self.add_shortcut.binding.key =
iced_winit::platform_specific::wayland::keymap::key_to_keysym(
unmodified_keysym,
location,
);
keymap::key_to_keysym(unmodified_keysym, location);
if let Some(k) = self
.add_shortcut
.keys
@ -387,11 +403,8 @@ impl Page {
binding.clear();
return Task::batch(vec![
widget::text_input::focus(id.clone()),
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
true,
)
.discard(),
widget::text_input::focus(id.clone()),
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
]);
}
@ -405,10 +418,7 @@ impl Page {
Task::batch(vec![
widget::text_input::focus(new_id.clone()),
widget::text_input::select_all(new_id),
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
true,
)
.discard(),
keyboard_shortcuts_inhibit::inhibit_shortcuts(true).discard(),
])
}
@ -425,24 +435,24 @@ impl Page {
.on_submit(|_| Message::EditCombination)
.id(self.task_id.clone());
let name_control = widget::column()
let name_control = widget::column::with_capacity(2)
.spacing(4)
.push(widget::text::body(fl!("shortcut-name")))
.push(name_input);
let command_control = widget::column()
let command_control = widget::column::with_capacity(2)
.spacing(4)
.push(widget::text::body(fl!("command")))
.push(task_input);
let input_fields = widget::column()
let input_fields = widget::column::with_capacity(2)
.spacing(12)
.push(name_control)
.push(command_control)
.padding([16, 24]);
let keys = self.add_shortcut.keys.iter().fold(
widget::list_column().spacing(0),
widget::list_column(),
|column, (id, (text, widget_id))| {
let key_combination = widget::editable_input(
fl!("type-key-combination"),
@ -454,6 +464,7 @@ impl Page {
.select_on_focus(true)
.on_input(move |input| Message::KeyInput(id, input))
.on_submit(|_| Message::AddKeybinding)
.on_tab(Message::TabPressed) // capture Tab to prevent focus navigation
.padding([0, 12])
.id(widget_id.clone())
.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"))
.on_press(Message::AddShortcut)
@ -471,19 +482,22 @@ impl Page {
.width(Length::Fill)
.align_x(Alignment::End);
widget::column()
widget::column::with_capacity(2)
.spacing(32)
.push(controls)
.push(add_keybinding_button)
.into()
}
fn add_shortcut(&mut self, mut binding: Binding) {
if let Some(action) = self.model.config_contains(&binding) {
fn add_shortcut(&mut self, mut binding: Binding, replace: bool) {
if replace {
self.model.config_remove(&binding);
} else if let Some(action) = self.model.config_contains(&binding) {
let action_str = super::localize_action(&action);
self.replace_dialog.push((binding, action, action_str));
return;
}
binding.keycode = None;
binding.description = Some(self.add_shortcut.name.clone());
let new_action = Action::Spawn(self.add_shortcut.task.clone());
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> {
self.model.on_clear();
iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
false,
)
.discard()
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
}
#[cfg(feature = "wayland")]
@ -598,17 +609,14 @@ impl page::Page<crate::pages::Message> for Page {
if matches!(
key,
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;
}
cosmic::iced_winit::conversion::physical_to_scancode(physical_key).map(
|code| {
crate::pages::Message::CustomShortcuts(Message::KeyPressed(
code, key, location, modifiers,
))
},
)
conversion::physical_to_scancode(physical_key).map(|code| {
crate::pages::Message::CustomShortcuts(Message::KeyPressed(
code, key, location, modifiers,
))
})
}
iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
key,
@ -623,13 +631,11 @@ impl page::Page<crate::pages::Message> for Page {
) {
return None;
}
cosmic::iced_winit::conversion::physical_to_scancode(physical_key).map(
|code| {
crate::pages::Message::CustomShortcuts(Message::KeyReleased(
code, key, location,
))
},
)
conversion::physical_to_scancode(physical_key).map(|code| {
crate::pages::Message::CustomShortcuts(Message::KeyReleased(
code, key, location,
))
})
}
iced::event::Event::Keyboard(iced::keyboard::Event::ModifiersChanged(e)) => {
Some(crate::pages::Message::CustomShortcuts(
@ -717,7 +723,7 @@ fn shortcuts() -> Section<crate::pages::Message> {
.width(Length::Fill)
.align_x(Alignment::End);
widget::column()
widget::column::with_capacity(2)
.push(content)
.push(add_shortcut)
.spacing(24)

View file

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0-only
use super::{ShortcutMessage, ShortcutModel};
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
use cosmic::{Element, Task, app::ContextDrawer};
use cosmic_settings_config::shortcuts::Action;
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> {
self.model.on_clear();
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
false,
)
.discard()
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
}
#[cfg(feature = "wayland")]
@ -102,7 +100,7 @@ pub const fn actions() -> &'static [Action] {
]
}
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.
for action in actions() {

View file

@ -405,28 +405,31 @@ impl Search {
self.localized[*id].to_lowercase().contains(&input)
|| shortcut_search_actions.contains(action)
})
.fold(Slab::new(), |mut slab, (_, action)| {
slab.insert(ShortcutModel::new(
&self.defaults,
&self.shortcuts,
action.clone(),
));
.fold(
Slab::with_capacity(self.actions.len()),
|mut slab, (_, action)| {
slab.insert(ShortcutModel::new(
&self.defaults,
&self.shortcuts,
action.clone(),
));
slab
})
slab
},
)
}
}
fn shortcuts() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let accessibility = descriptions.insert(fl!("accessibility"));
let custom_label = descriptions.insert(fl!("custom"));
let manage_window_label = descriptions.insert(fl!("manage-windows"));
let move_window_label = descriptions.insert(fl!("move-windows"));
let nav_label = descriptions.insert(fl!("nav-shortcuts"));
let system_label = descriptions.insert(fl!("system-shortcut"));
let window_tiling_label = descriptions.insert(fl!("window-tiling"));
crate::slab!(descriptions {
accessibility = fl!("accessibility");
custom_label = fl!("custom");
manage_window_label = fl!("manage-windows");
move_window_label = fl!("move-windows");
nav_label = fl!("nav-shortcuts");
system_label = fl!("system-shortcut");
window_tiling_label = fl!("window-tiling");
});
Section::default()
.descriptions(descriptions)
@ -434,7 +437,7 @@ fn shortcuts() -> Section<crate::pages::Message> {
let descriptions = &section.descriptions;
let search = widget::search_input("", &page.search.input)
.width(314)
.width(314.)
.on_clear(Message::Search(String::new()))
.on_input(Message::Search)
.apply(widget::container)
@ -500,7 +503,7 @@ fn category_item(category: Category, name: &str, modified: u16) -> Element<'_, M
let control = if modified == 0 {
Element::from(icon)
} else {
widget::row()
widget::row::with_capacity(2)
.push(text::body(fl!("modified", count = modified)))
.push(icon)
.into()
@ -513,6 +516,7 @@ fn category_item(category: Category, name: &str, modified: u16) -> Element<'_, M
.class(theme::Container::List)
.apply(widget::button::custom)
.class(theme::Button::Transparent)
.width(Length::Fill)
.on_press(Message::Category(category))
.into()
}

View file

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0-only
//
use super::{ShortcutMessage, ShortcutModel};
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
use cosmic::{Element, Task, app::ContextDrawer};
use cosmic_settings_config::shortcuts::Action;
use cosmic_settings_config::shortcuts::action::Direction;
@ -16,10 +17,13 @@ impl Default for Page {
fn default() -> Self {
Self {
model: super::Model::default().actions(|defaults, keybindings| {
actions().iter().fold(Slab::new(), |mut slab, action| {
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
slab
})
actions().iter().cloned().fold(
Slab::with_capacity(actions().len()),
|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> {
self.model.on_clear();
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
false,
)
.discard()
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
}
#[cfg(feature = "wayland")]
@ -116,7 +117,7 @@ pub const fn actions() -> &'static [Action] {
}
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.
for action in actions() {

View file

@ -3,6 +3,7 @@
use super::{ShortcutMessage, ShortcutModel};
use cosmic::app::ContextDrawer;
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
use cosmic::{Element, Task};
use cosmic_settings_config::shortcuts::Action;
use cosmic_settings_config::shortcuts::action::{Direction, FocusDirection};
@ -17,10 +18,13 @@ impl Default for Page {
fn default() -> Self {
Self {
model: super::Model::default().actions(|defaults, keybindings| {
actions().iter().fold(Slab::new(), |mut slab, action| {
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
slab
})
actions().iter().cloned().fold(
Slab::with_capacity(actions().len()),
|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> {
self.model.on_clear();
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
false,
)
.discard()
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
}
#[cfg(feature = "wayland")]
@ -119,7 +120,7 @@ pub const fn actions() -> &'static [Action] {
}
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.
for action in actions() {

View file

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0-only
use super::{ShortcutMessage, ShortcutModel};
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
use cosmic::{Element, Task, app::ContextDrawer};
use cosmic_settings_config::shortcuts::Action;
use cosmic_settings_config::shortcuts::action::System as SystemAction;
@ -16,10 +17,13 @@ impl Default for Page {
fn default() -> Self {
Self {
model: super::Model::default().actions(|defaults, keybindings| {
actions().iter().fold(Slab::new(), |mut slab, action| {
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
slab
})
actions().iter().cloned().fold(
Slab::with_capacity(actions().len()),
|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> {
self.model.on_clear();
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
false,
)
.discard()
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
}
#[cfg(feature = "wayland")]
@ -122,7 +123,7 @@ pub const fn actions() -> &'static [Action] {
}
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.
for action in actions() {

View file

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0-only
use super::{ShortcutMessage, ShortcutModel};
use cosmic::iced::platform_specific::shell::wayland::commands::keyboard_shortcuts_inhibit;
use cosmic::{Element, Task, app::ContextDrawer};
use cosmic_settings_config::shortcuts::Action;
use cosmic_settings_config::shortcuts::action::Orientation;
@ -16,10 +17,13 @@ impl Default for Page {
fn default() -> Self {
Self {
model: super::Model::default().actions(|defaults, keybindings| {
actions().iter().fold(Slab::new(), |mut slab, action| {
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
slab
})
actions().iter().cloned().fold(
Slab::with_capacity(actions().len()),
|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> {
self.model.on_clear();
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
false,
)
.discard()
keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard()
}
#[cfg(feature = "wayland")]
@ -103,7 +104,7 @@ pub fn actions() -> &'static [Action] {
}
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.
for action in actions() {

View file

@ -188,7 +188,7 @@ impl page::Page<crate::pages::Message> for Page {
// XXX icon?
page::Info::new("input-devices", "preferences-input-devices-symbolic")
.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_settings_page::Section;
use cosmic_settings_page::{self as page, section};
use slab::Slab;
use slotmap::SlotMap;
use super::Message;
@ -41,19 +40,19 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("mouse", "input-mouse-symbolic")
.title(fl!("mouse"))
.description(fl!("mouse", "desc"))
.description(fl!("xdg-entry-mouse-comment"))
}
}
impl page::AutoBind<crate::pages::Message> for Page {}
fn mouse() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let mouse_acceleration = descriptions.insert(fl!("mouse", "acceleration"));
let mouse_speed = descriptions.insert(fl!("mouse", "speed"));
let primary_button = descriptions.insert(fl!("primary-button"));
let acceleration_desc = descriptions.insert(fl!("acceleration-desc"));
crate::slab!(descriptions {
mouse_acceleration = fl!("mouse", "acceleration");
mouse_speed = fl!("mouse", "speed");
primary_button = fl!("primary-button");
acceleration_desc = fl!("acceleration-desc");
});
Section::default()
.descriptions(descriptions)
@ -63,12 +62,15 @@ fn mouse() -> Section<crate::pages::Message> {
settings::section()
.title(&section.title)
.add(settings::flex_item(
&descriptions[primary_button],
cosmic::widget::segmented_control::horizontal(&input.primary_button)
.minimum_button_width(0)
.on_activate(|x| Message::PrimaryButtonSelected(x, false)),
))
.add(
settings::flex_item(
&descriptions[primary_button],
cosmic::widget::segmented_control::horizontal(&input.primary_button)
.minimum_button_width(0)
.on_activate(|x| Message::PrimaryButtonSelected(x, false)),
)
.align_items(Alignment::Center),
)
.add(
settings::item::builder(&descriptions[mouse_speed]).flex_control({
let value = (input
@ -116,11 +118,11 @@ fn mouse() -> Section<crate::pages::Message> {
}
fn scrolling() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let natural = descriptions.insert(fl!("scrolling", "natural"));
let natural_desc = descriptions.insert(fl!("scrolling", "natural-desc"));
let scroll_speed = descriptions.insert(fl!("scrolling", "speed"));
crate::slab!(descriptions {
natural = fl!("scrolling", "natural");
natural_desc = fl!("scrolling", "natural-desc");
scroll_speed = fl!("scrolling", "speed");
});
Section::default()
.title(fl!("scrolling"))
@ -131,35 +133,39 @@ fn scrolling() -> Section<crate::pages::Message> {
settings::section()
.title(&section.title)
.add(settings::flex_item(&descriptions[scroll_speed], {
let value = input
.input_default
.scroll_config
.as_ref()
.and_then(|x| x.scroll_factor)
.unwrap_or(1.)
.log(2.)
* 10.0
+ 50.0;
.add(
settings::item::builder(&descriptions[scroll_speed])
.flex_control({
let value = input
.input_default
.scroll_config
.as_ref()
.and_then(|x| x.scroll_factor)
.unwrap_or(1.)
.log(2.)
* 10.0
+ 50.0;
let slider = widget::slider(1.0..=100.0, value, |value| {
Message::SetScrollFactor(2f64.powf((value - 50.0) / 10.0), false)
})
.width(Length::Fill)
.breakpoints(&[50.0])
.apply(widget::container)
.max_width(250);
let slider = widget::slider(1.0..=100.0, value, |value| {
Message::SetScrollFactor(2f64.powf((value - 50.0) / 10.0), false)
})
.width(Length::Fill)
.breakpoints(&[50.0])
.apply(widget::container)
.max_width(250);
row::with_capacity(2)
.align_y(Alignment::Center)
.spacing(8)
.push(
text::body(format!("{:.0}", value.round()))
.width(Length::Fixed(22.0))
.align_x(Alignment::Center),
)
.push(slider)
}))
row::with_capacity(2)
.align_y(Alignment::Center)
.spacing(8)
.push(
text::body(format!("{:.0}", value.round()))
.width(Length::Fixed(22.0))
.align_x(Alignment::Center),
)
.push(slider)
})
.align_items(Alignment::Center),
)
.add(
settings::item::builder(&descriptions[natural])
.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_settings_page::Section;
use cosmic_settings_page::{self as page, section};
use slab::Slab;
use slotmap::SlotMap;
use tracing::error;
@ -52,21 +51,21 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("touchpad", "input-touchpad-symbolic")
.title(fl!("touchpad"))
.description(fl!("touchpad", "desc"))
.description(fl!("xdg-entry-touchpad-comment"))
}
}
impl page::AutoBind<crate::pages::Message> for Page {}
fn touchpad() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let primary_button = descriptions.insert(fl!("primary-button"));
let primary_button_desc = descriptions.insert(fl!("primary-button", "desc"));
let touchpad_speed = descriptions.insert(fl!("touchpad", "speed"));
let acceleration = descriptions.insert(fl!("touchpad", "acceleration"));
let acceleration_desc = descriptions.insert(fl!("acceleration-desc"));
let disable_while_typing = descriptions.insert(fl!("disable-while-typing"));
crate::slab!(descriptions {
primary_button = fl!("primary-button");
primary_button_desc = fl!("primary-button", "desc");
touchpad_speed = fl!("touchpad", "speed");
acceleration = fl!("touchpad", "acceleration");
acceleration_desc = fl!("acceleration-desc");
disable_while_typing = fl!("disable-while-typing");
});
Section::default()
.descriptions(descriptions)
@ -148,12 +147,12 @@ fn touchpad() -> Section<crate::pages::Message> {
}
fn click_behavior() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let click_finger = descriptions.insert(fl!("click-behavior", "click-finger"));
let button_areas = descriptions.insert(fl!("click-behavior", "button-areas"));
let tap_to_click = descriptions.insert(fl!("tap-to-click"));
let _tap_to_click_desc = descriptions.insert(fl!("tap-to-click", "desc"));
crate::slab!(descriptions {
click_finger = fl!("click-behavior", "click-finger");
button_areas = fl!("click-behavior", "button-areas");
tap_to_click = fl!("tap-to-click");
_tap_to_click_desc = fl!("tap-to-click", "desc");
});
Section::default()
.title(fl!("click-behavior"))
@ -167,27 +166,17 @@ fn click_behavior() -> Section<crate::pages::Message> {
settings::section()
.title(&*section.title)
// Secondary click via two fingers, and middle-click via three fingers
.add(settings::item_row(vec![
widget::radio(
text::body(&descriptions[click_finger]),
ClickMethod::Clickfinger,
page.input_touchpad.click_method,
|option| Message::SetSecondaryClickBehavior(Some(option), true),
)
.width(Length::Fill)
.into(),
]))
.add(settings::item::builder(&descriptions[click_finger]).radio(
ClickMethod::Clickfinger,
page.input_touchpad.click_method,
|option| Message::SetSecondaryClickBehavior(Some(option), true),
))
// Secondary and middle-click via button areas.
.add(settings::item_row(vec![
widget::radio(
text::body(&descriptions[button_areas]),
ClickMethod::ButtonAreas,
page.input_touchpad.click_method,
|option| Message::SetSecondaryClickBehavior(Some(option), true),
)
.width(Length::Fill)
.into(),
]))
.add(settings::item::builder(&descriptions[button_areas]).radio(
ClickMethod::ButtonAreas,
page.input_touchpad.click_method,
|option| Message::SetSecondaryClickBehavior(Some(option), true),
))
.add(
settings::item::builder(&descriptions[tap_to_click]).toggler(
page.input_touchpad
@ -203,13 +192,13 @@ fn click_behavior() -> Section<crate::pages::Message> {
}
fn scrolling() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let edge = descriptions.insert(fl!("scrolling", "edge"));
let natural = descriptions.insert(fl!("scrolling", "natural"));
let natural_desc = descriptions.insert(fl!("scrolling", "natural-desc"));
let scroll_speed = descriptions.insert(fl!("scrolling", "speed"));
let two_finger = descriptions.insert(fl!("scrolling", "two-finger"));
crate::slab!(descriptions {
edge = fl!("scrolling", "edge");
natural = fl!("scrolling", "natural");
natural_desc = fl!("scrolling", "natural-desc");
scroll_speed = fl!("scrolling", "speed");
two_finger = fl!("scrolling", "two-finger");
});
Section::default()
.title(fl!("scrolling"))
@ -223,33 +212,27 @@ fn scrolling() -> Section<crate::pages::Message> {
settings::section()
.title(&section.title)
// Two-finger scrolling toggle
.add(settings::item_row(vec![
widget::radio(
text::body(&descriptions[two_finger]),
.add(
settings::item::builder(&descriptions[two_finger]).radio(
ScrollMethod::TwoFinger,
page.input_touchpad
.scroll_config
.as_ref()
.and_then(|x| x.method),
|option| Message::SetScrollMethod(Some(option), true),
)
.width(Length::Fill)
.into(),
]))
),
)
// Edge scrolling toggle
.add(settings::item_row(vec![
widget::radio(
text::body(&descriptions[edge]),
.add(
settings::item::builder(&descriptions[edge]).radio(
ScrollMethod::Edge,
page.input_touchpad
.scroll_config
.as_ref()
.and_then(|x| x.method),
|option| Message::SetScrollMethod(Some(option), true),
)
.width(Length::Fill)
.into(),
]))
),
)
// Scroll speed slider
.add(settings::item(&descriptions[scroll_speed], {
let value = page
@ -298,7 +281,11 @@ fn scrolling() -> 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_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 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()
.title(fl!("gestures"))
.descriptions(descriptions)

View file

@ -103,6 +103,8 @@ pub enum Message {
WindowManagement(desktop::window_management::Message),
#[cfg(feature = "page-networking")]
Wired(networking::wired::Message),
#[cfg(feature = "page-workspaces")]
Workspaces(desktop::workspaces::Message),
// Common page functionality
CloseContextDrawer,

View file

@ -84,9 +84,9 @@ impl page::Page<crate::pages::Message> for Page {
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
) -> Option<page::Content> {
crate::slab!(descriptions {
wifi_desc = fl!("connections-and-profiles", variant = "wifi");
wired_desc = fl!("connections-and-profiles", variant = "wired");
vpn_desc = fl!("connections-and-profiles", variant = "vpn");
wifi_desc = fl!("xdg-entry-wireless-comment");
wired_desc = fl!("xdg-entry-wired-comment");
vpn_desc = fl!("xdg-entry-vpn-comment");
});
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
.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(
fl!("vpn"),
&descs[vpn_desc],

View file

@ -9,12 +9,11 @@ use std::sync::{Arc, LazyLock};
use anyhow::Context;
use cosmic::dialog::file_chooser::FileFilter;
use cosmic::task;
use cosmic::widget::text_input::focus;
use cosmic::{
Apply, Element, Task,
iced::core::text::Wrapping,
iced::{Alignment, Length},
iced_core::text::Wrapping,
widget::{self, icon},
widget::{self, icon, space::horizontal as horizontal_space, text_input::focus},
};
use cosmic_settings_network_manager_subscription::nm_secret_agent::{self, PasswordFlag};
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 {
page::Info::new("vpn", "preferences-vpn-symbolic")
.title(fl!("vpn"))
.description(fl!("connections-and-profiles", variant = "vpn"))
.description(fl!("xdg-entry-vpn-comment"))
}
fn content(
@ -841,12 +840,12 @@ impl Page {
Message::FocusSecureInput => {
// retry until the widget is in the tree and focused or the dialog is removed.
if matches!(self.dialog, Some(VpnDialog::Password { .. })) {
return cosmic::iced_runtime::task::widget(
cosmic::iced_core::widget::operation::focusable::find_focused(),
return cosmic::iced::runtime::task::widget(
cosmic::iced::core::widget::operation::focusable::find_focused(),
)
.collect()
.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()
} else {
focus(SECURE_INPUT_VPN.clone())
@ -991,7 +990,7 @@ fn devices_view() -> Section<crate::pages::Message> {
ref active_conns, ..
}) = page.nm_state
else {
return cosmic::widget::column().into();
return cosmic::widget::space().into();
};
let spacing = cosmic::theme::spacing();
@ -1051,7 +1050,7 @@ fn devices_view() -> Section<crate::pages::Message> {
.position(widget::popover::Position::Bottom)
.on_close(Message::ViewMore(None))
.popup(
widget::column()
widget::column::with_capacity(3)
.push_maybe(is_connected.then(|| {
popup_button(
Message::Deactivate(uuid.clone()),
@ -1086,7 +1085,7 @@ fn devices_view() -> Section<crate::pages::Message> {
let widget = widget::settings::item_row(vec![
identifier.into(),
widget::horizontal_space().into(),
horizontal_space().into(),
controls.into(),
]);

View file

@ -10,17 +10,15 @@ use anyhow::Context;
use cosmic::{
Apply, Element, Task,
app::ContextDrawer,
iced::{Alignment, Length},
iced_core::text::Wrapping,
iced_widget::focus_next,
iced::core::text::Wrapping,
iced::{Alignment, Length, widget::operation::focus_next},
task,
widget::{self, column, icon, text_input::focus},
widget::{self, column, icon, space::horizontal, text_input::focus},
};
use cosmic_settings_network_manager_subscription::{
self as network_manager, NetworkManagerState,
available_wifi::{AccessPoint, NetworkType},
current_networks::ActiveConnectionInfo,
hw_address::HwAddress,
nm_secret_agent,
};
use cosmic_settings_page::{self as page, Section, section};
@ -84,6 +82,8 @@ pub enum Message {
ViewMore(Option<network_manager::SSID>),
/// Toggle WiFi access
WiFiEnable(bool),
/// Update search query for filtering networks
SearchQuery(String),
}
impl From<Message> for crate::app::Message {
@ -103,7 +103,6 @@ enum WiFiDialog {
Forget(network_manager::SSID),
Password {
ssid: network_manager::SSID,
hw_address: HwAddress,
identity: Option<String>,
password: SecureString,
password_hidden: bool,
@ -139,6 +138,8 @@ pub struct Page {
qr_code_data: Option<widget::qr_code::Data>,
/// QR code context drawer state
qr_drawer: Option<QRCodeDrawer>,
/// Search query for filtering WiFi networks
search_query: String,
}
#[derive(Debug)]
@ -159,7 +160,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> cosmic_settings_page::Info {
page::Info::new("wifi", "preferences-wireless-symbolic")
.title(fl!("wifi"))
.description(fl!("connections-and-profiles", variant = "wifi"))
.description(fl!("xdg-entry-wireless-comment"))
}
fn content(
@ -194,7 +195,7 @@ impl page::Page<crate::pages::Message> for Page {
widget::button::standard(fl!("cancel")).on_press(Message::CancelDialog);
let control: Element<_> = if let Some(identity) = identity {
column::column()
column::with_capacity(2)
.spacing(8)
.push(
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()));
}
let content = column::column()
let content = column::with_capacity(3)
.spacing(spacing.space_s)
.push(qr_section)
.push(description)
@ -322,6 +323,7 @@ impl page::Page<crate::pages::Message> for Page {
self.connecting.clear();
self.withheld_state = None;
self.withheld_devices = None;
self.search_query.clear();
if let Some(cancel) = self.nm_task.take() {
_ = cancel.send(());
@ -353,12 +355,7 @@ impl Page {
}
match req {
network_manager::Request::Authenticate {
ssid,
identity,
hw_address,
..
} => {
network_manager::Request::Authenticate { ssid, identity, .. } => {
if success {
self.connecting.remove(ssid.as_str());
} else {
@ -366,7 +363,6 @@ impl Page {
self.dialog = Some(WiFiDialog::Password {
ssid: ssid.into(),
identity,
hw_address,
password: SecureString::from(""),
password_hidden: true,
tx: Arc::new(Mutex::new(None)),
@ -377,9 +373,9 @@ impl Page {
network_manager::Request::SelectAccessPoint(
ssid,
hw_address,
network_type,
_tx,
_interface,
) => {
if success || matches!(network_type, NetworkType::Open) {
self.connecting.remove(ssid.as_ref());
@ -388,7 +384,6 @@ impl Page {
ssid,
identity: matches!(network_type, NetworkType::EAP)
.then(String::new),
hw_address,
password: SecureString::from(""),
password_hidden: true,
tx: Arc::new(Mutex::new(None)),
@ -456,7 +451,7 @@ impl Page {
let escaped_ssid = escape_wifi_qr_string(ssid.as_ref());
let qr_string = if let Some(ref pass) = password {
let security = match security_type {
NetworkType::PSK => "WPA",
NetworkType::PskOrSae => "WPA",
NetworkType::EAP => "WPA",
NetworkType::Open => "",
};
@ -499,9 +494,9 @@ impl Page {
.sender
.unbounded_send(network_manager::Request::SelectAccessPoint(
ssid,
ap.hw_address,
ap.network_type,
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 {
ssid,
identity: matches!(ap.network_type, NetworkType::EAP).then(String::new),
hw_address: ap.hw_address,
password: SecureString::from(""),
password_hidden: true,
tx: Arc::new(Mutex::new(None)),
@ -553,7 +547,6 @@ impl Page {
ssid,
identity,
password,
hw_address,
tx,
..
} = dialog
@ -562,6 +555,7 @@ impl Page {
self.connecting.insert(ssid.clone());
let nm_sender = nm.sender.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 {
let mut guard = tx.lock().await;
if let Some(tx) = guard.take() {
@ -570,9 +564,9 @@ impl Page {
_ = nm_sender.unbounded_send(network_manager::Request::Authenticate {
ssid: ssid.to_string(),
identity,
hw_address,
password,
secret_tx,
interface,
});
}
})
@ -674,6 +668,11 @@ impl Page {
// TODO: Per-device wifi connection handling.
self.active_device = Some(device);
}
Message::SearchQuery(query) => {
self.search_query = query;
}
Message::NetworkManagerConnect(conn) => {
return cosmic::task::batch(vec![
self.connect(conn.clone()),
@ -718,7 +717,6 @@ impl Page {
ssid,
password: previous,
password_hidden: true,
hw_address: ap.hw_address,
identity: matches!(ap.network_type, NetworkType::EAP).then(String::new),
tx,
});
@ -736,7 +734,6 @@ impl Page {
ssid,
password,
identity,
hw_address,
..
}) = self.dialog.take()
{
@ -746,7 +743,6 @@ impl Page {
tx: Arc::new(Mutex::new(None)),
ssid,
identity,
hw_address,
});
return task::message(Message::FocusSecureInput);
}
@ -755,12 +751,15 @@ impl Page {
Message::FocusSecureInput => {
// retry until the widget is in the tree and focused or the dialog is removed.
if matches!(self.dialog, Some(WiFiDialog::Password { .. })) {
return cosmic::iced_runtime::task::widget(
cosmic::iced_core::widget::operation::focusable::find_focused(),
return cosmic::iced::runtime::task::widget(
cosmic::iced::core::widget::operation::focusable::find_focused(),
)
.collect()
.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()
} else {
focus(SECURE_INPUT_WIFI.clone())
@ -867,6 +866,7 @@ fn devices_view() -> Section<crate::pages::Message> {
forget_txt = fl!("wifi", "forget");
known_networks_txt = fl!("known-networks");
no_networks_txt = fl!("no-networks");
no_search_results_txt = fl!("no-search-results");
settings_txt = fl!("settings");
share_txt = fl!("share");
visible_networks_txt = fl!("visible-networks");
@ -877,13 +877,13 @@ fn devices_view() -> Section<crate::pages::Message> {
.descriptions(descriptions)
.view::<Page>(move |_binder, page, section| {
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 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)
.push(widget::list_column().add(wifi_enable))
@ -907,54 +907,48 @@ fn devices_view() -> Section<crate::pages::Message> {
view = view.push(no_networks_found);
} 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_visible = false;
// Create separate sections for known and visible networks.
let (known_networks, visible_networks) = state.wireless_access_points.iter().fold(
(
widget::settings::section()
.title(&section.descriptions[known_networks_txt]),
widget::settings::section()
.title(&section.descriptions[visible_networks_txt]),
),
|(mut known_networks, mut visible_networks), network| {
// Add visible networks that are known
for network in &state.wireless_access_points {
if known_ssids.contains(network.ssid.as_ref()) {
has_known = true;
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
.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 {
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(if is_known || !is_encrypted {
Message::Connect(network.ssid.clone())
} else {
Message::PasswordRequest(network.ssid.clone())
}),
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
needs_password
.then(|| widget::icon::from_name("connection-secure-symbolic")),
)
.push(
@ -963,9 +957,9 @@ fn devices_view() -> Section<crate::pages::Message> {
.spacing(spacing.space_xxs);
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 {
widget::text::body(connect_txt)
widget::text::body(connect_label)
.align_y(Alignment::Center)
.into()
};
@ -982,7 +976,7 @@ fn devices_view() -> Section<crate::pages::Message> {
.position(widget::popover::Position::Bottom)
.on_close(Message::ViewMore(None))
.popup(
widget::column()
widget::column::with_capacity(4)
.push_maybe(is_connected.then(|| {
popup_button(
Message::Disconnect(network.ssid.clone()),
@ -1011,12 +1005,10 @@ fn devices_view() -> Section<crate::pages::Message> {
.class(cosmic::theme::Container::Dropdown),
)
.apply(|e| Some(Element::from(e)))
} else if is_known {
} else {
view_more_button
.on_press(Message::ViewMore(Some(network.ssid.clone())))
.apply(|e| Some(Element::from(e)))
} else {
None
};
let controls = widget::row::with_capacity(2)
@ -1025,30 +1017,233 @@ fn devices_view() -> Section<crate::pages::Message> {
.align_y(Alignment::Center)
.spacing(spacing.space_xxs);
let widget = widget::settings::item_row(vec![
let item = widget::settings::item_row(vec![
identifier.into(),
widget::horizontal_space().into(),
horizontal().into(),
controls.into(),
]);
if is_known {
has_known = true;
known_networks = known_networks.add(widget);
} else {
has_visible = true;
visible_networks = visible_networks.add(widget);
}
known_networks = known_networks.add(item);
}
}
(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 {
view = view.push(known_networks);
}
if has_visible {
view = view.push(visible_networks);
// Build Visible Networks section (searchable when 15+ networks, filtered when user types)
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 cosmic::{
Apply, Element, Task,
iced::core::text::Wrapping,
iced::{Alignment, Length},
iced_core::text::Wrapping,
widget::{self, icon},
widget::{self, icon, space::horizontal as horizontal_space},
};
use cosmic_dbus_networkmanager::interface::enums::DeviceState;
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 {
page::Info::new("wired", "preferences-wired-symbolic")
.title(fl!("wired"))
.description(fl!("connections-and-profiles", variant = "wired"))
.description(fl!("xdg-entry-wired-comment"))
}
fn content(
@ -512,7 +512,7 @@ impl Page {
.position(widget::popover::Position::Bottom)
.on_close(Message::ViewMore(None))
.popup(
widget::column()
widget::column::with_capacity(3)
.push_maybe(is_connected.then(|| {
popup_button(
Message::Deactivate(connection.uuid.clone()),
@ -549,7 +549,7 @@ impl Page {
let widget = widget::settings::item_row(vec![
identifier.into(),
widget::horizontal_space().into(),
horizontal_space().into(),
controls.into(),
]);
@ -575,7 +575,7 @@ fn devices_view() -> Section<crate::pages::Message> {
.descriptions(descriptions)
.view::<Page>(move |_binder, page, section| {
let Some(ref nm_state) = page.nm_state else {
return cosmic::widget::column().into();
return cosmic::widget::space().into();
};
let spacing = cosmic::theme::spacing();

View file

@ -1,5 +1,5 @@
use chrono::{Duration, TimeDelta};
use futures::{FutureExt, Stream, StreamExt, future::join_all};
use jiff::{Span, SpanRelativeTo, SpanRound, ToSpan, Unit};
use upower_dbus::{BatteryState, BatteryType, DeviceProxy};
use zbus::{Connection, zvariant::ObjectPath};
@ -233,7 +233,7 @@ pub struct Battery {
pub is_present: bool,
pub percent: f64,
pub is_charging: bool,
pub remaining_duration: Duration,
pub remaining_duration: Span,
}
#[derive(Default, Debug, Clone)]
@ -302,7 +302,7 @@ async fn enumerate_devices<'a>() -> Result<Vec<upower_dbus::DeviceProxy<'a>>, zb
impl Battery {
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!(
proxy.is_present().map(Result::unwrap_or_default),
@ -319,15 +319,11 @@ impl Battery {
&& (percent - 100.0_f64).abs() < f64::EPSILON;
if !is_charging {
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 = dur;
if let Ok(time) = proxy.time_to_empty().await {
remaining_duration = time.seconds();
}
} 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 = dur;
} else if let Ok(time) = proxy.time_to_full().await {
remaining_duration = time.seconds();
}
let battery_percent = if percent > 95.0 {
@ -378,15 +374,22 @@ impl Battery {
Battery::default()
}
pub fn remaining_time(&self) -> String {
if self.remaining_duration <= TimeDelta::zero() {
if !self.remaining_duration.is_positive() {
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 hours = total_seconds % 86400 / 3600;
let minutes = (total_seconds % 3600) / 60;
let days = balanced.get_days();
let hours = balanced.get_hours();
let minutes = balanced.get_minutes();
let mut time: Vec<String> = Vec::new();
if days > 0 {
@ -546,7 +549,7 @@ mod tests {
for case in cases {
let (actual, expected) = case;
let battery = Battery {
remaining_duration: Duration::new(actual, 0).unwrap(),
remaining_duration: actual.seconds(),
is_charging: false,
..Default::default()
};

View file

@ -3,12 +3,12 @@ mod backend;
use self::backend::{GetCurrentPowerProfile, SetPowerProfile};
use backend::{Battery, ConnectedDevice, PowerProfile};
use chrono::TimeDelta;
use cosmic::iced::{self, Alignment, Length};
use cosmic::iced_widget::{column, row};
use cosmic::widget::{self, radio, settings, text};
use cosmic::Task;
use cosmic::iced::core::text::{Ellipsize, EllipsizeHeightLimit};
use cosmic::iced::widget::{column, row};
use cosmic::iced::{self, Alignment, Length, stream};
use cosmic::widget::{self, settings, space, text};
use cosmic::{Apply, surface};
use cosmic::{Task, iced_futures};
use cosmic_config::{Config, CosmicConfigEntry};
use cosmic_idle_config::CosmicIdleConfig;
use cosmic_settings_page::{self as page, Section, section};
@ -16,6 +16,7 @@ use futures::{SinkExt, StreamExt};
use itertools::Itertools;
use slab::Slab;
use slotmap::SlotMap;
use std::hash::Hash;
use std::iter;
use std::time::Duration;
use upower_dbus::DeviceProxy;
@ -101,7 +102,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("power", "preferences-power-and-battery-symbolic")
.title(fl!("power"))
.description(fl!("power", "desc"))
.description(fl!("xdg-entry-power-comment"))
}
fn content(
@ -143,7 +144,7 @@ impl page::Page<crate::pages::Message> for Page {
// A subscription for the system battery.
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 {
receive_battery_changes(proxy, String::new(), sender, |_, b| {
Message::UpdateBattery(b)
@ -154,24 +155,50 @@ impl page::Page<crate::pages::Message> for Page {
});
// Subscriptions for all connected device batteries.
let device_batteries = self
.connected_devices
.iter()
.filter_map(|device| {
device
.proxy
.clone()
.map(|p| (device.device_path.clone(), p))
})
.map(|(path, proxy)| {
iced::Subscription::run_with_id(
path.clone(),
iced_futures::stream::channel(1, |sender| async move {
receive_battery_changes(proxy, path, sender, Message::UpdateDeviceBattery)
.await
}),
)
});
let device_batteries =
self.connected_devices
.iter()
.filter_map(|device| {
device
.proxy
.clone()
.map(|p| (device.device_path.clone(), p))
})
.map(|(path, proxy)| {
#[derive(Clone)]
struct DeviceBatterySubscriptionData {
proxy: DeviceProxy<'static>,
path: String,
}
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))
}
@ -200,47 +227,56 @@ impl page::Page<crate::pages::Message> for Page {
}
}),
cosmic::Task::run(
iced_futures::stream::channel(1, |mut emitter| async move {
let span = tracing::span!(tracing::Level::INFO, "power::device_stream task");
let _span_handle = span.enter();
stream::channel(
1,
|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 {
tracing::error!("could not established zbus connection to system");
return;
};
let Ok(connection) = zbus::Connection::system().await else {
tracing::error!("could not established zbus connection to system");
return;
};
let added_stream = ConnectedDevice::device_added_stream(&connection).await;
let removed_stream = ConnectedDevice::device_removed_stream(&connection).await;
let added_stream = ConnectedDevice::device_added_stream(&connection).await;
let removed_stream =
ConnectedDevice::device_removed_stream(&connection).await;
let mut sender = emitter.clone();
let added_future = std::pin::pin!(async {
match added_stream {
Ok(stream) => {
let mut stream = std::pin::pin!(stream);
while let Some(device) = stream.next().await {
tracing::debug!(device = device.model, "device added");
_ = sender.send(Message::DeviceConnect(device)).await;
let mut sender = emitter.clone();
let added_future = std::pin::pin!(async {
match added_stream {
Ok(stream) => {
let mut stream = std::pin::pin!(stream);
while let Some(device) = stream.next().await {
tracing::debug!(device = device.model, "device added");
_ = 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 {
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;
}),
futures::future::select(added_future, removed_future).await;
},
),
|msg| msg,
),
];
@ -423,7 +459,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
widget::icon::from_name(connected_device.battery.icon_name.clone());
let battery_percent_and_time = widget::text(
if connected_device.battery.remaining_duration > TimeDelta::zero() {
if connected_device.battery.remaining_duration.is_positive() {
format!(
"{}% - {}",
connected_device.battery.percent,
@ -437,7 +473,10 @@ fn connected_devices() -> Section<crate::pages::Message> {
row!(
widget::icon::from_name(connected_device.device_icon).size(48),
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)
.spacing(4)
.align_y(Alignment::Center),
@ -450,7 +489,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
.width(Length::Fill)
.height(Length::Fill),
)
.height(64)
.height(64.)
.class(cosmic::theme::Container::List)
.into()
})
@ -460,7 +499,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
.spacing(8)
.push(text::heading(&section.title))
.push(
widget::column()
widget::column::with_capacity(devices.len())
.extend(
devices
.into_iter()
@ -469,16 +508,8 @@ fn connected_devices() -> Section<crate::pages::Message> {
.map(|mut device_row| {
cosmic::Element::from(
row!(
device_row.next().unwrap_or(
widget::horizontal_space()
.width(Length::Fill)
.into()
),
device_row.next().unwrap_or(
widget::horizontal_space()
.width(Length::Fill)
.into()
),
device_row.next().unwrap_or(space::horizontal().into()),
device_row.next().unwrap_or(space::horizontal().into()),
)
.spacing(8),
)
@ -491,9 +522,9 @@ fn connected_devices() -> Section<crate::pages::Message> {
}
fn profiles() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let _power_desc = descriptions.insert(fl!("power", "desc"));
crate::slab!(descriptions {
_power_desc = fl!("xdg-entry-power-comment");
});
Section::default()
.title(fl!("power-mode"))
@ -508,18 +539,9 @@ fn profiles() -> Section<crate::pages::Message> {
section = profiles
.into_iter()
.map(|profile| {
settings::item_row(vec![
radio(
widget::column::with_capacity(2)
.push(text::body(profile.title()))
.push(text::caption(profile.description())),
profile,
Some(current_profile),
Message::PowerProfileChange,
)
.width(Length::Fill)
.into(),
])
settings::item::builder(profile.title())
.description(profile.description())
.radio(profile, Some(current_profile), Message::PowerProfileChange)
})
.fold(section, settings::Section::add);
}

View file

@ -7,12 +7,11 @@ use cosmic::{
Apply, Element, Task,
iced::{Alignment, Length, window},
surface,
widget::{self, settings},
widget::{self, settings, space::horizontal as horizontal_space},
};
use cosmic_config::{Config, ConfigGet, ConfigSet};
use cosmic_settings_page::{self as page, Section, section};
use cosmic_settings_sound_subscription as subscription;
use slab::Slab;
use slotmap::SlotMap;
const AUDIO_CONFIG: &str = "com.system76.CosmicAudio";
@ -125,7 +124,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("sound", "preferences-sound-symbolic")
.title(fl!("sound"))
.description(fl!("sound", "desc"))
.description(fl!("xdg-entry-sound-comment"))
}
fn set_id(&mut self, entity: page::Entity) {
@ -251,20 +250,20 @@ impl Page {
}
fn input() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let volume = descriptions.insert(fl!("sound-input", "volume"));
let device = descriptions.insert(fl!("sound-input", "device"));
let _level = descriptions.insert(fl!("sound-input", "level"));
let amplification = descriptions.insert(fl!("amplification"));
let amplification_desc = descriptions.insert(fl!("amplification", "desc"));
crate::slab!(descriptions {
volume = fl!("sound-input", "volume");
device = fl!("sound-input", "device");
_level = fl!("sound-input", "level");
amplification = fl!("amplification");
amplification_desc = fl!("amplification", "desc");
});
Section::default()
.title(fl!("sound-input"))
.descriptions(descriptions)
.view::<Page>(move |_binder, page, section| {
if page.model.sources().is_empty() {
return widget::row().into();
return widget::space().into();
}
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| {
Message::SetSourceVolume(change).into()
})
};
}
.width(Length::Fill)
.apply(widget::container)
.max_width(250.);
let volume_control = widget::row::with_capacity(4)
.align_y(Alignment::Center)
@ -293,7 +295,7 @@ fn input() -> Section<crate::pages::Message> {
.width(Length::Fixed(22.0))
.align_x(Alignment::Center),
)
.push(widget::horizontal_space().width(8))
.push(horizontal_space().width(8.))
.push(slider);
let devices = widget::dropdown::popup_dropdown(
page.model.sources(),
@ -308,19 +310,19 @@ fn input() -> Section<crate::pages::Message> {
let mut controls = settings::section()
.title(&section.title)
.add(settings::flex_item(
&*section.descriptions[volume],
volume_control,
))
.add(
settings::item::builder(&*section.descriptions[volume])
.flex_control(volume_control)
.align_items(Alignment::Center),
)
.add(settings::item(&*section.descriptions[device], devices));
controls = controls.add(
settings::item::builder(&*section.descriptions[amplification])
.description(&*section.descriptions[amplification_desc])
.control(
widget::toggler(page.amplification_source)
.on_toggle(|t| Message::ToggleOverAmplificationSource(t).into()),
),
.toggler(page.amplification_source, |t| {
Message::ToggleOverAmplificationSource(t).into()
}),
);
Element::from(controls)
@ -328,17 +330,16 @@ fn input() -> Section<crate::pages::Message> {
}
fn output() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let volume = descriptions.insert(fl!("sound-output", "volume"));
let device = descriptions.insert(fl!("sound-output", "device"));
let _level = descriptions.insert(fl!("sound-output", "level"));
let balance = descriptions.insert(fl!("sound-output", "balance"));
let left = descriptions.insert(fl!("sound-output", "left"));
let right = descriptions.insert(fl!("sound-output", "right"));
// let balance = descriptions.insert(fl!("sound-output", "balance"));
let amplification = descriptions.insert(fl!("amplification"));
let amplification_desc = descriptions.insert(fl!("amplification", "desc"));
crate::slab!(descriptions {
volume = fl!("sound-output", "volume");
device = fl!("sound-output", "device");
_level = fl!("sound-output", "level");
balance = fl!("sound-output", "balance");
left = fl!("sound-output", "left");
right = fl!("sound-output", "right");
amplification = fl!("amplification");
amplification_desc = fl!("amplification", "desc");
});
Section::default()
.title(fl!("sound-output"))
@ -353,7 +354,10 @@ fn output() -> Section<crate::pages::Message> {
widget::slider(0..=100, page.model.sink_volume, |change| {
Message::SetSinkVolume(change).into()
})
};
}
.width(Length::Fill)
.apply(widget::container)
.max_width(250.);
let volume_control = widget::row::with_capacity(4)
.align_y(Alignment::Center)
@ -370,7 +374,7 @@ fn output() -> Section<crate::pages::Message> {
.width(Length::Fixed(22.0))
.align_x(Alignment::Center),
)
.push(widget::horizontal_space().width(8))
.push(horizontal_space().width(8.))
.push(slider);
let devices = widget::dropdown::popup_dropdown(
@ -386,21 +390,26 @@ fn output() -> Section<crate::pages::Message> {
let mut controls = settings::section()
.title(&section.title)
.add(settings::flex_item(
&*section.descriptions[volume],
volume_control,
))
.add(
settings::item::builder(&*section.descriptions[volume])
.flex_control(volume_control)
.align_items(Alignment::Center),
)
.add(settings::item(&*section.descriptions[device], devices))
.add(settings::item(
&*section.descriptions[balance],
widget::row::with_capacity(4)
widget::row::with_capacity(5)
.align_y(Alignment::Center)
.push(
widget::text::body(&*section.descriptions[left])
.width(Length::Fixed(22.0))
.align_x(Alignment::Center),
widget::column::with_capacity(2)
.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(
widget::slider(
0..=200,
@ -410,21 +419,24 @@ fn output() -> Section<crate::pages::Message> {
)
.breakpoints(&[100]),
)
.push(widget::horizontal_space().width(8))
.push(horizontal_space().width(8.))
.push(
widget::text::body(&*section.descriptions[right])
.width(Length::Fixed(22.0))
.align_x(Alignment::Center),
widget::column::with_capacity(2)
.align_x(Alignment::Center)
.push(
widget::text::body(&*section.descriptions[right])
.align_x(Alignment::Center),
)
.push(horizontal_space().width(22.0)),
),
));
controls = controls.add(
settings::item::builder(&*section.descriptions[amplification])
.description(&*section.descriptions[amplification_desc])
.control(
widget::toggler(page.amplification_sink)
.on_toggle(|t| Message::ToggleOverAmplificationSink(t).into()),
),
.toggler(page.amplification_sink, |t| {
Message::ToggleOverAmplificationSink(t).into()
}),
);
Element::from(controls)
@ -442,7 +454,7 @@ fn device_profiles() -> Section<crate::pages::Message> {
.view::<Page>(move |_binder, page, section| {
let descriptions = &section.descriptions;
let button = widget::row::with_children(vec![
widget::horizontal_space().into(),
horizontal_space().into(),
widget::icon::from_name("go-next-symbolic").size(16).into(),
]);
@ -450,10 +462,13 @@ fn device_profiles() -> Section<crate::pages::Message> {
.control(button)
.spacing(16)
.apply(widget::container)
.width(Length::Fill)
.class(cosmic::theme::Container::List)
.apply(widget::button::custom)
.width(Length::Fill)
.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()
})

View file

@ -1,12 +1,12 @@
// Copyright 2023 System76 <info@system76.com>
// SPDX-License-Identifier: GPL-3.0-only
use cosmic::iced::Alignment;
use cosmic_settings_page::{self as page, Section, section};
use super::info::Info;
use cosmic::widget::{editable_input, list_column, settings, text};
use cosmic::{Apply, Task};
use slab::Slab;
use slotmap::SlotMap;
#[derive(Clone, Debug)]
@ -61,7 +61,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("about", "help-about-symbolic")
.title(fl!("about"))
.description(fl!("about", "desc"))
.description(fl!("xdg-entry-about-comment"))
}
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> {
let mut descriptions = Slab::new();
let device = descriptions.insert(fl!("about-device"));
let device_desc = descriptions.insert(fl!("about-device", "desc"));
crate::slab!(descriptions {
device = fl!("about-device");
device_desc = fl!("about-device", "desc");
});
Section::default()
.descriptions(descriptions)
@ -178,7 +178,7 @@ fn device() -> Section<crate::pages::Message> {
page.editing_device_name,
Message::HostnameEdit,
)
.width(250)
.width(250.)
.on_input(Message::HostnameInput)
.on_unfocus(Message::HostnameSubmit)
.on_submit(|_| Message::HostnameSubmit);
@ -195,13 +195,13 @@ fn device() -> Section<crate::pages::Message> {
}
fn hardware() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let model = descriptions.insert(fl!("about-hardware", "model"));
let memory = descriptions.insert(fl!("about-hardware", "memory"));
let processor = descriptions.insert(fl!("about-hardware", "processor"));
let graphics = descriptions.insert(fl!("about-hardware", "graphics"));
let disk_capacity = descriptions.insert(fl!("about-hardware", "disk-capacity"));
crate::slab!(descriptions {
model = fl!("about-hardware", "model");
memory = fl!("about-hardware", "memory");
processor = fl!("about-hardware", "processor");
graphics = fl!("about-hardware", "graphics");
disk_capacity = fl!("about-hardware", "disk-capacity");
});
Section::default()
.title(fl!("about-hardware"))
@ -211,43 +211,46 @@ fn hardware() -> Section<crate::pages::Message> {
let mut section_builder = settings::section()
.title(&section.title)
.add(settings::flex_item(
&*desc[model],
text::body(&page.info.hardware_model),
))
.add(settings::flex_item(
&*desc[memory],
text::body(&page.info.memory),
))
.add(settings::flex_item(
&*desc[processor],
text::body(&page.info.processor),
));
.add(
settings::flex_item(&*desc[model], text::body(&page.info.hardware_model))
.align_items(Alignment::Center),
)
.add(
settings::flex_item(&*desc[memory], text::body(&page.info.memory))
.align_items(Alignment::Center),
)
.add(
settings::flex_item(&*desc[processor], text::body(&page.info.processor))
.align_items(Alignment::Center),
);
for card in &page.info.graphics {
section_builder = section_builder.add(settings::flex_item(
&*desc[graphics],
text::body(card.as_str()),
));
section_builder = section_builder.add(
settings::flex_item(&*desc[graphics], text::body(card.as_str()))
.align_items(Alignment::Center),
);
}
section_builder
.add(settings::flex_item(
&*desc[disk_capacity],
text::body(&page.info.disk_capacity),
))
.add(
settings::flex_item(
&*desc[disk_capacity],
text::body(&page.info.disk_capacity),
)
.align_items(Alignment::Center),
)
.into()
})
}
fn os() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let os = descriptions.insert(fl!("about-os", "os"));
let os_arch = descriptions.insert(fl!("about-os", "os-architecture"));
let kernel = descriptions.insert(fl!("about-os", "kernel"));
let desktop = descriptions.insert(fl!("about-os", "desktop-environment"));
let windowing_system = descriptions.insert(fl!("about-os", "windowing-system"));
crate::slab!(descriptions {
os = fl!("about-os", "os");
os_arch = fl!("about-os", "os-architecture");
kernel = fl!("about-os", "kernel");
desktop = fl!("about-os", "desktop-environment");
windowing_system = fl!("about-os", "windowing-system");
});
Section::default()
.title(fl!("about-os"))
@ -256,26 +259,32 @@ fn os() -> Section<crate::pages::Message> {
let desc = &section.descriptions;
settings::section()
.title(&section.title)
.add(settings::flex_item(
&*desc[os],
text::body(&page.info.operating_system),
))
.add(settings::flex_item(
&*desc[os_arch],
text::body(&page.info.os_architecture),
))
.add(settings::flex_item(
&*desc[kernel],
text::body(&page.info.kernel_version),
))
.add(settings::flex_item(
&*desc[desktop],
text::body(&page.info.desktop_environment),
))
.add(settings::flex_item(
&*desc[windowing_system],
text::body(&page.info.windowing_system),
))
.add(
settings::flex_item(&*desc[os], text::body(&page.info.operating_system))
.align_items(Alignment::Center),
)
.add(
settings::flex_item(&*desc[os_arch], text::body(&page.info.os_architecture))
.align_items(Alignment::Center),
)
.add(
settings::flex_item(&*desc[kernel], text::body(&page.info.kernel_version))
.align_items(Alignment::Center),
)
.add(
settings::flex_item(
&*desc[desktop],
text::body(&page.info.desktop_environment),
)
.align_items(Alignment::Center),
)
.add(
settings::flex_item(
&*desc[windowing_system],
text::body(&page.info.windowing_system),
)
.align_items(Alignment::Center),
)
.into()
})
}

View file

@ -1,7 +1,8 @@
// Copyright 2023 System76 <info@system76.com>
// 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};
#[must_use]
@ -21,55 +22,15 @@ pub struct Info {
}
impl Info {
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()
};
/// OpenGL backend reports GPU names with renderer suffixes like "/PCIe/SSE2".
/// We strip these to match against Vulkan backend's clean name.
fn normalize_gpu_name(name: &str) -> String {
name.split('/').next().unwrap_or(name).trim().to_string()
}
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")]
fn wgpu_graphics() -> Vec<String> {
let mut graphics = Vec::new();
// Use wgpu to enumerate GPUs. Works cross-platform and doesn't require external tools
let instance = wgpu::Instance::default();
@ -149,15 +110,17 @@ impl Info {
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;
}
if adapter_info.device != 0 {
seen_devices.insert(device_key);
}
seen_names.insert(gpu_name.clone());
info.graphics.push(gpu_name);
seen_names.insert(normalized_gpu_name);
graphics.push(gpu_name);
}
// NVIDIA Optimus quirk: On laptops with NVIDIA Optimus (switchable graphics),
@ -170,10 +133,68 @@ impl Info {
let device_key = (vendor, device);
if !seen_devices.contains(&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
}
}

View file

@ -8,13 +8,12 @@ use cosmic::{
Apply, Element,
dialog::file_chooser,
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 image::GenericImageView;
use pwhash::{bcrypt, md5_crypt, sha256_crypt, sha512_crypt};
use regex::Regex;
use slab::Slab;
use slotmap::SlotMap;
use std::{
collections::HashMap,
@ -200,7 +199,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("users", "system-users-symbolic")
.title(fl!("users"))
.description(fl!("users", "desc"))
.description(fl!("xdg-entry-users-comment"))
}
fn dialog(&self) -> Option<Element<'_, pages::Message>> {
@ -323,7 +322,7 @@ impl page::Page<crate::pages::Message> for Page {
)))
.width(Length::Fill),
)
.push(Space::new(5, 0))
.push(horizontal().width(5.))
.push(admin_toggler)
.align_y(Alignment::Center),
),
@ -777,25 +776,22 @@ impl Page {
impl page::AutoBind<crate::pages::Message> for Page {}
fn user_list() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let user_type_standard = descriptions.insert(fl!("users", "standard"));
let user_type_admin = descriptions.insert(fl!("users", "admin"));
crate::slab!(descriptions {
user_type_standard = fl!("users", "standard");
user_type_admin = fl!("users", "admin");
});
Section::default()
.descriptions(descriptions)
.view::<Page>(move |_binder, page, section| {
let descriptions = &section.descriptions;
let cosmic::cosmic_theme::Spacing {
space_xxs, space_m, ..
} = cosmic::theme::active().cosmic().spacing;
let space_xxs = cosmic::theme::spacing().space_xxs;
let users_list = page
.users
.iter()
.enumerate()
.flat_map(|(idx, user)| {
.map(|(idx, user)| {
let expanded =
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]
});
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
.profile_icon
.clone()
@ -885,8 +850,8 @@ fn user_list() -> Section<crate::pages::Message> {
)
.align_y(Alignment::Center)
.spacing(space_xxs)
.width(Length::Fill)
.into(),
widget::horizontal_space().width(Length::Fill).into(),
icon::from_name(if expanded {
"go-up-symbolic"
} else {
@ -897,27 +862,49 @@ fn user_list() -> Section<crate::pages::Message> {
.into(),
]);
let account_details = Some(
widget::button::custom(account_details_content)
.padding([space_xxs, space_m])
.on_press(Message::SelectUser(idx))
.class(cosmic::theme::Button::ListItem)
let mut user_list = widget::list_column().add(
list::button(account_details_content)
.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(
widget::list_column()
.spacing(0)
.padding([8, 0])
.divider_padding(0)
.list_item_padding(0),
widget::ListColumn::add,
widget::column::with_capacity(page.users.len()),
|col, user| col.push(user),
)
.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"))
.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)
.push(users_list)
.push(add_user)
.spacing(space_m)
.spacing(space_xxs)
.apply(Element::from)
.map(crate::pages::Message::User)
})

View file

@ -1,14 +1,14 @@
// Copyright 2023 System76 <info@system76.com>
// SPDX-License-Identifier: GPL-3.0-only
use chrono::{Datelike, Timelike};
use crate::widget::selection_context_item;
use cosmic::{
Apply, Element, Task,
app::ContextDrawer,
cosmic_config::{self, ConfigGet, ConfigSet},
iced_core::text::Wrapping,
iced::core::text::Wrapping,
surface,
widget::{self, dropdown, settings},
widget::{self, dropdown, list, settings},
};
use cosmic_settings_page::{self as page, Section, section};
use icu::{
@ -20,9 +20,7 @@ use icu::{
},
locale::{Locale, preferences::extensions::unicode::keywords::HourCycle},
};
use slab::Slab;
use slotmap::{Key, SlotMap};
use std::rc::Rc;
pub use timedate_zbus::TimeDateProxy;
use tracing::error;
@ -139,7 +137,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("time-date", "preferences-system-time-symbolic")
.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> {
@ -337,7 +335,11 @@ impl Page {
for (id, timezone) in self.timezone_list.iter().enumerate() {
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)
}
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) {
self.local_time = Some(update_local_time());
@ -408,9 +376,9 @@ pub enum Message {
impl page::AutoBind<crate::pages::Message> for Page {}
fn date() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let title = descriptions.insert(fl!("time-date"));
crate::slab!(descriptions {
title = fl!("time-date");
});
Section::default()
.title(fl!("time-date"))
@ -429,12 +397,12 @@ fn date() -> Section<crate::pages::Message> {
}
fn format() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let military = descriptions.insert(fl!("time-format", "twenty-four"));
let show_seconds = descriptions.insert(fl!("time-format", "show-seconds"));
let first = descriptions.insert(fl!("time-format", "first"));
let show_date = descriptions.insert(fl!("time-format", "show-date"));
crate::slab!(descriptions {
military = fl!("time-format", "twenty-four");
show_seconds = fl!("time-format", "show-seconds");
first = fl!("time-format", "first");
show_date = fl!("time-format", "show-date");
});
Section::default()
.title(fl!("time-format"))
@ -492,38 +460,27 @@ fn format() -> Section<crate::pages::Message> {
}
fn timezone() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let time_zone = descriptions.insert(fl!("time-zone"));
crate::slab!(descriptions {
time_zone = fl!("time-zone");
});
Section::default()
.title(fl!("time-zone"))
.descriptions(descriptions)
.view::<Page>(move |_binder, page, section| {
let timezone_context_button = widget::row::with_capacity(2)
.spacing(12)
.push(
settings::section()
.title(&section.title)
// Time zone select
.add(crate::widget::go_next_with_item(
&section.descriptions[time_zone],
widget::text::body(
page.timezone
.map(|id| &*page.timezone_list[id])
.unwrap_or_default(),
)
.wrapping(Wrapping::Word),
)
.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),
)
Message::TimezoneContext,
))
.apply(cosmic::Element::from)
.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> {
let now = chrono::Local::now();
let now = jiff::Zoned::now();
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(),
}
}

View file

@ -21,7 +21,7 @@ impl page::Page<crate::pages::Message> for Page {
fn info(&self) -> page::Info {
page::Info::new("time", "preferences-time-and-language-symbolic")
.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
use std::collections::{BTreeMap, BTreeSet};
use std::rc::Rc;
use std::sync::Arc;
use crate::widget::selection_context_item;
use cosmic::app::{ContextDrawer, context_drawer};
use cosmic::iced::{Alignment, Length};
use cosmic::iced_core::text::Wrapping;
use cosmic::widget::{self, button};
use cosmic::widget::{self, button, list};
use cosmic::{Apply, Element};
use cosmic_config::{ConfigGet, ConfigSet};
use cosmic_settings_page::Section;
@ -26,6 +25,8 @@ use icu::{
use locales_rs as locale;
use slotmap::{DefaultKey, SlotMap};
static GNOME_LANGUAGE_SELECTOR: &str = "gnome-language-selector";
#[derive(Clone, Debug)]
pub enum Message {
AddLanguage(DefaultKey),
@ -99,6 +100,7 @@ pub struct PageRefresh {
region: Option<SystemLocale>,
available_languages: SlotMap<DefaultKey, SystemLocale>,
system_locales: BTreeMap<String, SystemLocale>,
language_selector_available: bool,
}
#[derive(Default)]
@ -113,6 +115,8 @@ pub struct Page {
registry: Option<locale::Registry>,
expanded_source_popover: Option<usize>,
add_language_search: String,
/// Whether gnome-language-selector is in the path.
language_selector_available: bool,
/// Cached LC_NUMERIC locale in icu locale format.
numeric_locale: Option<Locale>,
/// 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 {
page::Info::new("time-region", "preferences-region-and-language-symbolic")
.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> {
@ -165,22 +169,27 @@ impl page::Page<crate::pages::Message> for Page {
.on_clear(Message::AddLanguageSearch(String::new()))
.apply(Element::from)
.map(crate::pages::Message::from);
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);
context_drawer(
let drawer = context_drawer(
self.add_language_view().map(crate::pages::Message::from),
crate::pages::Message::CloseContextDrawer,
)
.title(fl!("add-language", "context"))
.header(search)
.footer(install_additional_button)
.header(search);
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 => {
let search = widget::search_input("", &self.add_language_search)
@ -259,7 +268,7 @@ impl Page {
Message::InstallAdditionalLanguages => {
return cosmic::task::future(async move {
_ = tokio::process::Command::new("gnome-language-selector")
_ = tokio::process::Command::new(GNOME_LANGUAGE_SELECTOR)
.status()
.await;
@ -275,6 +284,7 @@ impl Page {
self.language = page_refresh.language;
self.region = page_refresh.region;
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.time_locale = self.icu_locale_from_env("LC_TIME");
}
@ -313,6 +323,9 @@ impl Page {
_ = 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()
&& let Some(language) = self
.available_languages
@ -329,6 +342,14 @@ impl Page {
region.unwrap_or(language).lang_code.clone(),
)
.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> {
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 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 {
if search_input.is_empty()
|| available_language
@ -359,37 +375,15 @@ impl Page {
.as_ref()
.is_some_and(|(_, locales)| locales.contains(&available_language.lang_code));
let button = widget::settings::item_row(vec![
widget::text::body(&available_language.display_name)
.class(if is_installed {
cosmic::theme::Text::Accent
} else {
cosmic::theme::Text::Default
})
.wrapping(Wrapping::Word)
.width(Length::Fill)
.into(),
list = list.add(selection_context_item(
&available_language.display_name,
is_installed,
if is_installed {
widget::icon::from_name("object-select-symbolic")
.size(16)
.icon()
.class(cosmic::theme::Svg::Custom(svg_accent.clone()))
.into()
Message::RemoveLanguage(id)
} 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> {
let svg_accent = Rc::new(|theme: &cosmic::Theme| {
let color = theme.cosmic().accent_text_color().into();
cosmic::widget::svg::Style { color: Some(color) }
});
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();
@ -487,37 +476,15 @@ impl Page {
.as_ref()
.is_some_and(|l| l.lang_code == locale.lang_code);
let button = widget::settings::item_row(vec![
widget::text::body(&locale.region_name)
.class(if is_selected {
cosmic::theme::Text::Accent
} else {
cosmic::theme::Text::Default
})
.wrapping(Wrapping::Word)
.width(Length::Fill)
.into(),
list = list.add(selection_context_item(
&locale.region_name,
is_selected,
if is_selected {
widget::icon::from_name("object-select-symbolic")
.size(16)
.icon()
.class(cosmic::theme::Svg::Custom(svg_accent.clone()))
.into()
None
} 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);
}
let language_selector_available = which::which(GNOME_LANGUAGE_SELECTOR).is_ok();
Ok(PageRefresh {
config,
registry: Registry(registry),
@ -772,6 +741,7 @@ pub async fn page_reload() -> eyre::Result<PageRefresh> {
region,
available_languages,
system_locales,
language_selector_available,
})
}
@ -894,6 +864,29 @@ pub async fn set_locale(
.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> {
locale
.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 ashpd::desktop::location::{Location, LocationProxy};
use chrono::NaiveDate;
use cosmic::iced::{
Subscription,
futures::{SinkExt, StreamExt, channel::mpsc::Sender, future},
@ -11,15 +12,14 @@ use tokio::select;
pub fn daytime() -> cosmic::iced::Subscription<bool> {
struct Sunset;
Subscription::run_with_id(
TypeId::of::<Sunset>(),
stream::channel(2, |tx| async {
Subscription::run_with(TypeId::of::<Sunset>(), |_| {
stream::channel(2, |tx: Sender<bool>| async {
if let Err(err) = inner(tx).await {
tracing::error!("Sunset subscription error: {:?}", err);
}
future::pending().await
}),
)
})
})
}
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 now = chrono::Local::now();
let date = now.date_naive();
let now_in_seconds = now.timestamp();
let now = jiff::Zoned::now();
let now_in_seconds = now.timestamp().as_second();
// 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 sunrise = current_solar_day
.event_time(SolarEvent::Sunrise)
.timestamp();
let sunset = current_solar_day.event_time(SolarEvent::Sunset).timestamp();
let daytime = now_in_seconds >= sunrise && now_in_seconds <= sunset;
.map(|s| s.timestamp());
let sunset = current_solar_day
.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?;
let sleep = if daytime {
sunset - now_in_seconds
} else if now_in_seconds < sunset {
sunrise - now_in_seconds
let next_event = if daytime {
sunset
} else if now_in_seconds < sunrise.unwrap_or(0) {
sunrise
} else {
let tmrw = now + chrono::Duration::days(1);
let tmrw_sunrise = SolarDay::new(coord, tmrw.date_naive())
let tmrw = now.checked_add(jiff::Span::new().days(1))?;
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)
.timestamp();
tmrw_sunrise - now_in_seconds
.map(|s| s.timestamp())
};
let sleep = next_event
.map(|ts| (ts - now_in_seconds).max(60))
.unwrap_or(3600);
next = select! {
() = tokio::time::sleep(tokio::time::Duration::from_secs(sleep as u64)) => {
Some(Event::Daytime)

View file

@ -1,6 +1,7 @@
use cosmic::{
iced::{Subscription, stream},
iced_futures::futures::{self, SinkExt},
use cosmic::iced::{
Subscription,
futures::{self, SinkExt},
stream,
};
use notify::{Config, EventKind, RecommendedWatcher, RecursiveMode, Watcher};
use std::fmt::Debug;
@ -15,45 +16,49 @@ pub enum Event {
pub fn desktop_files<I: 'static + Hash + Copy + Send + Sync + Debug>(
id: I,
) -> cosmic::iced::Subscription<Event> {
Subscription::run_with_id(
id,
stream::channel(1, move |mut output| async move {
let handle = tokio::runtime::Handle::current();
let (tx, mut rx) = mpsc::channel(4);
let mut last_update = std::time::Instant::now();
Subscription::run_with(id, |_| {
stream::channel(
1,
move |mut output: futures::channel::mpsc::Sender<Event>| async move {
let handle = tokio::runtime::Handle::current();
let (tx, mut rx) = mpsc::channel(4);
let mut last_update = std::time::Instant::now();
// Automatically select the best implementation for your platform.
// You can also access each implementation directly e.g. INotifyWatcher.
let watcher = RecommendedWatcher::new(
move |res: Result<notify::Event, notify::Error>| {
if let Ok(event) = res {
match event.kind {
EventKind::Create(_) | EventKind::Modify(_) | EventKind::Remove(_) => {
let now = std::time::Instant::now();
if now.duration_since(last_update).as_secs() > 3 {
_ = handle.block_on(tx.send(()));
last_update = now;
// Automatically select the best implementation for your platform.
// You can also access each implementation directly e.g. INotifyWatcher.
let watcher = RecommendedWatcher::new(
move |res: Result<notify::Event, notify::Error>| {
if let Ok(event) = res {
match event.kind {
EventKind::Create(_)
| EventKind::Modify(_)
| EventKind::Remove(_) => {
let now = std::time::Instant::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 {
for path in cosmic::desktop::fde::default_paths() {
let _ = watcher.watch(path.as_ref(), RecursiveMode::Recursive);
while rx.recv().await.is_some() {
_ = output.send(Event::Changed).await;
}
}
while rx.recv().await.is_some() {
_ = output.send(Event::Changed).await;
}
}
futures::future::pending().await
}),
)
futures::future::pending().await
},
)
})
}

View file

@ -25,15 +25,16 @@ pub enum WallpaperEvent {
}
pub fn wallpapers(current_dir: PathBuf) -> cosmic::iced::Subscription<WallpaperEvent> {
Subscription::run_with_id(
current_dir.clone(),
stream::channel(2, |tx| async {
Subscription::run_with(current_dir, |current_dir: &PathBuf| {
let current_dir = current_dir.clone();
stream::channel(2, move |tx: Sender<WallpaperEvent>| async move {
let current_dir = current_dir.clone();
if let Err(err) = inner(tx, current_dir).await {
tracing::error!("Wallpapers subscription error: {:?}", err);
}
future::pending().await
}),
)
})
})
}
async fn inner(tx: Sender<WallpaperEvent>, current_dir: PathBuf) -> anyhow::Result<()> {

View file

@ -1,7 +1,7 @@
// Copyright 2023 System76 <info@system76.com>
// SPDX-License-Identifier: GPL-3.0-only
use cosmic::{iced_core::Border, theme};
use cosmic::{iced::Border, theme};
#[must_use]
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,
},
shadow: Default::default(),
snap: true,
}
})
}
@ -35,6 +36,7 @@ pub fn display_container_screen() -> cosmic::theme::Container<'static> {
width: 0.0,
},
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>) {
let (cancel_tx, cancel_rx) = tokio::sync::oneshot::channel::<()>();
let task = cosmic::Task::stream(cosmic::iced_futures::stream::channel(
1,
|emitter| async move {
select(
std::pin::pin!(cancel_rx),
std::pin::pin!(event_loop(emitter)),
)
.await;
},
));
let task = cosmic::Task::stream(cosmic::iced::stream::channel(1, |emitter| async move {
select(
std::pin::pin!(cancel_rx),
std::pin::pin!(event_loop(emitter)),
)
.await;
}));
(cancel_tx, task)
}

View file

@ -2,14 +2,16 @@
// SPDX-License-Identifier: GPL-3.0-only
use std::borrow::Cow;
use std::rc::Rc;
use cosmic::cosmic_theme::Spacing;
use cosmic::iced::core::text::Wrapping;
use cosmic::iced::{Alignment, Length};
use cosmic::iced_core::text::Wrapping;
use cosmic::widget::color_picker::ColorPickerUpdate;
use cosmic::widget::{
self, ColorPickerModel, button, column, container, divider, horizontal_space, icon, row,
settings, text, vertical_space,
self, ColorPickerModel, button, column, container, divider, icon, list, row, settings,
space::{horizontal, vertical},
text,
};
use cosmic::{Apply, Element, theme};
use cosmic_settings_page as page;
@ -39,7 +41,7 @@ pub fn color_picker_context_view<'a, Message: Clone + 'static>(
.apply(container)
.center_x(Length::Fill);
cosmic::widget::column()
column::with_capacity(2)
.push_maybe(description)
.push(color_picker)
.align_x(Alignment::Center)
@ -74,7 +76,7 @@ pub fn search_header<Message>(
.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::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> {
row::with_capacity(2)
.push(text::title3(page.title.as_str()))
.push(horizontal_space())
.push(horizontal())
.into()
}
#[must_use]
pub fn unimplemented_page<Message: 'static>() -> Element<'static, Message> {
pub fn unimplemented_page<Message: Clone + 'static>() -> Element<'static, Message> {
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."))
.into()
@ -150,10 +152,12 @@ pub fn page_list_item<'a, Message: 'static + Clone>(
.padding([space_s, space_m])
.align_x(Alignment::Center)
.class(theme::Container::List)
.width(Length::Fill)
.apply(button::custom)
.padding(0)
.class(theme::Button::Transparent)
.on_press(message)
.width(Length::Fill)
.into()
}
@ -181,44 +185,69 @@ pub fn sub_page_header<'a, Message: 'static + Clone>(
.into()
}
pub fn go_next_item<Msg: Clone + 'static>(
pub fn go_next_item<Msg: 'static>(
description: &str,
msg_opt: impl Into<Option<Msg>>,
) -> cosmic::Element<'_, Msg> {
) -> list::ListButton<'_, Msg> {
settings::item_row(vec![
text::body(description).wrapping(Wrapping::Word).into(),
horizontal_space().into(),
text::body(description)
.width(Length::Fill)
.wrapping(Wrapping::Word)
.into(),
icon::from_name("go-next-symbolic").size(16).icon().into(),
])
.apply(widget::container)
.class(cosmic::theme::Container::List)
.apply(button::custom)
.padding(0)
.class(theme::Button::Transparent)
.apply(list::button)
.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,
item: impl Into<cosmic::Element<'a, Msg>>,
msg_opt: impl Into<Option<Msg>>,
) -> cosmic::Element<'a, Msg> {
) -> list::ListButton<'a, Msg> {
settings::item_row(vec![
text::body(description).wrapping(Wrapping::Word).into(),
horizontal_space().into(),
widget::row::with_capacity(2)
horizontal().into(),
row::with_capacity(2)
.push(item)
.push(icon::from_name("go-next-symbolic").size(16).icon())
.align_y(Alignment::Center)
.spacing(cosmic::theme::spacing().space_s)
.spacing(theme::spacing().space_s)
.into(),
])
.apply(widget::container)
.class(cosmic::theme::Container::List)
.apply(button::custom)
.padding(0)
.class(theme::Button::Transparent)
.apply(list::button)
.on_press_maybe(msg_opt.into())
}
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())
.into()
}

View file

@ -1,6 +1,6 @@
[package]
name = "cosmic-pipewire"
version = "1.0.0"
version = "1.0.7"
edition = "2024"
repository = "https://github.com/pop-os/cosmic-settings"
rust-version.workspace = true

View file

@ -34,7 +34,7 @@ use pipewire::{
proxy::{ProxyListener, ProxyT},
types::ObjectType,
};
use std::{cell::RefCell, rc::Rc, u32};
use std::{cell::RefCell, rc::Rc};
pub type NodeId = u32;
pub type RouteId = u32;
@ -66,17 +66,18 @@ fn run_service(
let registry = core.get_registry_rc()?;
let state = Rc::new(RefCell::new(State {
nodes: IntMap::new(),
main_loop: main_loop.downgrade(),
proxies: Proxies {
devices: IntMap::new(),
metadata: IntMap::new(),
nodes: IntMap::new(),
},
nodes: IntMap::new(),
active_routes: IntMap::new(),
routes: IntMap::new(),
node_devices: IntMap::new(),
node_card_profile_device: IntMap::new(),
node_props: IntMap::new(),
main_loop: main_loop.downgrade(),
on_event,
}));
@ -180,10 +181,10 @@ fn run_service(
return;
}
if let Some(device) = Device::from_device(info) {
if let Some(state) = state.upgrade() {
state.borrow_mut().add_device(pw_id, device);
}
if let Some(device) = Device::from_device(info)
&& let Some(state) = state.upgrade()
{
state.borrow_mut().add_device(pw_id, device);
}
}
})
@ -207,7 +208,9 @@ fn run_service(
match param_type {
ParamType::EnumProfile => {
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({
let state = Rc::downgrade(&state);
move |info| {
if let Some(node) = Node::from_node(info) {
if let Some(state) = state.upgrade() {
state.borrow_mut().add_node(id, node);
}
if let Some(node) = Node::from_node(info)
&& let Some(state) = state.upgrade()
{
state.borrow_mut().add_node(id, node);
}
}
})
@ -354,24 +357,18 @@ fn run_service(
"default.audio.sink" => {
if let Ok(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" => {
if let Ok(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.
AddNode(Node),
/// A profile was enumerated
AddProfile(DeviceId, Profile),
AddProfile(DeviceId, u32, Profile),
/// A route was enumerated
AddRoute(DeviceId, u32, Route),
/// The default sink was changed.
@ -496,13 +493,21 @@ struct Proxies {
}
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,
/// 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.
on_event: Box<dyn FnMut(Event)>,
}
@ -513,6 +518,16 @@ impl State {
}
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));
}
@ -554,8 +569,8 @@ impl State {
self.on_event(Event::AddNode(node));
}
fn add_profile(&mut self, id: DeviceId, profile: Profile) {
self.on_event(Event::AddProfile(id, profile));
fn add_profile(&mut self, id: DeviceId, index: u32, profile: Profile) {
self.on_event(Event::AddProfile(id, index, profile));
}
fn add_route(&mut self, id: DeviceId, index: u32, route: Route) {
@ -565,7 +580,7 @@ impl State {
if routes.len() < index as usize + 1 {
let additional = (index as usize + 1) - routes.capacity();
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();
@ -592,8 +607,8 @@ impl State {
self.on_event(Event::DefaultSource(name));
}
fn node_route(&self, device_id: DeviceId, route_device: i32) -> Option<&Route> {
self.routes
fn active_node_route(&self, device_id: DeviceId, route_device: i32) -> Option<&Route> {
self.active_routes
.get(device_id)?
.iter()
.find(|r| r.devices.contains(&route_device))
@ -682,14 +697,14 @@ impl State {
fn set_mute_node(&self, id: NodeId, mute: bool) {
// Prefer to mute the device instead of the node.
// 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
.get(id)
.zip(self.node_card_profile_device.get(id))
{
let route_device = route_device as i32;
if let Some(route) = self.node_route(device_id, route_device) {
self.set_mute(device_id, route_device, route, mute);
let card_profile_device = card_profile_device as i32;
if let Some(route) = self.active_node_route(device_id, card_profile_device) {
self.set_mute(device_id, card_profile_device, route, mute);
return;
};
}
@ -748,7 +763,6 @@ impl State {
if let Some(param) = Pod::from_bytes(&serialized) {
device.set_param(ParamType::Route, 0, param);
}
return;
}
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.
if let Some((&device_id, &route_device)) = self
if let Some((&device_id, &card_profile_device)) = self
.node_devices
.get(id)
.zip(self.node_card_profile_device.get(id))
{
let route_device = route_device as i32;
if let Some(route) = self.node_route(device_id, route_device) {
self.set_volume(device_id, props, route_device, route, volume, balance);
let card_profile_device = card_profile_device as i32;
if let Some(route) = self.active_node_route(device_id, card_profile_device) {
self.set_volume(
device_id,
props,
card_profile_device,
route,
volume,
balance,
);
return;
};
}
@ -789,7 +810,7 @@ impl State {
FormatProperties(libspa_sys::SPA_PROP_channelVolumes),
ValueArray,
pod::ValueArray::Float(volume::to_channel_volumes(
&props.channel_map.as_deref().unwrap_or_default(),
props.channel_map.as_deref().unwrap_or_default(),
volume,
balance,
))
@ -859,7 +880,7 @@ impl State {
ValueArray,
pod::ValueArray::Float(if matches!(route.direction, Direction::Output) {
volume::to_channel_volumes(
&props.channel_map.as_deref().unwrap_or_default(),
props.channel_map.as_deref().unwrap_or_default(),
volume,
balance,
)

View file

@ -4,7 +4,7 @@
use crate::{Availability, spa_utils::string_from_pod};
use libspa::pod::Pod;
#[derive(Clone, Debug)]
#[derive(Clone, Debug, Default)]
pub struct Profile {
pub index: i32,
pub priority: i32,

View file

@ -14,10 +14,8 @@ pub fn string_from_pod(pod: &Pod) -> Option<String> {
unsafe {
// SAFETY: Pod is checked to be a string beforehand
if libspa_sys::spa_pod_get_string(pod.as_raw_ptr(), &mut cstr) == 0 {
if !cstr.is_null() {
return Some(String::from_utf8_lossy(CStr::from_ptr(cstr).to_bytes()).into_owned());
}
if libspa_sys::spa_pod_get_string(pod.as_raw_ptr(), &mut cstr) == 0 && !cstr.is_null() {
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
* Released version

View file

@ -1,20 +1,32 @@
app = COSMIC Instellings
dbus-connection-error = Koppeling aan DBus het misluk
ok = OK
unknown = Onbekend
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
connections-and-profiles = { $variant ->
[wired] Kabelverbindings
[wifi] Wifi-verbindings
[vpn] VPN-verbindings
*[other] Onbekende verbindings
} en verbindingsprofiele.
add-network = Voeg netwerk toe
.profile = Voeg profiel toe
add-vpn = Voeg VPN toe
@ -36,14 +48,11 @@ settings = Instellings
username = Gebruikersnaam
visible-networks = Sigbare netwerke
identity = Identiteit
auth-dialog = Verifikasie vereis
.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.
forget-dialog = Vergeet hierdie wifi-netwerk?
.description = U sal weer 'n wagwoord moet invoer as u hierdie wifi-netwerk in die toekoms gebruik wil.
network-device-state =
.activated = Gekoppel
.config = Verbind, wag…
@ -51,7 +60,7 @@ network-device-state =
.disconnected = Het ontkoppel
.failed = Kon nie verbind nie
.ip-check = Verbinding nagaan…
.ip-config = IP- en roeteringsinligting opvra…
.ip-config = IP- en roeteringsinligting opvra…
.need-auth = Dit benodig verifikasie
.prepare = Verbinding word voorberei…
.secondaries = Wag op sekondêre verbinding…
@ -59,17 +68,14 @@ network-device-state =
.unknown = Status onbekend
.unmanaged = Onbeheerd
.unplugged = Kabel is losgekoppel
remove-connection-dialog = Hierdie verbindingsprofiel verwyder?
.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.
vpn = VPN
.connections = VPN-verbindings
.error = Kon nie VPN-konfigurasie byvoeg nie
.remove = Verwyder verbindingsprofiel
.select-file = Kies 'n VPN-konfigurasielêer
vpn-error = VPN-fout
.config = Kon nie VPN-konfigurasie byvoeg 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-desc = Gekose lêer moet op 'n plaaslike lêerstelsel wees.
.wireguard-device = Die skepping van WireGuard-toestel het misluk
.with-password = Kon nie { $field ->
*[username] VPN-gebruikersnaam
[password] VPN-wagwoord
[password-flags] VPN-wagwoordvlae
} met nmcli stel nie
.with-password =
Kon nie { $field ->
*[username] VPN-gebruikersnaam
[password] VPN-wagwoord
[password-flags] VPN-wagwoordvlae
} met nmcli stel nie
wired = Bedraad
.adapter = Bedrade adapter { $id }
.connections = Bedrade verbindings
.devices = Bedrade toestelle
.remove = Verwyder verbindingsprofiel
wifi = Wifi
.adapter = Wifi-adapter { $id }
.forget = Vergeet hierdie netwerk
wireguard-dialog = Voeg WireGuard-toestel toe
.description = Kies 'n toestelnaam vir die WireGuard-konfigurasie.
@ -108,10 +112,9 @@ online-accounts = Aanlyn rekeninge
activate = Aktiveer
confirm = Bevestig
enable = Skakel in
bluetooth = Bluetooth
.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
.connecting = Verbinding maak…
.disconnecting = Verbinding beëindig…
@ -122,16 +125,12 @@ bluetooth = Bluetooth
.disabled = Die bluetooth-diens is gedeaktiveer
.inactive = Die bluetooth-diens is nie aktief nie
.unknown = Die Bluetooth-diens kon nie geaktiveer word nie. Het u BlueZ geïnstalleer?
bluetooth-paired = Voorheen gekoppelde apparate
.connect = Verbind
.battery = { $percentage }% battery
bluetooth-confirm-pin = Bevestig bluetooth-pinkode
.description = Bevestig dat die volgende pinkode ooreenstem met dié wat op { $device } vertoon word
bluetooth-available = Apparate in die omgewing
bluetooth-adapters = Bluetooth-adapters
## Accessibility
@ -145,20 +144,21 @@ accessibility = Toeganklikheid
.high-contrast = Hoë kontrastmodus
.invert-colors = Keer kleure om
.color-filters = Kleurfilters
hearing = Gehoor
.mono = Speel stereo-klank as mono
default = Standaard
magnifier = Vergrootglas
.controls = Of gebruik hierdie kortpaaie: { $zoom_in ->
[zero] {""}
*[other] {""}
{$zoom_in} om in te zoem,
.controls =
Of gebruik hierdie kortpaaie: { $zoom_in ->
[zero] { "" }
*[other]
{ "" }
{ $zoom_in } om in te zoem,
}{ $zoom_out ->
[zero] {""}
*[other] {""}
{$zoom_out} om uit te zoem,
[zero] { "" }
*[other]
{ "" }
{ $zoom_out } om uit te zoem,
}
Super + Scroll met uw muis
.scroll_controls = Aktiveer muis- of raakvlakzoem met Super + Scroll
@ -176,5 +176,3 @@ color-filter = Kleurfiltertipe
.deuteranopia = Groen/Rooi (groenswakheid, Deuteranopie)
.protanopia = Rooi/Groen (rooiswakheid, Protanopie)
.tritanopia = Blou/Geel (bluoswakheid, Tritanopie)

View file

@ -3,22 +3,62 @@ dbus-connection-error = تعذر الاتصال بـDBus
ok = حسنًا
unknown = مجهول
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
connections-and-profiles =
{ $variant ->
[wired] سلكي
[wifi] واي فاي
[vpn] VPN
*[other] غير معروف
} الاتصالات وملفات تعريف الاتصال.
add-network = أضف شبكة
.profile = أضف ملف تعريف
add-vpn = إضافة VPN
add-vpn = أضف VPN
airplane-on = وضع الطائرة مفعَّل.
cable-unplugged = الكابل مفصول
connect = توصيل
connect = اتصل
connected = متصل
connecting = يتصل…
disconnect = اقطع الاتصال
@ -26,7 +66,7 @@ forget = انسَ
known-networks = الشبكات المعروفة
network-and-wireless = الشبكة واللاسلكي
no-networks = لم يُعثر على أي شبكات.
no-vpn = لا توجد اتصالات VPN متاحة.
no-vpn = لا اتصالات VPN متوفرة.
password = كلمة السر
password-confirm = أكِّد كلمة السر
remove = أزِل
@ -34,11 +74,11 @@ settings = الإعدادات
username = اسم المستخدم
visible-networks = الشبكات المرئية
identity = الهوية
auth-dialog = المصادقة مطلوبة
.vpn-description = أدخل اسم المستخدم وكلمة السر المطلوبين من قبل خدمة VPN.
.wifi-description = أدخل كلمة السر أو مفتاح التشفير. يمكنك أيضًا الاتصال بالضغط على زر ”WPS“ الموجود على الراوتر.
forget-dialog = هل تريد نسيان شبكة الواي فاي هذه؟
.description = ستحتاج إلى إدخال كلمة السر مرة أخرى لاستخدام شبكة Wi-Fi هذه في المستقبل.
auth-dialog = الاستيثاق مطلوب
.vpn-description = أدخل اسم المستخدم وكلمة السر المطلوبين من قِبل خدمة VPN.
.wifi-description = أدخل كلمة السر أو مفتاح التعمية. يمكنك أيضًا الاتصال بالضغط على زر "WPS" الموجود على جهاز التوجيه.
forget-dialog = أنسَ شبكة واي فاي هذه؟
.description = سيتعين إدخال كلمة السر مجددًا لاستخدامها مستقبلًا.
network-device-state =
.activated = متصل
.config = يتصل
@ -47,7 +87,7 @@ network-device-state =
.failed = فشل الاتصال
.ip-check = يتحقق من الاتصال
.ip-config = طلب معلومات IP والتوجيه
.need-auth = يحتاج إلى مصادقة
.need-auth = يحتاج إلى الاستيثاق
.prepare = التحضير للاتصال
.secondaries = انتظار الاتصال الثانوي
.unavailable = غير متاح
@ -99,7 +139,6 @@ activate = تفعيل
confirm = أكِّد
enable = فعِّل
bluetooth = بلوتوث
.desc = أدر أجهزة بلوتوث
.status = سيظهر النظام باسم { $aliases } حين تُفتح إعدادات بلوتوث.
.connected = متصل
.connecting = يتصل
@ -169,9 +208,8 @@ desktop = سطح المكتب
## Desktop: Wallpaper
wallpaper = خلفية
wallpaper = الخلفية
.change = غيِّر الصورة كل
.desc = صور الخلفية والألوان وخيارات عرض الشرائح.
.fit = ملاءمة الخلفية
.folder-dialog = اختر مجلد الخلفية
.image-dialog = اختر صورة الخلفية
@ -201,7 +239,6 @@ x-hours =
## Desktop: Appearance
appearance = المظهر
.desc = ألوان التمييز والنسق
accent-color = لون التمييز
app-background = خلفية النافذة
auto = آلي
@ -230,15 +267,15 @@ container-background = خلفية الحاوية
.reset = صفِّر إلى الوضع الآلي
.desc = يُستخدم في شريط التنقل الجانبي والدرج الجانبي ومربعات الحوار وعناصر واجهة المستخدم المماثلة
control-tint = تحكم في لون المكون
.desc = يستخدم لخلفيات الأزرار القياسية ومدخلات البحث ومدخلات النص والمكونات المماثلة.
.desc = يستخدم لخلفيات الأزرار القياسية ومدخلات البحث ومدخلات النص والمكونات المماثلة
frosted = تأثير الزجاج البلوري على واجهة النظام
.desc = يطبِّق تمويه الخلفية للوحة والمرسى والبريمجات والمطلق ومكتبة التطبيقات
enable-export = قم بتطبيق هذا المظهر على تطبيقات GNOME.
.desc = لا تدعم جميع مجموعات الأدوات التبديل التلقائي. قد تحتاج التطبيقات غير التابعة لـ COSMIC إلى إعادة التشغيل بعد تغيير المظهر.
icon-theme = ثيم الأيقونات
.desc = يطبق مجموعة مختلفة من الأيقونات على التطبيقات.
icon-theme = نسق الأيقونات
.desc = يطبق مجموعة مختلفة من الأيقونات على التطبيقات
text-tint = لون نص الواجهة
.desc = اللون المستخدم لاشتقاق ألوان نص الواجهة التي تتمتع بتباين كافٍ على الأسطح المختلفة.
.desc = اللون المستخدم لاشتقاق ألوان نص الواجهة التي تتمتع بتباين كافٍ على الأسطح المختلفة
style = المظهر
.round = دائري
.slightly-round = دائري قليلاً
@ -261,12 +298,10 @@ monospace-font = خط أحادي المسافة
## Desktop: Notifications
notifications = الإشعارات
.desc = لا تزعج، وإشعارات شاشة القفل، وإعدادات كل تطبيق على حدة.
## Desktop: Panel
panel = اللوحة
.desc = شريط النظام الأساسي للقوائم والبريمجات
add = أضِف
add-applet = أضِف بريمج
all = الكل
@ -279,7 +314,7 @@ panel-bottom = الأسفل
panel-left = الشمال
panel-right = اليمين
panel-top = الأعلى
search-applets = ابحث البريمجات…
search-applets = ابحث عن بريمجات…
small = صغير
start-segment = جزء البداية
panel-appearance = المظهر
@ -308,19 +343,17 @@ panel-missing = ضبط اللوحة مفقود
## Desktop: Dock
dock = حامل التطبيقات
.desc = حامل اختياري للتطبيقات والبرامج المصغرة.
dock = المرسى
## Desktop: Window management
window-management = إدارة النوافذ
.desc = إجراءات مفتاح سوبر، وخيارات التحكم في النوافذ، وخيارات إضافية لتقسيم النوافذ.
super-key = إجراءات مفتاح سوبر
super-key = إجراءات مفتاح Super
.launcher = فتح مشغل التطبيقات
.workspaces = فتح مساحات العمل
.applications = فتح التطبيقات
.disable = تعطيل
edge-gravity = تنجذب النوافذ التي تطفو إلى الحواف القريبة
edge-gravity = تنجذب النوافذ العائمة إلى الحواف القريبة
window-controls = تحكمات النوافذ
.maximize = أظهر زر التكبير
.minimize = أظهر زر التصغير
@ -333,7 +366,6 @@ focus-navigation = تنقُل التركيز
## Desktop: Workspaces
workspaces = مساحات العمل
.desc = توجه وسلوك مساحة العمل.
workspaces-behavior = سلوك مساحة العمل
.dynamic = مساحات عمل حركيَّة
.dynamic-desc = يُزيل مساحات العمل الفارغة آليًا.
@ -360,7 +392,6 @@ color = اللون
.sidebar = ملفات تعريف الألوان
.temperature = درجة حرارة اللون
display = الشاشات
.desc = أدر الشاشات والإضاءة الليلية
.arrangement = ترتيب الشاشات
.arrangement-desc = اسحب الشاشات لإعادة ترتيبها.
.enable = فعِّل الشاشة
@ -409,7 +440,6 @@ dialog = حوار
## Sound
sound = الصوت
.desc = غير متوفر
sound-output = الإخراج
.volume = مستوي صوت الإخراج
.device = جهاز الإخراج
@ -423,7 +453,7 @@ sound-input = الإدخال
.device = جهاز الإدخال
.level = مستوى الإدخال
amplification = التضخيم
.desc = يسمح برفع مستوى الصوت إلى 150٪.
.desc = يسمح برفع مستوى الصوت إلى 150٪
sound-alerts = التنبيهات
.volume = مستوي صوت التنبيهات
.sound = صوت التنبيهات
@ -433,7 +463,6 @@ sound-applications = التطبيقات
## Power
power = الطاقة والمُدَّخرة
.desc = أدر إعدادات الطاقة
battery = المُدَّخرة
.minute =
{ $value } { $value ->
@ -478,7 +507,6 @@ power-saving = خيارات توفير الطاقة
acceleration-desc = يضبط حساسية التتبع آليًا بناءً على السرعة
disable-while-typing = عطِّل أثناء الكتابة
input-devices = أجهزة الإدخال
.desc = أجهزة الإدخال
primary-button = الزر الأساسي
.desc = يعيِّن ترتيب الأزرار الملموسة.
.left = شمال
@ -497,7 +525,6 @@ fast = سريع
short = قصير
long = طويل
keyboard = لوحة المفاتيح
.desc = مصادر الإدخال والتبديل وإدخال الأحرف الخاصة والاختصارات
keyboard-sources = مصادر الإدخال
.desc = يمكن تبديل مصادر الإدخال باستعمال تركيبة مفتاحي Super+Space. يمكن أن يُخصّص هذا من خلال إعدادات اختصارات لوحة المفاتيح.
.move-up = حرِك لأعلى
@ -654,7 +681,6 @@ zoom-out = بعِّد
## Input: Mouse
mouse = الفأرة
.desc = سرعة الفأرة والتسارع والتمرير الطبيعي.
.speed = سرعة الفأرة
.acceleration = فعِّل تسارع الفأرة
@ -663,13 +689,12 @@ mouse = الفأرة
click-behavior = سلوك النقر
.click-finger = النقر الثانوي بإصبعين والنقر الأوسط بثلاثة أصابع
.button-areas = النقر الثانوي في الزاوية اليمنى السفلية والنقر الأوسط في المنتصف السفلي
pinch-to-zoom = الضغط للتكبير
.desc = استخدم إصبعين لتقريب المحتوى، في التطبيقات التي تدعم ذلك.
pinch-to-zoom = قرص للتكبير
.desc = استخدم إصبعين لتقريب المحتوى، في التطبيقات التي تدعم ذلك
tap-to-click = اضغط للنقر
.desc = يتيح الضغط بإصبع واحد للنقر الأساسي والضغط بإصبعين للنقر الثانوي والضغط بثلاثة أصابع للنقر الأوسط
touchpad = لوحة اللمس
.acceleration = فعِّل تسارع لوحة اللمس
.desc = سرعة لوحة اللمس وخيارات النقر والإيماءات.
.speed = سرعة لوحة اللمس
## Input: Gestures
@ -690,11 +715,9 @@ open-workspaces-view = نظرة عامة على مساحات العمل المف
## Time & Language
time = الوقت واللغة
.desc = غير متوفر
time-date = التاريخ والوقت
.desc = المنطقة الزمنية وإعدادات الساعة الآلية وبعض تنسيقات الوقت.
.auto = الضبط الآلي
.auto-ntp = سيحدَّث التاريخ والوقت الآلي عند ضبط المنطقة الزمنية
.auto = عيِّن آليًا
.auto-ntp = سيحدَّث التاريخ والوقت الآلي عند تعيين المنطقة الزمنية
time-zone = المنطقة الزمنية
.auto = المنطقة الزمنية الآلية
.auto-info = يتطلب خدمات الموقع والوصول إلى الإنترنت
@ -708,7 +731,6 @@ time-format = تنسيق التاريخ والوقت
.sunday = الأحد
.monday = الاثنين
time-region = المنطقة واللغة
.desc = تنسيق التواريخ والأوقات والأرقام بناءً على منطقتك.
formatting = التنسيق
.dates = التواريخ
.time = الوقت
@ -730,7 +752,6 @@ applications = التطبيقات
## Applications: Default Applications
default-apps = التطبيقات المبدئية
.desc = متصفح الويب المبدئي وعميل البريد ومتصفح الملفات والتطبيقات الأخرى.
.web-browser = متصفح الوِب
.file-manager = مدير الملفات
.mail-client = عميل البريد
@ -741,22 +762,21 @@ default-apps = التطبيقات المبدئية
.terminal = طرفية
.other-associations = جمعيات أخرى
.text-editor = محرِّر نصوص
.not-installed = غير مُنصَّب
## Applications: Startup Applications
startup-apps = تطبيقات بدء التشغيل
.desc = تكوين التطبيقات التي يتم تشغيلها عند تسجيل الدخول.
.add = إضافة تطبيق
.user = التطبيقات التي يتم تشغيلها عند تسجيل الدخول
.none = لم تتم إضافة أي تطبيقات بدء تشغيل
.remove-dialog-title = إزالة { $name }؟
.remove-dialog-description = هل تريد حذف تطبيق بدء التشغيل هذا؟
.search-for-application = البحث عن تطبيق
.add = أضِف تطبيق
.user = التطبيقات التي تُشغّل عند الولوج
.none = لم تُضاف تطبيقات بدء تشغيل
.remove-dialog-title = أزلِ { $name }؟
.remove-dialog-description = أتريد إزالة تطبيق بدء التشغيل هذا؟
.add-startup-app = أضِف تطبيق بدء التشغيل
## Applications: Legacy Applications
legacy-applications = توافق تطبيقات اكس11
.desc = تغيير مقياس تطبيقات نظام النوافذ اكس11 والاختصارات العامة
legacy-app-global-shortcuts = اختصارات عامة في تطبيقات اكس11
.desc = تسمح الاختصارات العامة بالتعرّف على ضغطات المفاتيح وأحداث زر الفأرة المُجراة في تطبيقٍ ما لتطبيقاتٍ أخرى — لميزات مثل «اضغط لتتحدث» أو «اضغط لكتم الصوت». مبدئيًا، يُعطّل هذا في تطبيقات اكس11 لضمان عدم تمكن التطبيقات الأخرى من مراقبة أحداث لوحة المفاتيح والفأرة التي تحتوي على معلومات حساسة.
.none = لا مفاتيح
@ -781,9 +801,8 @@ system = النظام والحسابات
## System: About
about = عن
.desc = اسم الجهاز ومعلومات العتاد ومبدئيات نظام التشغيل
about-device = اسم الجهاز
.desc = هذا الاسم يظهر للشبكات الأخرى وأجهزة بلوتوث.
.desc = هذا الاسم يظهر للشبكات الأخرى وأجهزة بلوتوث
about-hardware = العتاد
.model = طراز العتاد
.memory = الذاكرة
@ -802,23 +821,21 @@ about-related = الإعدادات ذات الصلة
## System: Firmware
firmware = البرمجيات الثابتة
.desc = تفاصيل البرمجيات الثابتة.
## System: Users
users = المستخدمون
.desc = الاستيثاق وحسابات المستخدمين.
.admin = مدير
.standard = عادي
.profile-add = اختر صورة ملف تعريف
administrator = مدير
.desc = يمكن للمديرين تغيير الإعدادات لجميع المستخدمين، وإضافة مستخدمين آخرين وإزالتهم.
.desc = يمكن للمديرين تغيير الإعدادات لجميع المستخدمين، وإضافة مستخدمين آخرين وإزالتهم
add-user = أضِف مستخدم
change-password = غيَّر كلمة السر
remove-user = أزِل المستخدم
full-name = الاسم الكامل
invalid-username = اسم المستخدم غير صالح.
password-mismatch = يجب أن تتطابق كلمة السر والتأكيد.
invalid-username = اسم المستخدم غير صالح
password-mismatch = يجب أن تتطابق كلمة السر والتأكيد
save = حفظ
never = أبدًا
keyboard-numlock-boot = Numlock
@ -837,3 +854,60 @@ shadows-tiling = النوافذ المبلطة
.clip = مطابقة زوايا النظام
.shadow = طبِّق الظلال
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
connections-and-profiles =
{ $variant ->
[wired] Правадныя
[wifi] Wi-Fi
[vpn] VPN
*[other] Невядомыя
} злучэнні і профілі злучэнняў.
add-network = Дадаць сетку
.profile = Дадаць профіль
add-vpn = Дадаць VPN
@ -549,7 +542,7 @@ migrate-workspace =
navigate = Перайсці
replace = Замяніць
shortcut-name = Назва спалучэння
system-controls = Элементы кантроля сістэмай
system-controls = Элементы кантролю сістэмай
terminate = Завяршыць
toggle-stacking = Пераключыць стасаванне акна
type-key-combination = Увядзіце камбінацыю клавіш
@ -654,7 +647,7 @@ window-tiling = Укладанне вокнаў
.toggle-floating = Пераключыць плавучасць акна
.toggle-orientation = Пераключыць арыентацыю
replace-shortcut-dialog = Замянць спалучэнне?
.desc = { $shortcut } выкарыстоўваецца для { $name }. Калі вы заменіце яго, { $name } будзе адаключана.
.desc = { $shortcut } выкарыстоўваецца для { $name }. Калі вы заменіце яго, { $name } будзе адключана.
zoom-in = Павялічыць
zoom-out = Паменшыць
@ -671,9 +664,9 @@ click-behavior = Паводзіны пры націску
.click-finger = Другасны клік актывуецца двума пальцамі, а сярэдні клік — трыма пальцамі
.button-areas = Другасны клік актывуецца ў ніжнім правым вугле, а сярэдні клік — у ніжнім цэнтры
pinch-to-zoom = Шчыпок для маштабавання
.desc = Выкарыстоўвайце два пальцы для маштабавання змесціва праграм, якія падтрымліваюць маштабаванне.
.desc = Выкарыстоўвайце два пальцы для маштабавання змесціва праграм, якія падтрымліваюць маштабаванне
tap-to-click = Націск для кліку
.desc = Уключае націск адным пальцам для асноўнага кліку, двума пальцамі — для другаснага кліку і трыма пальцамі — для сярэдняга кліку.
.desc = Уключае націск адным пальцам для асноўнага кліку, двума пальцамі — для другаснага кліку і трыма пальцамі — для сярэдняга кліку
touchpad = Сэнсарная панэль
.acceleration = Уключыць паскарэнне сэнсарнай панэлі
.desc = Хуткасць сэнсарнай панэлі, параметры націскаў, жэсты.
@ -699,11 +692,11 @@ open-workspaces-view = Адкрыць агляд працоўных прасто
time = Час і мова
.desc = N/A
time-date = Дата і час
.desc = Часавы пояс, аўтаматычныя налады гадзінніка і фарматаванне часу.
.desc = Часавы пояс, аўтаматычныя налады гадзінніка і фарматаванне часу
.auto = Задаваць аўтаматычна
.auto-ntp = Дата і час будуць абнаўляцца аўтаматычка, калі заданы часавы пояс.
time-zone = Часовы пояс
.auto = Аўтаматычны часовы пояс
.auto-ntp = Дата і час будуць абнаўляцца аўтаматычна, калі зададзены часавы пояс
time-zone = Часавы пояс
.auto = Аўтаматычны часавы пояс
.auto-info = Патрабуецца доступ да месцазнаходжання і інтэрнэту
time-format = Фармат даты і часу
.twenty-four = 24-гадзінны фармат
@ -715,7 +708,7 @@ time-format = Фармат даты і часу
.sunday = Нядзеля
.monday = Панядзелак
time-region = Рэгіён і мова
.desc = Фармат даты, часу і лікаў у адпаведнасці з рэгіёнам.
.desc = Фармат даты, часу і лікаў у адпаведнасці з рэгіёнам
formatting = Фарматаванне
.dates = Даты
.time = Час
@ -751,21 +744,21 @@ default-apps = Праграмы па змаўчанні
## Applications: Startup Applications
startup-apps = Праграмы пры запуску
startup-apps = Праграмы для аўтазапуску
.desc = Наладзьце праграмы, якія запускаюцца пры ўваходзе ў сістэму.
.add = Дадаць праграму
.user = Праграмы, якія запускаюцца падчас вашага ўвахода ў сістэму
.none = У аўтазапуску няма праграм
.remove-dialog-title = Выдаліць { $name }?
.remove-dialog-description = Вы сапраўды жадаеце выдаліць гэта як праграму для запуску?
.search-for-application = Пошук праграмы
.remove-dialog-description = Выдаліць гэта як праграму для аўтазапуску?
.add-startup-app = Дадаць праграму для аўтазапуску
## Applications: Legacy Applications
legacy-applications = Сумяшчальнасць праграм X11
.desc = Маштабаванне праграм аконнай сістэмы X11 і глабальныя спалучэнні клавіш.
.desc = Маштабаванне праграм аконнай сістэмы X11 і глабальныя спалучэнні клавіш
legacy-app-global-shortcuts = Глабальныя спалучэнні клавіш у праграмах X11
.desc = Глабальныя спалучэнні клавіш дазваляюць распазнаваць націсканні клавіш і падзеі кнопак мышы ў праграмах іншымі праграмамі для такіх функцый, як "націсні і кажы" або "націсні і адключы гук". Па змаўчанні гэта адключана ў праграмах X11, каб іншыя праграмы не маглі маніторыць падзеі клавіятуры і мышы, якія змяшчаюць канфідэнцыйную інфармацыю.
.desc = Глабальныя спалучэнні клавіш дазваляюць распазнаваць націсканні клавіш і падзеі кнопак мышы ў праграмах іншымі праграмамі для такіх функцый, як "націсні і кажы" або "націсні і адключы гук". Стандартна, Глабальныя спалучэнні адключаны ў праграмах X11, каб іншыя праграмы не маглі кантраляваць падзеі клавіятуры і мышы, якія змяшчаюць канфідэнцыяльную інфармацыю.
.none = Без клавіш
.modifiers = Мадыфікатары (Super, Shift, Control, Alt)
.combination = Усе клавішы, пакуль націснутыя мадыфікатары Super, Control або Alt
@ -775,22 +768,22 @@ legacy-app-scaling = Маштабаванне праграм аконнай сі
.scaled-gaming = Аптымізаваць для гульняў і поўнаэкранных праграм
.gaming-description = Праграмы X11 могуць выглядаць крыху большымі/меншымі ў параўнанні з праграмамі Wayland.
.scaled-applications = Аптымізаваць для праграм
.applications-description = Гульні і поўнаэкранныя праграмы X11 могуць не адпавядаць разрозненню вашага дысплея.
.applications-description = Гульні і поўнаэкранныя праграмы X11 могуць не адпавядаць раздзяляльнасці вашага дысплэя.
.scaled-compatibility = Рэжым максімальнай сумяшчальнасці
.compatibility-description = Праграмы X11 могуць выглядаць размытымі на HiDPI-экранах.
.preferred-display = Выбраны дысплей для гульняў і поўнаэкранных праграм X11
.preferred-display = Выбраны дысплэй для гульняў і поўнаэкранных праграм X11
.no-display = Няма
## System
system = Сістэма і акаўнты
system = Сістэма і ўліковыя запісы
## System: About
about = Пра сістэму
.desc = Назва прылады, інфармацыя аб абсталяванні, стандартныя налады аперацыйнай сістэмы.
.desc = Назва прылады, інфармацыя аб абсталяванні, стандартныя налады аперацыйнай сістэмы
about-device = Назва прылады
.desc = Гэтая назва адлюстроўваецца іншым сеткавым або блютуз прыладам.
.desc = Гэтая назва адлюстроўваецца іншым сеткавым або блютуз прыладам
about-hardware = Абсталяванне
.model = Мадэль абсталявання
.memory = Памяць
@ -800,6 +793,7 @@ about-hardware = Абсталяванне
about-os = Аперацыйная сістэма
.os = Аперацыйная сістэма
.os-architecture = Архітэктура аперацыйнай сістэмы
.kernel = Версія ядра
.desktop-environment = Асяроддзе працоўнага стала
.windowing-system = Сістэма вокнаў
about-related = Спадарожныя налады
@ -808,7 +802,7 @@ about-related = Спадарожныя налады
## System: Firmware
firmware = Праграмнае забеспячэнне
.desc = Дэталі праграмнага забеспячэння.
.desc = Дэталі праграмнага забеспячэння
## System: Users
@ -818,13 +812,13 @@ users = Карыстальнікі
.standard = Звычайны
.profile-add = Выбраць выяву профілю
administrator = Адміністратар
.desc = Адміністратары могуць змяняць налады для ўсіх карыстальнікаў, дадаваць і выдаляць іншых карыстальнікаў.
.desc = Адміністратары могуць змяняць налады для ўсіх карыстальнікаў, дадаваць і выдаляць іншых карыстальнікаў
add-user = Дадаць карыстальніка
change-password = Змяніць пароль
remove-user = Выдаліць карыстальніка
full-name = Поўнае імя
invalid-username = Недапушчальнае імя карыстальніка.
password-mismatch = Пароль і пацвярджэнне мусяць супадаць.
invalid-username = Недапушчальнае імя карыстальніка
password-mismatch = Пароль і пацвярджэнне мусяць супадаць
save = Захаваць
amplification = Узмацненне
.desc = Дазваляе павялічваць гучнасць да 150%.

View file

@ -6,13 +6,6 @@ number = { $number }
## Network & Wireless
connections-and-profiles =
{ $variant ->
[wired] Кабелни
[wifi] Безжични
[vpn] ВЧМ
*[other] Неизвестни
} връзки и профили на връзките.
add-network = Добавяне на мрежа
.profile = Добавяне на профил
add-vpn = Добавяне на ВЧМ

View file

@ -2,6 +2,65 @@ app = Nastavení COSMIC
unknown = Neznámé
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 = Plocha
@ -9,12 +68,10 @@ desktop = Plocha
## Desktop: Appearance
appearance = Vzhled
.desc = Doplňkové barvy a témata
## Desktop: Notifications
notifications = Oznámení
.desc = Nerušit, oznámení na zamykací obrazovce a nastavení pro specifické aplikace
## Desktop: Options
@ -23,19 +80,17 @@ hot-corner = Aktivní roh
window-controls = Ovládání oken
.maximize = Zobrazit tlačítko pro maximalizaci
.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
.desc = Volitelná lišta pro aplikace a applety
## Desktop: Panel
panel = Panel
.desc = Hlavní systémová lišta pro menu a applety
panel-behavior-and-position = Chování a pozice
.autohide = Automaticky skrýt panel
.dock-autohide = Automaticky skrýt dok
.position = Pozice na obrazovce
.display = Zobrazit na displeji
.display = Zobrazit na obrazovce
panel-top = Nahoře
panel-bottom = Dole
panel-left = Vlevo
@ -72,16 +127,15 @@ all = Všechny
## Desktop: Tapeta
wallpaper = Pozadí
wallpaper = Tapeta
.change = Měnit obrázek každých
.desc = Obrázky pozadí, barvy a možnosti prezentace
.fit = Způsob umístění pozadí
.folder-dialog = Vyberte složku s obrázky pozadí
.image-dialog = Vyberte obrázek pozadí
.plural = Pozadí
.same = Stejné pozadí na všech displejích
.fit = Způsob umístění tapety
.folder-dialog = Vyberte složku s tapetami
.image-dialog = Vyberte obrázek tapety
.plural = Tapety
.same = Stejná tapeta na všech obrazovkách
.slide = Prezentace
all-displays = Všechny displeje
all-displays = Všechny obrazovky
colors = Barvy
fit-to-screen = Přizpůsobit obrazovce
x-minutes =
@ -100,15 +154,14 @@ x-hours =
## Desktop: Workspaces
workspaces = Pracovní plochy
.desc = Chování a orientace pracovních ploch
workspaces-behavior = Chování pracovních ploch
.dynamic = Dynamické pracovní plochy
.dynamic-desc = Automaticky odstraní prázdné pracovní plochy.
.fixed = Fixní množství pracovních ploch
.fixed-desc = Přidat nebo odstranit pracovní plochy v přehledu.
workspaces-multi-behavior = Chování při více monitorech
.span = Pracovní plochy obsadí více displejů
.separate = Každý displej má svou vlastní pracovní plochu
.span = Pracovní plochy obsadí více obrazovek
.separate = Každá obrazovka má svou vlastní pracovní plochu
## Networking: Wired
@ -126,13 +179,11 @@ online-accounts = Online účty
## Time & Language
time = Čas a jazyk
.desc = N/A
time-date = Datum a čas
.desc = Časová zóna, automatické nastavení hodin a formátování času
.auto = Nastavit automaticky
.auto-ntp = Pokud nastavíte časovou zónu, datum a čas se bude aktualizovat automaticky
time-zone = Časová zóna
.auto = Automatická časová zóna
.auto-ntp = Pokud nastavíte časové pásmo, datum a čas se bude aktualizovat automaticky
time-zone = Časové pásmo
.auto = Automatické časové pásmo
.auto-info = Vyžaduje službu polohy a internet
time-format = Formát data a času
.twenty-four = 24 hodinový čas
@ -144,12 +195,10 @@ time-format = Formát data a času
.sunday = Neděle
.monday = Pondělí
time-region = Region a jazyk
.desc = Formátujte datumy, časy a čísla podle vašeho regionu
## Sound
sound = Zvuk
.desc = N/A
sound-output = Výstup
.volume = Hlasitost výstupu
.device = Výstupní zařízení
@ -175,7 +224,6 @@ system = Systém a účty
## System: About
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
.desc = Tento název se zobrazí ostatním síťovým a Bluetooth zařízením
about-hardware = Hardware
@ -188,7 +236,7 @@ about-os = Operační systém
.os = Operační systém
.os-architecture = Architektura operačního systému
.kernel = Verze jádra
.desktop-environment = Desktopové prostředí
.desktop-environment = Prostředí plochy
.windowing-system = Okenní systém
about-related = Podobná nastavení
.support = Získat podporu
@ -196,12 +244,10 @@ about-related = Podobná nastavení
## System: Firmware
firmware = Firmware
.desc = Podrobnosti o firmwaru
## System: Users
users = Uživatelé
.desc = Ověření a uživatelské účty
.admin = Administrátor
.standard = Standardní
.profile-add = Vyberte obrázek profilu
@ -223,15 +269,14 @@ scrolling = Rolování
## Input: Keyboard
keyboard = Klávesnice
.desc = Metody zadávání, přepínání, vkládání speciálních znaků, zkratky
keyboard-sources = Metody zadávání
.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.
keyboard-sources = Vstupní zdroje
.desc = Vstupní zdroje lze přepínat pomocí Super + Mezerník. Toto se dá změnit v nastavení klávesových zkratek.
.move-up = Posunout nahoru
.move-down = Posunout dolů
.settings = Nastavení
.view-layout = Zobrazit rozložení klávesnice
.remove = Odstranit
.add = Přidat metodu zadávání
.add = Přidat vstupní zdroj
keyboard-special-char = Zadávání speciálních znaků
.alternate = Klávesa pro náhradní znaky
.compose = Klávesa Compose
@ -241,12 +286,11 @@ keyboard-special-char = Zadávání speciálních znaků
## Input: Keyboard: Shortcuts
keyboard-shortcuts = Klávesové zkratky
.desc = Zobrazit a změnit klávesové zkratky
.desc = Zobrazit a změnit zkratky
## Input: Mouse
mouse = Myš
.desc = Rychlost myši, zrychlení, přirozené rolování
.speed = Rychlost myši
.acceleration = Povolit zrychlení myši
@ -254,7 +298,6 @@ mouse = Myš
touchpad = Touchpad
.acceleration = Povolit zrychlení touchpadu
.desc = Rychlost touchpadu, nastavení klikání, gesta
.speed = Rychlost touchpadu
dbus-connection-error = Selhalo připojení k DBus
ok = OK
@ -277,15 +320,14 @@ settings = Nastavení
username = Uživatelské jméno
visible-networks = Viditelné sítě
identity = Identita
dark = Tmavé
light = Světlé
dark = Tmavý
light = Světlý
wireguard-dialog = Přidat zařízení WireGuard
.description = Vyberte název zařízení pro nastavení WireGuard.
activate = Aktivovat
confirm = Potvrdit
enable = Povolit
bluetooth = Bluetooth
.desc = Správa Bluetooth zařízení.
.status = Tento systém je viditelný jako { $aliases }, dokud jsou otevřena nastavení Bluetooth.
.connected = Připojeno
.connecting = Připojování
@ -324,14 +366,14 @@ fill = Vyplnit
open-new-folder = Otevřít novou složku
recent-folders = Nedávné složky
never = Nikdy
accent-color = Doplňková barva
accent-color = Barva zvýraznění
app-background = Pozadí okna
auto = Auto
close = Zavřít
replace = Nahradit
color-picker = Výběr barvy
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
hex = Hex
import = Importovat
@ -339,7 +381,7 @@ mode-and-colors = Režim a barvy
recent-colors = Nedávné barvy
reset-to-default = Obnovit výchozí
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íť
.profile = Přidat profil
auth-dialog = Vyžadováno ověření
@ -371,19 +413,12 @@ vpn = VPN
.error = Nepodařilo se přidat nastavení VPN
.remove = Odstranit profil připojení
.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
.config = Nepodařilo se přidat nastavení VPN
.connect = Nepodařilo se připojit k VPN
.connection-editor = Editor připojení selhal
.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-desc = Vybraný soubor musí být na lokálním souborovém systému
.wireguard-device = Nepodařilo se vytvořit zařízení WireGuard
@ -396,7 +431,7 @@ vpn-error = Chyba VPN
wifi = Wi-Fi
.adapter = Adaptér Wi-Fi { $id }
.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
.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
@ -409,16 +444,15 @@ container-background = Pozadí kontejneru
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
frosted = Efekt zmrazeného okna na systémovém rozhraní
.desc = Aplikuje rozmazané pozadí na panel, dok, applety, spouštěč a knihovnu aplikací
enable-export = Použít současné téma pro GNOME aplikace
.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 = Použije rozmazané pozadí pro panel, dok, applety, spouštěč a knihovnu aplikací
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ě motivu.
password-mismatch = Heslo a jeho potvrzení se musí shodovat
invalid-username = Neplatné uživatelské jméno
icon-theme = Téma ikon
.desc = Aplikuje jinou sadu ikon na aplikace
monospace-font = Monospace písmo
icon-theme = Motiv ikon
.desc = Použije jinou sadu ikon pro aplikace
monospace-font = Písmo s pevnou šířkou
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
.horizontal = Nastavit horizontá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-floating = Přepnout plovoucí okno
.toggle-orientation = Přepnout orientaci
icons-and-toolkit = Témata ikon a toolkitů
interface-font = Systémové písmo
icons-and-toolkit = Motivy ikon a toolkitů
interface-font = Písmo systému
super-key = Akce klávesy Super
.launcher = Otevřít spouštěč
.workspaces = Otevřít pracovní plochy
@ -483,18 +517,17 @@ color-filter = Typ barevného filtru
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
experimental-settings = Experimentální nastavení
display = Displeje
.desc = Spravujte displeje a noční světlo
.arrangement = Uspořádání displejů
.arrangement-desc = Přetáhněte displeje pro jejich uspořádání
.enable = Povolit displej
.external = { $size } { $output } Externí displej
.laptop = { $size } Displej laptopu
.options = Možnosti displeje
display = Obrazovky
.arrangement = Uspořádání obrazovek
.arrangement-desc = Přetáhněte obrazovky pro jejich uspořádání
.enable = Povolit obrazovku
.external = { $size } { $output } externí obrazovka
.laptop = { $size } obrazovka notebooku
.options = Možnosti obrazovky
.refresh-rate = Obnovovací frekvence
.resolution = Rozlišení
.scale = Škálování
.additional-scale-options = Další možnosti škálování
.scale = Měřítko
.additional-scale-options = Další možnosti měřítka
style = Styl
.round = Kulatý
.slightly-round = Lehce kulatý
@ -504,7 +537,7 @@ interface-density = Hustota rozhraní
.compact = Kompaktní
.spacious = Prostorné
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
mirroring = Zrcadlení
.id = Zrcadlení { $id }
@ -512,14 +545,14 @@ mirroring = Zrcadlení
.mirror = Zrcadlit { $display }
.project =
Vysílat na { $display ->
[all] všechny displeje
[all] všechny obrazovky
*[other] { $display }
}
.project-count =
Vysílání na { $count } { $count ->
[one] další displej
[few] další displeje
*[other] dalších displejů
[one] další obrazovku
[few] další obrazovky
*[other] dalších obrazovek
}
night-light = Noční světlo
.auto = Automaticky (od západu do východu)
@ -537,14 +570,19 @@ vrr = Variabilní obnovovací frekvence
scheduling = Plánování
.manual = Manuální plán
dialog = Dialog
.title = Ponechat tato nastavení displeje?
.title = Ponechat toto nastavení obrazovky?
.keep-changes = Ponechat změny
.change-prompt = Změny nastavení se automaticky zruší za { $time } sekund.
.revert-settings = Obnovit nastavení
.change-prompt =
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í
.desc = Umožňuje zesílit zvuk až na 150%
power = Napájení a baterie
.desc = Spravujte nastavení napájení
battery = Baterie
.minute =
{ $value } { $value ->
@ -584,11 +622,10 @@ power-mode = Režim napájení
power-saving = Možnosti úspory energie
.turn-off-screen-after = Vypnout obrazovku za
.auto-suspend = Automaticky uspat za
.auto-suspend-ac = Automaticky uspávat při napájení z elektrické sítě
.auto-suspend-battery = Automaticky uspávat při napájení pouze z baterie
.auto-suspend-ac = Automaticky uspat při napájení ze sítě
.auto-suspend-battery = Automaticky uspat při napájení z baterie
disable-while-typing = Zakázat při psaní
input-devices = Vstupní zařízení
.desc = Vstupní zařízení
modified = { $count } změněných
slow = Pomalá
fast = Rychlá
@ -597,16 +634,16 @@ long = Dlouhé
keyboard-typing-assist = Psaní
.repeat-rate = Frekvence opakování
.repeat-delay = Zpoždění opakování
keyboard-numlock-boot = Numlock
.boot-state = Stav při spuštění systému
keyboard-numlock-boot = Num Lock
.boot-state = Stav klávesy při spuštění systému
.last-boot = Poslední spuštění systému
.on = Zapnuto
.off = Vypnuto
.set = Nastavit stav numlock při spuštění systému
.on = Zapnutý
.off = Vypnutý
.set = Num Lock při spuštění systému
added = Přidáno
type-to-search = Pište pro vyhledávání...
show-extended-input-sources = Zobrazit rozšířené metody zadávání
input-source-switch = Přepnout metodu zadávání klávesnice
show-extended-input-sources = Zobrazit rozšířené vstupní zdroje
input-source-switch = Přepnout vstupní zdroj klávesnice
add-another-keybinding = Přidat další klávesovou zkratku
command = Příkaz
custom = Vlastní
@ -661,7 +698,7 @@ manage-windows = Správa oken
.minimize = Minimalizovat okno
.resize-inwards = Zmenš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-out = Oddálit
preferred-languages = Preferované jazyky
@ -703,19 +740,19 @@ move-windows = Přesouvání oken
.prev-workspace = Přesunout okno na předchozí pracovní plochu
.next-workspace = Přesunout okno na další pracovní plochu
.last-workspace = Přesunout okno na poslední pracovní plochu
.next-display = Přesunout okno na další displej
.prev-display = Přesunout okno na předchozí displej
.next-display = Přesunout okno na další obrazovku
.prev-display = Přesunout okno na předchozí obrazovku
.send-to-prev-workspace = Přesunout okno na předchozí pracovní plochu
.send-to-next-workspace = Přesunout okno na další pracovní plochu
system-shortcut = Systém
.app-library = Otevřít knihovnu aplikací
.brightness-down = Snížit jas displeje
.brightness-up = Zvýšit jas displeje
.display-toggle = Přepnout interní displej
.brightness-down = Snížit jas obrazovky
.brightness-up = Zvýšit jas obrazovky
.display-toggle = Přepnout vestavěnou obrazovku
.home-folder = Otevřít domovskou složku
.keyboard-brightness-down = Sníž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
.lock-screen = Zamknout obrazovku
.mute = Ztlumit zvukový výstup
@ -763,9 +800,8 @@ formatting = Formátování
.measurement = Jednotky
.paper = Papír
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č
.file-manager = Prohlížeč souborů
.file-manager = Správce souborů
.mail-client = Poštovní klient
.music = Hudba
.video = Video
@ -774,32 +810,31 @@ default-apps = Výchozí aplikace
.terminal = Terminál
.other-associations = Ostatní asociace
.text-editor = Textový editor
startup-apps = Automatické spouštění aplikací
.desc = Nastavte aplikace, které se spustí při přihlášení
.not-installed = Není nainstalováno
startup-apps = Automaticky spouštěné aplikace
.add = Přidat aplikaci
.user = Aplikace spouštěné při přihlášení
.none = Nejsou přidány žádné aplikace pro automatické spouštění
.remove-dialog-title = Odstranit { $name }?
.remove-dialog-description = Odstranit tuto aplikaci z automatického spouštění?
.add-startup-app = Přidat aplikaci pro spouštění
legacy-applications = Kompatibilita X11 aplikací
.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í klávesové zkratky X11 aplikací
.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.
legacy-applications = Kompatibilita aplikací X11
legacy-app-global-shortcuts = Globální zkratky aplikací X11
.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.
.none = Žádné klávesy
.modifiers = Modifikátory (Super, Shift, Control, Alt)
.combination = Všechny klávesy při stisku modifikátorů Super, Control nebo Alt
.all = Všechny klávesy
.mouse = Události tlačítek myši v X11 aplikacích
legacy-app-scaling = Škálování aplikací v okenním systému X11
.mouse = Události tlačítek myši v aplikacích X11
legacy-app-scaling = Měřítko aplikací v okenním systému X11
.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
.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
.compatibility-description = Aplikace X11 mohou na HiDPI obrazovkách vypadat rozmazaně
.preferred-display = Preferovaný displej pro hry a aplikace X11 na celé obrazovce
.no-display = Žádný
.preferred-display = Preferovaná obrazovka pro hry a aplikace X11 na celé obrazovce
.no-display = Žádná
place-here = Sem umístěte applety
network-name = Název sítě
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
shadows-floating = Plovoucí okna
.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
connections-and-profiles =
{ $variant ->
[wired] Kablet
[wifi] Wi-Fi
[vpn] VPN
*[other] Ukendt
} forbindelser og forbindelsesprofiler.
add-network = Tilføj Netværk
.profile = Tilføj profil
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
ok = OK
unknown = Unbekannt
@ -6,13 +6,6 @@ number = { $number }
## 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
.profile = Profil hinzufügen
add-vpn = VPN hinzufügen
@ -36,9 +29,9 @@ visible-networks = Sichtbare Netzwerke
identity = Identität
auth-dialog = Authentifizierung erforderlich
.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.
forget-dialog = Dieses Wi-Fi-Netzwerk vergessen?
.description = Du musst erneut ein Passwort eingeben, um dieses Wi-Fi-Netzwerk in der Zukunft zu verwenden.
.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 WLAN-Netzwerk vergessen?
.description = Du musst erneut ein Passwort eingeben, um dieses WLAN-Netzwerk in Zukunft verwenden zu können.
network-device-state =
.activated = Verbunden
.config = Wird verbunden
@ -55,7 +48,7 @@ network-device-state =
.unmanaged = Unverwaltet
.unplugged = Kabel ausgesteckt
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.
vpn = VPN
.connections = VPN-Verbindungen
@ -82,8 +75,8 @@ wired = Kabelgebunden
.connections = Kabelgebundene Verbindungen
.devices = Kabelgebundene Geräte
.remove = Verbindungsprofil entfernen
wifi = Wi-Fi
.adapter = Wi-Fi-Adapter { $id }
wifi = WLAN
.adapter = WLAN-Adapter { $id }
.forget = Dieses Netzwerk vergessen
wireguard-dialog = WireGuard-Gerät hinzufügen
.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
online-accounts = Online-Konten
.desc = Hinzufügen von Konten, IMAP und SMTP, Unternehmensanmeldungen
.desc = Konten, IMAP und SMTP, Unternehmensanmeldungen hinzufügen
# Bluetooth
@ -99,7 +92,6 @@ activate = Aktivieren
confirm = Bestätigen
enable = Aktivieren
bluetooth = Bluetooth
.desc = Bluetooth-Geräte verwalten
.status = Dieses System ist als { $aliases } sichtbar, während die Bluetooth-Einstellungen geöffnet sind.
.connected = Verbunden
.connecting = Wird verbunden
@ -121,16 +113,16 @@ bluetooth-adapters = Bluetooth-Adapter
## Accessibility
accessibility = Zugänglichkeit
.vision = Sehkraft
accessibility = Barrierefreiheit
.vision = Sehen
.on = Ein
.off = Aus
.unavailable = Nicht verfügbar
.screen-reader = Bildschirmleser
.high-contrast = Modus mit hohem Kontrast
.high-contrast = Modus für hohen Kontrast
.invert-colors = Farben invertieren
.color-filters = Farbfilter
hearing = Gehör
hearing = Hören
.mono = Stereo-Audio als Mono abspielen
default = Standard
magnifier = Vergrößerungsglas
@ -156,8 +148,8 @@ magnifier = Vergrößerungsglas
.continuous = Vergrößerung folgt der Maus
.onedge = Bewegt sich, wenn die Maus die Kanten berürt
.centered = Den Mauszeiger auf der Vergrößerung zentriert halten
color-filter = Typ des Farbfilters
.unknown = Unbekannt Filter aktiv
color-filter = Farbfiltertyp
.unknown = Unbekannter Filter aktiv
.greyscale = Graustufen
.deuteranopia = Grün/Rot (Grünschwäche, Deuteranopie)
.protanopia = Rot/Grün (Rotschwäche, Protanopie)
@ -171,13 +163,12 @@ desktop = Desktop
wallpaper = Hintergrundbild
.change = Bild ändern alle
.desc = Hintergrundbilder, Farben und Diashow-Optionen.
.fit = Hintergrundbild anpassen
.folder-dialog = Ordner für Hintergrundbilder auswählen
.image-dialog = Hintergrundbild auswählen
.plural = Hintergrundbilder
.same = Gleiches Hintergrundbild auf allen Bildschirmen
.slide = Diashow
.slide = Slideshow
add-color = Farbe hinzufügen
add-image = Bild hinzufügen
all-displays = Alle Bildschirme
@ -186,7 +177,7 @@ dialog-add = Hinzufügen
fill = Füllen
fit-to-screen = An Bildschirm anpassen
open-new-folder = Neuen Ordner öffnen
recent-folders = Letzte Ordner
recent-folders = Zuletzt verwendete Ordner
x-minutes =
{ $number } { $number ->
[one] Minute
@ -202,9 +193,8 @@ never = Nie
## Desktop: Appearance
appearance = Aussehen
.desc = Akzentfarben und Themen.
accent-color = Akzentfarbe
app-background = Anwendungs- oder Fensterhintergrund
app-background = Fensterhintergrund
auto = Automatisch
close = Schließen
color-picker = Farbwähler
@ -212,34 +202,34 @@ copied-to-clipboard = In Zwischenablage kopiert
copy-to-clipboard = In Zwischenablage kopieren
dark = Dunkel
export = Exportieren
hex = Hex
hex = Hexadezimal
import = Importieren
light = Hell
mode-and-colors = Modus und Farben
recent-colors = Letzte Farben
reset-to-default = Auf Standardwerte zurücksetzen
recent-colors = Zuletzt verwendete Farben
reset-to-default = Auf Standard zurücksetzen
rgb = RGB
window-hint-accent = Hinweisfarbe für aktives Fenster
window-hint-accent-toggle = Akzentfarbe des Themas als Hinweisfarbe für aktives Fenster verwenden
auto-switch = Automatischer Wechsel zwischen hellem und dunklem Modus
window-hint-accent-toggle = Themenakzentfarbe als Hinweis für aktives Fenster verwenden
auto-switch = Automatisch zwischen hellem und dunklem Modus wechseln
.sunrise = Wechselt bei Sonnenaufgang in den hellen Modus
.sunset = Wechselt bei Sonnenuntergang in den dunklen Modus
.next-sunrise = Wechselt beim nächsten Sonnenaufgang in den hellen Modus
.next-sunset = Wechselt beim nächsten Sonnenuntergang in den dunklen Modus
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.
.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-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
.desc = Wird für die Navigationsseitenleiste, Seitenschublade, Dialoge und ähnliche Widgets verwendet
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
.desc = Wendet eine Hintergrundunschärfe auf Panel, Dock, Applets, Starter und Anwendungsbibliothek an.
enable-export = Dieses Thema auf GNOME-Apps anwenden.
.desc = Wendet Hintergrundunschärfe auf Panel, Dock, Applets, Starter und Anwendungsbibliothek an
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.
icon-theme = Symbolthema
.desc = Wendet einen anderen Satz von Symbolen auf Anwendungen an.
text-tint = Texttönung der Oberfläche
.desc = Farbe zur Ableitung von Oberflächentextfarben, die auf verschiedenen Oberflächen einen ausreichenden Kontrast aufweisen.
.desc = Wendet einen anderen Satz von Symbolen auf Anwendungen an
text-tint = Texttönung der Benutzeroberfläche
.desc = Zum Ableiten von Textfarben der Benutzeroberfläche, die auf verschiedenen Oberflächen einen ausreichenden Kontrast aufweisen
style = Stil
.round = Rund
.slightly-round = Leicht rund
@ -262,12 +252,10 @@ monospace-font = Nichtproportionale Schriftart
## Desktop: Notifications
notifications = Benachrichtigungen
.desc = Nicht stören, Sperrbildschirm-Benachrichtigungen und Einstellungen pro Anwendung.
## Desktop: Panel
panel = Panel
.desc = Obere Leiste mit Desktop-Steuerelementen und Menüs.
add = Hinzufügen
add-applet = Applet hinzufügen
all = Alle
@ -291,7 +279,7 @@ panel-behavior-and-position = Verhalten und Positionen
.autohide = Panel automatisch ausblenden
.dock-autohide = Dock automatisch ausblenden
.position = Position auf Bildschirm
.display = Anzeigen auf Bildschirm
.display = Auf Bildschirm anzeigen
panel-style = Stil
.anchor-gap = Lücke zwischen Panel 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
.appearance = Aussehen
.size = Größe
.background-opacity = Deckkraft des Hintergrunds
.background-opacity = Hintergrunddeckkraft
panel-applets = Konfiguration
.dock-desc = Dock-Applets konfigurieren.
.desc = Panel-Applets konfigurieren.
.dock-desc = Dock-Applets konfigurieren
.desc = Panel-Applets konfigurieren
panel-missing = Panel-Konfiguration fehlt
.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
dock = Dock
.desc = Panel mit angehefteten Anwendungen in der App-Ablage und anderen Applets.
## Desktop: Window management
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
.launcher = Starter öffnen
.workspaces = Arbeitsflächen öffnen
@ -334,22 +320,26 @@ focus-navigation = Fokus-Navigation
## Desktop: Workspaces
workspaces = Arbeitsflächen
.desc = Anzahl, Verhalten und Platzierung der Arbeitsflächen festlegen.
workspaces-behavior = Verhaltern der Arbeitsfläche
workspaces-overview = Arbeitsflächenübersicht
.action-on-typing = Aktion beim Tippen
.none = Keine
.launcher = Starter öffnen
.applications = Anwendungen öffnen
workspaces-behavior = Arbeitsflächenverhalten
.dynamic = Dynamische Arbeitsflächen
.dynamic-desc = Entfernt automatisch leere Arbeitsflächen.
.fixed = Feste Anzahl an Arbeitsflächen
.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
.separate = Bildschirme haben separate Arbeitsflächen
workspaces-overview-thumbnails = Miniaturansichten der Arbeitsflächenübersicht
.show-number = Nummer der Arbeitsfläche anzeigen
.show-name = Name der Arbeitsfläche anzeigen
workspaces-orientation = Ausrichtung der Arbeitsflächen
.show-number = Arbeitsflächennummer anzeigen
.show-name = Arbeitsflächenname anzeigen
workspaces-orientation = Arbeitsflächenausrichtung
.vertical = Vertikal
.horizontal = Horizontal
hot-corner = Aktive Ecken
hot-corner = Aktive Ecke
.top-left-corner = Aktive Ecke oben links für Arbeitsflächen aktivieren
## Displays
@ -361,7 +351,6 @@ color = Farbe
.sidebar = Farbprofile
.temperature = Farbtemperatur
display = Bildschirme
.desc = Bildschirme, Grafikumschaltung und Nachtlicht verwalten
.arrangement = Bildschirmanordnung
.arrangement-desc = Bildschirme ziehen, um sie neu anzuordnen.
.enable = Bildschirm aktivieren
@ -388,15 +377,15 @@ mirroring = Spiegelung
}
night-light = Nachtlicht
.auto = Automatisch (Sonnenuntergang bis Sonnenaufgang)
.desc = Blaues Licht mittels wärmerer Farben reduzieren.
.desc = Blaues Licht mittels wärmerer Farben reduzieren
orientation = Ausrichtung
.standard = Standard
.rotate-90 = Um 90 Grad drehen
.rotate-180 = Um 180 Grad drehen
.rotate-270 = Um 270 Grad drehen
vrr = Variable refresh rate
.enabled = Aktiv
.force = Immer aktiv
.rotate-90 = Um 90° drehen
.rotate-180 = Um 180° drehen
.rotate-270 = Um 270° drehen
vrr = Variable Bildwiederholrate
.enabled = Aktiviert
.force = Immer
.auto = Automatisch
.disabled = Deaktiviert
scheduling = Zeitplanung
@ -410,7 +399,6 @@ dialog = Dialog
## Sound
sound = Klang
.desc = N/V
sound-output = Ausgabe
.volume = Ausgabelautstärke
.device = Ausgabegerät
@ -424,15 +412,14 @@ sound-input = Eingang
.device = Eingabegerät
.level = Eingangspegel
sound-alerts = Alarmsignale
.volume = Lautstärke von Alarmsignalen.
.sound = Alarmsignalklang.
.volume = Lautstärke von Alarmsignalen
.sound = Alarmsignalklang
sound-applications = Anwendungen
.desc = Lautstärken und Einstellungen von Anwendungen
## Energie
power = Energie & Akku
.desc = Energieeinstellungen verwalten
battery = Akku
.minute =
{ $value } { $value ->
@ -474,12 +461,11 @@ power-saving = Energiesparoptionen
## 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
input-devices = Eingabegeräte
.desc = Eingabegeräte
primary-button = Primäre Taste
.desc = Legt die Reihenfolge der physischen Tasten fest.
.desc = Legt die Reihenfolge der physischen Tasten fest
.left = Links
.right = Rechts
scrolling = Scrollen
@ -496,7 +482,6 @@ fast = Schnell
short = Kurz
long = Lang
keyboard = Tastatur
.desc = Eingabequellen, Umschaltung, Eingabe von Sonderzeichen, Tastenkombinationen.
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.
.move-up = Nach oben verschieben
@ -508,6 +493,7 @@ keyboard-sources = Eingabequellen
keyboard-special-char = Eingabe von Sonderzeichen
.alternate = Taste für alternative Zeichen
.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
keyboard-typing-assist = Tippen
.repeat-rate = Wiederholungsrate
@ -526,22 +512,22 @@ show-extended-input-sources = Erweiterte Eingabequellen anzeigen
keyboard-shortcuts = Tastenkombinationen
.desc = Tastenkombinationen anzeigen und anpassen
add-another-keybinding = Weitere Tastenkombination hinzufügen
add-another-keybinding = Weitere Tastenbelegung hinzufügen
cancel = Abbrechen
command = Befehl
custom = Benutzerdefiniert
debug = Debug
debug = Fehlerbehebung
disabled = Deaktiviert
input-source-switch = Tastaturlayout umschalten
migrate-workspace-prev = Arbeitsfläche zur vorherigen Ausgabe migrieren
migrate-workspace-next = Arbeitsfläche zur nächsten Ausgabe migrieren
input-source-switch = Spracheingabequelle der Tastatur wechseln
migrate-workspace-prev = Arbeitsfläche zur vorherigen Ausgabe verlagern
migrate-workspace-next = Arbeitsfläche zur nächsten Ausgabe verlagern
migrate-workspace =
Arbeitsfläche zur { $direction ->
*[down] unteren
[left] linken
[right] rechten
[up] oberen
} Ausgabe migrieren
} Ausgabe verlagern
navigate = Navigieren
replace = Ersetzen
shortcut-name = Name der Tastenkombination
@ -580,7 +566,7 @@ nav-shortcuts = Navigation
manage-windows = Fenster verwalten
.close = Fenster schließen
.maximize = Fenster maximieren
.fullscreen = Fenster zum Vollbild
.fullscreen = Vollbildfenster
.minimize = Fenster minimieren
.resize-inwards = Fenstergröße nach innen ändern
.resize-outwards = Fenstergröße nach außen ändern
@ -619,6 +605,7 @@ system-shortcut = System
.app-library = App-Bibliothek öffnen
.brightness-down = Bildschirmhelligkeit verringern
.brightness-up = Bildschirmhelligkeit erhöhen
.display-toggle = Internen Bildschirm umschalten
.home-folder = Persönlichen Ordner öffnen
.keyboard-brightness-down = Tastaturhelligkeit verringern
.keyboard-brightness-up = Tastaturhelligkeit erhöhen
@ -632,7 +619,9 @@ system-shortcut = System
.play-prev = Vorheriger Titel
.poweroff = System ausschalten
.screenshot = Bildschirmfoto machen
.suspend = Bereitschaft
.terminal = Terminal öffnen
.touchpad-toggle = Touchpad umschalten
.volume-lower = Lautstärke der Audioausgabe verringern
.volume-raise = Lautstärke der Audioausgabe erhöhen
.web-browser = Webbrowser öffnen
@ -655,7 +644,6 @@ zoom-out = Herauszoomen
## Input: Mouse
mouse = Maus
.desc = Mausgeschwindigkeit, -beschleunigung, natürliches Scrollen.
.speed = Mausgeschwindigkeit
.acceleration = Mausbeschleunigung aktivieren
@ -663,14 +651,13 @@ mouse = Maus
click-behavior = Klickverhalten
.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
.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
.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
.acceleration = Touchpad-Beschleunigung aktivieren
.desc = Touchpad-Geschwindigkeit, Klickoptionen, Gesten.
.speed = Touchpad-Geschwindigkeit
## Input: Gestures
@ -691,34 +678,31 @@ open-workspaces-view = Arbeitsflächenübersicht öffnen
## Time & Language
time = Uhrzeit & Sprache
.desc = N/V
time-date = Datum & Uhrzeit
.desc = Zeitzone, automatische Uhreinstellungen und einige Zeitformatierungen.
.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
.auto = Automatische Zeitzone
.auto-info = Erfordert Ortungsdienste und Internetzugang
time-format = Datum- & Zeitformat
time-format = Datums- & Uhrzeitformat
.twenty-four = 24-Stunden-Uhrzeit
.show-seconds = Sekunden anzeigen
.first = Erster Tag der Woche
.show-date = Datum im oberen Panel anzeigen
.show-date = Datum im Zeit-Applet anzeigen
.friday = Freitag
.saturday = Samstag
.sunday = Sonntag
.monday = Montag
time-region = Region & Sprache
.desc = Datum, Uhrzeiten und Zahlen gemäß deiner Region formatieren
formatting = Formatierung
.dates = Daten
.dates = Datum
.time = Uhrzeit
.date-and-time = Datum & Uhrzeit
.numbers = Zahlen
.measurement = Maß
.paper = Papier
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
.context = Sprache hinzufügen
install-additional-languages = Zusätzliche Sprachen installieren
@ -731,7 +715,6 @@ applications = Anwendungen
## Applications: Default Applications
default-apps = Standardanwendungen
.desc = Standard-Webbrowser, E-Mail-Client, Dateibrowser und andere Anwendungen.
.web-browser = Webbrowser
.file-manager = Dateibrowser
.mail-client = E-Mail-Client
@ -740,30 +723,33 @@ default-apps = Standardanwendungen
.photos = Fotos
.calendar = Kalender
.terminal = Terminal
.other-associations = Weitere Standardanwendungen
.text-editor = Text-Editor
.other-associations = Andere Zuordnungen
.text-editor = Texteditor
.not-installed = Nicht installiert
## Applications: Startup Applications
startup-apps = Startup-Anwendungen
.desc = Konfigurieren Sie Anwendungen, die bei der Anmeldung ausgeführt werden.
startup-apps = Startanwendungen
.add = Anwendung hinzufügen
.user = Benutzerspezifische Anwendungen
.user-description = Diese Anwendungen werden gestartet, wenn Sie sich bei Ihrem aktuellen Benutzer anmelden.
.user = Anwendungen, die bei deiner Anmeldung gestartet werden
.none = Keine Startanwendungen hinzugefügt
.remove-dialog-title = { $name } entfernen?
.remove-dialog-description = Sind Sie sicher, dass Sie diese Anwendung als Startup-Anwendung entfernen möchten?
.search-for-application = Nach Anwendungen suche
.remove-dialog-description = Diese Startanwendung entfernen?
.add-startup-app = Startanwendung hinzufügen
## Applications: Legacy Applications
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.
legacy-app-scaling = Anwendungsskalierung des X11-Fenstersystems
.scaled-by-system = Alle X11-Anwendungen skalieren
.system-description = X11-Anwendungen werden auf HiDPI-Bildschirmen unscharf dargestellt.
.scaled-natively = X11-Anwendungen in nativer Auflösung rendern
.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.
.scaled-gaming = Für Spiele und Vollbild-Apps optimieren
.gaming-description = X11-Anwendungen können im Vergleich zu Wayland-Anwendungen etwas größer/kleiner erscheinen
.scaled-applications = Für Anwendungen optimieren
.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
@ -772,9 +758,8 @@ system = System & Konten
## System: Über
about = Über
.desc = Gerätename, Hardwareinfo, Voreinstellungen des Betriebssystems.
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
.model = Hardwaremodell
.memory = Speicher
@ -784,7 +769,7 @@ about-hardware = Hardware
about-os = Betriebssystem
.os = Betriebssystem
.os-architecture = Betriebssystemarchitektur
.kernel = Kernel Version
.kernel = Kernel-Version
.desktop-environment = Desktopumgebung
.windowing-system = Fenstersystem
about-related = Zugehörige Einstellungen
@ -793,17 +778,137 @@ about-related = Zugehörige Einstellungen
## System: Firmware
firmware = Firmware
.desc = Firmwaredetails.
## System: Benutzer
users = Benutzer
.desc = Authentifizierung und Benutzerkonten.
.admin = Administrator
.standard = Standard
.profile-add = Profilbild auswählen
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
remove-user = Benutzer entfernen
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
ok = OK
unknown = Unknown
number = { $number }
## Network & Wireless
## Freedesktop desktop entries
connections-and-profiles = { $variant ->
[wired] Wired
[wifi] Wi-Fi
[vpn] VPN
*[other] Unknown
} connections and connection profiles.
app = COSMIC Settings
xdg-entry-comment = Settings application for the COSMIC desktop
xdg-entry-keywords = COSMIC;Settings;
xdg-entry-about = About
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
.profile = Add profile
@ -114,7 +233,6 @@ confirm = Confirm
enable = Enable
bluetooth = Bluetooth
.desc = Manage Bluetooth devices
.status = This system is visible as { $aliases } while Bluetooth settings are open.
.connected = Connected
.connecting = Connecting
@ -189,7 +307,6 @@ desktop = Desktop
wallpaper = Wallpaper
.change = Change image every
.desc = Wallpaper images, colors, and slideshow options
.fit = Wallpaper fit
.folder-dialog = Choose wallpaper folder
.image-dialog = Choose wallpaper image
@ -220,7 +337,6 @@ never = Never
## Desktop: Appearance
appearance = Appearance
.desc = Accent colors and theming
accent-color = Accent color
app-background = Window background
@ -298,12 +414,10 @@ shadow-and-corners = Window shadow and corners
## Desktop: Notifications
notifications = Notifications
.desc = Do Not Disturb, lockscreen notifications, and per-application settings
## Desktop: Panel
panel = Panel
.desc = Primary system bar for menus and applets
add = Add
add-applet = Add applet
@ -353,12 +467,10 @@ panel-missing = Panel configuration is missing
## Desktop: Dock
dock = Dock
.desc = An optional bar for apps and applets
## Desktop: Window management
window-management = Window management
.desc = Super key action, window control options, and additional window tiling options
super-key = Super key action
.launcher = Open Launcher
@ -372,6 +484,7 @@ window-controls = Window controls
.maximize = Show maximize button
.minimize = Show minimize button
.active-window-hint = Show active window hint
.position-start = Place buttons on the left (macOS style)
focus-navigation = Focus navigation
.focus-follows-cursor = Focus follows cursor
@ -381,7 +494,12 @@ focus-navigation = Focus navigation
## Desktop: 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
.dynamic = Dynamic workspaces
@ -404,6 +522,9 @@ workspaces-orientation = Workspaces orientation
hot-corner = Hot Corner
.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
-requires-restart = Requires restart
@ -415,7 +536,6 @@ color = Color
.temperature = Color temperature
display = Displays
.desc = Manage displays and night light
.arrangement = Display arrangement
.arrangement-desc = Drag displays to rearrange them
.enable = Enable display
@ -468,7 +588,6 @@ dialog = Dialog
## Sound
sound = Sound
.desc = N/A
sound-output = Output
.volume = Output volume
@ -504,7 +623,6 @@ sound-device-profiles = Device profiles
# Power & Battery settings page
power = Power & battery
.desc = Manage power settings
battery = Battery
.minute = { $value } { $value ->
@ -551,7 +669,7 @@ acceleration-desc = Automatically adjusts tracking sensitivity based on speed
disable-while-typing = Disable while typing
input-devices = Input devices
.desc = Input devices
primary-button = Primary button
.desc = Sets the order of physical buttons
@ -572,7 +690,6 @@ fast = Fast
short = Short
long = Long
keyboard = Keyboard
.desc = Input sources, switching, special character entry, shortcuts
keyboard-sources = Input Sources
.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
type-to-search = Type to search...
no-search-results = No networks match your search.
show-extended-input-sources = Show extended input sources
## Input: Keyboard: Shortcuts
@ -744,7 +862,6 @@ zoom-out = Zoom Out
## Input: Mouse
mouse = Mouse
.desc = Mouse speed, acceleration, natural scrolling
.speed = Mouse speed
.acceleration = Enable mouse acceleration
@ -762,7 +879,6 @@ tap-to-click = Tap to click
touchpad = Touchpad
.acceleration = Enable touchpad acceleration
.desc = Touchpad speed, click options, gestures
.speed = Touchpad speed
## Input: Gestures
@ -785,10 +901,8 @@ open-workspaces-view = Open Workspaces Overview
## Time & language
time = Time & language
.desc = N/A
time-date = Date & time
.desc = Time zone, automatic clock settings, and time formatting
.auto = Set automatically
.auto-ntp = Date & time will update automatically when the time zone is set
@ -807,7 +921,6 @@ time-format = Date & time format
.monday = Monday
time-region = Region & language
.desc = Format dates, times, and numbers based on your region
formatting = Formatting
.dates = Dates
@ -832,7 +945,6 @@ applications = Applications
## Applications: Default applications
default-apps = Default Applications
.desc = Default web browser, mail client, file browser, and other applications
.web-browser = Web browser
.file-manager = File manager
.mail-client = Mail client
@ -843,11 +955,12 @@ default-apps = Default Applications
.terminal = Terminal
.other-associations = Other associations
.text-editor = Text Editor
.not-installed = Not installed
## Applications: Startup applications
startup-apps = Startup applications
.desc = Configure applications which run on login
.add = Add app
.user = Applications launched when you log in
.none = No startup applications added
@ -858,7 +971,6 @@ startup-apps = Startup applications
## Applications: Legacy applications
legacy-applications = X11 applications compatibility
.desc = X11 Window system application scaling and Global shortcuts
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.
@ -885,7 +997,6 @@ system = System & accounts
## System: About
about = About
.desc = Device name, hardware information, operating system defaults
about-device = Device name
.desc = This name appears to other network or Bluetooth devices
@ -910,12 +1021,10 @@ about-related = Related settings
## System: Firmware
firmware = Firmware
.desc = Firmware details
## System: Users
users = Users
.desc = Authentication and user accounts
.admin = Admin
.standard = Standard
.profile-add = Choose profile image

View file

@ -6,13 +6,6 @@ number = { $number }
## 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
.profile = Añadir perfil
add-vpn = Añadir VPN
@ -809,3 +802,6 @@ full-name = Nombre completo
invalid-username = Nombre de usuario inválido.
password-mismatch = Las contraseñas no coinciden.
save = Guardar
xdg-entry-applications = Aplicaciones
xdg-entry-appearance = Apariencia
xdg-entry-a11y = Accesibilidad

View file

@ -4,15 +4,66 @@ ok = OK
unknown = Desconocido
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
connections-and-profiles =
{ $variant ->
[wired] Cableada,
[wifi] Wi-Fi,
[vpn] VPN,
*[other] Desconocida
} conexiones y perfiles de conexión.
add-network = Añadir red
.profile = Añadir perfil
add-vpn = Añadir VPN
@ -335,6 +386,11 @@ focus-navigation = Navegación de enfoque
workspaces = Espacios de trabajo
.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
.dynamic = Espacios de trabajo dinámicos
.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.
.wired-description = Kui tahad seda võrku hiljem kasutada, siis pead profiili uuesti looma.
app = COSMICu seadistused
connections-and-profiles =
{ $variant ->
[wired] Traadiga
[wifi] WiFi
[vpn] VPN-i
*[other] Muud
} ühendust ja ühendusprofiili.
add-network = Lisa võrk
.profile = Lisa võrguprofiil
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
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
connections-and-profiles =
Connexions { $variant ->
[wired] filaires
[wifi] Wi-Fi
[vpn] VPN
*[other] inconnues
} et profils.
add-network = Ajouter un réseau
.profile = Ajouter un profil
add-vpn = Ajouter un VPN
@ -95,7 +147,6 @@ online-accounts = Comptes en lignes
confirm = Confirmer
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.
.connected = Connecté
.connecting = Connexion
@ -123,7 +174,6 @@ desktop = Bureau
wallpaper = Fond décran
.change = Changer l'image tous les
.desc = Images de fond décran, couleurs et options de diaporama
.fit = Adapter le fond décran
.folder-dialog = Choisir le dossier de fond décran
.image-dialog = Choisir l'image de fond décran
@ -154,7 +204,6 @@ never = Jamais
## Desktop: Appearance
appearance = Apparence
.desc = Couleur d'accentuation et thème
accent-color = Couleur d'accentuation
app-background = Arrière-plan des fenêtres
auto = Auto
@ -214,12 +263,10 @@ monospace-font = Police monospace
## Desktop: Notifications
notifications = Notifications
.desc = Ne pas déranger, notifications sur l'écran de verrouillage, et paramètres par application
## Desktop: Panel
panel = Panneau
.desc = Barre système principale pour les menus et les applets
add = Ajouter
add-applet = Ajouter applet
all = Tous
@ -262,12 +309,10 @@ panel-missing = La configuration du panneau est manquante
## Desktop: Dock
dock = Dock
.desc = Un panneau optionnel pour les applis et les applets
## Desktop: Window management
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
.launcher = Ouvrir le Lanceur
.workspaces = Ouvrir les Espaces de travail
@ -277,6 +322,7 @@ window-controls = Contrôles des fenêtres
.maximize = Afficher le bouton maximiser
.minimize = Afficher le bouton minimiser
.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-follows-cursor = Le focus suit le curseur
.focus-follows-cursor-delay = Délai de suivi du focus en ms
@ -285,7 +331,6 @@ focus-navigation = Navigation par le focus
## Desktop: Workspaces
workspaces = Espaces de travail
.desc = Orientation et comportement des espaces de travail
workspaces-behavior = Comportement des espaces de travail
.dynamic = Espaces de travail dynamiques
.dynamic-desc = Supprime automatiquement les espaces de travail vides.
@ -312,7 +357,6 @@ color = Couleur
.sidebar = Profils de couleurs
.temperature = Température de couleur
display = Écrans
.desc = Gérer les écrans, les modes graphiques et le mode nuit
.arrangement = Disposition des écrans
.arrangement-desc = Faire glisser les écrans pour les réorganiser
.enable = Activer écran
@ -365,7 +409,6 @@ legacy-app-scaling = Mise à l'échelle des applications système X11
## Sound
sound = Son
.desc = N/A
sound-output = Sortie
.volume = Volume de sortie
.device = Périphérique de sortie
@ -387,7 +430,6 @@ sound-applications = Applications
## Power
power = Alimentation
.desc = Gérer les paramètres d'alimentation
battery = Batterie
.minute =
{ $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
disable-while-typing = Désactiver pendant la saisie
input-devices = Périphériques d'entrée
.desc = Périphériques d'entrée
primary-button = Bouton principal
.desc = Définit l'ordre des boutons physiques
.left = Gauche
@ -451,7 +492,6 @@ fast = Rapide
short = Court
long = Long
keyboard = Clavier
.desc = Sources de saisie, changement de source, saisie de caractères spéciaux, raccourcis
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.
.move-up = Remonter
@ -604,7 +644,6 @@ replace-shortcut-dialog = Remplacer le raccourci?
## Input: Mouse
mouse = Souris
.desc = Vitesse de la souris, accélération, défilement naturel
.speed = Vitesse 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
touchpad = 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
## Input: Gestures
@ -634,9 +672,7 @@ open-workspaces-view = Ouvrir l'aperçu des espaces de travail
## Time & Language
time = Heure et langue
.desc = N/A
time-date = Date et heure
.desc = Fuseau horaire, réglage de l'heure automatique et format de l'heure
.auto = Régler automatiquement
.auto-ntp = La date et l'heure seront mises à jour automatiquement lorsque le fuseau horaire sera défini
time-zone = Fuseau Horaire
@ -652,7 +688,6 @@ time-format = Format date et heure
.sunday = Dimanche
.monday = Lundi
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
.dates = Dates
.time = Heure
@ -674,7 +709,6 @@ system = Système et comptes
## System: About
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
.desc = Il est visible par les autres appareils réseau ou Bluetooth
about-hardware = Matériel
@ -694,13 +728,11 @@ about-related = Paramètres associés
## System: Firmware
firmware = Micrologiciel
.desc = Détails micrologiciel
firmware = Firmware
## System: Users
users = Utilisateurs
.desc = Authentification et comptes utilisateurs
.admin = Admin
.standard = Standard
.profile-add = Choisir l'image de profil
@ -713,7 +745,6 @@ full-name = Nom complet
## System: Default Applications
default-apps = Applications par défaut
.desc = Navigateur web, client mail, explorateur de fichiers, et autres applications
.web-browser = Navigateur web
.file-manager = Explorateur de fichiers
.mail-client = Client mail
@ -724,6 +755,7 @@ default-apps = Applications par défaut
.terminal = Terminal
.other-associations = Autres associations
.text-editor = Éditeur de texte
.not-installed = Non installé
identity = Identité
save = Enregistrer
password-confirm = Confirmer le mot de passe
@ -798,10 +830,8 @@ gestures = Gestes
.four-finger-up = Glissement de quatre doigts vers le haut
.three-finger-any = Glissement de trois doigts dans n'importe quelle direction
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
startup-apps = Applications de démarrage
.desc = Configurer les applications qui se lancent au démarrage
.add = Ajouter appli
.user = Applications lancées lors de la connexion
.none = Aucune application de démarrage ajoutée
@ -824,3 +854,52 @@ sound-device-port-unplugged = Débranché
sound-hd-audio = Audio HD
sound-usb-audio = Audio USB
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
unknown = Ûnbekend
number = { $number }
connections-and-profiles =
connections-and-profiles = { $variant ->
[wired] Kabelferbiningen
[wifi] Wifi-ferbiningen
[vpn] VPN-ferbiningen
*[other] Ûnbekende ferbiningen
} en ferbiningsprofilen.
cancel = Annulearje
settings = Ynstellings

View file

@ -6,13 +6,6 @@ number = { $number }
## 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
.profile = Cuir próifíl leis
add-vpn = Cuir VPN leis
@ -99,7 +92,6 @@ activate = Gníomhachtaigh
confirm = Deimhnigh
enable = Cumasaigh
bluetooth = Bluetooth
.desc = Bainistigh gléasanna Bluetooth
.status = Tá an córas seo le feiceáil mar { $aliases } agus socruithe Bluetooth oscailte.
.connected = Ceangailte
.connecting = Ag ceangal
@ -108,9 +100,9 @@ bluetooth = Bluetooth
.disconnect = Dícheangail
.forget = Déan dearmad
.dbus-error = Tharla earráid agus tú ag idirghníomhú le DBus: { $why }
.disabled = Tá an tseirbhís bluetooth díchumasaithe
.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?
.disabled = Tá an tseirbhís Bluetooth díchumasaithe
.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?
bluetooth-paired = Gléasanna ceangailte roimhe seo
.connect = Ceangail
.battery = { $percentage }% cadhnra
@ -171,10 +163,9 @@ desktop = Deasc
wallpaper = Cúlbhrat
.change = Athraigh íomhá gach
.desc = Íomhánna cúlbhrat, dathanna, agus roghanna taispeántas sleamhnán.
.fit = Cúlbhrat oiriúnach
.folder-dialog = Roghnaigh fillteán cúlbhrat
.image-dialog = Roghnaigh íomhá cúlbhrat
.image-dialog = Roghnaigh íomhá chúlbhrat
.plural = Cúlbhrat
.same = Cúlbhrat céanna ar gach taispeáint
.slide = Taispeántas sleamhnán
@ -202,7 +193,6 @@ never = Riamh
## Desktop: Appearance
appearance = Dealramh
.desc = Dathanna béime agus téamaíocht
accent-color = Dath béime
app-background = Cúlra fuinneoige
auto = Uath
@ -233,7 +223,7 @@ container-background = Cúlra coimeádán
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
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.
.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í
@ -262,12 +252,10 @@ monospace-font = Cló monospás
## Desktop: Notifications
notifications = Fógraí
.desc = Ná cuir isteach, fógraí glasála scáileáin, agus socruithe in aghaidh an fheidhmchláir
## Desktop: Panel
panel = Painéal
.desc = Barra córais phríomhúil do roghchláir agus feidhmchláiríní
add = Cuir leis
add-applet = Cuir feidhmchláirín leis
all = Gach
@ -277,8 +265,8 @@ end-segment = Deighleog deireadh
large = Mór
no-applets-found = Níor aimsíodh feidhmchláiríní...
panel-bottom = Bun
panel-left = C
panel-right = Deas
panel-left = Ar ch
panel-right = Ar dheis
panel-top = Barr
search-applets = Cuardach feidhmchláiríní...
small = Beag
@ -310,12 +298,10 @@ panel-missing = Tá cumraíocht an phainéil ar iarraidh
## Desktop: Dock
dock = Duga
.desc = Barra roghnach le haghaidh aipeanna agus feidhmchláiríní
## Desktop: Window management
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
.launcher = Oscail lainseálaí
.workspaces = Oscail spásanna oibre
@ -334,7 +320,6 @@ focus-navigation = Nascleanúint fócais
## Desktop: Workspaces
workspaces = Spásanna oibre
.desc = Treoshuíomh agus iompar spás oibre
workspaces-behavior = Iompar spáis oibre
.dynamic = Spásanna oibre dinimiciúla
.dynamic-desc = Baintear spásanna oibre folamh go huathoibríoch.
@ -361,10 +346,9 @@ color = Dath
.sidebar = Próifílí dathanna
.temperature = Teocht datha
display = Taispeántais
.desc = Bainistigh taispeántais agus solas oíche
.arrangement = Socrú taispeántais
.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
.laptop = { $size } taispeáint ríomhaire glúine
.options = Roghanna taispeána
@ -410,7 +394,6 @@ dialog = Dialóg
## Sound
sound = Fuaim
.desc = N/A
sound-output = Aschur
.volume = Toirt aschuir
.device = Gléas aschuir
@ -432,7 +415,6 @@ sound-applications = Feidhmchláir
## Power
power = Cumhacht & ceallraí
.desc = Bainistigh socruithe cumhachta
battery = Ceallraí
.minute =
{ $value } { $value ->
@ -477,7 +459,6 @@ power-saving = Roghanna coigilte cumhachta
acceleration-desc = Coigeartaíonn sé íogaireacht rianaithe go huathoibríoch bunaithe ar luas
disable-while-typing = Díchumasaigh agus tú ag clóscríobh
input-devices = Gléasanna ionchuir
.desc = Gléasanna ionchuir
primary-button = Cnaipe príomhúil
.desc = Socraíonn sé ord na gcnaipí fisiciúla
.left = Clé
@ -496,7 +477,6 @@ fast = Tapa
short = Gairid
long = Fada
keyboard = Méarchlár
.desc = Foinsí ionchuir, athrú, iontráil carachtar speisialta, aicearraí
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.
.move-up = Bog suas
@ -538,8 +518,8 @@ migrate-workspace-next = Aistrigh spás oibre go dtí an chéad aschur eile
migrate-workspace =
Imirce spás oibre chuig aschur { $direction ->
*[down] síos
[left] c
[right] deas
[left] ar ch
[right] ar dheis
[up] suas
}
navigate = Nascleanúint
@ -561,19 +541,19 @@ nav-shortcuts = Nascleanúint
.prev-workspace = Fócas ar spás oibre roimhe seo
.next-workspace = Fócas ar an gcéad spás oibre eile
.focus =
Fuinneog fócais { $direction ->
Fócas fuinneog { $direction ->
*[down] síos
[in] isteach
[left] c
[left] ar ch
[out] amach
[right] deas
[right] ar dheis
[up] suas
}
.output =
Athraigh chuig aschur { $direction ->
*[down] síos
[left] c
[right] deas
[left] ar ch
[right] ar dheis
[up] suas
}
.workspace = Athraigh go spás oibre { $num }
@ -587,24 +567,24 @@ manage-windows = Bainistigh fuinneoga
.toggle-sticky = Scoránaigh an fhuinneog greamaitheach
move-windows = Bog fuinneoga
.direction =
Bog Fuinneog { $direction ->
Bog an fhuinneog { $direction ->
*[down] síos
[left] c
[right] deas
[left] ar ch
[right] ar dheis
[up] suas
}
.display =
Bog fuinneog monatóir amháin { $direction ->
Bog an fhuinneog monatóir amháin { $direction ->
*[down] síos
[left] c
[right] deas
[left] ar ch
[right] ar dheis
[up] suas
}
.workspace =
Bog fuinneog spás oibre amháin { $direction ->
Bog an fhuinneog spás oibre amháin { $direction ->
*[below] thíos
[left] c
[right] deas
[left] ar ch
[right] ar dheis
[above] thuas
}
.workspace-num = Bog an fhuinneog go spás oibre { $num }
@ -658,9 +638,8 @@ zoom-out = Súmáil amach
## Input: Mouse
mouse = Luch
.desc = Luas luch, luasghéarú, scrollú nádúrtha
.speed = Luas luch
.acceleration = Cumasaigh luasghéarú na luiche
.acceleration = Cumasaigh luasghéarú luiche
## 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
touchpad = Ceap tadhaill
.acceleration = Cumasaigh luasghéarú an ceap tadhaill
.desc = Luas an ceap tadhaill, roghanna cliceáil, gothaí
.speed = Luas an ceap tadhaill
## Input: Gestures
@ -694,9 +672,7 @@ open-workspaces-view = Oscail radharc spásanna oibre
## Time & Language
time = Am & teanga
.desc = N/A
time-date = Dáta & am
.desc = Crios ama, socruithe uathoibríocha cloig, agus formáidiú ama
.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
time-zone = Crios ama
@ -712,7 +688,6 @@ time-format = Formáid dáta & ama
.sunday = Domhnach
.monday = Luan
time-region = Réigiún & teanga
.desc = Formáidigh dátaí, amanna agus uimhreacha bunaithe ar do réigiún
formatting = Formáidiú
.dates = Dátaí
.time = Am
@ -734,7 +709,6 @@ applications = Feidhmchláir
## Applications: Default Applications
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
.file-manager = Bainisteoir comhad
.mail-client = Cliant ríomhphoist
@ -745,11 +719,11 @@ default-apps = Feidhmchláir réamhshocraithe
.terminal = Teirminéal
.other-associations = Cumainn eile
.text-editor = Eagarthóir téacs
.not-installed = Gan suiteáil
## Applications: Startup Applications
startup-apps = Feidhmchláir tosaithe
.desc = Cumraigh feidhmchláir a ritheann ar logáil isteach.
.add = Cuir feidhmchlár leis
.user = Lainseáil feidhmchláir nuair a logálann tú isteach
.none = Níor cuireadh aon fheidhmchláir tosaithe leis
@ -760,9 +734,8 @@ startup-apps = Feidhmchláir tosaithe
## Applications: Legacy Applications
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
.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
.modifiers = Mionathraitheoirí (Super, Shift, Control, Alt)
.combination = Gach eochair agus na modhnóirí Super, Control nó Alt á mbrú
@ -785,7 +758,6 @@ system = Córas & cuntais
## System: About
about = Maidir
.desc = Ainm gléis, faisnéis crua-earraí, réamhshocruithe córais oibriúcháin
about-device = Ainm an ghléis
.desc = Feictear an t-ainm seo ar líonraí nó ar ghléasanna Bluetooth eile
about-hardware = Crua-earraí
@ -806,12 +778,10 @@ about-related = Socruithe gaolmhara
## System: Firmware
firmware = Dochtearraí
.desc = Sonraí maidir le dochtearraí
## System: Users
users = Úsáideoirí
.desc = Fíordheimhniú agus cuntais úsáideora
.admin = Riarthóir
.standard = Caighdeán
.profile-add = Roghnaigh íomhá phróifíl
@ -836,3 +806,108 @@ sound-device-port-unplugged = Díphlugáilte
sound-hd-audio = Fuaim HD
sound-usb-audio = Fuaim USB
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
connections-and-profiles =
{ $variant ->
[wired] तार
[wifi] वाई-फाई
[vpn] वी.पी.एन
*[other] अज्ञात
} कनेक्शन और प्रोफाइल।
add-network = नेटवर्क जोड़ें
.profile = प्रोफाइल जोड़ें
add-vpn = वी.पी.एन जोड़ें

View file

@ -4,56 +4,107 @@ ok = OK
unknown = Ismeretlen
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
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
.profile = Profil hozzáadása
add-vpn = VPN hozzáadása
airplane-on = A repülőgép üzemmód be van kapcsolva
cable-unplugged = Kábel kihúzva
connect = Csatlakozás
connected = Csatlakozva
connected = Csatlakoztatva
connecting = Csatlakozás…
disconnect = Leválasztás
disconnect = Bontás
forget = Elfelejtés
known-networks = Ismert hálózatok
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
password = Jelszó
password-confirm = Jelszó megerősítése
remove = Törlés
remove = Eltávolítás
settings = Beállítások
username = Felhasználónév
visible-networks = Látható hálózatok
identity = Azonosító
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.
.wifi-description = Írd be a jelszót vagy a titkosítókulcsot. A router „WPS” gombjának megnyomásával is csatlakozhatsz.
.vpn-description = Írd be a VPN szolgáltatáshoz szükséges felhasználónevet és jelszót.
.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?
.description = A jelszót ismét meg kell adnod, ha újra csatlakozni szeretnél.
network-device-state =
.activated = Csatlakozva
.activated = Csatlakoztatva
.config = Csatlakozás…
.deactivating = Leválasztás…
.disconnected = Leválasztva
.deactivating = Bontás…
.disconnected = Kapcsolat bontva
.failed = Csatlakozás sikertelen
.ip-check = Kapcsolat ellenőrzé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
.secondaries = Várakozás egy másodlagos kapcsolatra
.secondaries = Várakozás másodlagos kapcsolatra
.unavailable = Nem elérhető
.unknown = Ismeretlen állapot
.unmanaged = Kezeletlen
.unplugged = A kábel ki van húzva
.unplugged = Kábel kihúzva
remove-connection-dialog = Törlöd a kapcsolati profilt?
.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.
@ -99,16 +150,15 @@ activate = Aktiválás
confirm = Megerősítés
enable = Engedélyezés
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.
.connected = Csatlakozva
.connected = Csatlakoztatva
.connecting = Csatlakozás…
.disconnecting = Leválasztás…
.disconnecting = Bontás…
.connect = Csatlakozás
.disconnect = Leválasztás
.disconnect = Bontás
.forget = Elfelejtés
.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
.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
@ -117,7 +167,7 @@ bluetooth-paired = Korábban párosított eszközök
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
bluetooth-available = Közeli eszközök
bluetooth-adapters = Bluetooth adapterek
bluetooth-adapters = Bluetooth-adapterek
## Accessibility
@ -171,10 +221,9 @@ desktop = Asztal
wallpaper = Háttérkép
.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
.folder-dialog = Válassz háttérkép mappát
.image-dialog = Válassz háttérkép képet
.folder-dialog = Válassz mappát a háttérképekhez
.image-dialog = Válassz képet a háttérképnek
.plural = Háttérképek
.same = Ugyanaz a háttérkép legyen minden kijelzőn
.slide = Diavetítés
@ -184,7 +233,7 @@ all-displays = Minden kijelző
colors = Színek
dialog-add = Hozzáadá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
recent-folders = Legutóbbi mappák
x-minutes =
@ -202,7 +251,6 @@ never = Soha
## Desktop: Appearance
appearance = Megjelenés
.desc = Kiemelőszínek és COSMIC témák
accent-color = Kiemelőszín
app-background = Ablakháttér
auto = Automatikus
@ -219,20 +267,20 @@ mode-and-colors = Mód és színek
recent-colors = Korábbi színek
reset-to-default = Visszaállítás alapértelmezettre
rgb = RGB
window-hint-accent = Az 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 = Aktív ablak kiemelésének színe
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
.sunrise = Napkeltekor világos módra vált
.sunset = Napnyugtakor sötét módra vált
.next-sunrise = Következő napfelkeltekor világos módra vált
.next-sunset = Következő napnyugtakor sötét módra vált
.sunrise = Napkeltekor világos módra váltás
.sunset = Napnyugtakor sötét módra váltás
.next-sunrise = Következő napfelkeltekor világos módra váltás
.next-sunset = Következő napnyugtakor sötét módra váltás
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
.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
.desc = Szabványos gombok hátterére, keresési bemenetekre, szövegbevitelre és hasonló összetevőkre használatos
frosted = Elmosódott üveg hatás a rendszerfelületen
.desc = Szabványos gombok hátterére, keresési bemenetekre, szövegbevitelre és hasonló összetevőkre használandó
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
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.
@ -262,12 +310,10 @@ monospace-font = Rögzített szélességű betűtípus
## Desktop: Notifications
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
panel = Panel
.desc = Fő rendszersáv menükhöz és kisalkalmazásokhoz
add = Hozzáadás
add-applet = Kisalkalmazás hozzáadása
all = Összes
@ -310,21 +356,19 @@ panel-missing = A panel konfigurációja hiányzik
## Desktop: Dock
dock = Dokk
.desc = Egy opcionális sáv alkalmazásokhoz és kisalkalmazásokhoz
## Desktop: Window management
window-management = Ablakkezelés
.desc = Super billentyű funkció, ablakkezelési és csempézési beállítások
super-key = Super billentyű
super-key = Super billentyű funkciója
.launcher = Indító megnyitása
.workspaces = Munkaterületek megnyitása
.applications = Alkalmazások megnyitása
.disable = Kikapcsolás
.disable = Letiltás
edge-gravity = A lebegő ablakok a közeli szélekhez igazodnak
window-controls = Ablakvezérlés
.maximize = Maximalizálás gomb mutatása
.minimize = Minimalizálás gomb mutatása
.maximize = Maximalizálás gomb megjelenítése
.minimize = Minimalizálás gomb megjelenítése
.active-window-hint = Aktív ablak kiemelése
focus-navigation = Fókusznavigáció
.focus-follows-cursor = Fókusz követi az egeret
@ -334,16 +378,15 @@ focus-navigation = Fókusznavigáció
## Desktop: Workspaces
workspaces = Munkaterületek
.desc = Munkaterületek tájolása és viselkedése
workspaces-behavior = Munkaterületek viselkedése
.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-desc = Munkaterületek hozzáadása vagy eltávolítása az áttekintésben
workspaces-multi-behavior = Többmonitoros viselkedés
.span = A munkaterületek kiterjednek a kijelzőkre
.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-name = Munkaterület nevének megjelenítése
workspaces-orientation = Munkaterületek tájolása
@ -361,7 +404,6 @@ color = Szín
.sidebar = Színprofilok
.temperature = Színhőmérséklet
display = Kijelzők
.desc = Kijelzők kezelése és éjszakai fény
.arrangement = Kijelző elrendezése
.arrangement-desc = Húzd a kijelzőket az átrendezésükhöz
.enable = Kijelző engedélyezése
@ -388,7 +430,7 @@ mirroring = Tükrözés
}
night-light = Éjszakai fény
.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
.standard = Normál
.rotate-90 = 90 fokos elforgatás
@ -410,7 +452,6 @@ dialog = Párbeszédablak
## Sound
sound = Hang
.desc = N/A
sound-output = Kimenet
.volume = Kimeneti hangerő
.device = Kimeneti eszköz
@ -432,7 +473,6 @@ sound-applications = Alkalmazások
## Power
power = Energia és akkumulátor
.desc = Energiabeállítások kezelése
battery = Akkumulátor
.minute =
{ $value } { $value ->
@ -474,12 +514,11 @@ power-saving = Energiagazdálkodási beállítások
## Input
acceleration-desc = Automatikusan beállítja a követési érzékenységet a sebesség alapján
disable-while-typing = Letiltás gépelés közben
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éskor
input-devices = Beviteli eszközök
.desc = Beviteli eszközök
primary-button = Elsődleges gomb
.desc = A gombok sorrendjének beállítása
.desc = Gombok sorrendjének beállítása
.left = Bal
.right = Jobb
scrolling = Görgetés
@ -496,9 +535,8 @@ fast = Gyors
short = Rövid
long = Hosszú
keyboard = Billentyűzet
.desc = Bemeneti források, speciális karakterek, gyorsbillentyűk
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-down = Mozgatás lejjebb
.settings = Beállítások
@ -520,7 +558,7 @@ keyboard-numlock-boot = Num Lock
.off = Kikapcsolva
.set = Num Lock rendszerindítási állapotának beállítása
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
## Input: Keyboard: Shortcuts
@ -532,8 +570,8 @@ cancel = Mégse
command = Parancs
custom = Egyedi
debug = Hibakeresés
disabled = Tiltva
input-source-switch = Billentyűzetkiosztás váltása
disabled = Letiltva
input-source-switch = Beviteli forrás váltása
migrate-workspace-prev = Munkaterület áthelyezése az előző kimenetre
migrate-workspace-next = Munkaterület áthelyezése a következő kimenetre
migrate-workspace =
@ -556,11 +594,11 @@ custom-shortcuts = Egyéni gyorsbillentyűk
.none = Nincsenek egyéni gyorsbillentyűk
modified = { $count } módosítva
nav-shortcuts = Navigáció
.prev-output = Az előző kimenet fókuszálása
.next-output = A következő kimenet fókuszálása
.last-workspace = Az utolsó munkaterület fókuszálása
.prev-workspace = Az előző munkaterület fókuszálása
.next-workspace = A következő munkaterület fókuszálása
.prev-output = Fókuszálás az előző kimenetre
.next-output = Fókuszálás a következő kimenetre
.last-workspace = Fókuszálás az utolsó munkaterületre
.prev-workspace = Fókuszálás az előző munkaterületre
.next-workspace = Fókuszálás a következő munkaterületre
.focus =
Ablak fókuszálása { $direction ->
*[down] le
@ -659,7 +697,6 @@ zoom-out = Kicsinyítés
## Input: Mouse
mouse = Egér
.desc = Egérsebesség, gyorsítás és természetes görgetés
.speed = Egér sebessége
.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
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
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
touchpad = Érintőpárna
.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
## Input: Gestures
gestures = Gesztusok
.four-finger-down = Négy ujjas csúsztatás lefelé
.four-finger-left = Négy ujjas csúsztatás balra
.four-finger-right = Négy ujjas csúsztatás jobbra
.four-finger-up = Négy ujjas csúsztatás felfelé
.three-finger-any = Három ujjas csúsztatás bármelyik irányba
.four-finger-down = Négyujjas csúsztatás lefelé
.four-finger-left = Négyujjas csúsztatás balra
.four-finger-right = Négyujjas csúsztatás jobbra
.four-finger-up = Négyujjas csúsztatás felfelé
.three-finger-any = Háromujjas csúsztatás bármelyik irányba
switch-workspaces = Munkaterület váltása
.horizontal = Négy ujjas csúsztatás balra/jobbra
.vertical = Négy ujjas csúsztatás felfelé/lefelé
.horizontal = Négyujjas csúsztatás balra/jobbra
.vertical = Négyujjas csúsztatás felfelé/lefelé
switch-between-windows = Váltás az ablakok között
open-application-library = Alkalmazáskönyvtár 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 = Idő és nyelv
.desc = N/A
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-ntp = A dátum és idő automatikusan frissül, ha az időzóna be van állítva
time-zone = Időzóna
@ -713,7 +747,6 @@ time-format = Dátum- és időformátum
.sunday = Vasárnap
.monday = Hétfő
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
.dates = Dátum
.time = Idő
@ -735,7 +768,6 @@ applications = Alkalmazások
## Applications: Default Applications
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ő
.file-manager = Fájlkezelő
.mail-client = Levelezőprogram
@ -746,11 +778,11 @@ default-apps = Alapértelmezett alkalmazások
.terminal = Terminál
.other-associations = Egyéb társítások
.text-editor = Szövegszerkesztő
.not-installed = Nincs telepítve
## Applications: Startup Applications
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
.user = Bejelentkezéskor indított alkalmazások
.none = Nincs indítási alkalmazás hozzáadva
@ -761,7 +793,6 @@ startup-apps = Indítási alkalmazások
## Applications: Legacy Applications
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
.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ű
@ -786,11 +817,10 @@ system = Rendszer és fiókok
## System: About
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
.desc = Ez a név más hálózati vagy Bluetooth-eszközök számára látható
about-hardware = Hardver
.model = Hardver modell
.model = Hardvermodell
.memory = Memória
.processor = Processzor
.graphics = Grafika
@ -807,12 +837,10 @@ about-related = Kapcsolódó beállítások
## System: Firmware
firmware = Firmware
.desc = Firmware részletei
## System: Users
users = Felhasználók
.desc = Hitelesítés és felhasználói fiókok
.admin = Rendszergazda
.standard = Normál
.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
amplification = Erősítés
.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
share = Hálózat megosztása
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-hd-audio = HD-hang
sound-usb-audio = USB-hang
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
unknown = Óþekkt
number = { $number }
connections-and-profiles =
{ $variant ->
[wired] Kapaltengdar
[wifi] Wi-Fi
[vpn] VPN
*[other] óþekktar
} tengingar og tengisnið.
add-network = Add network
.profile = Bæta við notandasniði
add-vpn = Bæta við VPN

View file

@ -4,15 +4,67 @@ ok = OK
unknown = Sconosciuto
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
connections-and-profiles =
Connessione { $variant ->
[wired] Ethernet
[wifi] Wi-Fi
[vpn] VPN
*[other] Sconosciuto
} e profili di connessione.
add-network = Aggiungi rete
.profile = Aggiungi profilo
add-vpn = Aggiungi VPN

View file

@ -3,13 +3,6 @@ unknown = 不明
## Network & Wireless
connections-and-profiles =
{ $variant ->
[wired] 有線の
[wifi] Wi-Fiの
[vpn] VPNの
*[other] 不明な
}接続と接続プロファイル。
add-network = ネットワークを追加
.profile = プロファイルを追加
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
connections-and-profiles =
{ $variant ->
[wired] ತಂತಿ
[wifi] ವೈ-ಫೈ
[vpn] ವಿ.ಪಿ.ಎನ್
*[other] ಅಜ್ಞಾತ
} ಸಂಪರ್ಕಗಳು ಮತ್ತು ಸಂಪರ್ಕ ಪ್ರೊಫೈಲ್‌ಗಳು.
add-network = ನೆಟ್ವರ್ಕ್ ಸೇರಿಸಿ
.profile = ಪ್ರೊಫೈಲ್ ಸೇರಿಸಿ
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