2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-09-04 16:15:09 +00:00

Compare commits

...

113 Commits

Author SHA1 Message Date
Albert Vaca Cintora
8eac1d7f6b Do not request sinks list
Rely on it being sent at connect and on any update.

It requires this desktop app change to be merged and released, since we
were not sending the list at connect time before:
https://invent.kde.org/network/kdeconnect-kde/-/merge_requests/763
2024-12-22 17:22:25 +01:00
Mash Kyrielight
553bae4a33 Fix icon color on dark theme 2024-12-16 21:46:31 +00:00
l10n daemon script
7d5f40a3a1 GIT_SILENT made messages (after extraction) 2024-12-10 01:56:00 +00:00
Albert Vaca Cintora
e8c74ec689 Fix format of commented code 2024-12-04 22:47:25 +01:00
Albert Vaca Cintora
c7223a17dc Bump AGP version 2024-12-04 22:47:25 +01:00
Albert Vaca Cintora
2fddd7e24a Gitignore .kotlin 2024-12-04 22:47:25 +01:00
TPJ Schikhof
7920a1a250 Migrate PluginPreference to Kotlin 2024-12-03 08:55:08 +00:00
TPJ Schikhof
a1ce310f65 Rename .java to .kt 2024-12-03 08:55:08 +00:00
TPJ Schikhof
8fea00a843 Migrate list fragments to Kotlin 2024-12-02 22:28:08 +00:00
TPJ Schikhof
7210fd8425 Rename .java to .kt 2024-12-02 22:28:08 +00:00
l10n daemon script
dcb817a805 GIT_SILENT Sync po/docbooks with svn 2024-12-02 03:09:05 +00:00
l10n daemon script
b916d2c972 GIT_SILENT made messages (after extraction) 2024-12-02 02:27:42 +00:00
Albert Vaca Cintora
6b15348677 Bump deps 2024-11-30 16:42:46 +01:00
l10n daemon script
a899f06885 GIT_SILENT made messages (after extraction) 2024-11-24 01:52:13 +00:00
l10n daemon script
4a1a086e0f GIT_SILENT made messages (after extraction) 2024-11-14 01:51:25 +00:00
l10n daemon script
8853f1807f GIT_SILENT Sync po/docbooks with svn 2024-11-13 02:19:46 +00:00
l10n daemon script
0a8bd2bf56 GIT_SILENT made messages (after extraction) 2024-11-13 01:49:45 +00:00
l10n daemon script
c5d1d4a9fa GIT_SILENT made messages (after extraction) 2024-11-10 01:59:34 +00:00
Rocket Aaron
741e24c984 Fix invalid device name condition 2024-11-06 22:51:25 +08:00
l10n daemon script
8b9b99275d GIT_SILENT made messages (after extraction) 2024-11-02 01:49:08 +00:00
l10n daemon script
cfe789fb7e GIT_SILENT made messages (after extraction) 2024-10-31 01:49:58 +00:00
l10n daemon script
7170bdb687 GIT_SILENT made messages (after extraction) 2024-10-28 01:54:26 +00:00
l10n daemon script
53f746cb6a GIT_SILENT made messages (after extraction) 2024-10-27 01:56:57 +00:00
l10n daemon script
35777b4b15 GIT_SILENT made messages (after extraction) 2024-10-26 01:51:18 +00:00
l10n daemon script
a1d0689d50 GIT_SILENT made messages (after extraction) 2024-10-25 01:49:31 +00:00
l10n daemon script
883eca5cf3 GIT_SILENT made messages (after extraction) 2024-10-24 01:47:57 +00:00
l10n daemon script
d91107329a GIT_SILENT made messages (after extraction) 2024-10-23 01:49:27 +00:00
Albert Vaca Cintora
b7f3a7d868 Release 1.32.9 2024-10-21 17:16:54 +02:00
Albert Vaca Cintora
e613e7e09d Change wording to try to make Google happy 2024-10-21 16:48:51 +02:00
Albert Vaca Cintora
cb44c70d17 Bump deps 2024-10-21 16:48:51 +02:00
Albert Vaca Cintora
056b569951 Revert "Replace ClassIndex (unmaintained) with KlassIndex"
Fixes the R8 minifier error "Type fyi.fax.klassindex.AnnotationIndex is defined multiple times"

This reverts commit 526c3a9c4d.
2024-10-21 16:48:51 +02:00
l10n daemon script
2d421e3eb6 GIT_SILENT made messages (after extraction) 2024-10-21 01:50:35 +00:00
l10n daemon script
5674ddd3e9 GIT_SILENT Sync po/docbooks with svn 2024-10-20 02:20:20 +00:00
l10n daemon script
5bb996a6ac GIT_SILENT made messages (after extraction) 2024-10-20 01:49:51 +00:00
l10n daemon script
d89ab2bb20 GIT_SILENT made messages (after extraction) 2024-10-19 01:52:02 +00:00
l10n daemon script
e5661225a1 GIT_SILENT made messages (after extraction) 2024-10-17 01:49:15 +00:00
l10n daemon script
cc38149834 GIT_SILENT made messages (after extraction) 2024-10-16 01:51:14 +00:00
l10n daemon script
4805ea91b8 GIT_SILENT made messages (after extraction) 2024-10-15 01:47:53 +00:00
l10n daemon script
2553a7cebb GIT_SILENT made messages (after extraction) 2024-10-14 01:46:06 +00:00
Albert Vaca Cintora
526c3a9c4d Replace ClassIndex (unmaintained) with KlassIndex 2024-10-13 23:51:35 +02:00
Albert Vaca Cintora
333ad876aa Add recommended "uses-feature" based on the permissions 2024-10-13 23:14:51 +02:00
Albert Vaca Cintora
588cc8dfcf compileSdk should not be lower than targetSdk 2024-10-13 22:18:56 +02:00
Albert Vaca Cintora
48dd405201 Request bluetooth permissions with an explanation
The Play Store requires an explanation before requesting any permissions
2024-10-13 22:17:48 +02:00
Albert Vaca Cintora
1fad01e306 Bump dependencies 2024-10-13 21:49:00 +02:00
l10n daemon script
c78dd6f40d GIT_SILENT made messages (after extraction) 2024-10-12 01:48:30 +00:00
l10n daemon script
3084513778 GIT_SILENT made messages (after extraction) 2024-10-11 01:56:46 +00:00
l10n daemon script
e592b45a61 GIT_SILENT made messages (after extraction) 2024-10-10 01:47:37 +00:00
Albert Vaca Cintora
deee9cc2e2 Release 1.32.7 2024-10-08 22:41:20 +02:00
Albert Vaca Cintora
a107796ec2 Change Iterator argument to List 2024-10-08 22:38:01 +02:00
Albert Vaca Cintora
c32e00bb47 Fix plugin list not recomposing 2024-10-08 22:37:46 +02:00
Albert Vaca Cintora
ba98e21d40 Make every pending intent immutable except the one for the widget
The widget runs as part of the launcher (so, a different app) which needs
to modify the intent to tell us what command the user selected.
2024-10-08 22:18:58 +02:00
Luca Carlon
551b089d9a Do not use FLAG_MUTABLE when targeting Android >= 34
BUG: 494158
2024-10-08 15:48:23 +00:00
l10n daemon script
b9e9d66fa5 GIT_SILENT made messages (after extraction) 2024-10-08 01:48:18 +00:00
l10n daemon script
107611f8d2 GIT_SILENT made messages (after extraction) 2024-10-07 01:46:54 +00:00
l10n daemon script
d0fc68054f GIT_SILENT Sync po/docbooks with svn 2024-10-06 02:20:27 +00:00
l10n daemon script
9f15d4b3aa GIT_SILENT made messages (after extraction) 2024-10-06 01:48:36 +00:00
TPJ Schikhof
a149100d74 Add unit tests for TelephonyHelper 2024-10-05 05:55:22 +00:00
l10n daemon script
7332b355a4 GIT_SILENT made messages (after extraction) 2024-10-05 01:48:12 +00:00
ShellWen Chen
9cc8051d00 refactor(remotekeyboard): simplify checkRequiredPermissions using streams
This commit simplifies the `checkRequiredPermissions` method in the `RemoteKeyboardPlugin` by using Java
 streams.

The previous implementation used a for loop to iterate over the list of enabled input methods and check if the package name matched the current context. This has been replaced with a more concise stream-based approach using `anyMatch`.
2024-10-04 02:42:19 +00:00
ShellWen Chen
78050a158a refactor(remotekeyboard): use package name from context instead of hard-coded 2024-10-04 02:42:19 +00:00
TPJ Schikhof
a5057df1c8 Migrate EntryItem to Kotlin 2024-10-04 02:40:42 +00:00
TPJ Schikhof
b856bdbb0b Migrate LifecycleHelper to Kotlin 2024-10-03 03:14:21 +00:00
TPJ Schikhof
8cb9a1809d Migrate SettingsFragment to Kotlin 2024-10-03 03:07:41 +00:00
Albert Vaca Cintora
0ffd9cd9dc Release 1.32.5 2024-10-02 08:03:10 +02:00
Albert Vaca Cintora
725b3f1d6a Release 1.32.5 for the Play Store 2024-10-02 07:57:32 +02:00
Albert Vaca Cintora
63d1d15c4f Fix crash on Android 14+
ENABLED_INPUT_METHODS can't be read anymore
2024-10-02 07:56:35 +02:00
TPJ Schikhof
592b8a74a7 Unit testing for the SslHelper methods
(excluding methods involving RsaHelper)
2024-10-02 04:47:48 +00:00
Luca Carlon
38e713f489 Fix access to the Downloads directory on Android 10
On Android 10 the share files feature fails when the default
directory is selected. When selecting a custom directory, the
permission is explicitly asked to the user, which makes the
feature work. When the location is switched back to the default
location, the feature is again broken.

The requestLegacyExternalStorage flag brings back the old
behavior and allows to write in the directory. It should be however
ignored for Android >= 11 according to the docs:

https://developer.android.com/training/data-storage/use-cases#opt-out-in-production-app

From Android 11, the Downlods directory should not need specific permissions.
2024-10-02 04:41:39 +00:00
TPJ Schikhof
bb8649d869 Refactor storage helper and added unit tests 2024-10-02 04:26:23 +00:00
Philip Cohn-Cort
2e82673bbf Regenerate Gradle wrapper files 2024-10-02 03:52:19 +00:00
TPJ Schikhof
7ee33de646 Migrate BackgroundService to Kotlin 2024-10-02 03:51:59 +00:00
Albert Vaca Cintora
65a71696d5 Release 1.32.4 for Play Store without EXTERNAL STORAGE permission 2024-09-28 18:30:40 +02:00
Albert Vaca Cintora
e2aa79a252 Release 1.32.3 2024-09-28 18:26:16 +02:00
Albert Vaca Cintora
1ffcaf076e Bump deps 2024-09-28 18:21:06 +02:00
TPJ Schikhof
854b2a1c9f Migrate PluginFactory to Kotlin 2024-09-28 04:59:56 +00:00
l10n daemon script
8fb545d620 GIT_SILENT made messages (after extraction) 2024-09-27 01:53:54 +00:00
Marko Zajc
db615b82df Fix trusted networks
## Summary
1) Fix the code responsible for loading the trusted network list.
2) The old `#_#` delimiter has been replaced with a less likely NUL character. This requires re-adding trusted networks, so I can revert it if necessary.
3) Ignore incoming identity packets on untrusted devices if they come from an untrusted device.

BUG: 492302

## Test Plan

### Before:
1) Trusted networks were completely broken, an would show variations of `#` and `_` on the list due to a bug in the splitting code.
2) Any network with `#_#` in the SSID - although unlikely - would not be possible to use as a trusted network.
3) The device was still discoverable on an untrusted network by manually refreshing the devices list.

### After:
1) Trusted networks now load the SSID list correctly.
2) Networks with `#_#` in the SSID can be added as trusted networks.
3) The device is no longer discoverable on an untrusted network.
2024-09-21 22:24:46 +00:00
TPJ Schikhof
ee7d4a1f05 Migrate FindRemoteDevicePlugin to Kotlin 2024-09-16 10:24:04 +00:00
TPJ Schikhof
409ef6b579 Migrate PingPlugin to Kotlin 2024-09-16 10:20:43 +00:00
TPJ Schikhof
2c0a9d262e Migrate MockSharedPreference to Kotlin 2024-09-16 10:18:16 +00:00
TPJ Schikhof
2f10f1d0f2 Migrate NsdResolveQueue to Kotlin 2024-09-15 08:07:31 +00:00
l10n daemon script
9f788da478 GIT_SILENT made messages (after extraction) 2024-09-12 01:45:57 +00:00
TPJ Schikhof
ec952b49d9 Migrate LoopbackBackend to Kotlin 2024-09-10 21:22:59 +00:00
TPJ Schikhof
45da75f331 Migrate BackgroundJob(Handler) to Kotlin 2024-09-10 08:35:09 +00:00
Albert Vaca Cintora
283956c107 Bump targetSdk from 33 to 35 2024-09-08 14:35:36 +02:00
l10n daemon script
d605977b91 GIT_SILENT Sync po/docbooks with svn 2024-09-06 02:42:47 +00:00
Albert Vaca Cintora
80cf238354 Add changelog 2024-09-03 12:10:28 +02:00
Albert Vaca Cintora
8ee135b018 Release 1.32.2 2024-09-03 12:05:55 +02:00
Albert Vaca Cintora
2343dbf144 Release 1.32.2 for Play Store without EXTERNAL STORAGE permission 2024-09-03 12:04:38 +02:00
Albert Vaca Cintora
3f53180b1d Unify the check for NativeFileSystem support 2024-09-03 12:03:03 +02:00
Albert Vaca Cintora
0f7af315f5 Bump deps 2024-09-03 12:03:03 +02:00
TPJ Schikhof
7ebac70d47 Migrate DeviceTest to Kotlin 2024-09-02 10:29:16 +00:00
TPJ Schikhof
9037647281 Migrate SafeTextCheckerTest to Kotlin 2024-09-02 10:27:24 +00:00
l10n daemon script
9373587268 GIT_SILENT made messages (after extraction) 2024-09-02 01:46:49 +00:00
TPJ Schikhof
0771415d8f Migrate RsaHelper to Kotlin 2024-08-31 17:38:59 +00:00
TPJ Schikhof
fb0e2cc01d Migrate files helper to Kotlin + add unit tests 2024-08-30 18:02:12 +00:00
TPJ Schikhof
584fb78bb7 Relieve getStorageList() out of it's misery since it's not being used anymore
I was about to migrate this to Kotlin but reasoned it would save some work to remove this first since it's not being used anyway.
2024-08-30 14:29:17 +00:00
l10n daemon script
ae12e3e6fc GIT_SILENT Sync po/docbooks with svn 2024-08-29 02:19:17 +00:00
l10n daemon script
8be80cae3e GIT_SILENT made messages (after extraction) 2024-08-29 01:47:24 +00:00
l10n daemon script
d41ed4d911 GIT_SILENT made messages (after extraction) 2024-08-28 01:57:12 +00:00
l10n daemon script
6f783b54a5 GIT_SILENT made messages (after extraction) 2024-08-27 01:50:35 +00:00
l10n daemon script
1f6d1ea544 GIT_SILENT Sync po/docbooks with svn 2024-08-26 02:33:49 +00:00
l10n daemon script
27737c46f2 GIT_SILENT made messages (after extraction) 2024-08-26 02:00:08 +00:00
l10n daemon script
6b99fe7e7c GIT_SILENT made messages (after extraction) 2024-08-25 01:47:57 +00:00
Adam Liscak
6e59a6241a Certificate Expiry Hadling After 10 Years
Auto reconfiguration of own certificate:

currently:
if kdeconncect loads its certificate and its expired or not effective yet
it generates a new certificate and deletes all remembered devices
(since these will stay unreachable anyways)

previously:
if kdeconncect loads its certificate and its expired or not effective yet
it continues having the same certificate
This brings forth an issue: Other devices would refuse to connect to a device with
an expired or non-effective certificate.

Auto-delete of orphan certificates:

currently:
Devices in kdeconnect's devicelist that have illegal ssl certificates
(expired, not effective yet, empty) get automatically deleted from the
devicelist
previously:
they would just exist forever until the user deletes them
2024-08-24 10:24:34 +00:00
l10n daemon script
7506d32cef GIT_SILENT made messages (after extraction) 2024-08-24 01:47:48 +00:00
l10n daemon script
c35dc4928c GIT_SILENT made messages (after extraction) 2024-08-23 01:47:03 +00:00
l10n daemon script
6070276489 GIT_SILENT Sync po/docbooks with svn 2024-08-22 02:30:41 +00:00
l10n daemon script
9685f7e69a GIT_SILENT made messages (after extraction) 2024-08-22 01:55:16 +00:00
TPJ Schikhof
69495136da Migrate RandomHelper to Kotlin 2024-08-21 18:55:00 +00:00
Mhammad Alloush
5f18cb571d Update MousePadActivity to support doubletap drag
This MR is a continuation of !439 , which changes the default 
behavior of the remote mouse plugin's drag and drop trigger
to be a double-tap to drag, and adds a new SwitchPreference
that toggles between the old (hold to drag) and new behavior.
2024-08-21 18:52:24 +00:00
TPJ Schikhof
ab1b1f7ecc Migrate MediaStoreHelper to Kotlin 2024-08-21 15:06:55 +00:00
l10n daemon script
3f8170eae8 GIT_SILENT made messages (after extraction) 2024-08-20 02:02:39 +00:00
150 changed files with 3395 additions and 3265 deletions

1
.gitignore vendored
View File

@@ -13,3 +13,4 @@ local.properties
.directory
GPUCache/
/release/
/.kotlin/

View File

@@ -8,8 +8,8 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:versionCode="13201"
android:versionName="1.32.1">
android:versionCode="13209"
android:versionName="1.32.9">
<uses-feature
android:name="android.hardware.telephony"
@@ -20,6 +20,15 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />
<uses-feature
android:name="android.hardware.location.gps"
android:required="false" />
<uses-feature
android:name="android.hardware.microphone"
android:required="false" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
@@ -69,7 +78,9 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/KdeConnectTheme.NoActionBar"
android:name="org.kde.kdeconnect.KdeConnect"
android:enableOnBackInvokedCallback="true">
android:enableOnBackInvokedCallback="true"
android:requestLegacyExternalStorage="true"> <!-- requestLegacyExternalStorage is only used in Android 10: https://developer.android.com/training/data-storage/use-cases#opt-out-in-production-app -->
<receiver
android:name="com.android.mms.transaction.PushReceiver"

View File

@@ -48,10 +48,10 @@ fun String.runCommand(
android {
namespace = "org.kde.kdeconnect_tp"
compileSdk = 34
compileSdk = 35
defaultConfig {
minSdk = 21
targetSdk = 33
targetSdk = 35
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
buildFeatures {

View File

@@ -1,21 +1,21 @@
KDE Connect provides a set of features to integrate your workflow across devices:
KDE Connect bietet eine Reihe von Funktionen, um Ihre Arbeitsabläufe über verschiedene Geräte zu vereinigen:
- Transfer files between your devices.
- Access files on your phone from your computer, without wires.
- Shared clipboard: copy and paste between your devices.
- Get notifications for incoming calls and messages on your computer.
- Virtual touchpad: Use your phone screen as your computer's touchpad.
- Notifications sync: Access your phone notifications from your computer and reply to messages.
- Multimedia remote control: Use your phone as a remote for Linux media players.
- WiFi connection: no USB wire or bluetooth needed.
- End-to-end TLS encryption: your information is safe.
- Daten zwischen Ihren Geräten übertragen.
- Auf Daten auf Ihrem Telefon von Ihrem Computer aus zugreifen, ohne Kabel.
- Geteilte Zwischenablage: Kopieren und Einfügen zwischen Ihren Geräten.
- Erhalten Sie Benachrichtigungen über eingehende Anrufe und Nachrichten auf Ihren Computer.
- Virtuelles Touchpad: Verwenden Sie den Bildschirm Ihres Telefons als Touchpad für Ihren Computer.
- Abgleich der Benachrichtigungen: Greifen Sie über den Computer auf Ihre Telefonbenachrichtigungen zu und antworten Sie auf Nachrichten.
- Multimedia-Fernbedienung: Verwenden Sie Ihr Telefon als Fernbedienung für Linux-Medienspieler.
- WLAN-Verbindung: kein USB-Kabel oder Bluetooth erforderlich.
- Ende-zu-Ende-TLS-Verschlüsselung: Ihre Informationen sind sicher.
Please note you will need to install KDE Connect on your computer for this app to work, and keep the desktop version up-to-date with the Android version for the latest features to work.
Bitte beachten Sie, dass Sie KDE Connect auf Ihrem Computer installieren müssen, damit diese App funktioniert und halten Sie die Desktop-Version mit der Android-Version auf dem aktuellen Stand, um die neuesten Funktionen nutzen zu können.
Sensitive permissions information:
* Accessibility permission: Required to receive input from another device to control your Android phone, if you use the Remote Input feature.
* Background location permission: Required to know to which WiFi network you are connected to, if you use the Trusted Networks feature.
Informationen zu sensiblen Berechtigungen:
* Zugriffsberechtigung: Wird benötigt, um Eingaben zur Steuerung ihres Android-Telefons von einem anderen Gerät zu erhalten, wenn Sie die Ferneingabefunktion verwenden.
* Berechtigung den Standort im Hintergrund zu nutzen: Wird benötigt, um festzustellen, mit welchem WLAN-Netzwerk Sie verbunden sind, wenn Sie die Funktion „Vertrauenswürdige Netzwerke” verwenden.
KDE Connect never sends any information to KDE nor to any third party. KDE Connect sends data from one device to the other directly using the local network, never through the internet, and using end to end encryption.
KDE Connect sendet niemals irgendwelche Informationen an KDE oder an Dritte. KDE Connect sendet Daten, unter Verwendung einer Ende-zu-Ende-Verschlüsselung, über das lokale Netzwerk direkt von einem Gerät zum anderen, niemals über das Internet.
This app is part of an open source project and it exists thanks to all the people who contributed to it. Visit the website to grab the source code.
Diese App ist Teil eines Open-Scource-Projekts und besteht Dank all der Menschen die dazu beigetragen haben. Besuchen Sie die Internetseite, um sich den Quelltext zu holen.

View File

@@ -0,0 +1,11 @@
1.32.2
* Handle expired certificates
* Support doubletap drag in remote mouse
1.32.1
* Fixed a crash when opening the presentation remote
1.32
* Rewrite the remote file browsing
* Add Direct Share targets
* Send album art from phone to PC

View File

@@ -0,0 +1,14 @@
1.32.3
* Fix trusted devices list
1.32.2
* Handle expired certificates
* Support doubletap drag in remote mouse
1.32.1
* Fixed a crash when opening the presentation remote
1.32
* Rewrite the remote file browsing
* Add Direct Share targets
* Send album art from phone to PC

View File

@@ -0,0 +1,17 @@
1.32.5
* Fixed crash in Android 14+
1.32.3
* Fix trusted devices list
1.32.2
* Handle expired certificates
* Support doubletap drag in remote mouse
1.32.1
* Fixed a crash when opening the presentation remote
1.32
* Rewrite the remote file browsing
* Add Direct Share targets
* Send album art from phone to PC

View File

@@ -0,0 +1,16 @@
1.32.7
* Fixed file transfers showing as failed when they succeeded
* Fixed plugin list not updating after granting permissions
1.32.5
* Fixed crash in Android 14+
1.32.3
* Fix trusted devices list
1.32.2
* Handle expired certificates
* Support doubletap drag in remote mouse
1.32.1
* Fixed a crash when opening the presentation remote

View File

@@ -6,7 +6,7 @@ KDEConnect fournit un ensemble de fonctionnalités pour intégrer votre flux de
- Apparition de notifications pour les appels et les messages entrants sur votre ordinateur.
- Pavé tactile virtuel : utilisation de l'écran de votre téléphone comme pavé tactile pour votre ordinateur.
- Synchronisation de vos notifications : accès à vos notifications téléphoniques depuis votre ordinateur et réponses aux messages.
- Télé-commande multimédia : utilisation de votre téléphone comme télécommande pour les lecteurs de médias sous Linux.
- Télé-commande multimédia : utilisation de votre téléphone comme télécommande pour les lecteurs de média sous Linux.
- Connexion au Wifi : aucun connexion USB ou Bluetooth nécessaire.
- Chiffrement « TLS » de bout en bout : vos informations sont en sécurité.
@@ -18,4 +18,4 @@ Informations sur les permissions sensibles :
KDEConnect n'envoie jamais d'informations à KDE ni à aucun tiers. KDEConnect envoie des données d'un périphérique à un autre à l'aide du réseau local, mais jamais par Internet et en utilisant le chiffrement de bout en bout.
Cette application fait partie d'un projet « Open source ». Il existe grâce à toutes les personnes qui y ont contribué.Visitez le site Internet pour accéder au code source.
Cette application fait partie d'un projet « Open source ». Il existe grâce à toutes les personnes qui y ont contribué. Veuillez visiter le site Internet pour accéder au code source.

View File

@@ -1,20 +1,21 @@
O KDE Connect fornece um conjunto de recursos para integrar seu fluxo de trabalho entre dispositivos:
- Transfira arquivos entre seus dispositivos.
- Acesse arquivos do seu computador no seu telefone, sem fios.
- Área de transferência compartilhada: copie e cole entre seus dispositivos.
- Compartilhe arquivos e URLs em seu computador a partir de qualquer app.
- Receba notificações de chamadas recebidas e mensagens SMS no seu PC.
- Touchpad virtual: use a tela do telefone como touchpad do computador.
- Sincronização de notificações: leia as notificações do seu Android na área de trabalho.
- Controle remoto multimídia: use seu telefone como controle remoto para reprodutores de mídia Linux.
- Sincronização de notificações: acesse as notificações do seu telefone no seu computador e responda as mensagens.
- Controle remoto multimídia: use seu telefone como controle remoto para reprodutores de mídia no Linux.
- Conexão Wi-Fi: sem necessidade de cabos USB ou bluetooth.
- Criptografia TLS de ponta a ponta: suas informações estão seguras.
Observe que você precisará instalar o KDE Connect no seu computador para que este aplicativo funcione e mantenha a versão para desktop atualizada com a versão do Android para que os recursos mais recentes funcionem.
Informações a respeito de permissões especiais :
Informações sobre permissões sensíveis:
* Permissão de acessibilidade: necessária para receber entrada de outro dispositivo para controlar seu telefone Android, se você usar o recurso de entrada remota.
* Permissão de localização em segundo plano: necessária para saber a qual rede Wi-Fi você está conectado, se você usar o recurso de redes confiáveis.
O KDE Connect nunca envia nenhuma informação ao KDE nem a terceiros. O KDE Connect envia dados de um dispositivo para outro diretamente usando a rede local, nunca pela Internet e usando criptografia de ponta a ponta.
O KDE Connect nunca envia nenhuma informação ao KDE ou a terceiros. O KDE Connect envia dados de um dispositivo para outro diretamente usando a rede local, nunca pela Internet e usando criptografia de ponta a ponta.
Este aplicativo faz parte de um projeto de código aberto e existe graças a todas as pessoas que contribuíram para ele. Visite o site para obter o código-fonte.

View File

@@ -1,4 +1,4 @@
KDE 連線提供許多功能讓您整合您跨裝置的作業流程:
KDE Connect 提供許多功能讓您整合您跨裝置的作業流程:
- 在您的裝置之間傳輸檔案。
- 從您的電腦無線存取您的手機上的檔案。
@@ -10,12 +10,12 @@ KDE 連線提供許多功能讓您整合您跨裝置的作業流程:
- WiFi 連線:不需要 USB 線或是藍牙連線。
- 點對點 TLS 加密:您的資訊是安全的。
請注意,這個應用程式需要您在電腦上也安裝 KDE 連線才能正常運作;最新功能也會需要電腦的版本跟 Android 的版本一樣新才能正常運作。
請注意,這個應用程式需要您在電腦上也安裝 KDE Connect 才能正常運作;最新功能也會需要電腦的版本跟 Android 的版本一樣新才能正常運作。
敏感權限資訊:
* 協助工具權限:如果您使用「遠端輸入」功能,需要它來從另一個裝置接收輸入後控制您的 Android 裝置。
* 背景位置權限:如果您使用「信任網路」功能,需要它來得知您目前連線的 WiFi 網路。
KDE 連線不會傳送任何資訊給 KDE 或任何第三方。KDE 連線利用本地網路直接從一個裝置傳送資料到另一個裝置,不會透過網際網路,並且同時使用點對點加密。
KDE Connect 不會傳送任何資訊給 KDE 或任何第三方。KDE Connect 利用本地網路直接從一個裝置傳送資料到另一個裝置,不會透過網際網路,並且同時使用點對點加密。
這個應用程式是一個開源專案的一部分,它的存在歸功於所有貢獻者。可造訪網站取得原始碼。

View File

@@ -1 +1 @@
KDE 連線整合了您的智慧型手機與電腦
KDE Connect 整合了您的智慧型手機與電腦

View File

@@ -1,40 +1,40 @@
[versions]
activityCompose = "1.9.1"
androidDesugarJdkLibs = "2.0.4"
androidGradlePlugin = "8.5.2"
activityCompose = "1.9.3"
androidDesugarJdkLibs = "2.1.3"
androidGradlePlugin = "8.7.3"
androidSmsmms = "kdeconnect-1-21-0"
appcompat = "1.7.0"
bcpkixJdk15on = "1.70"
classindex = "3.13"
commonsCollections4 = "4.4"
commonsIo = "2.16.1"
commonsLang3 = "3.16.0"
constraintlayoutCompose = "1.0.1"
coreKtx = "1.13.1"
commonsIo = "2.17.0"
commonsLang3 = "3.17.0"
constraintlayoutCompose = "1.1.0"
coreKtx = "1.15.0"
dependencyLicenseReport = "2.7"
disklrucache = "2.0.2"
documentfile = "1.0.1"
gridlayout = "1.0.0"
jsonassert = "1.5.3"
junit = "4.13.2"
kotlin = "2.0.10"
kotlinxCoroutinesCore = "1.8.1"
kotlin = "2.0.21"
kotlinxCoroutinesCore = "1.9.0"
lifecycleExtensions = "2.2.0"
lifecycleRuntimeKtx = "2.8.4"
lifecycleRuntimeKtx = "2.8.7"
logger = "1.0.3"
material = "1.12.0"
material3 = "1.2.1"
material3 = "1.3.1"
media = "1.7.0"
minaCore = "2.2.3"
mockitoCore = "5.12.0"
mockitoCore = "5.14.2"
preferenceKtx = "1.2.1"
reactiveStreams = "1.0.4"
recyclerview = "1.3.2"
rxjava = "2.2.21"
sl4j = "2.0.13"
sshdCore = "2.13.2"
sshdCore = "2.14.0"
swiperefreshlayout = "1.1.0"
uiToolingPreview = "1.6.8"
uiToolingPreview = "1.7.5"
univocityParsers = "2.9.1"
[libraries]

Binary file not shown.

View File

@@ -1,6 +1,8 @@
#Sat Mar 02 00:26:28 CET 2024
#Sat Sep 28 01:39:16 AM EDT 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

294
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,78 +17,111 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -97,87 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

55
gradlew.bat vendored
View File

@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
@@ -54,48 +55,36 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal

View File

@@ -1,19 +1,20 @@
# Frederik Schwarzer <schwarzer@kde.org>, 2023.
# tobi <onewayme001@posteo.de>, 2024.
#. extracted from ./metadata/android/en-US/full_description.txt
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Project-Id-Version: kdeconnect-android-store-full\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2023-06-07 19:50+0200\n"
"Last-Translator: Frederik Schwarzer <schwarzer@kde.org>\n"
"PO-Revision-Date: 2024-10-02 20:37+0200\n"
"Last-Translator: tobi <onewayme001@posteo.de>\n"
"Language-Team: German <kde-i18n-de@kde.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 23.07.70\n"
"X-Generator: Lokalize 21.12.3\n"
msgid ""
"KDE Connect provides a set of features to integrate your workflow across "
@@ -48,3 +49,41 @@ msgid ""
"This app is part of an open source project and it exists thanks to all the "
"people who contributed to it. Visit the website to grab the source code.\n"
msgstr ""
"KDE Connect bietet eine Reihe von Funktionen, um Ihre Arbeitsabläufe über "
"verschiedene Geräte zu vereinigen:\n"
"\n"
"- Daten zwischen Ihren Geräten übertragen.\n"
"- Auf Daten auf Ihrem Telefon von Ihrem Computer aus zugreifen, ohne Kabel.\n"
"- Geteilte Zwischenablage: Kopieren und Einfügen zwischen Ihren Geräten.\n"
"- Erhalten Sie Benachrichtigungen über eingehende Anrufe und Nachrichten auf "
"Ihren Computer.\n"
"- Virtuelles Touchpad: Verwenden Sie den Bildschirm Ihres Telefons als "
"Touchpad für Ihren Computer.\n"
"- Abgleich der Benachrichtigungen: Greifen Sie über den Computer auf Ihre "
"Telefonbenachrichtigungen zu und antworten Sie auf Nachrichten.\n"
"- Multimedia-Fernbedienung: Verwenden Sie Ihr Telefon als Fernbedienung für "
"Linux-Medienspieler.\n"
"- WLAN-Verbindung: kein USB-Kabel oder Bluetooth erforderlich.\n"
"- Ende-zu-Ende-TLS-Verschlüsselung: Ihre Informationen sind sicher.\n"
"\n"
"Bitte beachten Sie, dass Sie KDE Connect auf Ihrem Computer installieren "
"müssen, damit diese App funktioniert und halten Sie die Desktop-Version mit "
"der Android-Version auf dem aktuellen Stand, um die neuesten Funktionen "
"nutzen zu können.\n"
"\n"
"Informationen zu sensiblen Berechtigungen:\n"
"* Zugriffsberechtigung: Wird benötigt, um Eingaben zur Steuerung ihres "
"Android-Telefons von einem anderen Gerät zu erhalten, wenn Sie die "
"Ferneingabefunktion verwenden. \n"
"* Berechtigung den Standort im Hintergrund zu nutzen: Wird benötigt, um "
"festzustellen, mit welchem WLAN-Netzwerk Sie verbunden sind, wenn Sie die "
"Funktion „Vertrauenswürdige Netzwerke” verwenden.\n"
"\n"
"KDE Connect sendet niemals irgendwelche Informationen an KDE oder an Dritte. "
"KDE Connect sendet Daten, unter Verwendung einer Ende-zu-Ende-"
"Verschlüsselung, über das lokale Netzwerk direkt von einem Gerät zum "
"anderen, niemals über das Internet.\n"
"\n"
"Diese App ist Teil eines Open-Scource-Projekts und besteht Dank all der "
"Menschen die dazu beigetragen haben. Besuchen Sie die Internetseite, um sich "
"den Quelltext zu holen.\n"

View File

@@ -2,7 +2,7 @@
#. extracted from ./metadata/android/en-US/short_description.txt
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Project-Id-Version: kdeconnect-android-store-short\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2023-06-07 19:50+0200\n"

View File

@@ -1,4 +1,4 @@
# Víctor Rodrigo Córdoba <vrcordoba@gmail.com>, 2023.
# SPDX-FileCopyrightText: 2023 Víctor Rodrigo Córdoba <vrcordoba@gmail.com>
#. extracted from ./metadata/android/en-US/full_description.txt
msgid ""
msgstr ""

View File

@@ -1,8 +1,8 @@
# Víctor Rodrigo Córdoba <vrcordoba@gmail.com>, 2023.
# SPDX-FileCopyrightText: 2023 Víctor Rodrigo Córdoba <vrcordoba@gmail.com>
#. extracted from ./metadata/android/en-US/short_description.txt
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Project-Id-Version: kdeconnect-android-store-short\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2023-06-10 17:26+0200\n"

View File

@@ -13,7 +13,6 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 22.12.3\n"
msgid ""
"KDE Connect provides a set of features to integrate your workflow across "

View File

@@ -13,7 +13,6 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 22.12.3\n"
msgid "KDE Connect integrates your smartphone and computer"
msgstr "KDE Connect eheyttää älypuhelimen ja tietokoneen"

View File

@@ -1,20 +1,20 @@
#
# SPDX-FileCopyrightText: 2023 Xavier Besnard <xavier.besnard@kde.org>
# SPDX-FileCopyrightText: 2023, 2024 Xavier Besnard <xavier.besnard@kde.org>
#. extracted from ./metadata/android/en-US/full_description.txt
msgid ""
msgstr ""
"Project-Id-Version: kdeconnect-android-store-full\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2023-09-28 18:06+0200\n"
"Last-Translator: Xavier BESNARD <xavier.besnard@neuf.fr>\n"
"Language-Team: French <kde-francophone@kde.org>\n"
"PO-Revision-Date: 2024-08-09 22:07+0200\n"
"Last-Translator: Xavier Besnard <xavier.besnard@kde.org>\n"
"Language-Team: French <French <kde-francophone@kde.org>>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Lokalize 23.08.1\n"
"X-Generator: Lokalize 23.08.5\n"
msgid ""
"KDE Connect provides a set of features to integrate your workflow across "
@@ -62,7 +62,7 @@ msgstr ""
"- Synchronisation de vos notifications : accès à vos notifications "
"téléphoniques depuis votre ordinateur et réponses aux messages.\n"
"- Télé-commande multimédia : utilisation de votre téléphone comme "
"télécommande pour les lecteurs de médias sous Linux.\n"
"télécommande pour les lecteurs de média sous Linux.\n"
"- Connexion au Wifi : aucun connexion USB ou Bluetooth nécessaire.\n"
"- Chiffrement « TLS » de bout en bout : vos informations sont en sécurité.\n"
"\n"
@@ -83,5 +83,5 @@ msgstr ""
"mais jamais par Internet et en utilisant le chiffrement de bout en bout.\n"
"\n"
"Cette application fait partie d'un projet « Open source ». Il existe grâce à "
"toutes les personnes qui y ont contribué.Visitez le site Internet pour "
"accéder au code source.\n"
"toutes les personnes qui y ont contribué. Veuillez visiter le site Internet "
"pour accéder au code source.\n"

View File

@@ -9,10 +9,10 @@ msgstr ""
"PO-Revision-Date: 2024-07-10 20:18+0200\n"
"Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
"Language-Team: Norwegian Nynorsk <l10n-no@lister.huftis.org>\n"
"Language: nn\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nn\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 24.05.1\n"
"X-Environment: kde\n"

View File

@@ -1,53 +1,21 @@
# Geraldo Simiao <geraldosimiao@fedoraproject.org>, 2023.
# Frederico Goncalves Guimaraes <frederico@teia.bio.br>, 2024.
#. extracted from ./metadata/android/en-US/full_description.txt
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2023-08-04 01:33-0300\n"
"Last-Translator: Geraldo Simiao <geraldosimiao@fedoraproject.org>\n"
"PO-Revision-Date: 2024-08-28 17:37-0300\n"
"Last-Translator: Frederico Goncalves Guimaraes <frederico@teia.bio.br>\n"
"Language-Team: Brazilian Portuguese <kde-i18n-pt_BR@kde.org>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 23.04.3\n"
"X-Generator: Lokalize 22.12.3\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#, fuzzy
#| msgid ""
#| "KDE Connect provides a set of features to integrate your workflow across "
#| "devices:\n"
#| "\n"
#| "- Shared clipboard: copy and paste between your devices.\n"
#| "- Share files and URLs to your computer from any app.\n"
#| "- Get notifications for incoming calls and SMS messages on your PC.\n"
#| "- Virtual touchpad: Use your phone screen as your computer's touchpad.\n"
#| "- Notifications sync: Read your Android notifications from the desktop.\n"
#| "- Multimedia remote control: Use your phone as a remote for Linux media "
#| "players.\n"
#| "- WiFi connection: no USB wire or bluetooth needed.\n"
#| "- End-to-end TLS encryption: your information is safe.\n"
#| "\n"
#| "Please note you will need to install KDE Connect on your computer for "
#| "this app to work, and keep the desktop version up-to-date with the "
#| "Android version for the latest features to work.\n"
#| "\n"
#| "Sensitive permissions information:\n"
#| "* Accessibility permission: Required to receive input from another device "
#| "to control your Android phone, if you use the Remote Input feature.\n"
#| "* Background location permission: Required to know to which WiFi network "
#| "you are connected to, if you use the Trusted Networks feature.\n"
#| "\n"
#| "KDE Connect never sends any information to KDE nor to any third party. "
#| "KDE Connect sends data from one device to the other directly using the "
#| "local network, never through the internet, and using end to end "
#| "encryption.\n"
#| "\n"
#| "This app is part of an open source project and it exists thanks to all "
#| "the people who contributed to it. Visit the website to grab the source "
#| "code.\n"
msgid ""
"KDE Connect provides a set of features to integrate your workflow across "
"devices:\n"
@@ -84,15 +52,16 @@ msgstr ""
"O KDE Connect fornece um conjunto de recursos para integrar seu fluxo de "
"trabalho entre dispositivos:\n"
"\n"
"- Transfira arquivos entre seus dispositivos.\n"
"- Acesse arquivos do seu computador no seu telefone, sem fios.\n"
"- Área de transferência compartilhada: copie e cole entre seus "
"dispositivos.\n"
"- Compartilhe arquivos e URLs em seu computador a partir de qualquer app.\n"
"- Receba notificações de chamadas recebidas e mensagens SMS no seu PC.\n"
"- Touchpad virtual: use a tela do telefone como touchpad do computador.\n"
"- Sincronização de notificações: leia as notificações do seu Android na área "
"de trabalho.\n"
"- Sincronização de notificações: acesse as notificações do seu telefone no "
"seu computador e responda as mensagens.\n"
"- Controle remoto multimídia: use seu telefone como controle remoto para "
"reprodutores de mídia Linux.\n"
"reprodutores de mídia no Linux.\n"
"- Conexão Wi-Fi: sem necessidade de cabos USB ou bluetooth.\n"
"- Criptografia TLS de ponta a ponta: suas informações estão seguras.\n"
"\n"
@@ -100,14 +69,14 @@ msgstr ""
"este aplicativo funcione e mantenha a versão para desktop atualizada com a "
"versão do Android para que os recursos mais recentes funcionem.\n"
"\n"
"Informações a respeito de permissões especiais :\n"
"Informações sobre permissões sensíveis:\n"
"* Permissão de acessibilidade: necessária para receber entrada de outro "
"dispositivo para controlar seu telefone Android, se você usar o recurso de "
"entrada remota.\n"
"* Permissão de localização em segundo plano: necessária para saber a qual "
"rede Wi-Fi você está conectado, se você usar o recurso de redes confiáveis.\n"
"\n"
"O KDE Connect nunca envia nenhuma informação ao KDE nem a terceiros. O KDE "
"O KDE Connect nunca envia nenhuma informação ao KDE ou a terceiros. O KDE "
"Connect envia dados de um dispositivo para outro diretamente usando a rede "
"local, nunca pela Internet e usando criptografia de ponta a ponta.\n"
"\n"

View File

@@ -1,19 +1,20 @@
# Kisaragi Hiu <mail@kisaragi-hiu.com>, 2023.
# taijuin <taijuin@gmail.com>, 2024.
#. extracted from ./metadata/android/en-US/full_description.txt
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2023-12-09 17:51+0900\n"
"Last-Translator: Kisaragi Hiu <mail@kisaragi-hiu.com>\n"
"PO-Revision-Date: 2024-11-12 19:04+0800\n"
"Last-Translator: taijuin <taijuin@gmail.com>\n"
"Language-Team: Traditional Chinese <zh-l10n@lists.slat.org>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 24.01.80\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.5\n"
msgid ""
"KDE Connect provides a set of features to integrate your workflow across "
@@ -48,7 +49,7 @@ msgid ""
"This app is part of an open source project and it exists thanks to all the "
"people who contributed to it. Visit the website to grab the source code.\n"
msgstr ""
"KDE 連線提供許多功能讓您整合您跨裝置的作業流程:\n"
"KDE Connect 提供許多功能讓您整合您跨裝置的作業流程:\n"
"\n"
"- 在您的裝置之間傳輸檔案。\n"
"- 從您的電腦無線存取您的手機上的檔案。\n"
@@ -60,8 +61,8 @@ msgstr ""
"- WiFi 連線:不需要 USB 線或是藍牙連線。\n"
"- 點對點 TLS 加密:您的資訊是安全的。\n"
"\n"
"請注意,這個應用程式需要您在電腦上也安裝 KDE 連線才能正常運作;最新功能也會需"
"要電腦的版本跟 Android 的版本一樣新才能正常運作。\n"
"請注意,這個應用程式需要您在電腦上也安裝 KDE Connect 才能正常運作;最新功能也"
"會需要電腦的版本跟 Android 的版本一樣新才能正常運作。\n"
"\n"
"敏感權限資訊:\n"
"* 協助工具權限:如果您使用「遠端輸入」功能,需要它來從另一個裝置接收輸入後控"
@@ -69,8 +70,8 @@ msgstr ""
"* 背景位置權限:如果您使用「信任網路」功能,需要它來得知您目前連線的 WiFi 網"
"路。\n"
"\n"
"KDE 連線不會傳送任何資訊給 KDE 或任何第三方。KDE 連線利用本地網路直接從一個裝"
"置傳送資料到另一個裝置,不會透過網際網路,並且同時使用點對點加密。 \n"
"KDE Connect 不會傳送任何資訊給 KDE 或任何第三方。KDE Connect 利用本地網路直接"
"從一個裝置傳送資料到另一個裝置,不會透過網際網路,並且同時使用點對點加密。 \n"
"\n"
"這個應用程式是一個開源專案的一部分,它的存在歸功於所有貢獻者。可造訪網站取得"
"原始碼。\n"

View File

@@ -1,19 +1,20 @@
# Kisaragi Hiu <mail@kisaragi-hiu.com>, 2023.
# taijuin <taijuin@gmail.com>, 2024.
#. extracted from ./metadata/android/en-US/short_description.txt
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2023-12-09 17:39+0900\n"
"Last-Translator: Kisaragi Hiu <mail@kisaragi-hiu.com>\n"
"PO-Revision-Date: 2024-11-12 19:00+0800\n"
"Last-Translator: taijuin <taijuin@gmail.com>\n"
"Language-Team: Traditional Chinese <zh-l10n@lists.slat.org>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 24.01.80\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.5\n"
msgid "KDE Connect integrates your smartphone and computer"
msgstr "KDE 連線整合了您的智慧型手機與電腦"
msgstr "KDE Connect 整合了您的智慧型手機與電腦"

View File

@@ -4,6 +4,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#000000"
android:fillColor="?colorControlNormal"
android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z"/>
</vector>

View File

@@ -4,6 +4,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:fillColor="?attr/colorControlNormal"
android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z"/>
</vector>

View File

@@ -6,8 +6,6 @@
android:viewportHeight="24">
<path
android:fillColor="#000000"
android:fillColor="?attr/colorControlNormal"
android:pathData="M7 9v6h4l5 5V4l-5 5H7z" />
<path
android:pathData="M0 0h24v24H0z" />
</vector>

View File

@@ -49,7 +49,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:background="@android:color/transparent"
android:contentDescription="@string/mute"
android:scaleType="fitXY"
android:src="@drawable/ic_volume_black"/>
android:src="@drawable/ic_volume"/>
<SeekBar
android:id="@+id/systemvolume_seek"

View File

@@ -198,7 +198,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:layout_weight="0"
android:contentDescription="@string/mpris_volume"
android:maxWidth="30dip"
android:src="@drawable/ic_volume_black"/>
android:src="@drawable/ic_volume"/>
<SeekBar

View File

@@ -84,9 +84,11 @@
<string name="error_canceled_by_other_peer">ألغاه ندّ آخر</string>
<string name="encryption_info_title">معلومات التّعمية</string>
<string name="pair_requested">طُلب الاقتران</string>
<string name="pair_succeeded">نجح الاقتران</string>
<string name="tap_to_open">اطرق لتفتح</string>
<string name="received_file_text">المس لفتح \'%1s\'</string>
<string name="tap_to_answer">المس للإجابة</string>
<string name="left_click">أرسل نقرة باليسار</string>
<string name="right_click">أرسل نقرة باليمين</string>
<string name="middle_click">أرسل نقرة بالوسط</string>
<string name="show_keyboard">أظهر لوحة المفاتيح</string>
@@ -113,6 +115,7 @@
<item>دقيقة واحدة</item>
<item>دقيقتان</item>
</string-array>
<string name="share_to">شارك مع…</string>
<string name="protocol_version_newer">يستخدم هذا الجهاز إصدار ميفاق أحدث</string>
<string name="plugin_settings_with_name">إعدادات %s</string>
<string name="invalid_device_name">اسم جهاز غير صالح</string>
@@ -145,8 +148,10 @@
<string name="no_file_browser">لا متصفّحات ملفّات مثبّتة.</string>
<string name="pref_plugin_telepathy">أرسل SMS</string>
<string name="pref_plugin_telepathy_desc">أرسل رسائل نصّيّة من سطح المكتب</string>
<string name="pref_plugin_telepathy_mms">أرسل رسالة قصيرة</string>
<string name="findmyphone_title">جِد جهازي</string>
<string name="findmyphone_title_tablet">جِد جهازي اللوحيّ</string>
<string name="findmyphone_title_tv">جِد تلفازي</string>
<string name="findmyphone_description">يرّن هذا الجهاز لتجده</string>
<string name="findmyphone_found">عثر عليه</string>
<string name="open">افتح</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Все още не сте добавили надеждна мрежа</string>
<string name="allow_all_networks_text">Allow all</string>
<string name="location_permission_needed_title">Изисква се разрешение</string>
<string name="bluetooth_permission_needed_desc">KDE Connect се нуждае от разрешение за свързване с устройства наблизо, за да направи устройства, сдвоени чрез Bluetooth, достъпни в KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect се нуждае от разрешение за местоположението във фонов режим, за да познава WiFi към която сте свързани, дори когато приложението е във фонов режим. Това е така, защото имената на WiFi мрежите около вас могат да бъдат използвани за намиране на вашето местоположение, дори когато KDE Connect не прави това.</string>
<string name="clipboard_android_x_incompat">Android 10 премахна достъпа до клипборда за всички приложения. Тази приставка ще бъде деактивирана.</string>
<string name="mpris_open_url">Продължаване на възпроизвеждането тук</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Изпращане</string>
<string name="compose_send_title">Текстът е изпратен</string>
<string name="open_compose_send">Съставяне на текст</string>
<string name="double_tap_to_drag">Двойно докосване за влачене</string>
<string name="hold_to_drag">Задържане за влачене</string>
<string name="about_kde_about">&lt;h1&gt;За&lt;/h1&gt; &lt;p&gt;KDE е световна общност от софтуерни инженери, художници, писатели, преводачи и творци, които са отдадени на &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;свободното разработване на софтуер&lt;/a&gt;. KDE създава работната среда Plasma, стотици приложения и многобройните софтуерни библиотеки, които ги поддържат.&lt;/p&gt; &lt;p&gt;KDE е кооперативно предприятие: нито една отделна организация контролира насоките или продуктите му. Вместо това ние работим заедно, за да постигнем общата цел да създадем най-добрия свободен софтуер в света. Всеки е добре дошъл да се присъедини и да да допринесе&lt;/a&gt; за KDE, включително и вие.&lt;/p&gt; Посетете &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; за повече информация за общността на KDE и за софтуера, който създаваме.</string>
<string name="about_kde_report_bugs_or_wishes">" &lt;h1&gt;Докладвайте за грешки или желания&lt;/h1&gt; &lt;p&gt;Софтуерът винаги може да бъде подобрен и екипът на KDE е готов да го направи. Въпреки това вие - потребителят - трябва да да ни кажете, когато нещо не работи според очакванията или може да бъде направено по-добре.&lt;/p&gt; &lt;p&gt;KDE разполага със система за проследяване на грешки. Посетете &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; или използвайте бутона \"Докладване на грешка\" от екрана за програмата, за да съобщите за грешки.&lt;/p&gt; Ако имате предложение за подобрение, тогава можете да използвате системата за проследяване на грешки, за да регистрирате желанието си. Уверете се, че използвате тежестта, наречена \"Wishlist\"."</string>
<string name="about_kde_join_kde">&lt;h1&gt;Присъединете се към KDE&lt;/h1&gt; &lt;p&gt;Не е необходимо да сте софтуерен разработчик на софтуер, за да сте член на екипа на KDE. Можете да се присъедините към преводаческите екипи за вашия език. Можете да предоставяте графики, теми, звуци, и подобрена документация. Вие решавате!&lt;/p&gt; &lt;p&gt;Посетете &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; за информация относно някои проекти, в които можете да да участвате.&lt;/p&gt; Ако имате нужда от повече информация или документация, тогава посетете &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; ще ви предостави необходимото.</string>
@@ -409,6 +412,7 @@
<string name="tap_to_execute">Докоснете, за да се изпълни</string>
<string name="plugin_stats">Данни на приставки</string>
<string name="enable_udp_broadcast">Активиране на откриване на устройства чрез UDP</string>
<string name="enable_bluetooth">Активиране на Bluetooth(бета)</string>
<string name="receive_notifications_permission_explanation">Известията трябва са разрешени, за да може да се получават от други устройства</string>
<string name="findmyphone_notifications_explanation">Разрешение за известия е необходимо, за да може телефонът да звъни, когато приложението е във фонов режим</string>
<string name="no_notifications">Известията са деактивирани, няма да получавате известия за входящи двойки.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Encara no heu afegit cap xarxa de confiança</string>
<string name="allow_all_networks_text">Permet totes</string>
<string name="location_permission_needed_title">Es requereix permís</string>
<string name="bluetooth_permission_needed_desc">El KDE Connect necessita permís per a connectar als dispositius propers per a fer que els dispositius aparellats per Bluetooth estiguin disponibles al KDE Connect.</string>
<string name="location_permission_needed_desc">El KDE Connect necessita el permís d\'ubicació en segon pla per a conèixer la xarxa Wi-Fi a la qual esteu connectat fins i tot quan l\'aplicació està en segon pla. Això és perquè el nom de les xarxes Wi-Fi que hi ha al voltant es podria utilitzar per a trobar la vostra ubicació, fins i tot quan això no és el que fa el KDE Connect.</string>
<string name="clipboard_android_x_incompat">L\'Android 10 ha tret l\'accés al porta-retalls a totes les aplicacions. Aquest connector estarà inhabilitat.</string>
<string name="mpris_open_url">Continua reproduint aquí</string>
@@ -389,10 +390,12 @@
<string name="send_compose">Envia</string>
<string name="compose_send_title">Títol de l\'enviament</string>
<string name="open_compose_send">Redacta text</string>
<string name="about_kde_about">&lt;h1&gt;Quant al&lt;/h1&gt; &lt;p&gt;El KDE és una comunitat mundial d\'enginyers, artistes, escriptors, traductors i creadors de programari compromesos amb el desenvolupament de &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;programari lliure&lt;/a&gt;. El KDE produeix l\'entorn d\'escriptori Plasma, centenars d\'aplicacions i moltes biblioteques de programari que els donen suport.&lt;/p&gt; &lt;p&gt;El KDE és una empresa en cooperativa: cap entitat controla la seva direcció o els productes. En el seu lloc, treballem junts per a aconseguir l\'objectiu comú de construir el millor programari lliure del món. Tothom hi és benvingut a &lt;a href=https://community.kde.org/Get_Involved&gt;unir-se i contribuir&lt;/a&gt; al KDE, inclosos vosaltres.&lt;/p&gt; Visiteu &lt;a href=https://www.kde.org/ca/&gt;https://www.kde.org/ca/&lt;/a&gt; per a obtenir més informació sobre la comunitat KDE i el programari que produïm.</string>
<string name="double_tap_to_drag">Dos tocs per a arrossegar</string>
<string name="hold_to_drag">Mantenir premut per a arrossegar</string>
<string name="about_kde_about">&lt;h1&gt;Quant al&lt;/h1&gt; &lt;p&gt;KDE és una comunitat mundial d\'enginyers, artistes, escriptors, traductors i creadors de programari compromesos amb el desenvolupament de &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;programari lliure&lt;/a&gt;. KDE produeix l\'entorn d\'escriptori Plasma, centenars d\'aplicacions i moltes biblioteques de programari que els donen suport.&lt;/p&gt; &lt;p&gt;KDE és una empresa en cooperativa: cap entitat controla la seva direcció o els productes. En el seu lloc, treballem junts per a aconseguir l\'objectiu comú de construir el millor programari lliure del món. Tothom hi és benvingut a &lt;a href=https://community.kde.org/Get_Involved&gt;unir-se i contribuir&lt;/a&gt; a KDE, inclosos vosaltres.&lt;/p&gt; Visiteu &lt;a href=https://www.kde.org/ca/&gt;https://www.kde.org/ca/&lt;/a&gt; per a obtenir més informació sobre la comunitat KDE i el programari que produïm.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Informeu dels errors o desitjos&lt;/h1&gt; &lt;p&gt;El programari sempre es pot millorar, i l\'equip del KDE està a punt per a fer-ho. No obstant això, l\'usuari, ha de dir-nos quan alguna cosa no funciona com s\'esperava o si podria fer-se millor.&lt;/p&gt; &lt;p&gt;El KDE té un sistema de seguiment d\'errors. Per a informar-ne d\'un, visiteu &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; o useu el botó «Informeu d\'un error» des de la pantalla Quant al.&lt;/p&gt; Si teniu un suggeriment de millora, podeu usar el sistema de seguiment d\'errors per a enregistrar el vostre desig. Assegureu-vos d\'usar la severitat anomenada «Llista de desitjos» (Wishlist).</string>
<string name="about_kde_join_kde">&lt;h1&gt;Uniu-vos al KDE&lt;/h1&gt; &lt;p&gt;No cal ser un desenvolupador de programari per a ser membre de l\'equip KDE. Podeu unir-vos als equips d\'idiomes que tradueixen la interfície dels programes. Podeu proporcionar gràfics, temes, sons i documentació millorada. Vosaltres decidiu!&lt;/p&gt; &lt;p&gt;Visiteu &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; per a obtenir informació sobre alguns projectes en què podeu participar-hi.&lt;/p&gt; Si us cal més informació o documentació, una visita a &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; us proporcionarà el que necessiteu.</string>
<string name="about_kde_support_kde">&lt;h1&gt;Contribució al KDE&lt;/h1&gt; &lt;p&gt;El programari KDE està i sempre estarà disponible de forma gratuïta, però la creació no està lliure de càrrecs.&lt;/p&gt; &lt;p&gt;Per a donar suport al desenvolupament, la comunitat KDE ha format la KDE e.V., una organització sense ànim de lucre legalment fundada a Alemanya. La KDE e.V. representa a la comunitat KDE en els assumptes legals i financers. Per a obtenir informació sobre la KDE e.V., vegeu &lt;a href=https://ev.kde.org/&gt;https://ev.kde.org/&lt;/a&gt;.El KDE es beneficia de molts tipus de contribucions, inclosa la financera. Usem els fons per a reemborsar als membres i altra gent per les despeses que incorren col·laborant-hi. S\'usen més fons per al suport legal i l\'organització de les conferències i reunions.&lt;/p&gt; &lt;p&gt;Us animem a ajudar al KDE mitjançant donacions monetàries, usant un dels mitjans descrits a &lt;a href=https://kde.org/ca/community/donations/&gt;https://kde.org/ca/community/donations/&lt;/a&gt;.&lt;/p&gt;. Moltes gràcies per endavant per la vostra ajuda.</string>
<string name="about_kde_support_kde">&lt;h1&gt;Contribució al KDE&lt;/h1&gt; &lt;p&gt;El programari KDE està i sempre estarà disponible de forma gratuïta, però la creació no està lliure de càrrecs.&lt;/p&gt; &lt;p&gt;Per a donar suport al desenvolupament, la comunitat KDE ha format la KDE e.V., una organització sense ànim de lucre legalment fundada a Alemanya. La KDE e.V. representa a la comunitat KDE en els assumptes legals i financers. Per a obtenir informació sobre la KDE e.V., vegeu &lt;a href=https://ev.kde.org/&gt;https://ev.kde.org/&lt;/a&gt;.El KDE es beneficia de molts tipus de contribucions, inclosa la financera. Usem els fons per a reemborsar als membres i altra gent per les despeses que incorren col·laborant-hi. S\'usen més fons per al suport legal i l\'organització de les conferències i reunions.&lt;/p&gt; &lt;p&gt;Us animem a ajudar al KDE mitjançant donacions monetàries, usant un dels mitjans descrits a &lt;a href=https://kde.org/ca/community/donations/&gt;https://kde.org/ca/community/donations/&lt;/a&gt;.&lt;/p&gt; Moltes gràcies per endavant per la vostra ajuda.</string>
<string name="maintainer_and_developer">Mantenidor i desenvolupador</string>
<string name="developer">Desenvolupador</string>
<string name="apple_support">Suport de macOS. Treballant en el suport d\'iOS</string>
@@ -403,12 +406,13 @@
<string name="maxim_leshchenko_task">Millores en la IU i ha creat aquesta pàgina</string>
<string name="holger_kaelberer_task">Connector de teclat remot i esmenes d\'errors</string>
<string name="saikrishna_arcot_task">Suport per a usar el teclat en el connector d\'entrada remota, esmenes d\'errors i millores generals</string>
<string name="shellwen_chen_task">Millorar la seguretat d\'SFTP, millorar la mantenibilitat d\'aquest projecte, esmenes d\'errors i millores generals</string>
<string name="shellwen_chen_task">Millorar la seguretat d\'SFTP, millorar les tasques de manteniment d\'aquest projecte, esmenes d\'errors i millores generals</string>
<string name="everyone_else">Tothom qui ha contribuït al KDE Connect al llarg dels anys</string>
<string name="send_clipboard">Envia el porta-retalls</string>
<string name="tap_to_execute">Toqueu per a executar</string>
<string name="plugin_stats">Estadístiques del connector</string>
<string name="enable_udp_broadcast">Activa el descobriment UDP de dispositius</string>
<string name="enable_bluetooth">Activa el Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Cal permetre que les notificacions es rebin des d\'altres dispositius</string>
<string name="findmyphone_notifications_explanation">Cal el permís de notificacions perquè el telèfon pugui sonar quan l\'aplicació estigui en segon pla</string>
<string name="no_notifications">Les notificacions estan desactivades, no rebreu notificacions entrants d\'emparellament.</string>

View File

@@ -401,6 +401,8 @@
<string name="clear_compose">Vyprázdnit</string>
<string name="send_compose">Odeslat</string>
<string name="open_compose_send">Napsat text</string>
<string name="double_tap_to_drag">Přetáhnout dvojitým ťuknutím</string>
<string name="hold_to_drag">Přetáhnout podržením</string>
<string name="about_kde_about">&lt;h1&gt;O KDE&lt;/h1&gt; &lt;p&gt;KDE je celosvětová komunita softwarových inženýrů, výtvarníků, překladatelů a jiných přispěvatelů, kteří se odevzdali vývoji &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Svobodného Softwaru&lt;/a&gt;. KDE vytvořilo pracovní prostředí Plasma, stovky aplikací a spousty knihoven, jenž je podporují. &lt;/p&gt; &lt;p&gt;KDE je společné úsilí, kde žádná společnost neřídí jeho směr nebo produkty. Namísto toho spolupracujeme na společném cíli jímž je vytvoření nejlepšího Free Softwaru. Každý je vítán aby &lt;a href=https://community.kde.org/Get_Involved&gt;se zapojil a přispíval&lt;/a&gt; do KDE, včetně vás. Více informací o komunitě KDE a softwaru, na kterém pracujeme najdete na &lt;/a&gt;$3&lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt;.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Hlaste chyby a návrhy&lt;/h1&gt; &lt;p&gt;Software je možno neustále vylepšovat a tým KDE je k tomu připraven. Avšak vy, uživatel, nám musíte sdělit, když něco nefunguje tak, jak by se očekávalo nebo by mělo být uděláno lépe.&lt;/p&gt; &lt;p&gt;KDE má systém sledování chyb. Chcete-li tedy nahlásit chybu, navštivte &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; nebo použijte dialog \"Nahlásit chybu...\".&lt;/p&gt; Máte-li náměty na vylepšení, budeme rádi, pošlete-li nám svoje přání. Ujistěte se však, že jste označili chybové hlášení jako \"Přání\".</string>
<string name="about_kde_join_kde">&lt;h1&gt;Přidejte se ke KDE&lt;/h1&gt; &lt;p&gt;K tomu, abyste se stali členem týmu KDE, není zapotřebí být vývojářem softwaru. Můžete se připojit k překladatelským týmům, které překládají programy. Můžete vytvářet grafiku, motivy, zvuky a lepší dokumentaci. Vy se rozhodněte!&lt;/p&gt; &lt;p&gt;Navštivte &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; kde naleznete informace o některých projektech, kterých se můžete zúčastnit.&lt;/p&gt; Potřebujete-li více informací nebo dokumentace, pak návštěva na &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; vám poskytne, co potřebujete.&lt;/p&gt;České stránky o KDE se nacházejí na adrese &lt;a href=\"http://czechia.kde.org/\"&gt;http://czechia.kde.org/&lt;/a&gt; . Přidejte se k nám!</string>
@@ -421,6 +423,7 @@
<string name="tap_to_execute">Pro spuštění ťukněte sem</string>
<string name="plugin_stats">Statistiky modulů</string>
<string name="enable_udp_broadcast">Povolit prohledávání sítě UDP</string>
<string name="enable_bluetooth">Povolit Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Je potřeba povolit oznámení aby e šlo přijímat z ostatních zařízení</string>
<string name="findmyphone_notifications_explanation">Oprávnění k upozorněním je potřeba aby telefon mohl zvonit když je aplikace na pozadí</string>
<string name="no_notifications">Upozornění jsou zakázána. Neuvidíte upozornění na párování.</string>

View File

@@ -18,6 +18,7 @@
<string name="pref_plugin_clipboard_sent">Zwischenablage versendet</string>
<string name="pref_plugin_mousepad">Ferneingabe</string>
<string name="pref_plugin_mousepad_desc">Das Gerät als Touchpad und/oder Tastatur verwenden</string>
<string name="pref_plugin_presenter">Präsentationsfernbedienung</string>
<string name="pref_plugin_presenter_desc">Das Gerät zum Wechseln der Folien einer Präsentation verwenden</string>
<string name="pref_plugin_remotekeyboard">Empfänger für Tastatureingaben</string>
<string name="pref_plugin_remotekeyboard_desc">Tastatureingaben entfernter Geräte empfangen</string>
@@ -51,6 +52,7 @@
<string name="remotekeyboard_multiple_connections">Es besteht mehr als eine Verbindungen zu einer entfernten Tastatur. Um Ihre Konfiguration anzupassen, wählen Sie bitte ein Gerät aus</string>
<string name="open_mousepad">Ferneingabe</string>
<string name="mousepad_info">Bewegen Sie Ihren Finger über den Bildschirm um den Mauszeiger zu bewegen. Tippen Sie auf den Bildschirm, um einen Klick zu simulieren und benutzen Sie entsprechend zwei/drei Finger für einen Rechts-/Mittelklick. Verwenden Sie zwei Finger, um zu Scrollen und einen langen Druck um Objekte zu verschieben. Gyroskop-Maus-Funktionen können Sie in den Modul-Einstellungen aktivieren.</string>
<string name="mousepad_info_no_gestures">Bewegen Sie den Finger auf dem Bildschirm, um den Mauszeiger zu bewegen. Tippen Sie, um zu klicken.</string>
<string name="mousepad_keyboard_input_not_supported">Das verbundene Gerät unterstützt keine Tastatureingaben</string>
<string name="mousepad_single_tap_settings_title">Aktionsausführung bei Berührung mit einem Finger einstellen</string>
<string name="mousepad_double_tap_settings_title">Aktionsausführung bei Berührung mit zwei Fingern einstellen</string>
@@ -59,6 +61,7 @@
<string name="mousepad_mouse_buttons_title">Maustasten anzeigen</string>
<string name="mousepad_acceleration_profile_settings_title">Zeigerbeschleunigung einstellen</string>
<string name="mousepad_scroll_direction_title">Bildlaufrichtung umkehren</string>
<string name="mousepad_scroll_sensitivity_title">Bildlaufgeschwindigkeit</string>
<string name="gyro_mouse_enabled_title">Gyroskop-Maus aktivieren</string>
<string name="gyro_mouse_sensitivity_title">Empfindlichkeit des Gyroskops einstellen</string>
<string-array name="mousepad_tap_entries">
@@ -77,9 +80,9 @@
<string-array name="mousepad_acceleration_profile_entries">
<item>Keine Beschleunigung</item>
<item>Schwächste</item>
<item>Schwach</item>
<item>Schwächer</item>
<item>Normal</item>
<item>Stark</item>
<item>Stärker</item>
<item>Stärkste</item>
</string-array>
<string name="sendkeystrokes_send_to">Tastendruck senden an</string>
@@ -115,6 +118,8 @@
<string name="my_device_fingerprint">Der SHA256-Fingerabdruck Ihres Gerätezertifikats lautet:</string>
<string name="remote_device_fingerprint">Der SHA256-Fingerabdruck des Gerätezertifikats der Gegenstelle lautet:</string>
<string name="pair_requested">Verbindung angefordert</string>
<string name="pair_succeeded">Kopplung erfolgreich</string>
<string name="pairing_request_from">Kopplungsanfrage von „%1s“</string>
<plurals name="incoming_file_title">
<item quantity="one">%1$d Datei von %2$s wird empfangen</item>
<item quantity="other">%1$d Dateien von %2$s werden empfangen</item>
@@ -151,6 +156,7 @@
<string name="received_file_text">Tippen um „%1s“ zu öffnen</string>
<string name="cannot_create_file">Die Datei %s kann nicht erstellt werden</string>
<string name="tap_to_answer">Zum Antworten tippen</string>
<string name="left_click">Linksklick senden</string>
<string name="right_click">Rechtsklick senden</string>
<string name="middle_click">Mittelklick senden</string>
<string name="show_keyboard">Tastatur anzeigen</string>
@@ -177,8 +183,12 @@
<item>1 Minute</item>
<item>2 Minuten</item>
</string-array>
<string name="mpris_notifications_explanation">Benachrichtigungen müssen erlaubt sein, um entfernte Medien im Benachrichtigungsfenster zu zeigen.</string>
<string name="mpris_notification_settings_title">Benachrichtigung zur Medienkontrolle anzeigen</string>
<string name="mpris_notification_settings_summary">Die Steuerung der Medienwiedergabe auch dann erlauben wenn KDE Connect nicht geöffnet ist</string>
<string name="share_to">Freigeben für ...</string>
<string name="unreachable_device">%s (nicht erreichbar)</string>
<string name="unreachable_device_url_share_text">URLs, die mit einem nicht erreichbaren Gerät geteilt werden, werden zugestellt sobald es erreichbar wird.\n\n</string>
<string name="protocol_version_newer">Dieses Gerät verwendet eine neuere Protokollversion</string>
<string name="plugin_settings_with_name">%s-Einstellungen</string>
<string name="invalid_device_name">Ungültiger Gerätename</string>
@@ -214,6 +224,7 @@
<string name="sftp_action_mode_menu_delete">Löschen</string>
<string name="sftp_no_storage_locations_configured">Keine Speicherorte ausgewählt</string>
<string name="sftp_saf_permission_explanation">Um von außerhalb auf Ihre Dateien zugreifen zu können, muss mindestens ein Speicherort vorhanden sein</string>
<string name="sftp_manage_storage_permission_explanation">Um den Fernzugriff auf Dateien auf diesem Gerät zu erlauben, müssen Sie KDE Connect erlauben den Speicher zu verwalten.</string>
<string name="no_players_connected">Keine Medienspieler gefunden</string>
<string name="send_files">Dateien senden</string>
<string name="block_notification_contents">Benachrichtigungsinhalte blockieren</string>
@@ -243,10 +254,13 @@
<string name="all_permissions_granted">Alle Berechtigungen erteilt 🎉</string>
<string name="optional_permission_explanation">Es müssen weitere Berechtigungen erteilt werden, um alle Funktionen nutzen zu können</string>
<string name="plugins_need_optional_permission">Einige Module haben eingeschränkte Funktionen wegen fehlender Berechtigungen, tippen Sie für weitere Informationen:</string>
<string name="share_optional_permission_explanation">Um Dateien zu empfangen, müssen Sie Speicherzugriff erlauben</string>
<string name="share_notifications_explanation">Um den Fortschritt beim Senden oder Emfangen von Dateien zu sehen, müssen Sie Benachrichtigungen erlauben.</string>
<string name="telepathy_permission_explanation">Um SMS vom Rechner aus zu lesen und zu versenden, muss der Zugriff auf die SMS-Funktion gewährt werden</string>
<string name="telephony_permission_explanation">Um eingehende Anrufe auf der Arbeitsfläche anzuzeigen, muss der Zugriff auf die Anrufliste und den Telefonstatus gewährt werden</string>
<string name="telephony_optional_permission_explanation">Um einen Namen anstelle der Telefonnummer anzuzeigen, muss der Zugriff auf das Adressbuch gewährt werden</string>
<string name="contacts_permission_explanation">Um Ihre Kontakte mit der Arbeitsfläche zu teilen, muss der Zugriff auf die Kontakte gewährt werden</string>
<string name="contacts_per_device_confirmation">Ihre Telefonkontakte werden auf dieses Gerät übertragen, damit sie von der KDE Connect SMS App und anderen Apps verwendet werden können.</string>
<string name="select_ringtone">Einen Klingelton auswählen</string>
<string name="telephony_pref_blocked_title">Unterdrückte Nummern</string>
<string name="telephony_pref_blocked_dialog_desc">Keine Anrufe und SMS von diesen Telefonnummern anzeigen (Bitte geben Sie eine Nummer pro Zeile ein)</string>
@@ -264,6 +278,9 @@
<string name="notification_channel_default">Andere Benachrichtigungen</string>
<string name="notification_channel_persistent">Dauerhafte Benachrichtigung</string>
<string name="notification_channel_media_control">Medienkontrolle</string>
<string name="notification_channel_filetransfer">eingehende Dateiübertragung</string>
<string name="notification_channel_filetransfer_upload">ausgehende Dateiübertragung</string>
<string name="notification_channel_filetransfer_error">Datenübertragungsfehler</string>
<string name="notification_channel_high_priority">Hohe Priorität</string>
<string name="mpris_stop">Die aktuelle Medienwiedergabe beenden</string>
<string name="copy_url_to_clipboard">Adresse in die Zwischenablage kopieren</string>
@@ -272,6 +289,7 @@
<string name="runcommand_notpaired">Das Gerät ist nicht verbunden</string>
<string name="runcommand_nosuchdevice">Ein solches Gerät existiert nicht</string>
<string name="runcommand_noruncommandplugin">Dieses Gerät hat das Modul zum Ausführen von Befehlen nicht aktiviert</string>
<string name="runcommand_name_as_title_title">Den Namen als Titel anzeigen</string>
<string name="pref_plugin_findremotedevice">Entferntes Gerät finden</string>
<string name="pref_plugin_findremotedevice_desc">Entferntes Gerät anklingeln</string>
<string name="ring">Klingeln</string>
@@ -302,6 +320,7 @@
<string name="empty_trusted_networks_list_text">Sie haben bisher noch kein vertrauenswürdiges Netzwerk hinzugefügt</string>
<string name="allow_all_networks_text">Alle erlauben</string>
<string name="location_permission_needed_title">Berechtigung erforderlich</string>
<string name="location_permission_needed_desc">KDE connect benötigt die Berechtigung für die Verwendung des Standorts im Hintergrund, um festzustellen, mit welchem WLAN-Netzwerk Sie verbunden sind, auch wenn die App im Hintergrund ist. Dies ist notwendig, da die Name der WLAN-Netzwerke verwendet werden können, um Ihren Standort zu bestimmen, auch wenn KDE Connect dies nicht tut.</string>
<string name="clipboard_android_x_incompat">In Android 10 wurde der Zugriff auf die Zwischenablage für alle Apps entfernt. Diese Modul wird deaktiviert.</string>
<string name="mpris_open_url">Wiedergabe hier fortsetzen</string>
<string name="cant_open_url">Die URL zum Fortsetzen der Wiedergabe kann nicht geöffnet werden</string>
@@ -312,6 +331,8 @@
<string name="bigscreen_right">Rechts</string>
<string name="bigscreen_down">Unten</string>
<string name="bigscreen_mic">Mikrofon</string>
<string name="pref_plugin_bigscreen">Fernbedienung für Großbildschirm</string>
<string name="pref_plugin_bigscreen_desc">Verwenden Sie ihr Gerät als Fernbedienung für einen Plasma-Großbildschirm</string>
<string name="bigscreen_optional_permission_explanation">Um den Mikrofoneingang des Mobiltelefons freizugeben, müssen Sie den Zugriff auf den Audioeingang des Mobiltelefons erlauben</string>
<string name="bigscreen_speech_extra_prompt">Sprache</string>
<string name="message_reply_label">Antworten</string>
@@ -347,6 +368,7 @@
<string name="about">Über</string>
<string name="authors">Autoren</string>
<string name="thanks_to">Dank an</string>
<string name="easter_egg">Osterei</string>
<string name="email_contributor">E-Mail an den Mitwirkenden senden\n%s</string>
<string name="visit_contributors_homepage">Internetseite des Mitwirkenden besuchen\n%s</string>
<string name="version">Version %s</string>
@@ -357,11 +379,23 @@
<string name="clear_compose">Leeren</string>
<string name="send_compose">Senden</string>
<string name="open_compose_send">Text schreiben</string>
<string name="double_tap_to_drag">Doppelklicken um zu ziehen</string>
<string name="hold_to_drag">Halten um zu ziehen</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Fehler und Wünsche melden&lt;/h1&gt; &lt;p&gt;Software kann immer verbessert werden und das KDE-Team ist immer bereit das zu tun. Jedoch müssen Sie - der Benutzer - uns sagen, wenn etwas nicht wie erwartet funktioniert oder verbessert werden könnte.&lt;/p&gt; &lt;p&gt;KDE hat ein Bug-Tracking-System. Besuchen Sie &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; oder verwenden Sie den Knopf „Probleme und Wünsche berichten“ auf dem Über-Bildschirm, um Bugs zu melden.&lt;/p&gt; Wenn Sie Vorschläge für Verbesserungen haben, können Sie gerne das Bug-Tracking-System nutzen, um Ihren Wunsch zu melden. Verwenden Sie hierzu den Schweregrad „Wunschliste“.</string>
<string name="maintainer_and_developer">Betreuer und Entwickler</string>
<string name="developer">Entwickler</string>
<string name="apple_support">macOS-Unterstützung. Arbeit an der macOS-Unterstützung</string>
<string name="bug_fixes_and_general_improvements">Fehlerbereinigung und allgemeine Verbesserungen</string>
<string name="aniket_kumar_task">Verbesserungen am SMS-Modul</string>
<string name="alex_fiestas_task">Verbesserungen am Kontakte-Modul</string>
<string name="maxim_leshchenko_task">UI-Verbesserungen und diese Infoseite</string>
<string name="everyone_else">Jeder, der über die Jahre noch zu KDE Connect beigetragen hat</string>
<string name="send_clipboard">Zwischenablage senden</string>
<string name="tap_to_execute">Tippen um auszuführen</string>
<string name="enable_udp_broadcast">UDP-Geräteerkennung einschalten</string>
<string name="findmyphone_notifications_explanation">Benachrichtigungen müssen erlaubt sein, damit das Telefon klingeln kann, wenn die App im Hintergrund ist</string>
<string name="no_notifications">Benachrichtigungen sind abgeschaltet, Sie erhalten keine Benachrichtigungen für eingehende Verbindungen.</string>
<string name="mpris_keepwatching">Wiedergabe fortsetzen</string>
<string name="mpris_keepwatching_settings_title">Wiedergabe fortsetzen</string>
<string name="notification_channel_keepwatching">Wiedergabe fortsetzen</string>
</resources>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">You have not added any trusted network yet</string>
<string name="allow_all_networks_text">Allow all</string>
<string name="location_permission_needed_title">Permission required</string>
<string name="bluetooth_permission_needed_desc">KDE Connect needs permission to connect to nearby devices to make devices paired using Bluetooth available in KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect needs the background location permission to know the WiFi network you are connected to even when the app is in the background. This is because the name of the WiFi networks around you could be used to find your location, even when this is not what KDE Connect does.</string>
<string name="clipboard_android_x_incompat">Android 10 has removed clipboard access to all apps. This plugin will be disabled.</string>
<string name="mpris_open_url">Continue playing here</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Send</string>
<string name="compose_send_title">Compose send</string>
<string name="open_compose_send">Compose text</string>
<string name="double_tap_to_drag">Double tap to drag</string>
<string name="hold_to_drag">Hold to drag</string>
<string name="about_kde_about">&lt;h1&gt;About&lt;/h1&gt; &lt;p&gt;KDE is a world-wide community of software engineers, artists, writers, translators and creators who are committed to &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Free Software&lt;/a&gt; development. KDE produces the Plasma desktop environment, hundreds of applications, and the many software libraries that support them.&lt;/p&gt; &lt;p&gt;KDE is a cooperative enterprise: no single entity controls its direction or products. Instead, we work together to achieve the common goal of building the world\'s finest Free Software. Everyone is welcome to &lt;a href=https://community.kde.org/Get_Involved&gt;join and contribute&lt;/a&gt; to KDE, including you.&lt;/p&gt; Visit &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; for more information about the KDE community and the software we produce.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Report Bugs or Wishes&lt;/h1&gt; &lt;p&gt;Software can always be improved, and the KDE team is ready to do so. However, you - the user - must tell us when something does not work as expected or could be done better.&lt;/p&gt; &lt;p&gt;KDE has a bug tracking system. Visit &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; or use the \"Report Bug\" button from the about screen to report bugs.&lt;/p&gt; If you have a suggestion for improvement then you are welcome to use the bug tracking system to register your wish. Make sure you use the severity called \"Wishlist\".</string>
<string name="about_kde_join_kde">&lt;h1&gt;Join KDE&lt;/h1&gt; &lt;p&gt;You do not have to be a software developer to be a member of the KDE team. You can join the language teams that translate program interfaces. You can provide graphics, themes, sounds, and improved documentation. You decide!&lt;/p&gt; &lt;p&gt;Visit &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; for information on some projects in which you can participate.&lt;/p&gt; If you need more information or documentation, then a visit to &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; will provide you with what you need.</string>
@@ -409,6 +412,7 @@
<string name="tap_to_execute">Tap to execute</string>
<string name="plugin_stats">Plugin stats</string>
<string name="enable_udp_broadcast">Enable UDP device discovery</string>
<string name="enable_bluetooth">Enable bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Notifications need to be allowed to receive them from other devices</string>
<string name="findmyphone_notifications_explanation">The notifications permission is needed so the phone can ring when the app is in the background</string>
<string name="no_notifications">Notifications are disabled, you won\'t receive incoming pair notifications.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">No ha añadido ninguna red confiable de momento</string>
<string name="allow_all_networks_text">Permitir todas</string>
<string name="location_permission_needed_title">Permisos requeridos</string>
<string name="bluetooth_permission_needed_desc">KDE Connect necesitas permisos para conectar a dispositivos cercanos para mostrar como disponibles en KDE Connect dispositivos vinculados por Bluetooth.</string>
<string name="location_permission_needed_desc">KDE Connect requiere permisos de localización para saber a que red está conectado incluso cuando la aplicación está en segundo plano. Esto es así porque el nombre de las redes WiFi a su alrededor se pueden usar para encontrar su localización, aunque no es esto lo que KDE Connect hace.</string>
<string name="clipboard_android_x_incompat">Android 10 ha eliminado el acceso al portapapeles para todas las aplicaciones. Este complemento se desactivará.</string>
<string name="mpris_open_url">Continuar reproduciendo aquí</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Enviar</string>
<string name="compose_send_title">Componer envío</string>
<string name="open_compose_send">Componer texto</string>
<string name="double_tap_to_drag">Doble pulsación para arrastrar</string>
<string name="hold_to_drag">Mantener para arrastrar</string>
<string name="about_kde_about">&lt;h1&gt;Acerca de&lt;/h1&gt; &lt;p&gt;KDE es una comunidad global de ingenieros software, artistas, escritores, traductores y creadores que siguen el desarrollo de &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Software Libre&lt;/a&gt;. KDE produce el entorno de escritorio Plasma, cientos de aplicaciones y todas las librerías en las que se basan.&lt;/p&gt; &lt;p&gt;KDE es una empresa colaborativa: no hay una entidad única que controla sus productos o su dirección. En su lugar, trabajamos de manera conjunta para conseguir la meta común de construir el mejor software libre posible. Todo el mundo es bienvenido a &lt;a href=https://community.kde.org/Get_Involved&gt;unirse y contribuir&lt;/a&gt; a KDE, incluido usted.&lt;/p&gt; Visite &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; para más información sobre la comunidad KDE y el software que creamos.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Reporte errores o deseos&lt;/h1&gt; &lt;p&gt;El software siempre puede ser mejorado y el equipo de KDE está preparado para ello. Sin embargo, usted - el usuario - debe comunicarnos cuando algo no funciona como es esperado o que puede ser mejorado. &lt;/p&gt; &lt;p&gt; KDE tiene un sistema de traqueo de errores. Visite &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; o use el botón «Informar de fallo» en la ventana «Acerca de» para reportar errores.&lt;/p&gt; Si tiene una sugerencia de mejora entonces use el sistema de traqueo de errores para registrar su sugerencia. Asegúrese de que usa la severidad «Lista de deseos».</string>
<string name="about_kde_join_kde">&lt;h1&gt;Unirse a KDE&lt;/h1&gt; &lt;p&gt;No tiene por que ser un desarrollador de software para ser miembro del equipo KDE. Se puede unir a los equipos de traducción que traducen las interfaces de los programas. Puede proporcionar gráficos, temas, sonidos y mejorar la documentación. ¡Tú decides!&lt;/p&gt; &lt;p&gt;Visite &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; para más información sobre los proyectos en los que puede participar.&lt;/p&gt; Si necesita más información o documentación, entonces una visita a &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; le proporcionará la información que necesite.</string>
@@ -409,6 +412,7 @@
<string name="tap_to_execute">Pulse para ejecutar</string>
<string name="plugin_stats">Estadísticas del complemento</string>
<string name="enable_udp_broadcast">Activar descubrimiento de dispositivos por UDP</string>
<string name="enable_bluetooth">Activar Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Las notificaciones tienen que estar activadas para recibirlas desde otros dispositivos</string>
<string name="findmyphone_notifications_explanation">Se necesita el permiso de notificaciones para que el teléfono pueda sonar cuando la aplicación está en segundo plano</string>
<string name="no_notifications">Las notificaciones están desactivadas, no recibirá notificaciones de vinculación entrantes.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Oraindik ez duzu gehitu konfiantza duen sarerik</string>
<string name="allow_all_networks_text">Baimendu guztiak</string>
<string name="location_permission_needed_title">Baimena beharrezkoa da</string>
<string name="bluetooth_permission_needed_desc">KDE Connect-ek hurbileko gailuetara konektatzeko baimena behar du, Bluetooth bidez parekatutako gailuak KDE Connect-en erabilgarri ipintzeko.</string>
<string name="location_permission_needed_desc">KDE Connect-ek konektatuta zauden Wi-Fi sarea zein den jakiteko atzeko planoko kokapen baimena behar du, baita aplikazioa atzeko planoan dagoenean ere. Hori horrela da, zure inguruko Wi-Fi sareen izenak zure kokalekua aurkitzeko erabil daitezkeelako, nahiz eta hori ez izan KDE Connect-ek egiten duena.</string>
<string name="clipboard_android_x_incompat">Android 10ek arbela atzitzeko aukera kendu die aplikazio guztiei. Plugin hau desgaitu egingo da.</string>
<string name="mpris_open_url">Jarraitu hemen jotzen</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Bidali</string>
<string name="compose_send_title">Bidalketa osatu</string>
<string name="open_compose_send">Konposatu testua</string>
<string name="double_tap_to_drag">Tak bikoitza arrastatzeko</string>
<string name="hold_to_drag">Eutsi arrastatzeko</string>
<string name="about_kde_about">"&lt;h1&gt;Honi buruz&lt;/h1&gt; &lt;p&gt;KDE &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Software Askearen&lt;/a&gt; garapenarekin engaiatutako mundu osoko software ingeniari, artista, idazle, itzultzaile eta sortzaile elkarte bat da. KDEk Plasma mahaigain ingurunea, ehunka aplikazio, eta haiei euskarria ematen dieten liburutegi ugariak ekoizten ditu. &lt;/p&gt; &lt;p&gt;KDE ekimen kooperatibo bat da: ez dago bere norabidea eta produktuak kontrolatzen dituen erakunderik. Aldiz, elkarrekin lan egiten dugu guztiok partekatzen dugun helburu bera lortzeko, munduko Software Aske bikainena eraikitzearena alegia. Jende oro ongi etorria da KDErekin &lt;a href=https://community.kde.org/Get_Involved&gt;elkartu eta laguntza ematera&lt;/a&gt;, zu barne. &lt;/p&gt; Bisitatu &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; , KDE elkartearen eta ekoizten dugun softwarearen gaineko informazio zabalagoa eskuratzeko."</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Akatsen edo nahien berri ematea&lt;/h1&gt; &lt;p&gt;Softwarea beti hobetu daiteke, eta KDE taldea horretarako prest dago. Hala ere, zuk - erabiltzailea zaren horrek - zerbait behar bezala ez dabilenean edo hobeto egin daitekeenean esan egin behar diguzu.&lt;/p&gt; &lt;p&gt;KDEk programa-akatsen gaineko jarraipena egiteko sistema bat du. Bisitatu &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; edo erabili Honi buruz pantailako «Akatsa jakinarazi» botoia.&lt;/p&gt; Hobetzeko iradokizunik baduzu, akatsen jarraipen sisteman zure nahia erregistratzera gonbidatzen zaitugu. Larritasun maila bezala \"Wishlist\" (nahien zerrenda) erabil ezazu horretarako.</string>
<string name="about_kde_join_kde">"&lt;h1&gt;Zatoz KDEra&lt;/h1&gt; &lt;p&gt;Ez duzu software garatzailea izan behar KDEren taldeko kide izateko. Programen interfazeak itzultzen dituzten hizkuntzen taldeetara batu zaitezke. Grafikoak, gaiak, soinuak, eta dokumentazio hobetua eskain ditzakezu. Zeuk erabaki!&lt;/p&gt; &lt;p&gt;Bisitatu &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; parte hartu dezakezun proiektuen informazioa eskuratzeko.&lt;/p&gt; Informazio edo dokumentazio gehiago behar baduzu, &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; bisitatuz behar duzuna eskuratuko duzu."</string>
@@ -409,6 +412,7 @@
<string name="tap_to_execute">Tak egin exekutatzeko</string>
<string name="plugin_stats">Pluginaren estatistikak</string>
<string name="enable_udp_broadcast">Gaitu UDP bidez gailua aurkitzea</string>
<string name="enable_bluetooth">Gaitu bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Jakinarazpenak baimendu behar dira beste gailuetatik haiek jasotzeko</string>
<string name="findmyphone_notifications_explanation">Aplikazioa atzeko planoan dagoenean telefonoak jo dezan jakinarazpen-baimena behar da</string>
<string name="no_notifications">Jakinarazpenak ezgaituta daude, ez duzu jasoko parekatzeko sarrerako jakinarazpenik.</string>

View File

@@ -122,6 +122,7 @@
<string name="remote_device_fingerprint">Etälaitteen varmenteen SHA256-sormenjälki on:</string>
<string name="pair_requested">Paripyyntö</string>
<string name="pair_succeeded">Paritus onnistui</string>
<string name="pairing_request_from">Parituspyyntö laitteesta ”%1s”</string>
<plurals name="incoming_file_title">
<item quantity="one">Vastaanotetaan %1$d tiedosto lähettäjältä %2$s</item>
<item quantity="other">Vastaanotetaan %1$d tiedostoa lähettäjältä %2$s</item>
@@ -188,6 +189,9 @@
<string name="mpris_notifications_explanation">Ilmoituskäyttöoikeus vaaditaan etämedian näyttämiseksi ilmoitussovelmassa</string>
<string name="mpris_notification_settings_title">Näytä mediasäädinilmoitukset</string>
<string name="mpris_notification_settings_summary">Sallii mediasoitintesi hallinnan KDE Connectia avaamatta</string>
<string name="share_to">Jaa…</string>
<string name="unreachable_device">%s (tavoittamattomissa)</string>
<string name="unreachable_device_url_share_text">Tavoittamattomissa olevalle laitteelle jaetut verkko-osoitteet välitetään heti kun laite tavoitetaan.\n\n</string>
<string name="protocol_version_newer">Laite käyttää uudempaa yhteyskäytäntöversiota</string>
<string name="plugin_settings_with_name">%s-asetukset</string>
<string name="invalid_device_name">Virheellinen laitenimi</string>
@@ -322,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Luotettuja verkkoja ei ole vielä lisätty</string>
<string name="allow_all_networks_text">Salli kaikki</string>
<string name="location_permission_needed_title">Käyttöoikeus vaaditaan</string>
<string name="bluetooth_permission_needed_desc">KDE Connect vaatii oikeuden yhdistää lähellä oleviin laitteisiin, jotta voisi kytkeä niitä Bluetoothilla pariksi.</string>
<string name="location_permission_needed_desc">KDE Connect tarvitsee taustasijaintioikeudet tietääkseen myös sovelluksen olleessa taustalla, mihin langattomaan verkkoon on kirjauduttu. Ympärilläsi olevien langattomien verkkojen nimiä voi käyttää sijaintisi selvittämiseen, vaikka KDE Connect ei tietoa siihen käytäkään.</string>
<string name="clipboard_android_x_incompat">Android 10 on poistanut kaikkien sovellusten leikepöytäkäytön. Liitännäinen poistetaan käytöstä.</string>
<string name="mpris_open_url">Jatka toistoa tästä</string>
@@ -385,6 +390,8 @@
<string name="send_compose">Lähetä</string>
<string name="compose_send_title">Kirjoita teksti</string>
<string name="open_compose_send">Kirjoita teksti</string>
<string name="double_tap_to_drag">Vedä kaksoisnapauttamalla</string>
<string name="hold_to_drag">Vedä pitämällä pohjassa</string>
<string name="about_kde_about">&lt;h1&gt;Tietoa&lt;/h1&gt; &lt;p&gt;KDE on ohjelmoijien, taiteilijoiden, kirjoittajien, kääntäjien ja muiden sisällönluojien kansainvälinen yhteisö, joka on sitoutunut &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;vapaiden ohjelmien&lt;/a&gt; kehitykseen. KDE tuottaa Plasma-työpöytäympäristöä, satoja sovelluksia ja monia niitä tukevia ohjelmakirjastoja.&lt;/p&gt; &lt;p&gt;KDE pyrkii yhteistyöhön: mikään yksittäinen toimija ei hallitse sen suuntaa tai tuotteita, vaan teemme yhdessä työtä yhteisen päämäärän hyväksi: tuottaaksemme maailman hienointa vapaata ohjelmistoa. Kaikki ovat tervetulleita &lt;a href=https://community.kde.org/Get_Involved&gt;liittymään ja avustamaan&lt;/a&gt; KDE:ta myös sinä.&lt;/p&gt; Sivulta &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; löytyy KDE-yhteisöstä ja tuottamistamme ohjelmista lisätietoa.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Ilmoita ohjelmavirheistä tai -toiveista&lt;/h1&gt; &lt;p&gt;Ohjelmia voi aina parantaa, ja KDE-yhteisö on siihen valmis. Sinun käyttäjän on kuitenkin kerrottava meille, kun jokin ei toimi odotetusti tai voisi toimia paremmin.&lt;/p&gt; &lt;p&gt;KDE:lla on virheenseurantajärjestelmä. Käy sivulla &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; tai käytä Tietoa-sivun painiketta ”Ilmoita ohjelmavirheestä”.&lt;/p&gt; Parannusehdotuksissakin olet tervetullut käyttämään virheenseurantajärjestelmää kirjataksesi toiveesi. Varmista, että käytät vakavuustasoa ”Wishlist”.</string>
<string name="about_kde_join_kde">&lt;h1&gt;Liity KDE:hen&lt;/h1&gt; &lt;p&gt;KDE-työryhmän jäseneksi tullakseen ei tarvitse olla ohjelmoija. Ohjelmien käyttöliittymien kääntämiseksi voi liittyä johonkin kansalliseen ryhmään, tuottaa grafiikkaa, teemoja tai ääniä tai parantaa ohjeistusta. Sinä päätät!&lt;/p&gt; &lt;p&gt;Sivulta &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; löytyy tietoa projekteista, joihin osallistua.&lt;/p&gt; Kaikki tarvittava lisätieto ja ohjeet löytyvät sivulta &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt;.</string>
@@ -399,12 +406,18 @@
<string name="maxim_leshchenko_task">Käyttöliittymäparannukset ja tämä tietosivu</string>
<string name="holger_kaelberer_task">Etänäppäimistöliitännäinen ja virheenkorjaukset</string>
<string name="saikrishna_arcot_task">Tuki näppäimistön käytölle etäsyöteliitännäisessä, virheenkorjaukset ja yleisparannukset</string>
<string name="shellwen_chen_task">Parantaa SFTP:n tietoturvaa ja tämän projektin ylläpidettävyyttä, korjaa virheitä ja yleisesti parantaa asioita</string>
<string name="everyone_else">Kaikki muut vuosien varrella KDE Connectia avustaneet</string>
<string name="send_clipboard">Lähetä leikepöytä</string>
<string name="tap_to_execute">Suorita napauttamalla</string>
<string name="plugin_stats">Liitännäisen tilastot</string>
<string name="enable_udp_broadcast">Käytä UDP-laitehakua</string>
<string name="enable_bluetooth">Käytä Bluetoothia (beeta)</string>
<string name="receive_notifications_permission_explanation">Ilmoitukset tulee sallia, jotta niitä voi vastaanottaa muilta laitteilta</string>
<string name="findmyphone_notifications_explanation">Ilmoituskäyttöoikeus vaaditaan, jotta puhelin voisi soida sovelluksen toimiessa taustalla</string>
<string name="no_notifications">Ilmoitukset eivät ole käytössä, joten paritusilmoituksia ei vastaanoteta.</string>
<string name="mpris_keepwatching">Jatka toistoa</string>
<string name="mpris_keepwatching_settings_title">Jatka toistoa</string>
<string name="mpris_keepwatching_settings_summary">Näytä hiljainen ilmoitus toiston jatkamisesta laitteella median sulkeuduttua</string>
<string name="notification_channel_keepwatching">Jatka toistoa</string>
</resources>

View File

@@ -53,7 +53,7 @@
<string name="open_mousepad">Contrôle distant</string>
<string name="mousepad_info">Faites glisser votre doigt sur l\'écran pour déplacer le pointeur de la souris. Tapotez pour cliquer et utilisez deux / trois doigts pour les clics droit et centre. Utilisez 2 doigts pour faire un défilement. Faites un appui prolongé pour réaliser un glisser-déposer. La fonctionnalité de gyroscope de souris peut être activée à partir des préférences de module externe.</string>
<string name="mousepad_info_no_gestures">Faites glisser un doigt sur l\'écran pour déplacer le pointeur de souris. Tapotez sur l\'écran pour effectuer un clic.</string>
<string name="mousepad_keyboard_input_not_supported">La saisie par le clavier n\'est pas pris en charge par le périphérique appairée.</string>
<string name="mousepad_keyboard_input_not_supported">La saisie par le clavier n\'est pas pris en charge par le périphérique associé.</string>
<string name="mousepad_single_tap_settings_title">Définir une action pour tapotage avec un doigt</string>
<string name="mousepad_double_tap_settings_title">Action pour l\'appui à deux doigts</string>
<string name="mousepad_triple_tap_settings_title">Action pour l\'appui à trois doigts</string>
@@ -99,7 +99,7 @@
<string name="pref_plugin_mousepad_send_keystrokes">Envoyez comme appuis de touches</string>
<string name="mouse_receiver_plugin_description">Recevoir les mouvements de la souri distante</string>
<string name="mouse_receiver_plugin_name">Récepteur de souris</string>
<string name="mouse_receiver_no_permissions">Pour recevoir des entrées tactiles à distance, vous devez accorder des autorisations daccessibilité pour contrôler entièrement votre périphérique</string>
<string name="mouse_receiver_no_permissions">Pour recevoir des entrées tactiles à distance, vous devez accorder des autorisations d\'accessibilité pour contrôler entièrement votre périphérique</string>
<string name="view_status_title">État</string>
<string name="battery_status_format">Batterie : %d %%</string>
<string name="battery_status_low_format">Batterie : %d %% Batterie faible</string>
@@ -186,12 +186,12 @@
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
<string name="mpris_notifications_explanation">Les permissions pour les notifications sont nécessaires pour afficher des supports distants dans le panneau des notifications</string>
<string name="mpris_notifications_explanation">Les permissions pour les notifications sont nécessaires pour afficher des média distants dans le panneau des notifications.</string>
<string name="mpris_notification_settings_title">Afficher la notification de contrôle du lecteur multimédia</string>
<string name="mpris_notification_settings_summary">Vous permet de contrôler vos lecteurs multimédia sans ouvrir KDEConnect.</string>
<string name="share_to">Partager vers…</string>
<string name="unreachable_device">%s (Inaccessible)</string>
<string name="unreachable_device_url_share_text">Les URL partagées vers un appareil inaccessible lui seront transmises une fois quil re-deviendra accessible.\n\n</string>
<string name="unreachable_device_url_share_text">Les URL partagées vers un appareil inaccessible lui seront transmises une fois qu\'il re-deviendra accessible.\n\n</string>
<string name="protocol_version_newer">Le périphérique utilise une version plus récente du protocole</string>
<string name="plugin_settings_with_name">Configuration %s</string>
<string name="invalid_device_name">Nom de périphérique non valable</string>
@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Vous n\'avez pas encore ajouté de réseau de confiance</string>
<string name="allow_all_networks_text">Tout autoriser</string>
<string name="location_permission_needed_title">Permissions requises</string>
<string name="bluetooth_permission_needed_desc">KDEConnect a besoin d\'autorisations pour se connecter aux périphériques proches afin que les périphériques couplés à l\'aide de Bluetooth soient disponibles dans KDEConnect.</string>
<string name="location_permission_needed_desc">KDEConnect a besoin de la permission d\'accéder à la localisation en arrière-plan pour connaître le réseau Wifi sur lequel vous êtes connecté, même si l\'application est en arrière-plan. En effet, le nom des réseaux Wifi autour de vous pourrait être utilisé pour trouver votre emplacement, même si ce n\'est pas ce que KDEConnect fait.</string>
<string name="clipboard_android_x_incompat">Android 10 a supprimé l\'accès des applications au presse-papier. Ce module externe sera désactivé.</string>
<string name="mpris_open_url">Continuer la lecture ici</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Envoyer</string>
<string name="compose_send_title">Préparer l\'envoi</string>
<string name="open_compose_send">Composer du texte</string>
<string name="double_tap_to_drag">Tapotement double pour un glisser</string>
<string name="hold_to_drag">Maintenir pour faire glisser</string>
<string name="about_kde_about">&lt;h1&gt;A propos&lt;/h1&gt; &lt;p&gt;KDE est une communauté mondiale d\'ingénieurs en logiciel, d\'artistes d\'ingénieurs logiciels, d\'artistes, d\'écrivains, de traducteurs et de créateurs s\'engageant pour le développement de &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt; Logiciels libres &lt;/a &gt;. KDE développe l\'environnement de bureau Plasma, des centaines d\'applications, et les nombreuses bibliothèques logicielles les prenant en charge. KDE est une entreprise coopérative : aucune entité centrale ne contrôle sa direction ou ses produits. Au contraire, nous travaillons tous ensemble pour atteindre un objectif commun : construire le meilleur logiciel libre au monde. Tout le monde est est le bienvenu pour &lt;a href=https://community.kde.org/Get_Involved&gt;rejoindre et contribuer&lt;/a&gt; à KDE, y compris vous. &lt;/p&gt; Visitez &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; pour de plus amples informations sur la communauté KDE et les logiciels que nous développons.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Signaler des bogues ou des souhaits&lt;/h1&gt; &lt;p&gt; Les logiciels peuvent toujours être améliorés et l\'équipe KDE est prête à le faire. Cependant, vous - la personne utilisatrice - devez nous dire quand quelque chose ne fonctionne pas comme prévu ou pourrait être mieux fait. KDE dispose d\'un système de suivi des bogues. Visitez &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; ou utilisez le bouton bouton « Signaler un bogue » de la page « A propos » pour signaler les bogues. Si vous avez une suggestion d\'amélioration, vous pouvez aussi utiliser le système de suivi des bogues pour enregistrer votre souhait. Veuillez vous assurer de bien utiliser le niveau de gravité appelée « Liste de souhaits ».</string>
<string name="about_kde_join_kde">&lt;h1&gt;Rejoignez KDE&lt;/h1&gt; &lt;p&gt;Vous n\'avez pas besoin d\'être un développeur de logiciels pour être membre de l\'équipe de KDE. Vous pouvez rejoindre les équipes nationales qui traduisent les interfaces des programmes. Vous pouvez fournir des illustrations, des thèmes, des sons, et de la documentation améliorée. À vous de décider ! &lt;/p&gt; &lt;p&gt;Visitez la page &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; pour obtenir des informations sur certains projets auxquels vous pouvez participer.&lt;/p&gt; Si vous avez besoin de plus d\'informations ou de documentation, veuillez visitez la page &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt;, qui vous fournira ce dont vous avez besoin.</string>
@@ -403,11 +406,13 @@
<string name="maxim_leshchenko_task">Améliorations de l\'interface utilisateur et de cette page d\'à propos</string>
<string name="holger_kaelberer_task">Corrections du module externe de clavier sans fil et de bogues</string>
<string name="saikrishna_arcot_task">Prise en charge de l\'utilisation du clavier dans le module d\'entrée à distance, corrections de bogues et améliorations générales</string>
<string name="everyone_else">"Toutes les autres personnes ayant contribué KDEConnect depuis plusieurs années"</string>
<string name="shellwen_chen_task">Implémentation de la sécurité de SFTP, amélioration de la maintenabilité de ce projet, corrections de bogues et améliorations générales</string>
<string name="everyone_else">Toutes les autres personnes ayant contribué à KDEConnect depuis plusieurs années</string>
<string name="send_clipboard">Envoyer le presse-papier</string>
<string name="tap_to_execute">Tapotez pour lancer</string>
<string name="plugin_stats">Statistiques des modules externes</string>
<string name="enable_udp_broadcast">Activer la découverte de périphériques « UDP »</string>
<string name="enable_bluetooth">Activer l\'interface Bluetooth (Bêta)</string>
<string name="receive_notifications_permission_explanation">Les notifications doivent être autorisées pour en recevoir d\'autres périphériques</string>
<string name="findmyphone_notifications_explanation">Les permissions pour les notifications sont nécessaires pour que le téléphone puisse sonner lorsque l\'application s\'exécute en tâche de fond</string>
<string name="no_notifications">Les notifications sont désactivées,. Vous ne recevrez pas de notifications d\'appairages entrants.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Aínda non engadiu ningunha rede de confianza</string>
<string name="allow_all_networks_text">Permitilas todas</string>
<string name="location_permission_needed_title">Require permiso</string>
<string name="bluetooth_permission_needed_desc">KDE Connect require permisos para conectarse a dispositivos próximos para poñer dispositivos emparellados mediante Bluetooth a disposición de KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect necesita o permiso de localización en segundo planto para saber a que rede WiFi se conectou incluso cando a aplicación está en segundo plano. Isto é porque o nome das redes WiFi ao redor seu podería usarse para descubrir a súa localización, aínda que KDE Connect non faga tal cousa.</string>
<string name="clipboard_android_x_incompat">Android 10 retirou o acceso ao portapapeis a todas as aplicacións. Desactivarase este complemento.</string>
<string name="mpris_open_url">Continuar reproducindo aquí</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Enviar</string>
<string name="compose_send_title">Preparar un envío</string>
<string name="open_compose_send">Escribir texto</string>
<string name="double_tap_to_drag">Toque dúas veces para arrastrar</string>
<string name="hold_to_drag">Manteña para arrastrar</string>
<string name="about_kde_about">"&lt;h1&gt;Sobre&lt;/h1&gt; &lt;p&gt;KDE é unha comunidade internacional de persoas dedicadas á enxeñaría de soporte lóxico, á arte, á documentación, á tradución e á creación, todas elas comprometidas co desenvolvemento de &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;soporte lóxico libre&lt;/a&gt;. KDE produce o contorno de escritorio Plasma, centos de aplicacións, e as moitas bibliotecas de soporte lóxico sobre as que estas están construídas.&lt;/p&gt; &lt;p&gt;KDE é un esforzo cooperativo: non hai unha única entidade que controle a súa dirección ou os seus produtos. No seu lugar, xuntámonos para traballar no obxectivo común de construír o mellor soporte lóxico libre do mundo. Todas as persoas son benvidas a &lt;a href=https://community.kde.org/Get_Involved&gt;unirse e colaborar&lt;/a&gt; en KDE, incluída vostede.&lt;/p&gt; Visite &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; para máis información sobre a comunidade KDE e o soporte lóxico que produce."</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Informe de fallos ou pida melloras&lt;/h1&gt; &lt;p&gt;O software sempre pode mellorarse, e o equipo de KDE está preparado para facelo. Porén, vostede, a persoa usuaria, ten que avisarnos cando algo non funciona como espera ou podería mellorarse.&lt;/p&gt; &lt;p&gt;KDE ten un sistema de seguimento de fallos. Visite &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; ou use o botón de «Informar dun fallo» da pantalla de información para informar dun fallo.&lt;/p&gt; Se ten unha suxestión de mellora tamén pode usar o sistema de seguimento de fallos para rexistrala. Asegúrese nese caso de usar a severidade «Lista de desexos».</string>
<string name="about_kde_join_kde">&lt;h1&gt;Únase a KDE&lt;/h1&gt; &lt;p&gt;Non necesita saber desenvolver software para formar parte do equipo de KDE. Pode unirse aos equipos de idiomas que traducen as interfaces dos programas. Pode fornecer imaxes, temas, sons, e mellorar a documentación. Vostede decide!&lt;/p&gt; &lt;p&gt;Visite &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; para informarse sobre os proxectos nos que pode participar.&lt;/p&gt; Se necesita máis información ou documentación, ten o que necesita en &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt;.</string>
@@ -409,6 +412,7 @@
<string name="tap_to_execute">Toque para executar</string>
<string name="plugin_stats">Estatísticas do complemento</string>
<string name="enable_udp_broadcast">Activar o descubrimento de dispositivos UDP.</string>
<string name="enable_bluetooth">Activar o Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Debe permitir notificacións para recibilas doutros dispositivos.</string>
<string name="findmyphone_notifications_explanation">Necesita o permiso de notificacións para que o teléfono poda soar cando a aplicación está en segundo plano.</string>
<string name="no_notifications">As notificacións están desactivadas, non recibirá notificacións entrantes de emparellamento.</string>

View File

@@ -50,12 +50,16 @@
<string name="remotekeyboard_connected">Koneksi keyboard jarak jauh telah aktif</string>
<string name="remotekeyboard_multiple_connections">Ada lebih dari satu koneksi keyboard jarak jauh, pilih peranti untuk diatur</string>
<string name="open_mousepad">Masukan jarak jauh</string>
<string name="mousepad_single_tap_settings_title">Set aksi ketuk satu jari</string>
<string name="mousepad_double_tap_settings_title">Set aksi ketuk dua jari</string>
<string name="mousepad_triple_tap_settings_title">Set aksi ketuk tiga jari</string>
<string name="mousepad_sensitivity_settings_title">Set kepekaan touchpad</string>
<string name="mousepad_info_no_gestures">Gerakkan jari pada layar untuk memindahkan kursor tetikus, ketuk untuk klik.</string>
<string name="mousepad_keyboard_input_not_supported">Masukan papan tik tidak didukung oleh perangkat tersanding.</string>
<string name="mousepad_single_tap_settings_title">Setel aksi ketuk satu jari</string>
<string name="mousepad_double_tap_settings_title">Setel aksi ketuk dua jari</string>
<string name="mousepad_triple_tap_settings_title">Setel aksi ketuk tiga jari</string>
<string name="mousepad_sensitivity_settings_title">Setel kepekaan touchpad</string>
<string name="mousepad_mouse_buttons_title">Tampilkan tombol tetikus</string>
<string name="mousepad_acceleration_profile_settings_title">Setel akselerasi pointer</string>
<string name="mousepad_scroll_direction_title">Arah Menggulir Terbalik</string>
<string name="gyro_mouse_enabled_title">Aktifkan tetikus giroskop</string>
<string-array name="mousepad_tap_entries">
<item>Klik kiri</item>
<item>Klik kanan</item>
@@ -63,10 +67,10 @@
<item>Tidak ada apa-apa</item>
</string-array>
<string-array name="mousepad_sensitivity_entries">
<item>Pelan</item>
<item>Agak Pelan</item>
<item>Normal</item>
<item>Agak Cepat</item>
<item>Lambat</item>
<item>Sedikit Lambat</item>
<item>Bawaan</item>
<item>Lebih Cepat</item>
<item>Cepat</item>
</string-array>
<string-array name="mousepad_acceleration_profile_entries">
@@ -78,7 +82,7 @@
<item>Sangat Kuat</item>
</string-array>
<string name="sendkeystrokes_send_to">Kirimkan penekanan tombol ke</string>
<string name="sendkeystrokes_textbox_hint">Kirimkan penekanan tombol ke host</string>
<string name="sendkeystrokes_textbox_hint">Kirimkan penekanan tombol ke hos</string>
<string name="sendkeystrokes_disabled_toast">Mengirim penekanan tombol dinonaktifkan - aktifkan di pengaturan</string>
<string name="sendkeystrokes_wrong_data">Tipe mime tidak sah - harus \'text/x-keystrokes\'</string>
<string name="sendkeystrokes_sent_text">Terkirim %1$s ke peranti %2$s</string>
@@ -91,6 +95,7 @@
<string name="pref_plugin_mousepad_send_keystrokes">Kirim sebagai penekanan tombol</string>
<string name="mouse_receiver_plugin_description">Terima penggerakan mouse jarak jauh</string>
<string name="mouse_receiver_plugin_name">Penerima mouse</string>
<string name="mouse_receiver_no_permissions">Untuk menerima masukan sentuh secara jarak jauh, Anda perlu memberi izin Aksesibilitas untuk dapat mengendalikan perangkat Anda</string>
<string name="view_status_title">Status</string>
<string name="battery_status_format">Baterai: %d%%</string>
<string name="battery_status_low_format">Baterai: %d%% Baterai Lemah</string>
@@ -101,7 +106,7 @@
<string name="device_menu_plugins">Pengesetan plugin</string>
<string name="device_menu_unpair">Leraikan</string>
<string name="pair_new_device">Sandingkan peranti baru</string>
<string name="unknown_device">Perangkat tak diketahui</string>
<string name="unknown_device">Perangkat tidak diketahui</string>
<string name="error_not_reachable">Peranti tidak dapat dicapai</string>
<string name="error_already_paired">Peranti sudah disandingkan</string>
<string name="error_timed_out">Waktu habis</string>
@@ -137,17 +142,17 @@
</plurals>
<string name="tap_to_open">Ketuk untuk membuka</string>
<string name="received_file_text">Ketuk untuk membuka \'%1s\'</string>
<string name="cannot_create_file">Gak bisa menciptakan file %s</string>
<string name="cannot_create_file">Tidak dapat membuat file %s</string>
<string name="tap_to_answer">Ketuk untuk menjawab</string>
<string name="right_click">Kirim Klik Kanan</string>
<string name="middle_click">Kirim Klik Tengah</string>
<string name="show_keyboard">Tampilkan Keyboard</string>
<string name="show_keyboard">Tampilkan Papan Tik</string>
<string name="device_not_paired">Peranti tidak disandingkan</string>
<string name="request_pairing">Minta penyandingan</string>
<string name="pairing_accept">Setujui</string>
<string name="pairing_reject">Apkir</string>
<string name="pairing_reject">Tolak</string>
<string name="settings">Pengaturan</string>
<string name="mpris_play">Putarkan</string>
<string name="mpris_play">Putar</string>
<string name="mpris_pause">Jeda</string>
<string name="mpris_previous">Sebelumnya</string>
<string name="mpris_rew">Mundur</string>
@@ -165,18 +170,20 @@
<item>1 menit</item>
<item>2 menit</item>
</string-array>
<string name="mpris_notifications_explanation">Izin notifkasi diperlukan untuk menampilkan media jarak jauh dalam bilah notifikasi</string>
<string name="mpris_notification_settings_title">Tampilkan notifikasi kendali media</string>
<string name="mpris_notification_settings_summary">Memungkinkan pengendalian pemutar media Anda tanpa membuka KDE Connect</string>
<string name="share_to">Bagikan ke…</string>
<string name="protocol_version_newer">Perangkat ini menggunakan sebuah versi protokol baru</string>
<string name="plugin_settings_with_name">Pengesetan %s</string>
<string name="invalid_device_name">Nama peranti tak absah</string>
<string name="shareplugin_text_saved">Teks diterima, tersimpan ke papan-klip</string>
<string name="plugin_settings_with_name">Pengaturan %s</string>
<string name="invalid_device_name">Nama peranti tidak valid</string>
<string name="shareplugin_text_saved">Teks diterima, tersimpan ke papan klip</string>
<string name="custom_devices_settings">Kustom daftar peranti</string>
<string name="custom_device_list">Tambahkan peranti dengan IP</string>
<string name="custom_device_deleted">Perangkat kustom yang dihapus</string>
<string name="custom_device_list_help">Jika peranti Anda tidak terdeteksi secara otomatis, Anda dapat menambahkan alamat IP atau nama host-nya dengan mengklik Tombol Aksi Yang Mengambang</string>
<string name="custom_device_fab_hint">Tambahkan sebuah peranti</string>
<string name="undo">Urung</string>
<string name="undo">Urungkan</string>
<string name="share_notification_preference">Notifikasi bising</string>
<string name="share_notification_preference_summary">Getar dan putarkan suara ketika menerima sebuah file</string>
<string name="share_destination_customize">Menyesuaikan tujuan direktori</string>
@@ -363,4 +370,5 @@
<string name="everyone_else">Semua orang yang telah berkontribusi pada KDE Connect selama bertahun-tahun</string>
<string name="send_clipboard">Kirim papan klip</string>
<string name="tap_to_execute">Ketuk untuk menjalankan</string>
<string name="enable_bluetooth">Aktifkan Bluetooth (beta)</string>
</resources>

View File

@@ -18,6 +18,7 @@
<string name="pref_plugin_clipboard_sent">Klippispjald sent</string>
<string name="pref_plugin_mousepad">Fjartengd ritun</string>
<string name="pref_plugin_mousepad_desc">Notaðu símann þinn eða spjaldtölvu sem snertiplatta og lyklaborð</string>
<string name="pref_plugin_presenter">Kynningar-fjarstýring</string>
<string name="pref_plugin_presenter_desc">Notaðu tækið þitt til að skipta á milli skyggna í kynningum</string>
<string name="pref_plugin_remotekeyboard">"Tekur á móti fjartengdum innslætti"</string>
<string name="pref_plugin_remotekeyboard_desc">Taktu á móti lyklainnslætti frá fjartengdum tækjum</string>
@@ -115,6 +116,8 @@
<string name="my_device_fingerprint">SHA256-fingrafar af skilríki tækisins þíns er:</string>
<string name="remote_device_fingerprint">SHA256-fingrafar af skilríki fjartengda tækisins er:</string>
<string name="pair_requested">Beðið um pörun</string>
<string name="pair_succeeded">Pörun tókst</string>
<string name="pairing_request_from">Beiðni um pörun frá \'%1s\'</string>
<plurals name="incoming_file_title">
<item quantity="one">Tek á móti %1$d skrá frá %2$s</item>
<item quantity="other">Tek á móti %1$d skrám frá %2$s</item>
@@ -151,6 +154,7 @@
<string name="received_file_text">Pikkaðu til að opna \'%1s\'</string>
<string name="cannot_create_file">Get ekki búið til skrána %s</string>
<string name="tap_to_answer">Pikkaðu til að svara</string>
<string name="left_click">Senda vinstri músarsmell</string>
<string name="right_click">Senda hægri músarsmell</string>
<string name="middle_click">Senda miðjumúsarsmell</string>
<string name="show_keyboard">Birta lyklaborð</string>
@@ -179,6 +183,8 @@
</string-array>
<string name="mpris_notification_settings_title">Birta tilkynningar fyrir margmiðlunarstýringar</string>
<string name="mpris_notification_settings_summary">Gerir kleift að stýra margmiðlunarspilurunum þínum án þess að opna KDE-tengingar</string>
<string name="share_to">Deila með…</string>
<string name="unreachable_device">%s (ekki aðgengilegt)</string>
<string name="protocol_version_newer">Þetta tæki notar nýrri útgáfu samskiptastaðals</string>
<string name="plugin_settings_with_name">Stillingar %s</string>
<string name="invalid_device_name">Ógilt heiti tækis</string>
@@ -233,6 +239,7 @@
<string name="findmyphone_found">Fann það</string>
<string name="open">Opna</string>
<string name="close">Loka</string>
<string name="permission_explanation">Þessi viðbót þarf sérstakar heimildir til að virka</string>
<string name="all_permissions_granted">Allar heimildir veittar 🎉</string>
<string name="share_optional_permission_explanation">Til að taka við skrám þarftu að veita aðgang að geymslurými</string>
<string name="select_ringtone">Veldu hringitón</string>
@@ -352,6 +359,8 @@
<string name="send_compose">Senda</string>
<string name="compose_send_title">Semja og senda</string>
<string name="open_compose_send">Semja texta</string>
<string name="double_tap_to_drag">Ýta tvisvar til að draga</string>
<string name="hold_to_drag">Halda til að draga</string>
<string name="maintainer_and_developer">Umsjónarmaður og forritari</string>
<string name="developer">Forritari</string>
<string name="apple_support">Stuðningur við macOS. Unnið að stuðningi við iOS</string>
@@ -366,5 +375,9 @@
<string name="tap_to_execute">Pikkaðu til að keyra</string>
<string name="plugin_stats">Tölfræði forritsviðbótar</string>
<string name="enable_udp_broadcast">Virkja UDP-uppgötvun tækis</string>
<string name="enable_bluetooth">Virkja bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Leyfa þarf tilkynningar til að geta tekið við þeim frá öðrum tækjum</string>
<string name="mpris_keepwatching">Halda áfram spilun</string>
<string name="mpris_keepwatching_settings_title">Halda áfram spilun</string>
<string name="notification_channel_keepwatching">Halda áfram spilun</string>
</resources>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Non hai aggiunto ancora alcuna rete affidabile</string>
<string name="allow_all_networks_text">Consenti tutte</string>
<string name="location_permission_needed_title">Permesso richiesto</string>
<string name="bluetooth_permission_needed_desc">KDE Connect necessita dell\'autorizzazione per connettersi ai dispositivi nelle vicinanze per rendere disponibili in KDE Connect i dispositivi associati tramite Bluetooth.</string>
<string name="location_permission_needed_desc">KDE Connect necessita dell\'autorizzazione alla posizione in background per conoscere la rete Wi-Fi a cui sei connesso anche quando l\'applicazione è in esecuzione sullo sfondo. Questo perché il nome delle reti Wi-Fi nelle tue vicinanze potrebbe essere utilizzata per trovare la tua posizione, anche se questo non è un utilizzo previsto da KDE Connect.</string>
<string name="clipboard_android_x_incompat">Android 10 ha rimosso l\'accesso agli appunti a tutte le applicazioni. Questa estensione sarà disabilitata.</string>
<string name="mpris_open_url">Continua qui la riproduzione</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Invia</string>
<string name="compose_send_title">Invio scorciatoia composita</string>
<string name="open_compose_send">Componi il testo</string>
<string name="double_tap_to_drag">Doppio tocco per trascinare</string>
<string name="hold_to_drag">Tieni premuto per trascinare</string>
<string name="about_kde_about">&lt;h1&gt;Informazioni&lt;/h1&gt; &lt;p&gt;KDE è una comunità mondiale di ingegneri del software, artisti, scrittori, traduttori e creatori che si impegnano a sviluppare &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;software libero&lt;/a&gt;. KDE produce l\'ambiente desktop Plasma, centinaia di applicazioni e le numerose librerie software che le supportano.&lt;/p&gt; &lt;p&gt;KDE è un\'impresa cooperativa: nessuna singola entità ne controlla la direzione o i prodotti. Invece, lavoriamo insieme per raggiungere l\'obiettivo comune di costruire il miglior software libero del mondo. Tutti sono invitati a &lt;a href=https://community.kde.org/Get_Involved&gt;unirsi e contribuire&lt;/a&gt; a KDE, incluso te.&lt;/p&gt; Visita &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; per ulteriori informazioni sulla comunità KDE e sul software che produciamo.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Segnala bug o desideri&lt;/h1&gt; &lt;p&gt;Il software può sempre essere migliorato e il team di KDE è pronto a farlo. Tuttavia, tu - l\'utente - devi dirci quando qualcosa non funziona come previsto o potrebbe essere fatto meglio.&lt;/p&gt; &lt;p&gt;KDE ha un sistema di tracciamento dei bug. Visita &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; oppure utilizza il pulsante «Segnala bug» dalla schermata delle informazioni per segnalare i bug.&lt;/p&gt; Se hai un suggerimento per il miglioramento, puoi utilizzare il sistema di tracciamento dei bug per registrare il tuo desiderio. Assicurati di utilizzare «Wishlist» per il campo Severity.</string>
<string name="about_kde_join_kde">&lt;h1&gt;Unisciti a KDE&lt;/h1&gt; &lt;p&gt;Non devi essere uno sviluppatore di software per essere un membro della squadra di KDE. Puoi unirti ai gruppi linguistici che traducono le interfacce dei programmi. Puoi fornire grafica, temi, suoni e documentazione migliorata. Decidi tu!&lt;/p&gt; &lt;p&gt;Visita &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; per informazioni su alcuni progetti a cui puoi partecipare.&lt;/p&gt; Se hai bisogno di ulteriori informazioni o di documentazione, visita &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; ti fornirà quello che ti serve.</string>
@@ -409,6 +412,7 @@
<string name="tap_to_execute">Tocca per eseguire</string>
<string name="plugin_stats">Statistiche delle estensioni</string>
<string name="enable_udp_broadcast">Abilita rilevamento UDP dei dispositivi</string>
<string name="enable_bluetooth">Abilita bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Le notifiche devono essere consentite per riceverle da altri dispositivi</string>
<string name="findmyphone_notifications_explanation">L\'autorizzazione alle notifiche è necessaria affinché il telefono possa squillare quando l\'applicazione è sullo sfondo</string>
<string name="no_notifications">Le notifiche sono disabilitate, non riceverai notifiche di associazione in arrivo.</string>

View File

@@ -342,6 +342,7 @@
<string name="empty_trusted_networks_list_text">עדיין לא הוספת רשתות מהימנות</string>
<string name="allow_all_networks_text">לאפשר הכול</string>
<string name="location_permission_needed_title">נדרשת הרשאה</string>
<string name="bluetooth_permission_needed_desc">KDE Connect זקוק להרשאה להתחבר להתקנים קרובים כדי שהתקנים שצומדו עם בלוטות׳ יהיו זמינים ב־KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect צריך הרשאת איתור מקום ברקע כדי לדעת לאיזו רשת אלחוטית התחברת, אפילו אם היישום ברקע. מצב זה נחוץ כיוון ששם הרשתות האלחוטיות מסביבך יכולים לשמש לאיתור המקום שלך, אפילו אם זה לא מה ש־KDE Connect תוכנן לעשות.</string>
<string name="clipboard_android_x_incompat">ב־Android 10 הוסרה הגישה ללוח הגזירים לכל היישומונים. התוסף הזה יושבת.</string>
<string name="mpris_open_url">להמשיך לנגן מכאן</string>
@@ -405,6 +406,8 @@
<string name="send_compose">שליחה</string>
<string name="compose_send_title">שליחה מחיבור</string>
<string name="open_compose_send">טקסט חיבור</string>
<string name="double_tap_to_drag">נקישה כפולה לגרירה</string>
<string name="hold_to_drag">החזקה לגרירה</string>
<string name="about_kde_about">&lt;h1&gt;על אודות&lt;/h1&gt; &lt;p&gt;KDE היא קהילה בינלאומית של מהנדסי תוכנה, כותבים, מתרגמים ויוצרים שמחויבים לפיתוח &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;תוכנה חופשית&lt;/a&gt;. מיזם KDE מפיק את סביבת שולחן העבודה פלזמה, מאות יישומים ומגוון רחב של ספריות תוכנה כדי לתמוך בהם.&lt;/p&gt; &lt;p&gt;KDE הוא תאגיד חברתי: אף ישות יחידה לא שולטת בכיוון או במוצרים. במקום, אנו פעולים יחד כדי להגיע ליעדנו המשותף: לבנות את התוכנה החופשית הטובה בעולם. כולם מוזמנים &lt;a href=https://community.kde.org/Get_Involved&gt;להצטרף ולתרום&lt;/a&gt; ל־KDE, כולל אותך.&lt;/p&gt; כדאי לבקר באתר &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; למידע נוסף על קהילת KDE ועל התוכנה שאנו מפיקים.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;דיווח על תקלות או משאלות&lt;/h1&gt; &lt;p&gt;תוכנות תמיד יכולות להשתפר וצוות KDE ערוך לכך. עם זאת, אנו זקוקים לך - המשתמש או המשתמשת - כדי לספר לנו מתי משהו לא עובד כצפוי או עשוי לעבוד טוב יותר.&lt;/p&gt; &lt;p&gt;ל־KDE יש מערכת מעקב אחר תקלות. יש לבקר ב־&lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; או להשתמש בכפתור „דיווח על תקלה” ממסך על אודות כדי לדווח על תקלות.&lt;/p&gt; אם יש לך הצעה לשיפור, אנו מזמינים אותך להשתמש במערכת מעקב התקלות כדי לתעד את המשאלה שלך, חשוב לזכור לסמן אותה בדרגת חומרה (severity) בשם „Wishlist” (רשימת משאלות).</string>
<string name="about_kde_join_kde">&lt;h1&gt;הצטרפות ל־KDE&lt;/h1&gt; &lt;p&gt;לא צריך להיות מפתחי תוכנה כדי להצטרף לחברות ב־KDE. אפשר להצטרף לצוותים המקומיים שמתרגמים את ממשקי התוכנות. אפשר לספק גרפיקה, ערכות עיצוב, צלילי ושיפור התיעוד. הבחירה היא רק שלך!&lt;/p&gt; &lt;p&gt;יש לבקר ב־&lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; למידע על חלק מהמיזמים בהם ניתן לקחת חלק.&lt;/p&gt; כדי לקבל מידע או תיעוד נוספים, ביקור ב־&lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; יספק לך את מה שדרוש לך.</string>
@@ -425,6 +428,7 @@
<string name="tap_to_execute">נגיעה תפעיל</string>
<string name="plugin_stats">סטטיסטיקת תוסף</string>
<string name="enable_udp_broadcast">הפעלת גילוי מכשירים ב־UDP</string>
<string name="enable_bluetooth">הפעלת בלוטות׳ (בטא)</string>
<string name="receive_notifications_permission_explanation">יש לאשר התראות כדי לקבל אותן במכשירים אחרים</string>
<string name="findmyphone_notifications_explanation">הרשאת ההתראות נחוצה כדי שהטלפון יצלצל גם אם היישומון ברקע</string>
<string name="no_notifications">התראות מושבתות, לא תתקבלנה התראות צימוד נכנסות.</string>

View File

@@ -18,6 +18,7 @@
<string name="pref_plugin_clipboard_sent">クリップボードが送信されました</string>
<string name="pref_plugin_mousepad">リモート入力</string>
<string name="pref_plugin_mousepad_desc">スマートフォンやタブレットをタッチパッドやキーボードとして利用</string>
<string name="pref_plugin_presenter">プレゼンテーションリモート</string>
<string name="pref_plugin_presenter_desc">デバイスを使ってプレゼンテーションのスライドを操作</string>
<string name="pref_plugin_remotekeyboard">リモートからキー入力を受信</string>
<string name="pref_plugin_remotekeyboard_desc">リモートデバイスからキーイベントを受信</string>
@@ -51,6 +52,7 @@
<string name="remotekeyboard_multiple_connections">複数のリモートキーボード接続があります。設定するデバイスを選択してください</string>
<string name="open_mousepad">リモート入力</string>
<string name="mousepad_info">スクリーン上で指を動かすとマウスカーソルが移動します。タップは左クリックになり、2本指タップは右クリック、3本指タップは中クリックになります。2本指でスクロール、長押しでドラッグ&amp;ドロップできます。プラグイン設定から空中マウス機能を有効化できます。</string>
<string name="mousepad_info_no_gestures">スクリーン上で指を動かすとマウスカーソルが移動します。タップするとクリックできます。</string>
<string name="mousepad_keyboard_input_not_supported">ペアリングされたデバイスはキーボード入力をサポートしていません</string>
<string name="mousepad_single_tap_settings_title">1本指タップのアクションを設定</string>
<string name="mousepad_double_tap_settings_title">2本指タップのアクションを設定</string>
@@ -88,7 +90,7 @@
<string name="sendkeystrokes_disabled_toast">キー入力の送信は無効化されています。設定で有効化してください</string>
<string name="sendkeystrokes_wrong_data">無効な MIME タイプです。\'text/x-keystrokes\' である必要があります</string>
<string name="sendkeystrokes_sent_text">ファイル %1$s をデバイス %2$s へ送信しました</string>
<string name="sendkeystrokes_pref_category_summary">このモジュールは他のアプリがテキストのセグメントを接続されたホストに送信されるキー入力として共有できるようにします</string>
<string name="sendkeystrokes_pref_category_summary">このモジュールは他のアプリがテキストのセグメントを接続されたホストにキー入力として共有できるようにします</string>
<string name="sendkeystrokes_pref_category_title">キー入力を送信</string>
<string name="sendkeystrokes_pref_enabled">キー入力の送信を有効化</string>
<string name="sendkeystrokes_pref_enabled_summary">MIME タイプが \'text/x-keystrokes\' のデータを受け付ける</string>
@@ -119,6 +121,8 @@
<string name="my_device_fingerprint">このデバイスの証明書の SHA256 フィンガープリント:</string>
<string name="remote_device_fingerprint">リモートデバイスの証明書の SHA256 フィンガープリント:</string>
<string name="pair_requested">ペアリング要求済み</string>
<string name="pair_succeeded">ペアリングが成功しました</string>
<string name="pairing_request_from">\'%1s\' からペアリングを要求されました</string>
<plurals name="incoming_file_title">
<item quantity="other">%1$d ファイルを %2$s から受信しています</item>
</plurals>
@@ -147,6 +151,7 @@
<string name="received_file_text">タップして \'%1s\' を開く</string>
<string name="cannot_create_file">ファイル %s を作成できません</string>
<string name="tap_to_answer">タップして応答</string>
<string name="left_click">左クリックを送信</string>
<string name="right_click">右クリックを送信</string>
<string name="middle_click">中クリックを送信</string>
<string name="show_keyboard">キーボードを表示</string>
@@ -176,6 +181,9 @@
<string name="mpris_notifications_explanation">通知ドロアにメディア情報を表示するためには、通知の許可が必要です。</string>
<string name="mpris_notification_settings_title">メディア操作の通知を表示</string>
<string name="mpris_notification_settings_summary">KDE Connect を開かずにメディアプレーヤーをコントロール可能にします</string>
<string name="share_to">共有先...</string>
<string name="unreachable_device">%s (到達不可)</string>
<string name="unreachable_device_url_share_text">到達できないデバイスと共有された URL はデバイスが到達可能になったときに送信されます。\n\n</string>
<string name="protocol_version_newer">このデバイスはより新しいプロトコルバージョンを使用しています</string>
<string name="plugin_settings_with_name">%s 設定</string>
<string name="invalid_device_name">不正なデバイス名</string>
@@ -183,10 +191,10 @@
<string name="custom_devices_settings">カスタムデバイスリスト</string>
<string name="custom_device_list">IP アドレスでデバイスを追加</string>
<string name="custom_device_deleted">カスタムデバイスが削除されました</string>
<string name="custom_device_list_help">もしデバイスが自動的に検出されない場合、アクションボタンから手動で IP アドレスやホストネームを追加できます</string>
<string name="custom_device_list_help">デバイスが自動的に検出されない場合、アクションボタンから手動で IP アドレスやホストネームを追加できます</string>
<string name="custom_device_fab_hint">デバイスを追加</string>
<string name="undo">元に戻す</string>
<string name="share_notification_preference">うるさい通知</string>
<string name="share_notification_preference">音声付きの通知</string>
<string name="share_notification_preference_summary">ファイル受信時に振動し、音声を再生します</string>
<string name="share_destination_customize">行き先ディレクトリをカスタマイズ</string>
<string name="share_destination_customize_summary_disabled">受信したファイルは Downloads に保存されます</string>
@@ -247,7 +255,7 @@
<string name="telephony_permission_explanation">デスクトップで通話を表示するために、電話の状態と通話履歴の権限を付与する必要があります</string>
<string name="telephony_optional_permission_explanation">電話番号の代わりに連絡先名を見るには、端末の連絡先へのアクセスを許可する必要があります</string>
<string name="contacts_permission_explanation">連絡先をデスクトップと共有するには、連絡先の権限を付与する必要があります</string>
<string name="contacts_per_device_confirmation">携帯電話に保存されている連絡先はこのデバイスにコピーされ、KDE Connect SMS app などのアプリで使用できるようになります。</string>
<string name="contacts_per_device_confirmation">携帯電話に保存されている連絡先はこのデバイスにコピーされ、KDE Connect SMS App などのアプリで使用できるようになります。</string>
<string name="select_ringtone">着信音を選択</string>
<string name="telephony_pref_blocked_title">ブロックされた番号</string>
<string name="telephony_pref_blocked_dialog_desc">これらの番号からの通話と SMS を表示しません。一行に1つの電話番号を指定してください</string>
@@ -289,7 +297,7 @@
<string name="all">すべて</string>
<string name="devices">デバイス</string>
<string name="settings_rename">デバイス名</string>
<string name="settings_dark_mode">ダーク テーマ</string>
<string name="settings_dark_mode">ダークテーマ</string>
<string name="settings_more_settings_title">その他の設定</string>
<string name="settings_more_settings_text">デバイスごとの設定はデバイス内の「プラグイン設定」にあります</string>
<string name="setting_persistent_notification">永続的な通知を表示</string>
@@ -373,9 +381,11 @@
<string name="send_compose">送信</string>
<string name="compose_send_title">送信するテキストを作成する</string>
<string name="open_compose_send">テキストを作成する</string>
<string name="maintainer_and_developer">メンテナと開発者</string>
<string name="double_tap_to_drag">タブルタップしてドラッグ</string>
<string name="hold_to_drag">長押ししてドラッグ</string>
<string name="maintainer_and_developer">メンテナ、開発者</string>
<string name="developer">開発者</string>
<string name="apple_support">macOS サポート。iOS サポートに取り組み中</string>
<string name="apple_support">macOS サポート。iOS サポート (作業中)</string>
<string name="bug_fixes_and_general_improvements">バグ修正と全体的な改善</string>
<string name="samoilenko_yuri_task">SFTP の実装、バグ修正と全体的な改善</string>
<string name="aniket_kumar_task">SMS プラグインの改善</string>
@@ -383,6 +393,7 @@
<string name="maxim_leshchenko_task">UI の改善とこの情報ページ</string>
<string name="holger_kaelberer_task">リモートキーボードプラグインとバグ修正</string>
<string name="saikrishna_arcot_task">リモート入力プラグインでのキーボードのサポート、バグ修正と全体的な改善</string>
<string name="shellwen_chen_task">SFTP のセキュリティの改善、このプロジェクトのメンテナンス性の改善、バグ修正と全体的な改善</string>
<string name="everyone_else">KDE Connect に貢献してきたその他すべての人々</string>
<string name="send_clipboard">クリップボードを送信</string>
<string name="tap_to_execute">タップして実行</string>
@@ -391,4 +402,8 @@
<string name="receive_notifications_permission_explanation">他のデバイスからの通知を受け取るためには、通知を許可する必要があります。</string>
<string name="findmyphone_notifications_explanation">アプリがバックグラウンドで動作しているときに携帯電話を鳴動させるには、通知の許可が必要です。</string>
<string name="no_notifications">通知は無効化されています。ペア要求通知は受信されません。</string>
<string name="mpris_keepwatching">再生を続ける</string>
<string name="mpris_keepwatching_settings_title">再生を続ける</string>
<string name="mpris_keepwatching_settings_summary">メディアを閉じた後、このデバイスで続けて再生するためのサイレント通知を表示する</string>
<string name="notification_channel_keepwatching">再生を続ける</string>
</resources>

View File

@@ -18,6 +18,7 @@
<string name="pref_plugin_clipboard_sent">클립보드 보냄</string>
<string name="pref_plugin_mousepad">원격 입력</string>
<string name="pref_plugin_mousepad_desc">내 휴대폰이나 태블릿을 터치패드와 키보드로 사용하기</string>
<string name="pref_plugin_presenter">프레젠테이션 리모콘</string>
<string name="pref_plugin_presenter_desc">내 장치로 프레젠테이션 슬라이드 전환하기</string>
<string name="pref_plugin_remotekeyboard">원격 키 입력 받기</string>
<string name="pref_plugin_remotekeyboard_desc">원격 장치의 키 입력 이벤트 받기</string>
@@ -51,6 +52,7 @@
<string name="remotekeyboard_multiple_connections">원격 키보드 연결이 여러 개 있습니다. 설정할 장치를 선택하십시오</string>
<string name="open_mousepad">원격 입력</string>
<string name="mousepad_info">화면에서 손가락을 움직이면 마우스 커서를 움직입니다. 화면을 누르면 왼쪽 단추를 누르고, 두 손가락과 세 손가락으로 누르면 오른쪽/가운데 단추를 누릅니다. 두 손가락을 사용하여 스크롤할 수 있습니다. 드래그 앤 드롭을 사용하려면 길게 누르십시오. 플러그인 설정에서 자이로 마우스를 활성화할 수 있습니다</string>
<string name="mousepad_info_no_gestures">화면에서 손가락을 움직이면 마우스 커서를 움직이며, 탭하면 클릭합니다.</string>
<string name="mousepad_keyboard_input_not_supported">페어링된 장치에서 키보드 입력을 지원하지 않음</string>
<string name="mousepad_single_tap_settings_title">한 손가락으로 눌렀을 때 동작 설정</string>
<string name="mousepad_double_tap_settings_title">두 손가락으로 눌렀을 때 동작 설정</string>
@@ -106,19 +108,21 @@
<string name="category_not_paired_devices">사용 가능한 장치</string>
<string name="category_remembered_devices">기억하는 장치</string>
<string name="device_menu_plugins">플러그인 설정</string>
<string name="device_menu_unpair">연결 해제</string>
<string name="pair_new_device">새 장치 연결</string>
<string name="device_menu_unpair">페어링 해제</string>
<string name="pair_new_device">새 장치 페어링</string>
<string name="cancel_pairing">페어링 취소</string>
<string name="unknown_device">알 수 없는 장치</string>
<string name="error_not_reachable">장치에 접근할 수 없음</string>
<string name="error_already_paired">장치가 이미 연결</string>
<string name="error_already_paired">장치가 이미 페어링</string>
<string name="error_timed_out">시간 초과됨</string>
<string name="error_canceled_by_user">사용자가 취소함</string>
<string name="error_canceled_by_other_peer">다른 쪽에서 취소함</string>
<string name="encryption_info_title">암호화 정보</string>
<string name="my_device_fingerprint">내 장치 인증서의 SHA256 지문:</string>
<string name="remote_device_fingerprint">원격 장치 인증서의 SHA256 지문:</string>
<string name="pair_requested">연결 요청됨</string>
<string name="pair_requested">페어링 요청됨</string>
<string name="pair_succeeded">페어링 성공</string>
<string name="pairing_request_from">\'%1s\'에서 페어링 요청</string>
<plurals name="incoming_file_title">
<item quantity="other">%2$s에서 보낸 파일 %1$d개 받음</item>
</plurals>
@@ -147,11 +151,12 @@
<string name="received_file_text">\'%1s\'을(를) 열려면 누르십시오</string>
<string name="cannot_create_file">파일 %s을(를) 만들 수 없음</string>
<string name="tap_to_answer">눌러서 응답하기</string>
<string name="left_click">왼쪽 단추 클릭 신호 보내기</string>
<string name="right_click">오른쪽 단추 클릭 신호 보내기</string>
<string name="middle_click">가운데 단추 클릭 신호 보내기</string>
<string name="show_keyboard">키보드 표시</string>
<string name="device_not_paired">장치가 연결되지 않음</string>
<string name="request_pairing">연결 요청</string>
<string name="device_not_paired">장치가 페어링되지 않음</string>
<string name="request_pairing">페어링 요청</string>
<string name="pairing_accept">수락</string>
<string name="pairing_reject">거부</string>
<string name="settings">설정</string>
@@ -176,6 +181,9 @@
<string name="mpris_notifications_explanation">알림 서랍에 원격 미디어를 표시하려면 알림 권한이 필요합니다</string>
<string name="mpris_notification_settings_title">미디어 제어 알림 표시</string>
<string name="mpris_notification_settings_summary">KDE Connect를 열지 않고 미디어 재생기 제어</string>
<string name="share_to">다음으로 공유…</string>
<string name="unreachable_device">%s(접근할 수 없음)</string>
<string name="unreachable_device_url_share_text">접근할 수 없는 장치와 공유한 URL은 장치에 다시 접근할 수 있게 될 때 전달됩니다.\n\n</string>
<string name="protocol_version_newer">이 장치의 프로토콜 버전이 더 새롭습니다</string>
<string name="plugin_settings_with_name">%s 설정</string>
<string name="invalid_device_name">잘못된 장치 이름</string>
@@ -221,7 +229,7 @@
<string name="device_rename_title">장치 이름 바꾸기</string>
<string name="device_rename_confirm">이름 바꾸기</string>
<string name="refresh">새로 고침</string>
<string name="unreachable_description">연결된 장치에 접근할 수 없습니다. 같은 네트워크에 있는지 확인하십시오.</string>
<string name="unreachable_description">페어링된 장치에 접근할 수 없습니다. 같은 네트워크에 있는지 확인하십시오.</string>
<string name="no_wifi">Wi-Fi 네트워크에 연결된 것 같지 않습니다. 다른 장치를 볼 수 없습니다. 여기를 클릭하면 Wi-Fi를 활성화합니다.</string>
<string name="on_non_trusted_message">신뢰할 수 없는 네트워크: 자동 발견을 비활성화했습니다.</string>
<string name="no_file_browser">설치된 파일 탐색기가 없습니다.</string>
@@ -273,7 +281,7 @@
<string name="copy_url_to_clipboard">클립보드로 URL 복사</string>
<string name="clipboard_toast">클립보드에 복사됨</string>
<string name="runcommand_notreachable">장치에 접근할 수 없음</string>
<string name="runcommand_notpaired">장치가 연결되지 않음</string>
<string name="runcommand_notpaired">장치가 페어링되지 않음</string>
<string name="runcommand_nosuchdevice">장치가 없음</string>
<string name="runcommand_noruncommandplugin">이 장치에서 명령 실행 플러그인이 활성화되어 있지 않음</string>
<string name="runcommand_category_device_controls_title">장치 제어</string>
@@ -310,6 +318,7 @@
<string name="empty_trusted_networks_list_text">신뢰할 수 있는 네트워크를 추가하지 않았습니다</string>
<string name="allow_all_networks_text">모두 허용</string>
<string name="location_permission_needed_title">권한이 필요함</string>
<string name="bluetooth_permission_needed_desc">KDE Connect에서 블루투스를 사용하여 페어링된 장치를 사용하려면 근처 장치에 연결할 수 있는 권한이 필요합니다.</string>
<string name="location_permission_needed_desc">KDE Connect에서 현재 연결된 Wi-Fi 네트워크 정보를 얻으려면 앱이 백그라운드에서 실행 중일 때에도 백그라운드 권한이 필요합니다. KDE Connect에서는 사용자의 위치를 찾지 않지만, 내 주변에 있는 Wi-Fi 네트워크의 이름으로도 위치를 찾을 수 있기 때문입니다.</string>
<string name="clipboard_android_x_incompat">안드로이드 10부터는 앱에서 클립보드에 접근할 수 없습니다. 이 플러그인이 비활성화되었습니다.</string>
<string name="mpris_open_url">여기에서 계속 재생</string>
@@ -373,6 +382,8 @@
<string name="send_compose">보내기</string>
<string name="compose_send_title">텍스트 보내기</string>
<string name="open_compose_send">텍스트 작성</string>
<string name="double_tap_to_drag">두 번 탭하면 드래그</string>
<string name="hold_to_drag">누르고 있으면 드래그</string>
<string name="about_kde_about">&lt;h1&gt;정보&lt;h1&gt; &lt;p&gt;KDE는 &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;자유 소프트웨어&lt;/a&gt;를 개발하려고 모인 소프트웨어 개발자, 예술가, 집필가, 번역가 및 기타 인원의 모임입니다. KDE 커뮤니티에서는 Plasma 데스크톱 환경, 다양한 앱 및 지원 라이브러리를 개발합니다.&lt;p&gt; &lt;p&gt;KDE는 협동 조합입니다. 어떠한 단일 집단도 방향이나 제품을 결정하지 않습니다. 우리는 전 세계에서 가장 뛰어난 자유 소프트웨어 개발이라는 공통 목표를 향해 함께 힘을 모으고 있습니다. KDE에는 이 글을 읽는 여러분과 같은 누구나 &lt;a href=https://community.kde.org/Get_Involved&gt;참여하고 기여&lt;/a&gt;할 수 있습니다.&lt;p&gt; &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; 페이지를 방문하셔서 KDE 커뮤니티와 소프트웨어에 대해 알아 보십시오.</string>
<string name="about_kde_report_bugs_or_wishes">"&lt;h1&gt;버그나 요구 사항 보고&lt;/h1&gt; &lt;p&gt;소프트웨어는 항상 개선되며, KDE 팀도 그럴 준비가 되어 있습니다. 따라서 사용자 여러분은 무언가가 예상한 대로 작동하지 않거나 더 잘 작동하기를 바라면 개발자에게 알려 주십시오.&lt;/p&gt; &lt;p&gt;KDE는 버그 추적 시스템을 가지고 있습니다. &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt;를 방문하시거나 \"도움말\" 메뉴의 \"버그 보고...\" 대화 상자를 이용하셔서 버그를 보고해 주십시오.&lt;/p&gt; 개선 사항 제안을 하고 싶으시다면 버그 보고 시스템을 통해서 알려 주십시오. 이 경우 심각성 항목에서 \"Wishlist\"를 선택하셔야 합니다."</string>
<string name="about_kde_join_kde">&lt;h1&gt;KDE에 참여하기&lt;/h1&gt; &lt;p&gt;소프트웨어 개발자만이 KDE에 참가할 수 있는 것은 아닙니다. 프로그램 인터페이스를 번역하는 각 언어 번역팀을 도울 수도 있습니다. 또한 그래픽, 테마, 소리, 더 나은 문서 등을 기여할 수도 있습니다. 직접 결정하십시오!&lt;/p&gt; &lt;p&gt;&lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; 페이지를 방문하셔서 참여할 수 있는 프로젝트를 찾아 보십시오.&lt;/p&gt; 만약 더 많은 정보나 문서가 필요하다면, &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; 사이트를 방문하셔서 원하는 정보를 찾으십시오.</string>
@@ -387,12 +398,18 @@
<string name="maxim_leshchenko_task">UI 개선과 정보 페이지</string>
<string name="holger_kaelberer_task">원격 키보드 플러그인과 버그 수정</string>
<string name="saikrishna_arcot_task">원격 입력 플러그인에서 키보드 사용 지원, 버그 수정과 개선</string>
<string name="shellwen_chen_task">SFTP 보안 개선, 프로젝트 관리 편의성 개선, 버그 수정과 개선</string>
<string name="everyone_else">그 외 오랫동안 KDE Connect에 기여한 사람들</string>
<string name="send_clipboard">클립보드 보내기</string>
<string name="tap_to_execute">실행하려면 누르십시오</string>
<string name="plugin_stats">플러그인 통계</string>
<string name="enable_udp_broadcast">UDP 서비스 발견 활성화</string>
<string name="enable_bluetooth">블루투스 활성화(베타)</string>
<string name="receive_notifications_permission_explanation">다른 장치에서 알림을 받으려면 알림을 허용해야 합니다</string>
<string name="findmyphone_notifications_explanation">앱이 백그라운드에서 실행 중일 때 장치를 울리게 하려면 알림 권한이 필요합니다</string>
<string name="no_notifications">알림이 비활성화되어 있습니다. 들어오는 페어링 알림을 받을 수 없습니다</string>
<string name="mpris_keepwatching">계속 재생</string>
<string name="mpris_keepwatching_settings_title">계속 재생</string>
<string name="mpris_keepwatching_settings_summary">미디어를 닫은 후 이 장치에서 계속 재생할 수 있는 조용한 알림 표시</string>
<string name="notification_channel_keepwatching">계속 재생</string>
</resources>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">U hebt nog geen vertrouwd netwerk toegevoegd</string>
<string name="allow_all_networks_text">Allen toestaan</string>
<string name="location_permission_needed_title">Toestemming vereist</string>
<string name="bluetooth_permission_needed_desc">KDE Connect heeft rechten nodig om te verbinden met apparaten dichtbij om apparaten te laten paren met Bluetooth beschikbaar in KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect heeft de permissie achtergrondlocatie nodig om het WiFi-netwerk te weten waarmee u bent verbonden zelfs wanneer de toepassing in de achtergrond is. Dit vanwege dat de naam van de WiFi-netwerken om u heen gebruikt zouden kunnen worden om uw locatie te vinden, zelfs wanneer dit niet is wat KDE Connect doet.</string>
<string name="clipboard_android_x_incompat">Android 10 heeft toegang tot het klembord naar alle toepassingen verwijderd. Deze plug-in zal uitgeschakeld worden.</string>
<string name="mpris_open_url">Hier doorgaan met afspelen</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Verzenden</string>
<string name="compose_send_title">Opstellen van verzending</string>
<string name="open_compose_send">Tekst opstellen</string>
<string name="double_tap_to_drag">Dubbel tikken om te slepen</string>
<string name="hold_to_drag">Ingedrukt houden om te slepen</string>
<string name="about_kde_about">&lt;h1&gt;Info over&lt;/h1&gt; &lt;p&gt;KDE is een wereldwijde gemeenschap van software ingenieurs, artiesten, schrijvers, vertalers en makers die toegewijd zijn aan &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Vrije software&lt;/a&gt; ontwikkeling. KDE produceert de Plasma bureaubladomgeving, honderden toepassingen en de vele software bibliotheken die deze ondersteunen.&lt;/p&gt; &lt;p&gt;KDE is een coöperatieve onderneming: geen enkele entiteit controleert zijn richting of producten. In plaats daarvan werken we samen om het gemeenschappelijke doel te bereiken van het bouwen van de \'s werelds mooiste Vrije software. Iedereen is welkom om &lt;a href=https://community.kde.org/Get_Involved&gt;mee te doen en bij te dragen&lt;/a&gt; aan KDE, inclusief u.&lt;/p&gt; Bezoek &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; voor meer informatie over de KDE gemeenschap en de software die we produceren.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Bugs of wensen rapporteren&lt;/h1&gt; &lt;p&gt;Software kan altijd verbeterd worden en het KDE team is gereed om dat te doen. Echter, u - de gebruiker - moet ons vertellen wanneer iets niet werkt zoals verwacht of beter gedaan kan worden.&lt;/p&gt; &lt;p&gt;KDE heeft een bugvolgsysteem. Bezoek &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; of gebruik de knop \"Bug rapporteren\" uit het Info over scherm om bugs te rapporteren.&lt;/p&gt; Als u een suggestie voor verbetering dan bent u welkom om het bugvolgsysteem te gebruiken om uw wens te registreren. Ga na dat u de ernst genaamd \"Wishlist\" gebruikt.</string>
<string name="about_kde_join_kde">&lt;h1&gt;Mee doen met KDE&lt;/h1&gt; &lt;p&gt;U hoeft geen software ontwerper te zijn om een lid van het KDE-team te worden. U kunt meedoen met een vertaalteam dat interfaces van programma\'s vertaalt. U kunt illustraties, thema\'s, geluiden en verbeterde documentatie leveren. U beslist!&lt;/p&gt; &lt;p&gt;Bezoek &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; voor informatie over projecten waarin u kunt participeren.&lt;/p&gt; Als u meer informatie of documentatie nodig hebt, dan kan een bezoek aan &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; u alles wat u nodig hebt leveren.</string>
@@ -409,6 +412,7 @@
<string name="tap_to_execute">Tik om uit te voeren</string>
<string name="plugin_stats">Plug-in-statistieken</string>
<string name="enable_udp_broadcast">Ontdekken van UDP-apparaat inschakelen</string>
<string name="enable_bluetooth">Bluetooth inschakelen (beta)</string>
<string name="receive_notifications_permission_explanation">Meldingen moeten toegestaan worden om ze te ontvangen van andere apparaten</string>
<string name="findmyphone_notifications_explanation">Het recht op meldingen is nodig zodat de telefoon af kan gaan wanneer de toepassing in de achtergrond is</string>
<string name="no_notifications">Meldingen zijn uitgeschakeld, u zult inkomende paringmeldingen ontvangen.</string>

View File

@@ -389,6 +389,8 @@
<string name="send_compose">Send</string>
<string name="compose_send_title">Send tekst</string>
<string name="open_compose_send">Skriv tekst</string>
<string name="double_tap_to_drag">Dobbelttrykk for å dra</string>
<string name="hold_to_drag">Hald for å dra</string>
<string name="about_kde_about">&lt;h1&gt;Om&lt;/h1&gt; &lt;p&gt;KDE er eit verdsfemnande fellesskap av eldsjeler som programmerer, teiknar, komponerer, dokumenterer, set om eller hjelper til på andre måtar med utvikling av &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;fri programvare&lt;/a&gt;. Me har laga brukarflata Plasma, hundrevis av program og dei mange programbiblioteka desse byggjer på.&lt;/p&gt; &lt;p&gt;KDE er eit fellesskap der inga einskild gruppe, firma eller organisasjon har eigarskap til produkta eller styrer retninga den vidare utviklinga skal gå i. Derimot arbeider me saman om å oppnå vårt felles mål om å laga fri programvare i verdsklasse. Alle er &lt;a href=https://community.kde.org/Get_Involved&gt;velkomne til å bidra&lt;/a&gt;  du òg.&lt;/p&gt;Du finn meir informasjon om KDE og programma me utviklar på &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt;.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Meld frå om feil eller ønskje&lt;/h1&gt; &lt;p&gt;Ein kan alltid forbetra programvare, og KDE-gruppa arbeider heile tida for det. Men du, som brukar, må melda frå til oss når noko ikkje verkar slik du forventar, eller når noko kunne vore gjort betre.&lt;/p&gt; &lt;p&gt;KDE har eit feilsporingssystem. Gå til &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; eller vel «Meld frå om feil» på «Om»-sida for å melda frå om feil.&lt;/p&gt; Om du har framlegg til forbetringar, kan du gjerne registrera òg desse i feilsporingssystemet. Sjå då til at du har markert feilrapporten med «Wishlist».</string>
<string name="about_kde_join_kde">&lt;h1&gt;Vert med i KDE&lt;/h1&gt; &lt;p&gt;Du treng ikkje vera programutviklar for å hjelpa til med KDE. Du kan arbeida med omsetjingar, laga grafikk, tema, lydar eller betre hjelpetekstar. Her er noko for alle!&lt;/p&gt; &lt;p&gt;&lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; finn du informasjon om nokre prosjekt du kan delta i.&lt;/p&gt; Om du vil ha meir informasjon eller dokumentasjon, finn du det du treng på &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt;.</string>
@@ -409,6 +411,7 @@
<string name="tap_to_execute">Tapp for å utføra handlinga</string>
<string name="plugin_stats">Programtillegg-statistikk</string>
<string name="enable_udp_broadcast">Slå på einingsoppdaging via UDP</string>
<string name="enable_bluetooth">Bruk Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Du må tillata varslingar for å kunna frå varslingar frå andre einingar</string>
<string name="findmyphone_notifications_explanation">Varslingsløyvet trengst for at telefonen skal kunna ringja når appen er i bakgrunnsmodus</string>
<string name="no_notifications">Varslingar er slåtte av, så du vil ikkje få varsling om parings­førespurnadar.</string>

View File

@@ -342,6 +342,7 @@
<string name="empty_trusted_networks_list_text">Nie dodałeś jeszcze żadnej zaufanej sieci</string>
<string name="allow_all_networks_text">Zezwól wszystkim</string>
<string name="location_permission_needed_title">Wymagana zgoda</string>
<string name="bluetooth_permission_needed_desc">KDE Connect wymaga pozwolenia na łączenie do sąsiednich urządzeń, aby urządzenia sparowane przy pomocy Bluetooth były widoczne w KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect potrzebuje uprawnień do sprawdzania twojego położenia w tle, aby móc poznać sieć WiFi, do której jesteś podłączony także wtedy, gdy aplikacja działa w tle. Jest tak dlatego, że nazwy sieci WiFi wokół ciebie mogą zostać użyte do ustalenia twojego położenia, mimo że KDE Connect nie robi tego w ten sposób.</string>
<string name="clipboard_android_x_incompat">Android 10 odebrał dostęp do schowka wszystkim programom. Ta wtyczka pozostanie wyłączona.</string>
<string name="mpris_open_url">Kontynuuj odtwarzanie tutaj</string>
@@ -405,6 +406,8 @@
<string name="send_compose">Wyślij</string>
<string name="compose_send_title">Napisz do wysłania</string>
<string name="open_compose_send">Napisz tekst</string>
<string name="double_tap_to_drag">Stuknij dwukrotnie, aby przeciągnąć</string>
<string name="hold_to_drag">Przytrzymaj, aby przeciągnąć</string>
<string name="about_kde_about">"&lt;h1&gt;O programie&lt;/h1&gt; &lt;p&gt;KDE to światowa społeczność inżynierów oprogramowania, artystów, pisarzy, tłumaczy i twórców, którzy są częścią rozwoju &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Wolnego Oprogramowania&lt;/a&gt;. KDE tworzy środowisko pulpitu Plazmy, setki aplikacji i wiele bibliotek programistycznych, aby je wspierać.&lt;/p&gt; &lt;p&gt;KDE jest przedsięwzięciem istniejącym ze współpracy; jego ruchami, czy produktami, nie steruje żaden pojedynczy byt. Pracujemy razem, aby osiągnąć wspólny cel, czyli budowę najlepszego Wolnego Oprogramowania na świecie. Każdy jest mile wiedziany, żeby &lt;a href=https://community.kde.org/Get_Involved&gt;dołączył i zaczął współtworzyć&lt;/a&gt; KDE, włączając w to ciebie.&lt;/p&gt; Odwiedź &lt; href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; po więcej szczegółów nt. społeczności KDE i oprogramowania, które tworzymy."</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Zgłaszaj błędy lub życzenia&lt;/h1&gt; &lt;p&gt;Oprogramowanie zawsze można ulepszyć, a zespół KDE jest gotowy, aby to robić. Jednakże ty - użytkownik - musisz nam powiedzieć o tym, co nie działa jak powinno lub co można zrobić lepiej.&lt;/p&gt; &lt;p&gt;KDE ma system obsługi błędów. Odwiedź &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; lub użyj przycisku \"Zgłoś błąd\" z ekranu o programie do zgłaszania błędów.&lt;/p&gt; Jeśli masz sugestie nt. usprawnień, to także możesz ją zarejestrować w naszym systemie obsługi błędów. Upewnij się, że użyjesz ważności o nazwie \"Lista życzeń\".</string>
<string name="about_kde_join_kde">&lt;h1&gt;Dołącz do KDE&lt;/h1&gt; &lt;p&gt;Nie musisz być programistą, aby być członkiem zespołu KDE. Możesz dołączyć do zespołów językowych, które tłumaczą oprogramowanie. Możesz dostarczać grafikę, zestawy wyglądu, dźwięki i ulepszać dokumentację. To ty decydujesz!&lt;/p&gt; &lt;p&gt;odwiedź &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; po szczegóły nt. projektów, w których możesz wziąć udział .&lt;/p&gt; Jeśli potrzebujesz więcej szczegółów lub dokumentacji, to odwiedziny na &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; dadzą ci to, czego chcesz.</string>
@@ -425,6 +428,7 @@
<string name="tap_to_execute">Stuknij, aby wykonać</string>
<string name="plugin_stats">Statystyki wtyczek</string>
<string name="enable_udp_broadcast">Włącz wykrywanie urządzeń UDP</string>
<string name="enable_bluetooth">Włącz Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Należy zezwolić na powiadomienia, aby móc je otrzymywać z innych urządzeń</string>
<string name="findmyphone_notifications_explanation">Uprawnienia powiadomień są potrzebne, aby telefon mógł dzwonić, gdy aplikacja działa w tle</string>
<string name="no_notifications">Powiadomienia są wyłączone, więc nie otrzymasz żadnych próśb o sparowanie.</string>

View File

@@ -18,6 +18,7 @@
<string name="pref_plugin_clipboard_sent">Área de transferência enviada</string>
<string name="pref_plugin_mousepad">Introdução de dados remota</string>
<string name="pref_plugin_mousepad_desc">Use seu celular ou tablet como mouse e teclado</string>
<string name="pref_plugin_presenter">Controle remoto para apresentações</string>
<string name="pref_plugin_presenter_desc">Use o seu dispositivo para mudar os slides de uma apresentação</string>
<string name="pref_plugin_remotekeyboard">Receber pressionamento de teclas remoto</string>
<string name="pref_plugin_remotekeyboard_desc">Recebe os eventos de pressionamento de teclas dos dispositivos remotos</string>
@@ -51,6 +52,7 @@
<string name="remotekeyboard_multiple_connections">Existe mais que uma conexão a teclados remotos. Selecione o dispositivo a configurar</string>
<string name="open_mousepad">Introdução de dados remota</string>
<string name="mousepad_info">Mova um dedo pela tela para mover o ponteiro do mouse. Dê um toque para clicar e use dois/três dedos para os botões da direita e do meio. Use dois dedos para rolar a tela. Use uma pressão longa para arrastar e soltar. A funcionalidade do mouse giroscópio pode ser habilitada nas preferências do plugin.</string>
<string name="mousepad_info_no_gestures">Mova o dedo na tela para mover o cursor do mouse, toque para um clique.</string>
<string name="mousepad_keyboard_input_not_supported">Entrada de teclado não suportada pelo dispositivo emparelhado</string>
<string name="mousepad_single_tap_settings_title">Definir ação do toque com um dedo</string>
<string name="mousepad_double_tap_settings_title">Definir ação do toque com dois dedos</string>
@@ -59,6 +61,7 @@
<string name="mousepad_mouse_buttons_title">Mostrar botões do mouse</string>
<string name="mousepad_acceleration_profile_settings_title">Definir aceleração do ponteiro</string>
<string name="mousepad_scroll_direction_title">Direção de rolagem inversa</string>
<string name="mousepad_scroll_sensitivity_title">Sensibilidade da rolagem</string>
<string name="gyro_mouse_enabled_title">Ativar mouse giroscópio</string>
<string name="gyro_mouse_sensitivity_title">Sensibilidade do giroscópio</string>
<string-array name="mousepad_tap_entries">
@@ -118,6 +121,8 @@
<string name="my_device_fingerprint">A impressão digital SHA256 do certificado do seu dispositivo é:</string>
<string name="remote_device_fingerprint">A impressão digital SHA256 do certificado do dispositivo remoto é:</string>
<string name="pair_requested">Solicitação de emparelhamento</string>
<string name="pair_succeeded">Emparelhado com sucesso</string>
<string name="pairing_request_from">Emparelhamento solicitado por %1s</string>
<plurals name="incoming_file_title">
<item quantity="one">Recebendo %1$d arquivo de %2$s</item>
<item quantity="other">Recebendo %1$d arquivos de %2$s</item>
@@ -154,6 +159,7 @@
<string name="received_file_text">Toque para abrir o \'%1s\'</string>
<string name="cannot_create_file">Não foi possível criar o arquivo %s</string>
<string name="tap_to_answer">Toque para responder</string>
<string name="left_click">Enviar um clique de botão esquerdo</string>
<string name="right_click">Enviar um Botão Direito</string>
<string name="middle_click">Enviar um Botão do Meio</string>
<string name="show_keyboard">Mostrar teclado</string>
@@ -180,8 +186,12 @@
<item>1 minuto</item>
<item>2 minutos</item>
</string-array>
<string name="mpris_notifications_explanation">A permissão de notificações é necessária para exibir a mídia remotas na gaveta de notificações</string>
<string name="mpris_notification_settings_title">Mostrar a notificação do controle multimídia</string>
<string name="mpris_notification_settings_summary">Permite controlar os seus reprodutores de mídias sem abrir o KDE Connect</string>
<string name="share_to">Compartilhar com...</string>
<string name="unreachable_device">%s (Inalcançável)</string>
<string name="unreachable_device_url_share_text">URLs compartilhadas com um dispositivo inalcançável serão enviadas para ele assim que ele voltar a ficar disponível.\n\n</string>
<string name="protocol_version_newer">Este dispositivo usa uma versão mais recente do protocolo</string>
<string name="plugin_settings_with_name">Configurações de %s</string>
<string name="invalid_device_name">Nome do dispositivo inválido</string>
@@ -248,10 +258,12 @@
<string name="optional_permission_explanation">Você precisa conceder permissões extras para ativar todas as funções</string>
<string name="plugins_need_optional_permission">Alguns plugins possuem recursos desativados devido à falta de permissões (toque para obter mais informações):</string>
<string name="share_optional_permission_explanation">Para receber arquivos você precisa permitir o acesso ao armazenamento</string>
<string name="share_notifications_explanation">Para acompanhar o progresso ao enviar e receber arquivos, você precisa permitir as notificações</string>
<string name="telepathy_permission_explanation">Para ler e gravar SMS a partir do seu ambiente de trabalho é necessário conceder permissão para SMS</string>
<string name="telephony_permission_explanation">Para ver as chamadas telefônicas no seu ambiente de trabalho é preciso dar permissões para registro de chamadas telefônicas e do estado do celular</string>
<string name="telephony_optional_permission_explanation">Para ver o nome de um contato em vez do seu número de telefone é necessário conceder acesso aos contatos do celular</string>
<string name="contacts_permission_explanation">Para compartilhar o seu livro de endereços com o ambiente de trabalho é necessário conceder permissão para os contatos</string>
<string name="contacts_per_device_confirmation">Os contatos do seu telefone serão copiados para este dispositivo, dessa forma eles poderão ser utilizados pelo aplicativo de SMS do KDE Connect e por outros.</string>
<string name="select_ringtone">Selecionar um toque de chamada</string>
<string name="telephony_pref_blocked_title">Números bloqueados</string>
<string name="telephony_pref_blocked_dialog_desc">Não mostrar as chamadas e SMS destes números. Indique um número por linha.</string>
@@ -269,6 +281,9 @@
<string name="notification_channel_default">Outras notificações</string>
<string name="notification_channel_persistent">Indicador persistente</string>
<string name="notification_channel_media_control">Controle multimídia</string>
<string name="notification_channel_filetransfer">Chegada de arquivo via transferência</string>
<string name="notification_channel_filetransfer_upload">Saída de arquivo via transferência</string>
<string name="notification_channel_filetransfer_error">Erro na transferência de arquivo</string>
<string name="notification_channel_high_priority">Prioridade alta</string>
<string name="mpris_stop">Parar o reprodutor atual</string>
<string name="copy_url_to_clipboard">Copiar URL para a área de transferência</string>
@@ -277,6 +292,10 @@
<string name="runcommand_notpaired">Dispositivo não emparelhado</string>
<string name="runcommand_nosuchdevice">Este dispositivo não existe</string>
<string name="runcommand_noruncommandplugin">Este dispositivo não tem o plugin \'Executar comando\' ativo</string>
<string name="runcommand_category_device_controls_title">Controles do dispositivo</string>
<string name="runcommand_device_controls_summary">Caso o seu dispositivo suporte \"controles de dispositivo\", os comandos que você configurou aparecerão aqui.</string>
<string name="set_runcommand_name_as_title">set_runcommand_name_as_title</string>
<string name="runcommand_name_as_title_title">Exibir o nome como título</string>
<string name="pref_plugin_findremotedevice">Procurar dispositivo remoto</string>
<string name="pref_plugin_findremotedevice_desc">Fazer tocar o seu dispositivo remoto</string>
<string name="ring">Toque</string>
@@ -359,7 +378,7 @@
<string name="email_contributor">E-mail do colaborador\n%s</string>
<string name="visit_contributors_homepage">Visite o site do colaborador\n%s</string>
<string name="version">Versão %s</string>
<string name="about_kde">Sobre o KDE</string>
<string name="about_kde">Sobre a KDE</string>
<string name="kde_be_free">KDE - Seja livre!</string>
<string name="kde">KDE</string>
<string name="konqi">Konqi</string>
@@ -370,9 +389,12 @@
<string name="send_compose">Enviar</string>
<string name="compose_send_title">Enviar composto</string>
<string name="open_compose_send">Compor texto</string>
<string name="about_kde_about">"&lt;h1&gt;About&lt;/h1&gt; &lt;p&gt;O KDE é uma comunidade mundial de engenheiros de software, artistas, escritores, tradutores e criadores comprometidos com o desenvolvimento de &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Software Livre.&lt;/a&gt; O KDE produz o ambiente de desktop Plasma, centenas de aplicativos e muitas bibliotecas de software que os suportam.&lt;/p&gt; &lt;p&gt;KDE é uma empresa cooperativa: nenhuma entidade controla sua direção ou produtos. Em vez disso, trabalhamos juntos para alcançar o objetivo comum de construir o melhor software livre do mundo. Todos são bem-vindos para &lt;a href=https://community.kde.org/Get_Involved&gt;participar e contribuir com o KDE&lt;/a&gt; , inclusive você.&lt;/p&gt; Visite &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; para obter mais informações sobre a comunidade KDE e o software que produzimos."</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Reportar bugs ou sugestões&lt;/h1&gt; &lt;p&gt; Software sempre pode ser melhorado e a equipe do KDE está pronta para isso. No entanto, você - o usuário - deve nos informar quando algo não funcionar conforme o esperado ou puder ser feito melhor.&lt;/p&gt; &lt;p&gt;KDE possui um sistema de rastreamento de bugs. Visite &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; ou use o botão \"Relatar erro\" na tela \"sobre\" para relatar bugs.&lt;/p&gt; Se você tiver uma sugestão de melhoria, poderá usar o sistema de rastreamento de bugs para registrar sua solicitação. Certifique-se de usar a opção \"wishlist\" no campo \"severity\".</string>
<string name="about_kde_support_kde">&lt;h1&gt;Apoie o KDE&lt;/h1&gt; &lt;p&gt;O software do KDE está e sempre estará disponível gratuitamente, mas criá-lo não é gratuito.&lt;/p&gt; &lt;p&gt;Para apoiar o desenvolvimento, a comunidade KDE formou o KDE e.V., uma organização sem fins lucrativos fundada legalmente na Alemanha. KDE e.V. representa a comunidade KDE em questões legais e financeiras. Veja &lt;a href=https://ev.kde.org/&gt;https://ev.kde.org/&lt;/a&gt; para obter informações sobre o KDE e.V.&lt;/p&gt; &lt;p&gt;O KDE se beneficia de muitos tipos de contribuições, inclusive financeiras. Usamos os fundos para reembolsar os membros e outros pelas despesas em que incorrem ao contribuir. Outros fundos são usados para apoio jurídico e organização de conferências e reuniões.&lt;/p&gt; &lt;p&gt;Gostaríamos de incentivá-lo a apoiar nossos esforços com uma doação financeira, usando uma das formas descritas em &lt;a href=https://www.kde.org/community/donations/&gt;https://www.kde.org/community/donations/&lt;/a&gt;.&lt;/p&gt; Muito obrigado antecipadamente por seu apoio.</string>
<string name="double_tap_to_drag">Toque duplo para arrastar</string>
<string name="hold_to_drag">Segurar para arrastar</string>
<string name="about_kde_about">&lt;h1&gt;About&lt;/h1&gt; &lt;p&gt;A KDE é uma comunidade mundial de engenheiros de software, artistas, escritores, tradutores e criadores comprometidos com o desenvolvimento de &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Software Livre.&lt;/a&gt; A KDE produz o ambiente de desktop Plasma, centenas de aplicativos e muitas bibliotecas de software que os suportam.&lt;/p&gt; &lt;p&gt;A KDE é uma empresa cooperativa: nenhuma entidade controla sua direção ou produtos. Em vez disso, trabalhamos juntos para alcançar o objetivo comum de construir o melhor software livre do mundo. Todos são bem-vindos para &lt;a href=https://community.kde.org/Get_Involved&gt;participar e contribuir com a KDE&lt;/a&gt; , inclusive você.&lt;/p&gt; Visite &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; para obter mais informações sobre a comunidade KDE e o software que produzimos.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Reportar bugs ou sugestões&lt;/h1&gt; &lt;p&gt; Software sempre pode ser melhorado e a equipe do KDE está pronta para isso. No entanto, você - o usuário - deve nos informar quando algo não funcionar conforme o esperado ou puder ser feito melhor.&lt;/p&gt; &lt;p&gt;A KDE possui um sistema de rastreamento de bugs. Visite &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; ou use o botão \"Relatar erro\" na tela \"sobre\" para relatar bugs.&lt;/p&gt; Se você tiver uma sugestão de melhoria, poderá usar o sistema de rastreamento de bugs para registrar sua solicitação. Certifique-se de usar a opção \"wishlist\" no campo \"severity\".</string>
<string name="about_kde_join_kde">&lt;h1&gt;Junte-se à KDE&lt;/h1&gt; &lt;p&gt; Você não precisa ser um desenvolvedor de software para ser membro da equipe KDE. Você pode se juntar às equipes de idioma que traduzem interfaces de programas. Você pode fornecer imagens, temas, sons e documentação aprimorada. Você decide!&lt;/p&gt; &lt;p&gt;Visite &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; para obter informações sobre alguns projetos dos quais você pode participar.&lt;/p&gt; Caso você precise de mais informações ou documentação, visite &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; talvez você encontre o que procura.</string>
<string name="about_kde_support_kde">&lt;h1&gt;Apoie a KDE&lt;/h1&gt; &lt;p&gt;O software da KDE está e sempre estará disponível gratuitamente, mas criá-lo não é gratuito.&lt;/p&gt; &lt;p&gt;Para apoiar o desenvolvimento, a comunidade KDE formou a KDE e.V., uma organização sem fins lucrativos fundada legalmente na Alemanha. KDE e.V. representa a comunidade KDE em questões legais e financeiras. Veja &lt;a href=https://ev.kde.org/&gt;https://ev.kde.org/&lt;/a&gt; para obter informações sobre o KDE e.V.&lt;/p&gt; &lt;p&gt;A KDE se beneficia de muitos tipos de contribuições, inclusive financeiras. Usamos os fundos para reembolsar os membros e outros pelas despesas em que incorrem ao contribuir. Outros fundos são usados para apoio jurídico e organização de conferências e reuniões.&lt;/p&gt; &lt;p&gt;Gostaríamos de incentivar você a apoiar nossos esforços com uma doação financeira, usando uma das formas descritas em &lt;a href=https://www.kde.org/community/donations/&gt;https://www.kde.org/community/donations/&lt;/a&gt;.&lt;/p&gt; Agradecemos, antecipadamente, o seu apoio.</string>
<string name="maintainer_and_developer">Mantenedor e desenvolvedor</string>
<string name="developer">Desenvolvedor</string>
<string name="apple_support">Suporte ao macOS. Trabalhando no suporte ao iOS</string>
@@ -383,8 +405,17 @@
<string name="maxim_leshchenko_task">Melhorias na interface e nesta página Sobre</string>
<string name="holger_kaelberer_task">Plugin de teclado remoto e correções de erros</string>
<string name="saikrishna_arcot_task">Suporte para usar o teclado no plugin de entrada remoto, correções de erros e melhorias em geral</string>
<string name="everyone_else">Todos os outros que contribuíram para o KDE Connect ao longo dos anos</string>
<string name="shellwen_chen_task">Melhorar a segurança do SFTP, melhorar a capacidade de manutenção deste projeto, correções de erros e melhorias em geral</string>
<string name="everyone_else">Todo mundo que contribuiu para o KDE Connect ao longo dos anos</string>
<string name="send_clipboard">Enviar para área de transferência</string>
<string name="tap_to_execute">Toque para executar</string>
<string name="plugin_stats">Estatísticas do plugin</string>
<string name="enable_udp_broadcast">Habilitar a descoberta de dispositivo via UDP</string>
<string name="receive_notifications_permission_explanation">Notificações devem ser permitidas para receber notificações dos outros dispositivos</string>
<string name="findmyphone_notifications_explanation">A permissão de notificação é necessária para que o telefone possa tocar quando o app estiver em segudo plano</string>
<string name="no_notifications">As notificações estão desabilitadas, você não receberá notificações de solicitação de pareamento.</string>
<string name="mpris_keepwatching">Continuar a execução</string>
<string name="mpris_keepwatching_settings_title">Continuar a execução</string>
<string name="mpris_keepwatching_settings_summary">Exibe uma notificação silenciosa para continuar a execução neste dispositivo após o fechamento da mídia.</string>
<string name="notification_channel_keepwatching">Continuar a execução</string>
</resources>

View File

@@ -342,6 +342,7 @@
<string name="empty_trusted_networks_list_text">Niste še dodali nobenega zaupanja vrednega omrežja</string>
<string name="allow_all_networks_text">Dovoli vse</string>
<string name="location_permission_needed_title">Zahtevano dovoljenje</string>
<string name="bluetooth_permission_needed_desc">KDE Connect potrebuje dovoljenje za povezavo z bližnjimi napravami, da bodo naprave, seznanjene z Bluetoothom, na voljo v KDE Connect.</string>
<string name="location_permission_needed_desc">"KDE Connect potrebuje dovoljenje omrežja, da pozna WiFi omrežje, s katerim ste povezani, tudi če je aplikacija v ozadju. To je zato, ker se ime omrežja wifi lahko uporabi za iskanje svoje lokacije, četudi to ne počne KDE Connect."</string>
<string name="clipboard_android_x_incompat">Android 10 je odstranil dostop do odložišča za vse aplikacije. Ta vtičnik bo onemogočen.</string>
<string name="mpris_open_url">Nadaljuj s predvajanjem tukaj</string>
@@ -405,6 +406,8 @@
<string name="send_compose">Pošlji</string>
<string name="compose_send_title">Sestavite besedilo</string>
<string name="open_compose_send">Sestavite besedilo</string>
<string name="double_tap_to_drag">Dvakrat tapnite za povlek</string>
<string name="hold_to_drag">Držite za povlek</string>
<string name="about_kde_about">&lt;h1&gt;O programu&lt;/h1&gt; &lt;p&gt;KDE je svetovna skupnost programskih inženirjev, umetnikov, piscev, prevajalcev in ustvarjalcev, ki so podporniki razvoja &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Prostega programja&lt;/a&gt;. KDE izdeluje Namizno okolje Plasma, stotine aplikacij in veliko programskih knjižnic, ki jih podpirajo. &lt;/p&gt; &lt;p&gt;KDE je zadružno podjetje: noben deležnik posamično ne obvladuje smeri razvoja ali izdelka. Namesto tega delamo skupaj, da bi dosegli skupni cilj razvoja, da bi prišli do najboljšega prostega programja na svetu. Vsakdo je dobrodošel v skupnost &lt;a href=https://community.kde.org/Get_Involved&gt;da se pridruži in prispeva &lt;/a&gt; v KDE vključno z vami. &lt;/p&gt; Obiščite &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; za več informacij o skupnosti KDE community in programju, ki ga razvijamo.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Poročajte o napakah in željah&lt;/h1&gt; &lt;p&gt;Programje je vedno mogoče izboljšati in skupina KDE je vedno pripravljena na izboljšave. Vendar, vi - kot uporabnica ali uporabnik - nam morate povedati, kadar nekaj ne deluje kot pričakujete ali bi bilo lahko izdelano bolje. &lt;/p&gt; &lt;p&gt;KDE ima sistem sledenja napak. Obiščite &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; ali uporabite gumb \"Poročaj o napaki\" na zaslonu O programu za poročanje napak.&lt;/p&gt; Če imate sugestijo za izboljšanje ste povabljeni, da uporabite sistem za sledenje napakam in zabeležite vašo željo. Zagotovite, da boste resnost napake označili kot \"Seznam želja - Wishlist\".</string>
<string name="about_kde_join_kde">&lt;h1&gt;Pridružite se KDE&lt;/h1&gt; &lt;p&gt;Ni treba, da ste razvijalci programov, da bi bili člani skupnosti KDE. Lahko se pridružite jezikovnim skupinam za prevajanje uporabniških vmesnikov. Lahko prispevate risbe, teme, zvoke in izboljšano dokumentacijo. Sami se odločite!&lt;/p&gt; &lt;p&gt;Obiščite &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; za informacije o projektih, katerim lahko prispevate.&lt;/p&gt; Če potrebujete več informacij ali dokumentacije, potem obiščite &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt;, kjer boste dobili potrebna navodila.</string>
@@ -425,6 +428,7 @@
<string name="tap_to_execute">Tapkajte za izvedbo</string>
<string name="plugin_stats">Stanje vtičnikov</string>
<string name="enable_udp_broadcast">Omogoči odkrivanje naprav UDP</string>
<string name="enable_bluetooth">Omogoči bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Morate imeti dovoljenje za obvestila, če jih želite sprejemati iz drugih naprav</string>
<string name="findmyphone_notifications_explanation">Potrebno je dovoljenje za obvestila, da lahko telefon zazvoni, ko je aplikacija v ozadju</string>
<string name="no_notifications">Obvestila so onemogočena, ne boste prejemali obvestil o dohodnih parih.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Du har inte lagt till några pålitliga nätverk ännu</string>
<string name="allow_all_networks_text">Tillåt alla</string>
<string name="location_permission_needed_title">Rättighet krävs</string>
<string name="bluetooth_permission_needed_desc">KDE-anslut behöver behörighet för att ansluta till närliggande apparater för att göra apparater som är parkopplade med Blåtand tillgängliga i KDE-anslut.</string>
<string name="location_permission_needed_desc">KDE-anslut behöver rättigheter för bakgrundsplats för att känna till WIFI-nätverket du är ansluten med även när programmet är i bakgrunden. Det beror på att namnen på WIFI-nätverk omkring dig skulle kunna användas för att ta reda på var du befinner dig, även om det inte är vad KDE-anslut gör.</string>
<string name="clipboard_android_x_incompat">Android 10 har tagit bort åtkomst till klippbordet för alla applikationer. Det här insticksprogrammet kommer att inaktiveras.</string>
<string name="mpris_open_url">Fortsätt spela här</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Skicka</string>
<string name="compose_send_title">Skriv och skicka</string>
<string name="open_compose_send">Skriv text</string>
<string name="double_tap_to_drag">Dubbeltryck för att dra</string>
<string name="hold_to_drag">Håll för att dra</string>
<string name="about_kde_about">&lt;h1&gt;Om&lt;/h1&gt; &lt;p&gt;KDE är ett världsomspännande nätverk av programvaruingenjörer, grafiker, författare, översättare och kreatörer som är engagerade i utveckling av &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;fri programvara&lt;/a&gt;. KDE producerar skrivbordsmiljön Plasma, hundratals program, och de talrika programvarubibliotek som stöder dem.&lt;/p&gt; &lt;p&gt;KDE är ett kooperativ, där ingen enskild person styr inriktningen eller produkterna. Istället arbetar vi tillsammans för att uppnå det gemensamma målet att skapa värdens finaste fria programvara. Alla är välkomna att &lt;a href=https://community.kde.org/Get_Involved&gt;gå med och bidra&lt;/a&gt; till KDE, inklusive du själv.&lt;/p&gt; Besök &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; för ytterligare information om KDE-gemenskapen och programvaran vi skapar.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Rapportera fel eller önskemål&lt;/h1&gt; &lt;p&gt;Programvara kan alltid förbättras, och KDE-gruppen är beredd att göra det. Men du - användaren - måste berätta för oss om något inte fungerar som förväntat eller kunde ha gjorts bättre.&lt;/p&gt; &lt;p&gt;KDE har ett felrapporteringssystem. Besök &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; eller använd dialogrutan \"Rapportera fel...\" från om-skärmen för att rapportera fel.&lt;/p&gt; Om du har ett förslag på en förbättring kan du använda felrapporteringssystemet för att registrera din önskan. Se då till att du använder allvarlighetsgraden \"Önskan\".</string>
<string name="about_kde_join_kde">&lt;h1&gt;Gå med i KDE&lt;/h1&gt; &lt;p&gt;Du behöver inte vara en programutvecklare för att bli medlem i KDE-gruppen. Du kan gå med i de nationella grupperna som översätter programmens gränssnitt. Du kan bidra med grafik, teman, ljud och förbättrad dokumentation. Det är upp till dig!&lt;/p&gt; &lt;p&gt;Besök &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; för information om några projekt som du kan delta i.&lt;/p&gt;Om du behöver mer information eller dokumentation kommer ett besök på &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; att ge dig det du behöver.</string>
@@ -409,6 +412,7 @@
<string name="tap_to_execute">Rör för att köra</string>
<string name="plugin_stats">Insticksprogramstatistik</string>
<string name="enable_udp_broadcast">Aktivera UDP-enhetsupptäckt</string>
<string name="enable_bluetooth">Aktivera Blåtand (beta)</string>
<string name="receive_notifications_permission_explanation">Underrättelser måste vara tillåtna för att kunna ta emot dem från andra apparater</string>
<string name="findmyphone_notifications_explanation">Underrättelserättigheter krävs så att telefonen kan ringa när programmet är i bakgrunden</string>
<string name="no_notifications">Underrättelser är inaktiverade, så en underrättelse om inkommande begäran att para ihop inte tas emot.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Henüz herhangi bir güvenilen ağ eklemediniz</string>
<string name="allow_all_networks_text">Hepsine izin ver</string>
<string name="location_permission_needed_title">İzin gerekli</string>
<string name="bluetooth_permission_needed_desc">KDE Bağlan, Bluetooth kullanarak eşleştirilmiş aygıtların KDE Bağlanda görülebilir olmasını sağlamak için yakındaki aygıtlara bağlanma iznine gereksinim duyar.</string>
<string name="location_permission_needed_desc">KDE Bağlan, uygulama arka planda olsa bile bağlı olduğunuz Wi-Fi ağını bilmek için arka plan konumu iznine gereksinim duyar. Bunun nedeni, çevrenizdeki Wi-Fi ağlarının adının, KDE Bağlanın yaptığı bu olmasa bile konumunuzu bulmak için kullanılabilmesidir.</string>
<string name="clipboard_android_x_incompat">Android 10, tüm uygulamalara pano erişimini kaldırdı. Bu eklenti devre dışı bırakılacak.</string>
<string name="mpris_open_url">Oynamayı burada sürdürün</string>
@@ -389,6 +390,8 @@
<string name="send_compose">Gönder</string>
<string name="compose_send_title">Gönderi oluştur</string>
<string name="open_compose_send">Metin oluştur</string>
<string name="double_tap_to_drag">Sürüklemek için çift dokunun</string>
<string name="hold_to_drag">Sürüklemek için tutun</string>
<string name="about_kde_about">&lt;h1&gt;Hakkında&lt;/h1&gt; &lt;p&gt;KDE, &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;Özgür Yazılım&lt;/a&gt; hareketine destek veren yazılım mühendislerinin, sanatçıların, yazarların, çevirmenlerin ve yaratıcıların bir araya geldiği dünya çapında bir topluluktur KDE, Plasma masaüstü ortamını, yüzlerce uygulamayı ve onları destekleyen sayısız yazılım kitaplığını üretir.&lt;/p&gt; &lt;p&gt;KDE, işbirliğine dayalı bir kuruluştur: yönünü veya ürünlerini tek başına denetleyen bir kuruluş yoktur. Bunun yerine, dünyanın en iyi Özgür Yazılımını oluşturma ortak hedefine ulaşmak için birlikte çalışıyoruz. Siz de dahil olmak üzere herkes &lt;a href=https://community.kde.org/Get_Involved&gt;katılabilir&lt;/a&gt; ve katkıda bulunabilir.&lt;/p&gt; KDE topluluğu ve ürettiğimiz yazılımlar hakkında daha fazla bilgi için &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; adresini ziyaret edin.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Hataları veya İsteklerinizi Bildirin&lt;/h1&gt; &lt;p&gt;Yazılımlar her zaman iyileştirilebilir ve KDE takımın bunu yapmaya hazırdır. Ancak siz de bir şey beklendiği gibi gitmezse veya hata verirse bize bildirin.&lt;/p&gt; &lt;p&gt;KDEnin bir hata takip sistemi vardır. &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; adresini ziyaret edin veya hakkında ekranının Hata Bildir düğmesini kullanarak hataları bildirin.&lt;/p&gt; Bir iyileştirme için öneriniz varsa bunu bildirmek için hata takip sistemini kullanabilirsiniz; yalnızca “Wishlist” önceliğini kullandığınızdan emin olun.</string>
<string name="about_kde_join_kde">"&lt;h1&gt;KDEye Katılın&lt;/h1&gt; &lt;p&gt;KDE takımının bir üyesi olmak için yazılım geliştirici olmanıza gerek yoktur. Program arayüzlerini çeviren dil takımlarına katılabilirsiniz. Grafikler, temalar, sesler ve iyileştirilmiş belgelendirme sağlayabilirsiniz. Karar sizin!&lt;/p&gt; &lt;p&gt;Katılabileceğiniz bazı projeler hakkında bilgi almak için &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; sayfasını ziyaret edin.&lt;/p&gt; Daha fazla bilgiye veya belgeye gereksiniminiz varsa &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; sayfasında aradığınızı bulabilirsiniz."</string>
@@ -405,10 +408,11 @@
<string name="saikrishna_arcot_task">Uzaktan girdi eklentisinde klavye kullanımı desteği, hata düzeltmeleri ve genel iyileştirmeler</string>
<string name="shellwen_chen_task">SFTP güvenliğini artır, projenin bakımını daha da kolaylaştır, hata düzeltmeleri ve genel iyileştirmeler</string>
<string name="everyone_else">KDE Bağlana yıllar boyunca katkıda bulunan herkes</string>
<string name="send_clipboard">Pano gönder</string>
<string name="tap_to_execute">Yürütmek için dokun</string>
<string name="plugin_stats">Eklenti istatistikleri</string>
<string name="enable_udp_broadcast">UDP aygıt keşfini etkinleştir</string>
<string name="send_clipboard">Pano Gönder</string>
<string name="tap_to_execute">Yürütmek için Dokun</string>
<string name="plugin_stats">Eklenti İstatistikleri</string>
<string name="enable_udp_broadcast">UDP Aygıt Keşfini Etkinleştir</string>
<string name="enable_bluetooth">Bluetoothu Etkinleştir (Beta)</string>
<string name="receive_notifications_permission_explanation">Başka aygıtlardan gelen bildirimleri alabilmek için bildirimlere izin verilmesi gereklidir</string>
<string name="findmyphone_notifications_explanation">Uygulama arka plandayken telefonun çalabilmesi için bildirim izni gereklidir</string>
<string name="no_notifications">Bildirimler devre dışı; herhangi bir gelen eş bildirimi almayacaksınız.</string>

View File

@@ -342,6 +342,7 @@
<string name="empty_trusted_networks_list_text">Вами ще не додано надійних мереж</string>
<string name="allow_all_networks_text">Дозволити всі</string>
<string name="location_permission_needed_title">Потрібні права доступу</string>
<string name="bluetooth_permission_needed_desc">KDE Connect потрібні права доступу до з\'єднання із сусідніми пристроями, щоб зробити пов\'язування пристроїв за допомогою Bluetooth доступним у KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect потрібні права на визначення місця перебування у фоновому режимі для роботи з мережею WiFi, з якою встановлено з\'єднання, навіть якщо програма працює у фоновому режимі. Причина полягає у тому, що назви сусідніх мереж WiFi може бути використано для визначення місця перебування, навіть якщо це не робить сама KDE Connect.</string>
<string name="clipboard_android_x_incompat">У Android 10 вилучено доступ до буфера даних для усіх програм. Цей додаток буде вимкнено.</string>
<string name="mpris_open_url">Продовжити відтворення тут</string>
@@ -405,6 +406,8 @@
<string name="send_compose">Надіслати</string>
<string name="compose_send_title">Надсилання редагованого</string>
<string name="open_compose_send">Редагувати текст</string>
<string name="double_tap_to_drag">Подвійне торкання для перетягування</string>
<string name="hold_to_drag">Утримування для перетягування</string>
<string name="about_kde_about">&lt;h1&gt;Інформація&lt;/h1&gt; &lt;p&gt;KDE — це всесвітня спільнота програмістів, художників, авторів текстів, перекладачів та фахівців з полегшення користування програмами, які роблять свій внесок до розвитку &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;вільного програмного забезпечення&lt;/a&gt;. KDE створено стільничне середовище Плазма, сотні вільних програм і багато бібліотек, які є їхньою основою.&lt;/p&gt; &lt;p&gt;Розробка KDE є спільною працею, у якій жоден з учасників не має переважного контролю над зусиллями або результатами роботи інших розробників KDE. Ми працюємо разом заради спільної мети — створення найкращого вільного програмного забезпечення. Кожен може &lt;a href=https://community.kde.org/Get_Involved&gt;долучитися і зробити свій внесок&lt;/a&gt;, зокрема це можете зробити ви.&lt;/p&gt; Відвідайте сайт &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt;, щоб дізнатися більше про спільноту KDE та створене нею програмне забезпечення.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Повідомляйте про вади і ваші побажання&lt;/h1&gt; &lt;p&gt;Програмне забезпечення завжди потребує вдосконалення, і команда KDE готова це робити. Проте, вам (користувачеві) варто повідомити нам, якщо щось не працює, як слід, або щось можна покращити.&lt;/p&gt; &lt;p&gt;KDE має систему стеження за вадами. Завітайте на сторінку &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; , щоб повідомити розробників про ваду у програмі.&lt;/p&gt;Якщо у вас є пропозиція щодо вдосконалення, за допомогою цієї системи можна зареєструвати ваше побажання. Переконайтеся, що поле «Важливість» встановлено у значення «Список побажань» («Wishlist»).</string>
<string name="about_kde_join_kde">&lt;h1&gt;Долучайтеся до KDE&lt;/h1&gt; &lt;p&gt;Не обов\'язково бути програмістом, щоб належати до Команди KDE. Можете приєднатися до команд, що перекладають інтерфейс програм. Можете забезпечувати користувачів графікою, темами, звуками та вдосконаленою документацію. Вам вирішувати!&lt;/p&gt; &lt;p&gt;Завітайте на сторінку &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; щодо інформації про деякі проєкти, у яких можна взяти участь.&lt;/p&gt;Якщо ви потребуєте більше інформації або документації, відвідайте &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt;, щоб ознайомитися з нею.</string>
@@ -425,6 +428,7 @@
<string name="tap_to_execute">Торкніться, щоб виконати</string>
<string name="plugin_stats">Статистика щодо додатків</string>
<string name="enable_udp_broadcast">Увімкнути виявлення пристроїв UDP</string>
<string name="enable_bluetooth">Увімкнути Bluetooth (тест)</string>
<string name="receive_notifications_permission_explanation">Для отримання сповіщень з інших пристроїв має бути уможливлено показ сповіщень</string>
<string name="findmyphone_notifications_explanation">Для уможливлення дзвінків, коли програма перебуває у фоновому режимі, потрібні права доступу до сповіщень</string>
<string name="no_notifications">Показ сповіщень вимкнено, ви не отримуватимете сповіщень щодо вхідних запитів на пов\'язування пристроїв.</string>

View File

@@ -318,6 +318,7 @@
<string name="empty_trusted_networks_list_text">您还没有添加任何可信的网络</string>
<string name="allow_all_networks_text">允许所有</string>
<string name="location_permission_needed_title">需要权限</string>
<string name="bluetooth_permission_needed_desc">KDE Connect 需要权限才能使用蓝牙连接并配对附近的设备。</string>
<string name="location_permission_needed_desc">KDE Connect 需要后台位置权限才能在后台检测您连接到的 WiFi 网络。后台位置权限是一个敏感权限,这是因为该权限可以让应用程序通过您周围的 WiFi 网络名称来查找您的位置。尽管 KDE Connect 申请了该权限,但它不会对您进行定位。</string>
<string name="clipboard_android_x_incompat">Android 10 已删除所有应用的剪贴板访问权限。此插件将被禁用。</string>
<string name="mpris_open_url">继续在此播放</string>
@@ -381,6 +382,8 @@
<string name="send_compose">发送</string>
<string name="compose_send_title">编写发送</string>
<string name="open_compose_send">编写文本</string>
<string name="double_tap_to_drag">双击进行拖动</string>
<string name="hold_to_drag">按住进行拖动</string>
<string name="about_kde_about">&lt;h1&gt;关于&lt;/h1&gt; &lt;p&gt;KDE 是由一群致力于&lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;自由软件&lt;/a&gt;事业的人们所组成的全球性协作社区。它的成员包括了来自世界各地的软件工程师、艺术工作者、文字工作者、翻译人员和其他创意人员。KDE 社区开发了 Plasma 桌面环境、数百款功能各异的应用软件、以及用于支持它们的大量程序库。&lt;/p&gt; &lt;p&gt;KDE 是一项立足于协作精神的事业,它的运作和产出不受任何单一个人或者机构的控制。我们的共同目标是为全世界带来高品质的自由软件。不管您来自何方,我们都欢迎您&lt;a href=https://community.kde.org/Get_Involved&gt;加入 KDE 并做出贡献&lt;/a&gt;&lt;/p&gt;请访问 &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; 来了解 KDE 社区和软件的更多信息。</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;报告程序缺陷和需求&lt;/h1&gt; &lt;p&gt;KDE 团队一直致力于改进软件的品质。为了做到这一点,倾听来自用户的反馈非常重要。如果您遇到了软件不能正常工作的情况,请务必告诉我们。如果您有关于改进软件的想法,也请与我们分享。&lt;/p&gt; &lt;p&gt;KDE 建有程序缺陷跟踪系统,请访问 &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; 或者使用“帮助”菜单中的“报告缺陷”对话框填写报告。&lt;/p&gt;如果您想要提出改进建议而不是报告程序缺陷,请确保在表格的 Severity (严重程度) 选单中选择“Wishlist (需求)”。</string>
<string name="about_kde_join_kde">&lt;h1&gt;加入 KDE&lt;/h1&gt; &lt;p&gt;即使您不是软件开发人员,我们也欢迎您加入 KDE 的队伍!您可以加入各种语言的翻译团队来翻译软件的界面,您还可以制作图像、主题、音效,或者改进软件配套的文档……您的角色您来定!&lt;/p&gt; &lt;p&gt;请访问 &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; 来物色您感兴趣的项目。&lt;/p&gt;如需了解更多相关信息和文档,请访问 &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt;</string>
@@ -401,6 +404,7 @@
<string name="tap_to_execute">轻触执行</string>
<string name="plugin_stats">插件状态</string>
<string name="enable_udp_broadcast">启用 UPnP 设备发现</string>
<string name="enable_bluetooth">启用蓝牙 (测试)</string>
<string name="receive_notifications_permission_explanation">需要允许通知才能从其他设备接收通知</string>
<string name="findmyphone_notifications_explanation">需要通知权限,这样当应用程序处于后台时手机可以发出铃声</string>
<string name="no_notifications">通知已禁用,您将不会收到传入的配对通知。</string>

View File

@@ -1,105 +1,105 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kde_connect">KDE 連線</string>
<string name="kde_connect">KDE Connect</string>
<string name="manifest_label_share">傳送到裝置</string>
<string name="foreground_notification_no_devices">沒有連線到任何裝置</string>
<string name="foreground_notification_devices">已連線到%s</string>
<string name="foreground_notification_no_devices">未與任何裝置產生連結</string>
<string name="foreground_notification_devices">已連%s</string>
<string name="foreground_notification_send_clipboard">傳送剪貼簿</string>
<string name="pref_plugin_telephony">電話通知器</string>
<string name="pref_plugin_telephony_desc">傳送來電通知</string>
<string name="pref_plugin_battery">電池報告</string>
<string name="pref_plugin_battery_desc">定期回報電池狀態</string>
<string name="pref_plugin_connectivity_report">報告</string>
<string name="pref_plugin_connectivity_report_desc">回報網路訊號強度狀態</string>
<string name="pref_plugin_connectivity_report">通性報告</string>
<string name="pref_plugin_connectivity_report_desc">回報網路訊號強度狀態</string>
<string name="pref_plugin_sftp">顯示檔案系統</string>
<string name="pref_plugin_sftp_desc">同意讓遠端可以瀏覽檔案系統</string>
<string name="pref_plugin_clipboard">同步剪貼簿</string>
<string name="pref_plugin_clipboard_desc">享剪貼簿的內容</string>
<string name="pref_plugin_clipboard_sent">已傳送剪貼簿</string>
<string name="pref_plugin_sftp_desc">允許遠端瀏覽此裝置的檔案系統</string>
<string name="pref_plugin_clipboard">剪貼簿同步</string>
<string name="pref_plugin_clipboard_desc">享剪貼簿的內容</string>
<string name="pref_plugin_clipboard_sent">已傳送剪貼簿內容</string>
<string name="pref_plugin_mousepad">遠端輸入</string>
<string name="pref_plugin_mousepad_desc">使用您的智慧型手機或平板來模擬觸碰板與鍵盤</string>
<string name="pref_plugin_mousepad_desc">使用手機或平板電腦作為觸控板和鍵盤</string>
<string name="pref_plugin_presenter">簡報遙控</string>
<string name="pref_plugin_presenter_desc">使用您的裝置來切換簡報中的投影片</string>
<string name="pref_plugin_remotekeyboard">接收遠端按鍵輸入</string>
<string name="pref_plugin_remotekeyboard_desc">從遠端裝置接收按鍵輸入活動</string>
<string name="pref_plugin_mpris">多媒體控制</string>
<string name="pref_plugin_mpris_desc">成為您媒體播放器的遙控器</string>
<string name="pref_plugin_runcommand">執行</string>
<string name="pref_plugin_runcommand_desc">您的智慧型手機或平板當中觸發遠端裝置上的命令</string>
<string name="pref_plugin_contacts">同步聯絡人工具</string>
<string name="pref_plugin_mpris_desc">成為您媒體播放器的遙控器</string>
<string name="pref_plugin_runcommand">執行</string>
<string name="pref_plugin_runcommand_desc">從手機或平板電腦觸發遠端命令</string>
<string name="pref_plugin_contacts">聯絡人同步</string>
<string name="pref_plugin_contacts_desc">允許同步裝置的通訊錄</string>
<string name="pref_plugin_ping">Ping 回應封包</string>
<string name="pref_plugin_ping_desc">傳送接收 Ping 回應封包</string>
<string name="pref_plugin_notifications">同步通知</string>
<string name="pref_plugin_notifications_desc">存取其他裝置的通知</string>
<string name="pref_plugin_ping">Ping 測試</string>
<string name="pref_plugin_ping_desc">傳送接收連線測試封包</string>
<string name="pref_plugin_notifications">通知同步</string>
<string name="pref_plugin_notifications_desc">其他裝置存取您的通知</string>
<string name="pref_plugin_receive_notifications">接收通知</string>
<string name="pref_plugin_receive_notifications_desc">在 Android 上顯示從其他裝置收到的通知</string>
<string name="pref_plugin_sharereceiver">分享接收</string>
<string name="pref_plugin_sharereceiver_desc">兩個裝置當中互相分享URL網址與檔案</string>
<string name="pref_plugin_receive_notifications_desc">接收來自其他裝置的通知並將其顯示在 Android 上</string>
<string name="pref_plugin_sharereceiver">分享接收</string>
<string name="pref_plugin_sharereceiver_desc">裝置之間分享檔案和網址 (URL)</string>
<string name="device_list_empty">沒有裝置</string>
<string name="ok">確認</string>
<string name="sad_ok">好吧 :(</string>
<string name="cancel">取消</string>
<string name="open_settings">開啟設定</string>
<string name="no_permissions">需要授予存取通知的權限</string>
<string name="no_permission_mprisreceiver">為了要能控制您的媒體播放器,您需要提供「通知的權限</string>
<string name="no_permissions_remotekeyboard">若要接收鍵盤按鍵事件,您需要啟用 KDE 連線遠端鍵盤功能</string>
<string name="send_ping">傳送 Ping 回應封包</string>
<string name="no_permissions">必須給予存取通知的權限</string>
<string name="no_permission_mprisreceiver">為了要能控制您的媒體播放器,您必須給予存取通知的權限</string>
<string name="no_permissions_remotekeyboard">若要接收鍵盤按鍵輸入活動,您必須啟用 KDE Connect 的遠端鍵盤功能</string>
<string name="send_ping">傳送 Ping 測試封包</string>
<string name="open_mpris_controls">多媒體控制</string>
<string name="remotekeyboard_editing_only_title">編輯時處理遠端按鍵</string>
<string name="remotekeyboard_not_connected">這裡沒有建立在 kdeconnect 之上的使用中遠端鍵盤連線。</string>
<string name="remotekeyboard_connected">遠端鍵盤連線啟用狀態</string>
<string name="remotekeyboard_multiple_connections">這裡有兩個以上的遠端鍵盤連結,選擇一個裝置以設定</string>
<string name="remotekeyboard_editing_only_title">僅在編輯時處理遠端按鍵</string>
<string name="remotekeyboard_not_connected">沒有作用中的遠端鍵盤連線,請在 KDE Connect 中建立一個</string>
<string name="remotekeyboard_connected">遠端鍵盤連線啟用</string>
<string name="remotekeyboard_multiple_connections">遠端鍵盤連線有多個,請選擇裝置進行設定</string>
<string name="open_mousepad">遠端輸入</string>
<string name="mousepad_info">您的智慧型手機螢幕上移動手指來控制電腦螢幕的游標。按一下表示滑鼠的左鍵,使用兩/三手指頭按一下來表示滑鼠的右鍵/中鍵。使用兩隻手指捲動。長按則表示要拖拉。可以在外掛程式設定啟用陀螺儀滑鼠功能</string>
<string name="mousepad_info_no_gestures">在螢幕上移動手指移動滑鼠游標,輕點來進行點擊</string>
<string name="mousepad_info">在手機螢幕上移動手指即可移動滑鼠游標。點擊一次,然後使用兩/三手指操作右側和中間按鈕。使用 2 根手指捲動頁面。長按進行拖放。可從右上角選單的外掛程式設定啟用陀螺儀滑鼠功能以更靈活的操控滑鼠游標</string>
<string name="mousepad_info_no_gestures">在螢幕上移動手指就可以移動滑鼠游標,手指輕點就代表點擊一下</string>
<string name="mousepad_keyboard_input_not_supported">配對裝置不支援鍵盤輸入</string>
<string name="mousepad_single_tap_settings_title">設定單指輕點的動作</string>
<string name="mousepad_double_tap_settings_title">設定兩隻手指頭按一下的動作</string>
<string name="mousepad_triple_tap_settings_title">設定三隻手指頭按一下的動作</string>
<string name="mousepad_sensitivity_settings_title">設定觸碰板的靈敏度</string>
<string name="mousepad_double_tap_settings_title">設定兩指輕點的動作</string>
<string name="mousepad_triple_tap_settings_title">設定三指輕點的動作</string>
<string name="mousepad_sensitivity_settings_title">設定觸控板靈敏度</string>
<string name="mousepad_mouse_buttons_title">顯示滑鼠按鈕</string>
<string name="mousepad_acceleration_profile_settings_title">設定指針加速度</string>
<string name="mousepad_scroll_direction_title">動方向相反</string>
<string name="mousepad_acceleration_profile_settings_title">設定滑鼠游標加速度</string>
<string name="mousepad_scroll_direction_title">反向捲動方向</string>
<string name="mousepad_scroll_sensitivity_title">捲動靈敏度</string>
<string name="gyro_mouse_enabled_title">啟用陀螺儀滑鼠</string>
<string name="gyro_mouse_sensitivity_title">陀螺儀靈敏度</string>
<string-array name="mousepad_tap_entries">
<item>點擊左鍵</item>
<item>點擊右鍵</item>
<item>點擊中鍵</item>
<item>左鍵點擊</item>
<item>右鍵點擊</item>
<item>中鍵點擊</item>
<item></item>
</string-array>
<string-array name="mousepad_sensitivity_entries">
<item></item>
<item>最慢</item>
<item></item>
<item>預設</item>
<item>高於預設值</item>
<item></item>
<item>最快</item>
</string-array>
<string-array name="mousepad_acceleration_profile_entries">
<item>沒有加速</item>
<item></item>
<item></item>
<item>沒有加速</item>
<item>最弱</item>
<item></item>
<item>中等</item>
<item>安全</item>
<item>安全</item>
<item>較強</item>
<item></item>
</string-array>
<string name="sendkeystrokes_send_to">傳送鍵盤輸入</string>
<string name="sendkeystrokes_textbox_hint">傳送鍵盤輸入主機</string>
<string name="sendkeystrokes_disabled_toast">已停用傳送鍵盤輸入的功能——請至「設定」裡啟動</string>
<string name="sendkeystrokes_wrong_data">無效的檔案類型——需為 text/x-keystrokes</string>
<string name="sendkeystrokes_sent_text">傳送按鍵組合 %1$s 裝置 %2$s</string>
<string name="sendkeystrokes_pref_category_summary">這個模組讓其他應用程式可以分享文字片段,並作為鍵盤輸入傳送至連線的主機</string>
<string name="sendkeystrokes_send_to">鍵盤輸入傳送到</string>
<string name="sendkeystrokes_textbox_hint">鍵盤輸入傳送到主機</string>
<string name="sendkeystrokes_disabled_toast">傳送鍵盤輸入的功能已停用 - 可在「設定」中啟用</string>
<string name="sendkeystrokes_wrong_data">無效的 mime 類型 - 必須為「text/x-keystrokes</string>
<string name="sendkeystrokes_sent_text">按鍵組合 %1$s 傳送到裝置 %2$s</string>
<string name="sendkeystrokes_pref_category_summary">此模組允許其他應用程式分享文字片段如同鍵盤輸入,並將其傳送到已連結的主機</string>
<string name="sendkeystrokes_pref_category_title">傳送鍵盤輸入</string>
<string name="sendkeystrokes_pref_enabled">啟用鍵盤輸入傳送</string>
<string name="sendkeystrokes_pref_enabled_summary">接收 MIME 類型為 \'text/x-keystrokes\' 的資料</string>
<string name="sendkeystrokes_safe_text_enabled">馬上傳送安全文字</string>
<string name="sendkeystrokes_safe_text_enabled_summary">不另行確認直接傳送簡短而只有數字字串</string>
<string name="sendkeystrokes_safe_text_enabled_summary">傳送短的純數字字串而不進行確認</string>
<string name="pref_plugin_mousepad_send_keystrokes">作為鍵盤輸入傳送</string>
<string name="mouse_receiver_plugin_description">接收遠端滑鼠移動</string>
<string name="mouse_receiver_plugin_name">滑鼠接收</string>
<string name="mouse_receiver_no_permissions">要接收遠端觸控輸入,您需要提供完全控制裝置的協助工具權限</string>
<string name="mouse_receiver_plugin_name">滑鼠接收</string>
<string name="mouse_receiver_no_permissions">若要遠端接收觸控輸入,您必須給予輔助功能權限以完全控制您的裝置</string>
<string name="view_status_title">狀態</string>
<string name="battery_status_format">電池:%d%%</string>
<string name="battery_status_low_format">電池:%d%% 低電量</string>
@@ -112,7 +112,7 @@
<string name="pair_new_device">配對新裝置</string>
<string name="cancel_pairing">取消配對</string>
<string name="unknown_device">不明的裝置</string>
<string name="error_not_reachable">裝置無法連結</string>
<string name="error_not_reachable">裝置無法存取</string>
<string name="error_already_paired">裝置已經配對</string>
<string name="error_timed_out">逾時</string>
<string name="error_canceled_by_user">使用者中斷</string>
@@ -142,18 +142,18 @@
<item quantity="other">無法從 %1$s 接收到 %2$d/%3$d 個檔案</item>
</plurals>
<plurals name="sent_files_title">
<item quantity="other">已將 %2$d 傳送至 %1$s</item>
<item quantity="other">已將 %2$d 個檔案傳送至 %1$s</item>
</plurals>
<plurals name="send_files_fail_title">
<item quantity="other">無法將第 %2$d (共 %3$d) 個檔案傳送至 %1$s</item>
</plurals>
<string name="tap_to_open">按一下開啟</string>
<string name="received_file_text">按一下開啟 \'%1s\'</string>
<string name="tap_to_open">點擊以開啟</string>
<string name="received_file_text">點擊以開啟「%1s</string>
<string name="cannot_create_file">無法建立 %s 檔案</string>
<string name="tap_to_answer">按一下即可回應</string>
<string name="left_click">傳送左鍵按一下</string>
<string name="right_click">傳送右鍵按一下</string>
<string name="middle_click">傳送中鍵按一下</string>
<string name="tap_to_answer">點擊即可回應</string>
<string name="left_click">傳送左鍵點擊</string>
<string name="right_click">傳送右鍵點擊</string>
<string name="middle_click">傳送中鍵點擊</string>
<string name="show_keyboard">顯示鍵盤</string>
<string name="device_not_paired">裝置未配對</string>
<string name="request_pairing">請求配對</string>
@@ -169,8 +169,8 @@
<string name="mpris_loop">重複播放</string>
<string name="mpris_shuffle">隨機播放</string>
<string name="mpris_volume">音量</string>
<string name="mpris_time_settings_title">往前/往後按鍵</string>
<string name="mpris_time_settings_summary">調整按下時往前 / 往後的時間</string>
<string name="mpris_time_settings_title">快轉 / 倒轉按鈕</string>
<string name="mpris_time_settings_summary">調整按下時快轉 / 倒轉的時間</string>
<string-array name="mpris_time_entries">
<item>10 秒鐘</item>
<item>20 秒鐘</item>
@@ -178,98 +178,98 @@
<item>1 分鐘</item>
<item>2 分鐘</item>
</string-array>
<string name="mpris_notifications_explanation">需要通知權限在通知欄顯示遠端媒體</string>
<string name="mpris_notification_settings_title">顯示媒體控制通知</string>
<string name="mpris_notification_settings_summary">允許控制您的媒體播放器而不需要開啟 KDE 連線</string>
<string name="mpris_notifications_explanation">需要通知權限才能在通知欄顯示遠端媒體</string>
<string name="mpris_notification_settings_title">顯示媒體控制通知</string>
<string name="mpris_notification_settings_summary">無需開啟 KDE Connect 即可控制您的媒體播放器</string>
<string name="share_to">分享給…</string>
<string name="unreachable_device">%s無法連線</string>
<string name="unreachable_device_url_share_text">分享給無法連線的裝置的網址會在該裝置重新連線後傳送給它。\n\n</string>
<string name="protocol_version_newer">此裝置使用較新的通訊協定</string>
<string name="plugin_settings_with_name">%s 設定</string>
<string name="unreachable_device">%s無法存取</string>
<string name="unreachable_device_url_share_text">分享網址 (URL) 到無法存取的裝置,將在該裝置變得可存取後再傳送過去。\n\n</string>
<string name="protocol_version_newer">此裝置使用較新的通訊協定版本</string>
<string name="plugin_settings_with_name">%s設定</string>
<string name="invalid_device_name">無效的裝置名稱</string>
<string name="shareplugin_text_saved">已接收文字,並且儲存到剪貼簿</string>
<string name="custom_devices_settings">自訂裝置列表</string>
<string name="custom_device_list"> IP 新增裝置</string>
<string name="custom_device_deleted">已刪除自訂裝置</string>
<string name="custom_device_list_help">未自動偵測到您的裝置,您可透過點「浮動作按鈕」來新增該裝置的 IP 位址或主機名稱</string>
<string name="custom_device_list">透過 IP 新增裝置</string>
<string name="custom_device_deleted">自訂裝置已刪除</string>
<string name="custom_device_list_help">如果未自動偵測到您的裝置,您可透過點「浮動作按鈕」來新增 IP 位址或主機名稱</string>
<string name="custom_device_fab_hint">新增裝置</string>
<string name="undo">復原</string>
<string name="share_notification_preference">通知方式</string>
<string name="share_notification_preference_summary">接收檔案時發出振動以及播放聲音</string>
<string name="share_destination_customize">自訂目標路徑</string>
<string name="share_destination_customize_summary_disabled">收到的檔案將會在 Downloads 上顯示。</string>
<string name="share_destination_customize_summary_enabled">檔案將儲存在下方所示的資料夾</string>
<string name="share_destination_folder_preference">目標路徑</string>
<string name="share_notification_preference_summary">接收檔案時振動並播放聲音</string>
<string name="share_destination_customize">自訂目標資料夾</string>
<string name="share_destination_customize_summary_disabled">收到的檔案將出現在「下載」資料夾中</string>
<string name="share_destination_customize_summary_enabled">檔案將儲存在下資料夾</string>
<string name="share_destination_folder_preference">目標資料夾</string>
<string name="share">分享</string>
<string name="share_received_file">分享「%s」</string>
<string name="title_activity_notification_filter">通知過濾器</string>
<string name="filter_apps_info">將會同步選取 App 的通知</string>
<string name="show_notification_if_screen_off">在螢幕關閉時傳送通知</string>
<string name="filter_apps_info">所選應用程式的通知將被同步</string>
<string name="show_notification_if_screen_off">在螢幕關閉時傳送通知</string>
<string name="add_device_dialog_title">新增裝置</string>
<string name="add_device_hint">主機名稱或 IP 位址</string>
<string name="sftp_preference_configured_storage_locations">設定儲存空間位置</string>
<string name="sftp_preference_add_storage_location_title">新增儲存空間位置</string>
<string name="sftp_preference_edit_storage_location">編輯儲存空間位置</string>
<string name="sftp_storage_preference_storage_location">儲存空間位置</string>
<string name="sftp_preference_configured_storage_locations">設定存放位置</string>
<string name="sftp_preference_add_storage_location_title">新增存放位置</string>
<string name="sftp_preference_edit_storage_location">編輯存放位置</string>
<string name="sftp_storage_preference_storage_location">存放位置</string>
<string name="sftp_storage_preference_storage_location_already_configured">此位置已被設定</string>
<string name="sftp_storage_preference_click_to_select">按一下選擇</string>
<string name="sftp_storage_preference_click_to_select">點擊以選擇</string>
<string name="sftp_storage_preference_display_name">顯示名稱</string>
<string name="sftp_storage_preference_display_name_already_used">此顯示名稱已被使用</string>
<string name="sftp_storage_preference_display_name_cannot_be_empty">顯示名稱不空白</string>
<string name="sftp_storage_preference_display_name_cannot_be_empty">顯示名稱不能為空白</string>
<string name="sftp_action_mode_menu_delete">刪除</string>
<string name="sftp_no_storage_locations_configured">未設定儲存空間位置</string>
<string name="sftp_saf_permission_explanation">要遠端存取檔案,您需先設定儲存空間位置</string>
<string name="sftp_manage_storage_permission_explanation">要允許遠端存取裝置的檔案,您需要允許 KDE 連線管理儲存裝置</string>
<string name="no_players_connected">沒有發現播放器</string>
<string name="sftp_no_storage_locations_configured">未設定存放位置</string>
<string name="sftp_saf_permission_explanation">要遠端存取檔案,您必須設定存放位置</string>
<string name="sftp_manage_storage_permission_explanation">要允許遠端存取裝置的檔案,您需要允許 KDE Connect 可以管理儲存空間</string>
<string name="no_players_connected">沒有找到播放器</string>
<string name="send_files">傳送檔案</string>
<string name="block_notification_contents">阻擋通知內容</string>
<string name="block_notification_images">阻擋通知圖片</string>
<string name="pairing_title">KDE 連線裝置</string>
<string name="pairing_description">您相同網域當中,有其他有執行KDE連線的裝置會出現在這裡</string>
<string name="pairing_title">KDE Connect 裝置</string>
<string name="pairing_description">同一網路中執行 KDE Connect 的其他裝置應該會出現在</string>
<string name="device_rename_title">重新命名裝置</string>
<string name="device_rename_confirm">變更名稱</string>
<string name="device_rename_confirm">重新命名</string>
<string name="refresh">重新整理</string>
<string name="unreachable_description">無法連結此配對裝置。請確保它連結到與您相同的網</string>
<string name="no_wifi">您尚未連線 Wi-Fi 網路,因此您可能無法看到任何裝置。按一下這裡啟用 Wi-Fi。</string>
<string name="unreachable_description">無法此配對裝置連結。請確保它連線至與您相同的網</string>
<string name="no_wifi">您尚未連線 Wi-Fi 網路,因此您可能無法看到任何裝置。點擊這裡啟用 Wi-Fi。</string>
<string name="on_non_trusted_message">不在信任網路:自動探索已停用。</string>
<string name="no_file_browser">沒有安裝檔案瀏覽程式</string>
<string name="no_file_browser">沒有安裝檔案瀏覽器。</string>
<string name="pref_plugin_telepathy">傳送簡訊</string>
<string name="pref_plugin_telepathy_desc">傳送文字訊到您的電腦桌面</string>
<string name="pref_plugin_telepathy_desc">傳送文字訊到您的電腦桌面</string>
<string name="pref_plugin_telepathy_mms">傳送 MMS</string>
<string name="pref_plugin_telepathy_mms_desc">要能夠從 KDE 連線傳送 MMS 您需要先將其設為預設簡訊應用程式。</string>
<string name="pref_plugin_telepathy_mms_desc">要能夠從 KDE Connect 傳送 MMS 您必須先將其設為預設簡訊應用程式。</string>
<string name="findmyphone_title">尋找我的手機</string>
<string name="findmyphone_title_tablet">尋找我的平板</string>
<string name="findmyphone_title_tv">尋找我的電視</string>
<string name="findmyphone_description">這個裝置發出聲響讓您能找到它</string>
<string name="findmyphone_description">裝置發出聲響以便您可以找到它</string>
<string name="findmyphone_found">找到裝置</string>
<string name="open">開啟</string>
<string name="close">關閉</string>
<string name="plugins_need_permission">部份的外掛程式需要權限才能運作(按一下以取得更多資訊)</string>
<string name="plugins_need_permission">部份的外掛程式需要權限才能運作(點擊以取得更多資訊)</string>
<string name="permission_explanation">這外掛程式需要權限以運作</string>
<string name="all_permissions_granted">提供所有權限 🎉</string>
<string name="optional_permission_explanation">你需要授予延伸的權限以啟用所有功能</string>
<string name="plugins_need_optional_permission">部份的外掛程式因為缺乏權限,而導致功能被停用。(按一下以了解更多資訊</string>
<string name="share_optional_permission_explanation">要接收檔案您需要允許存取儲存裝置</string>
<string name="share_notifications_explanation">要能夠看到傳送或接收檔案時的進度您需要允許通知</string>
<string name="telepathy_permission_explanation">為了要在您的個人電腦上讀取與撰寫簡訊,你需要提供簡訊權限</string>
<string name="telephony_permission_explanation">為了要在桌面上檢視手機通話,您需要提供手機通話記錄及手機狀態的權限</string>
<string name="telephony_optional_permission_explanation">為了要讓聯絡人名稱取代手機號碼,您需要提供手機通訊錄的權限</string>
<string name="contacts_permission_explanation">為了要與電腦分享您的通訊錄,您必須提供「聯絡人」的權限</string>
<string name="contacts_per_device_confirmation">您的電話通訊錄將會被複製到這個裝置,讓它們能夠被 KDE 連線簡訊應用程式和其他應用程式使用。</string>
<string name="all_permissions_granted">給予所有權限 🎉</string>
<string name="optional_permission_explanation">您必須給予額外權限才能啟用所有功能</string>
<string name="plugins_need_optional_permission">某些外掛程式由於缺乏權限功能被停用(點擊以了解更多):</string>
<string name="share_optional_permission_explanation">要接收檔案您必須允許存取儲存裝置</string>
<string name="share_notifications_explanation">要能夠看到傳送或接收檔案時的進度您必須允許通知</string>
<string name="telepathy_permission_explanation">要從電腦端傳送和讀取簡訊,您必須給予簡訊權限</string>
<string name="telephony_permission_explanation">要在電腦上查看手機通話,您必須給予電話通話紀錄和電話狀態的權限</string>
<string name="telephony_optional_permission_explanation">要查看聯絡人姓名而不是電話號碼,您必須給予存取手機聯絡人的權限</string>
<string name="contacts_permission_explanation">為了要與電腦分享您的通訊錄,您必須給予「聯絡人」的權限</string>
<string name="contacts_per_device_confirmation">您的電話通訊錄將會被複製到這個裝置,讓它們能夠被 KDE Connect 的簡訊應用程式和其他應用程式使用。</string>
<string name="select_ringtone">選擇一個鈴聲</string>
<string name="telephony_pref_blocked_title">封鎖號碼</string>
<string name="telephony_pref_blocked_dialog_desc">不顯示這些號碼的來電簡訊。請在一行指定一個電話號碼。</string>
<string name="mpris_coverart_description">目前媒體的專輯圖像</string>
<string name="telephony_pref_blocked_title">封鎖號碼</string>
<string name="telephony_pref_blocked_dialog_desc">不顯示這些號碼的來電簡訊。請行指定一個數字</string>
<string name="mpris_coverart_description">目前媒體的專輯封面</string>
<string name="settings_icon_description">設定圖示</string>
<string name="presenter_fullscreen">全螢幕</string>
<string name="presenter_exit">離開簡報模式</string>
<string name="presenter_lock_tip">您能鎖定裝置並使用音量鍵前往上 / 下一張投影片</string>
<string name="add_command">增加一行</string>
<string name="addcommand_explanation">沒有註冊的</string>
<string name="addcommand_explanation2">現在可以在 KDE 連線系統設定增加新的指</string>
<string name="add_command_description">您可以在電腦上增加</string>
<string name="add_command">增加一行</string>
<string name="addcommand_explanation">沒有註冊的</string>
<string name="addcommand_explanation2">您可以在 KDE Connect 系統設定中新增命</string>
<string name="add_command_description">您可以在電腦上增加</string>
<string name="pref_plugin_mprisreceiver">控制媒體播放器</string>
<string name="pref_plugin_mprisreceiver_desc">從另一個裝置操控您手機的媒體播放器</string>
<string name="pref_plugin_mprisreceiver_desc">從另一個裝置控製手機的媒體播放器</string>
<string name="notification_channel_default">其他通知</string>
<string name="notification_channel_persistent">持續性指示器</string>
<string name="notification_channel_media_control">多媒體控制</string>
@@ -278,16 +278,16 @@
<string name="notification_channel_filetransfer_error">檔案傳輸錯誤</string>
<string name="notification_channel_high_priority">高優先度</string>
<string name="mpris_stop">停止目前播放器</string>
<string name="copy_url_to_clipboard">複製 URL 剪貼簿</string>
<string name="copy_url_to_clipboard"> URL 複製到剪貼簿</string>
<string name="clipboard_toast">已複製到剪貼簿</string>
<string name="runcommand_notreachable">無法聯絡裝置</string>
<string name="runcommand_notreachable">裝置無法存取</string>
<string name="runcommand_notpaired">裝置未配對</string>
<string name="runcommand_nosuchdevice">此處沒有裝置</string>
<string name="runcommand_noruncommandplugin">裝置未啟用「執行令外掛程式」</string>
<string name="runcommand_nosuchdevice">沒有這樣的裝置</string>
<string name="runcommand_noruncommandplugin">裝置未啟用「執行令外掛程式」</string>
<string name="runcommand_category_device_controls_title">裝置控制</string>
<string name="runcommand_device_controls_summary">如果您的裝置支援「裝置控制」,您已設定的令將會出現在那裡。</string>
<string name="runcommand_device_controls_summary">如果您的裝置支援「裝置控制」,您已設定的令將會出現在那裡。</string>
<string name="set_runcommand_name_as_title">set_runcommand_name_as_title</string>
<string name="runcommand_name_as_title_title">將名稱為標題顯示</string>
<string name="runcommand_name_as_title_title">將名稱顯示為標題</string>
<string name="pref_plugin_findremotedevice">尋找遠端裝置</string>
<string name="pref_plugin_findremotedevice_desc">使遠端裝置響鈴</string>
<string name="ring">響鈴</string>
@@ -302,7 +302,7 @@
<string name="settings_more_settings_text">各裝置設定可在裝置內的「外掛程式設定」底下找到。</string>
<string name="setting_persistent_notification">顯示一致設定</string>
<string name="setting_persistent_notification_oreo">一致化通知</string>
<string name="setting_persistent_notification_description">按一下以在「通知設定」啟用或停用</string>
<string name="setting_persistent_notification_description">點擊以在「通知設定」啟用或停用</string>
<string name="extra_options">延伸選項</string>
<string name="privacy_options">隱私權選項</string>
<string name="set_privacy_options">設定隱私權選項</string>
@@ -310,15 +310,16 @@
<string name="block_images">阻擋通知中的圖片</string>
<string name="notification_channel_receivenotification">其他裝置上的通知</string>
<string name="no_app_for_opening">找不到適合用來開啟此檔案的應用程式</string>
<string name="remote_keyboard_service">KDE 連線遠端鍵盤</string>
<string name="presenter_pointer">指標裝置</string>
<string name="trusted_networks">信任網路</string>
<string name="remote_keyboard_service">KDE Connect 遠端鍵盤</string>
<string name="presenter_pointer">滑鼠游標</string>
<string name="trusted_networks">信任網路</string>
<string name="trusted_networks_desc">限制只對已知網路自動探索</string>
<string name="add_trusted_network">加入 %1s</string>
<string name="empty_trusted_networks_list_text">您尚未加入任何信任網路</string>
<string name="empty_trusted_networks_list_text">您尚未加入任何信任網路</string>
<string name="allow_all_networks_text">全部允許</string>
<string name="location_permission_needed_title">需要權限</string>
<string name="location_permission_needed_desc">KDE 連線需要背景位置權限,才能在背景執行時也能知道您目前所連線的 WiFi 網路。這是因為您週遭的 WiFi 網路名稱可以被用來推斷您的位置,即使這不是 KDE 連線在做的事情</string>
<string name="bluetooth_permission_needed_desc">KDE Connect 需要連線到附近裝置的權限,以便在 KDE Connect 中使用藍牙進行配對</string>
<string name="location_permission_needed_desc">KDE Connect 需要背景位置權限,才能在背景執行時也能知道您目前所連線的 WiFi 網路。這是因為您週遭的 WiFi 網路名稱可以被用來推斷您的位置,即使這不是 KDE Connect 在做的事情。</string>
<string name="clipboard_android_x_incompat">Android 10 已移除所有應用程式的剪貼簿存取權限。此外掛程式將停用。</string>
<string name="mpris_open_url">繼續在此播放</string>
<string name="cant_open_url">無法開啟 URL 以繼續播放</string>
@@ -329,12 +330,12 @@
<string name="bigscreen_right"></string>
<string name="bigscreen_down"></string>
<string name="bigscreen_mic">麥克風</string>
<string name="pref_plugin_bigscreen">全覽螢幕遠端</string>
<string name="pref_plugin_bigscreen_desc">裝置作為 Plasma 全覽螢幕的遠端控制</string>
<string name="bigscreen_optional_permission_explanation">為了與電腦共享手機麥克風端的音效輸入,需要您允許本軟體存取手機的音輸入權限</string>
<string name="pref_plugin_bigscreen">大螢幕遙控器</string>
<string name="pref_plugin_bigscreen_desc">使用您的裝置作為 Plasma Bigscreen 的遙控</string>
<string name="bigscreen_optional_permission_explanation">為了與電腦共享手機麥克風端的音效輸入,需要您允許本軟體存取手機的音輸入權限</string>
<string name="bigscreen_speech_extra_prompt">聲控功能</string>
<string name="message_reply_label">回覆</string>
<string name="mark_as_read_label">為已讀</string>
<string name="mark_as_read_label">為已讀</string>
<string name="user_display_name"></string>
<string name="set_default_sms_app_title">傳送 MMS</string>
<string name="set_group_message_as_mms_title">傳送群組 MMS</string>
@@ -367,18 +368,22 @@
<string name="authors">作者群</string>
<string name="thanks_to">感謝</string>
<string name="easter_egg">Easter Egg</string>
<string name="email_contributor">發信給貢獻者\n%s</string>
<string name="email_contributor">傳送電子郵件給貢獻者\n%s</string>
<string name="visit_contributors_homepage">造訪貢獻者的首頁\n%s</string>
<string name="version">版本 %s</string>
<string name="about_kde">關於 KDE</string>
<string name="kde_be_free">KDE ─ 擁抱自由!</string>
<string name="kde">KDE</string>
<string name="konqi">Konqi</string>
<string name="click_here_to_type">按這裡來打字</string>
<string name="rise_up">往上</string>
<string name="rise_down">往下</string>
<string name="click_here_to_type">點擊這裡以打字</string>
<string name="clear_compose">清除</string>
<string name="send_compose">傳送</string>
<string name="compose_send_title">撰寫傳送</string>
<string name="open_compose_send">撰寫簡訊</string>
<string name="double_tap_to_drag">雙擊以拖曳</string>
<string name="hold_to_drag">按住以拖曳</string>
<string name="about_kde_about">&lt;h1&gt;關於&lt;/h1&gt;&lt;p&gt;KDE 是一個由眾多軟體工程師、藝術作業者、文字作業者、翻譯人員和其他有志於&lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;自由軟體&lt;/a&gt;事業的人們組成的世界性社群。KDE 做出了 Plasma 桌面環境、數百個應用程式和支援它們的軟體函式庫。&lt;/p&gt;&lt;p&gt;KDE 團隊不受任何單獨的團體、公司或機構控制。我們的目標是一同為製作世界上最好的自由軟體而努力。我們歡迎任何人&lt;a href=https://community.kde.org/Get_Involved&gt;加入並作出貢獻&lt;/a&gt;——包含您。&lt;/p&gt;請造訪 &lt;a href=&amp;quot;https://www.kde.org/&amp;quot;&gt;https://www.kde.org/&lt;/a&gt; 來了解有關 KDE 社群與我們所做的軟體的更多資訊。</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;回報問題或希望功能&lt;/h1&gt;&lt;p&gt;軟體總是可以改善,而 KDE 團隊準備好繼續此項工作。不過您 — 作為使用者 — 需要在有東西沒有正常運作或是可以更好的時候告訴我們。&lt;/p&gt;&lt;p&gt;KDE 有一個問題追蹤系統。請造訪 &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; 或是從關於頁面使用「回報問題」按鈕來回報問題。&lt;/p&gt;如果您有改善的建議您也可以使用問題追蹤系統來寫下您的希望。此時請使用「Wishlist」願望清單作為問題的嚴重程度。</string>
<string name="about_kde_join_kde">&lt;h1&gt;加入 KDE&lt;/h1&gt;&lt;p&gt;您不需要是軟體工程師也能加入 KDE 團隊。您可以加入翻譯團隊來翻譯程式的介面。您可以提供圖形、佈景主題、音效,或幫忙撰寫文件,看您喜歡做哪一項。&lt;/p&gt;&lt;p&gt;請參考 &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; 上的資訊看看您能幫上什麼忙。&lt;/p&gt;如果您需要更多資訊或說明文件,請參照 &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt;,上面會有一些能幫忙您的資訊。</string>
@@ -390,19 +395,21 @@
<string name="samoilenko_yuri_task">SFTP 的實作、錯誤修正與一般改進</string>
<string name="aniket_kumar_task">簡訊外掛程式的改善</string>
<string name="alex_fiestas_task">聯絡人外掛程式的改善</string>
<string name="maxim_leshchenko_task">使用者介面的改善,以及這個關於頁面</string>
<string name="maxim_leshchenko_task">使用者介面的改善,以及此「關於頁面</string>
<string name="holger_kaelberer_task">遠端鍵盤外掛程式與問題修正</string>
<string name="saikrishna_arcot_task">在遠端輸入外掛程式中對於鍵盤的支援、錯誤修正一般改進</string>
<string name="everyone_else">其他所有這些年來向 KDE 連線貢獻的人們</string>
<string name="saikrishna_arcot_task">支援在遠端輸入外掛程式中使用鍵盤、錯誤修正一般改進</string>
<string name="shellwen_chen_task">改善 SFTP 的安全性、改善此專案的可維護性,錯誤修正和一般改進</string>
<string name="everyone_else">這些年來為 KDE Connect 做出貢獻的所有其他人</string>
<string name="send_clipboard">傳送剪貼簿</string>
<string name="tap_to_execute">按一下執行</string>
<string name="tap_to_execute">點擊以執行</string>
<string name="plugin_stats">外掛程式統計</string>
<string name="enable_udp_broadcast">啟用 UDP 裝置探索</string>
<string name="receive_notifications_permission_explanation">需要允許通知才能接收來自其他裝置的通知</string>
<string name="findmyphone_notifications_explanation">需要通知權限讓應用程式在背景時也能讓手機響鈴</string>
<string name="no_notifications">通知已停用,您不會接收到送來的配對請求。</string>
<string name="enable_bluetooth">啟用藍牙 (beta)</string>
<string name="receive_notifications_permission_explanation">需要被允許從其他裝置收到通知</string>
<string name="findmyphone_notifications_explanation">需要通知權限,以便當應用程式在背景時手機可以響鈴</string>
<string name="no_notifications">通知已停用,您將不會收到傳入的配對通知。</string>
<string name="mpris_keepwatching">繼續播放</string>
<string name="mpris_keepwatching_settings_title">繼續播放</string>
<string name="mpris_keepwatching_settings_summary">關閉媒體後在此裝置顯示繼續播放用的靜音通知</string>
<string name="mpris_keepwatching_settings_summary">顯示無聲通知以在關閉媒體後繼續在此裝置上播放</string>
<string name="notification_channel_keepwatching">繼續播放</string>
</resources>

View File

@@ -85,6 +85,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="mousepad_scroll_sensitivity_title">Scroll sensitivity</string>
<string name="gyro_mouse_enabled" translatable="false">gyro_mouse_enabled</string>
<string name="mousepad_mouse_buttons_enabled_pref" translatable="false">mouse_buttons_enabled</string>
<string name="mousepad_doubletap_drag_enabled_pref" translatable="false">doubletap_drag_enabled</string>
<string name="gyro_mouse_enabled_title">Enable gyroscope mouse</string>
<string name="gyro_mouse_sensitivity_title">Gyroscope sensitivity</string>
<string name="gyro_mouse_sensitivity" translatable="false">gyro_mouse_sensitivity</string>
@@ -423,6 +424,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="allow_all_networks_text">Allow all</string>
<string name="location_permission_needed_title">Permission required</string>
<string name="bluetooth_permission_needed_desc">KDE Connect needs permission to connect to nearby devices to make devices paired using Bluetooth available in KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect needs the background location permission to know the WiFi network you are connected to even when the app is in the background. This is because the name of the WiFi networks around you could be used to find your location, even when this is not what KDE Connect does.</string>
<string name="clipboard_android_x_incompat">Android 10 has removed clipboard access to all apps. This plugin will be disabled.</string>
<string name="mpris_open_url">Continue playing here</string>
@@ -513,6 +515,8 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="send_compose">Send</string>
<string name="compose_send_title">Compose send</string>
<string name="open_compose_send">Compose text</string>
<string name="double_tap_to_drag">Double tap to drag</string>
<string name="hold_to_drag">Hold to drag</string>
<string name="about_kde_about"><![CDATA[
<h1>About</h1>
@@ -564,6 +568,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="plugin_stats">Plugin stats</string>
<string name="enable_udp_broadcast">Enable UDP device discovery</string>
<string name="enable_bluetooth">Enable bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Notifications need to be allowed to receive them from other devices</string>
<string name="findmyphone_notifications_explanation">The notifications permission is needed so the phone can ring when the app is in the background</string>

View File

@@ -90,6 +90,15 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:key="@string/mousepad_mouse_buttons_enabled_pref"
android:title="@string/mousepad_mouse_buttons_title" />
<SwitchPreference
android:id="@+id/mousepad_double_tap_drag_enabled_pref"
android:defaultValue="true"
android:key="@string/mousepad_doubletap_drag_enabled_pref"
android:title="Drag and drop behavior"
android:summaryOn="@string/double_tap_to_drag"
android:summaryOff="@string/hold_to_drag"
/>
<org.kde.kdeconnect.Helpers.LongSummaryPreferenceCategory
android:key="@string/sendkeystrokes_pref_category"

View File

@@ -109,7 +109,14 @@ public class LanLinkProvider extends BaseLinkProvider {
}
Log.i("KDE/LanLinkProvider", "identity packet received from a TCP connection from " + networkPacket.getString("deviceName"));
identityPacketReceived(networkPacket, socket, LanLink.ConnectionStarted.Locally);
boolean deviceTrusted = isDeviceTrusted(networkPacket.getString("deviceId"));
if (!deviceTrusted && !TrustedNetworkHelper.isTrustedNetwork(context)) {
Log.i("KDE/LanLinkProvider", "Ignoring identity packet because the device is not trusted and I'm not on a trusted network.");
return;
}
identityPacketReceived(networkPacket, socket, LanLink.ConnectionStarted.Locally, deviceTrusted);
}
//I've received their broadcast and should connect to their TCP socket and send my identity.
@@ -149,6 +156,12 @@ public class LanLinkProvider extends BaseLinkProvider {
Log.i("KDE/LanLinkProvider", "Broadcast identity packet received from " + identityPacket.getString("deviceName"));
boolean deviceTrusted = isDeviceTrusted(identityPacket.getString("deviceId"));
if (!deviceTrusted && !TrustedNetworkHelper.isTrustedNetwork(context)) {
Log.i("KDE/LanLinkProvider", "Ignoring identity packet because the device is not trusted and I'm not on a trusted network.");
return;
}
SocketFactory socketFactory = SocketFactory.getDefault();
Socket socket = socketFactory.createSocket(address, tcpPort);
configureSocket(socket);
@@ -160,7 +173,7 @@ public class LanLinkProvider extends BaseLinkProvider {
out.write(myIdentity.serialize().getBytes());
out.flush();
identityPacketReceived(identityPacket, socket, LanLink.ConnectionStarted.Remotely);
identityPacketReceived(identityPacket, socket, LanLink.ConnectionStarted.Remotely, deviceTrusted);
}
private void configureSocket(Socket socket) {
@@ -171,6 +184,11 @@ public class LanLinkProvider extends BaseLinkProvider {
}
}
private boolean isDeviceTrusted(String deviceId) {
SharedPreferences preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
return preferences.getBoolean(deviceId, false);
}
/**
* Called when a new 'identity' packet is received. Those are passed here by
* {@link #tcpPacketReceived(Socket)} and {@link #udpPacketReceived(DatagramPacket)}.
@@ -184,9 +202,10 @@ public class LanLinkProvider extends BaseLinkProvider {
* @param identityPacket identity of a remote device
* @param socket a new Socket, which should be used to receive packets from the remote device
* @param connectionStarted which side started this connection
* @param deviceTrusted whether the packet comes from a trusted device
*/
@WorkerThread
private void identityPacketReceived(final NetworkPacket identityPacket, final Socket socket, final LanLink.ConnectionStarted connectionStarted) throws IOException {
private void identityPacketReceived(final NetworkPacket identityPacket, final Socket socket, final LanLink.ConnectionStarted connectionStarted, final boolean deviceTrusted) throws IOException {
if (!DeviceInfo.isValidIdentityPacket(identityPacket)) {
Log.w("KDE/LanLinkProvider", "Invalid identity packet received.");
@@ -203,10 +222,7 @@ public class LanLinkProvider extends BaseLinkProvider {
// If I'm the TCP server I will be the SSL client and viceversa.
final boolean clientMode = (connectionStarted == LanLink.ConnectionStarted.Locally);
SharedPreferences preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
boolean isDeviceTrusted = preferences.getBoolean(deviceId, false);
if (isDeviceTrusted && !SslHelper.isCertificateStored(context, deviceId)) {
if (deviceTrusted && !SslHelper.isCertificateStored(context, deviceId)) {
//Device paired with and old version, we can't use it as we lack the certificate
Device device = KdeConnect.getInstance().getDevice(deviceId);
if (device == null) {
@@ -214,13 +230,13 @@ public class LanLinkProvider extends BaseLinkProvider {
}
device.unpair();
//Retry as unpaired
identityPacketReceived(identityPacket, socket, connectionStarted);
identityPacketReceived(identityPacket, socket, connectionStarted, deviceTrusted);
}
String deviceName = identityPacket.getString("deviceName", "unknown");
Log.i("KDE/LanLinkProvider", "Starting SSL handshake with " + deviceName + " trusted:" + isDeviceTrusted);
Log.i("KDE/LanLinkProvider", "Starting SSL handshake with " + deviceName + " trusted:" + deviceTrusted);
final SSLSocket sslSocket = SslHelper.convertToSslSocket(context, socket, deviceId, isDeviceTrusted, clientMode);
final SSLSocket sslSocket = SslHelper.convertToSslSocket(context, socket, deviceId, deviceTrusted, clientMode);
sslSocket.addHandshakeCompletedListener(event -> {
String mode = clientMode ? "client" : "server";
try {

View File

@@ -1,91 +0,0 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Backends.LanBackend;
import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo;
import android.util.Log;
import androidx.annotation.NonNull;
import java.util.LinkedList;
public class NsdResolveQueue {
static final String LOG_TAG = "NsdResolveQueue";
final @NonNull NsdManager mNsdManager;
private final Object mLock = new Object();
private final LinkedList<PendingResolve> mResolveRequests = new LinkedList<>();
public NsdResolveQueue(NsdManager nsdManager) {
this.mNsdManager = nsdManager;
}
private static class PendingResolve {
final @NonNull NsdServiceInfo serviceInfo;
final @NonNull NsdManager.ResolveListener listener;
private PendingResolve(@NonNull NsdServiceInfo serviceInfo, @NonNull NsdManager.ResolveListener listener) {
this.serviceInfo = serviceInfo;
this.listener = listener;
}
}
public void resolveOrEnqueue(@NonNull NsdServiceInfo serviceInfo, @NonNull NsdManager.ResolveListener listener) {
synchronized (mLock) {
for (PendingResolve existing : mResolveRequests) {
if (serviceInfo.getServiceName().equals(existing.serviceInfo.getServiceName())) {
Log.i(LOG_TAG, "Not enqueuing a new resolve request for the same service: " + serviceInfo.getServiceName());
return;
}
}
mResolveRequests.addLast(new PendingResolve(serviceInfo, new ListenerWrapper(listener)));
if (mResolveRequests.size() == 1) {
resolveNextRequest();
}
}
}
private class ListenerWrapper implements NsdManager.ResolveListener {
private final @NonNull NsdManager.ResolveListener mListener;
private ListenerWrapper(@NonNull NsdManager.ResolveListener listener) {
mListener = listener;
}
@Override
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
mListener.onResolveFailed(serviceInfo, errorCode);
synchronized (mLock) {
mResolveRequests.pop();
resolveNextRequest();
}
}
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo) {
mListener.onServiceResolved(serviceInfo);
synchronized (mLock) {
mResolveRequests.pop();
resolveNextRequest();
}
}
}
private void resolveNextRequest() {
if (!mResolveRequests.isEmpty()) {
PendingResolve request = mResolveRequests.getFirst();
mNsdManager.resolveService(request.serviceInfo, request.listener);
}
}
}

View File

@@ -0,0 +1,66 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Backends.LanBackend
import android.net.nsd.NsdManager
import android.net.nsd.NsdServiceInfo
import android.util.Log
import java.util.LinkedList
class NsdResolveQueue {
val LOG_TAG: String = "NsdResolveQueue"
private val nsdManager: NsdManager
private val lock: Any
private data class PendingResolve(val serviceInfo: NsdServiceInfo, val listener: NsdManager.ResolveListener)
private val resolveRequests: LinkedList<PendingResolve>
constructor(nsdManager: NsdManager) {
this.nsdManager = nsdManager
this.lock = Any()
this.resolveRequests = LinkedList<PendingResolve>()
}
fun resolveOrEnqueue(serviceInfo: NsdServiceInfo, listener: NsdManager.ResolveListener) {
synchronized(lock) {
if (resolveRequests.any { r -> serviceInfo.serviceName == r.serviceInfo.serviceName }) {
Log.i(LOG_TAG, "Not enqueuing a new resolve request for the same service: " + serviceInfo.serviceName)
return
}
resolveRequests.addLast(PendingResolve(serviceInfo, ListenerWrapper(listener)))
if (resolveRequests.size == 1) {
resolveNextRequest()
}
}
}
private inner class ListenerWrapper(private val listener: NsdManager.ResolveListener) : NsdManager.ResolveListener {
override fun onResolveFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {
listener.onResolveFailed(serviceInfo, errorCode)
postResolve()
}
override fun onServiceResolved(serviceInfo: NsdServiceInfo) {
listener.onServiceResolved(serviceInfo)
postResolve()
}
private fun postResolve() {
synchronized(lock) {
resolveRequests.pop()
resolveNextRequest()
}
}
}
private fun resolveNextRequest() {
if (resolveRequests.isNotEmpty()) {
val request = resolveRequests.first
nsdManager.resolveService(request.serviceInfo, request.listener)
}
}
}

View File

@@ -1,50 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Backends.LoopbackBackend;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
import org.kde.kdeconnect.Backends.BaseLink;
import org.kde.kdeconnect.Backends.BaseLinkProvider;
import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.DeviceInfo;
import org.kde.kdeconnect.Helpers.DeviceHelper;
import org.kde.kdeconnect.NetworkPacket;
public class LoopbackLink extends BaseLink {
public LoopbackLink(Context context, BaseLinkProvider linkProvider) {
super(context, linkProvider);
}
@Override
public String getName() {
return "LoopbackLink";
}
@WorkerThread
@Override
public boolean sendPacket(@NonNull NetworkPacket in, @NonNull Device.SendPacketStatusCallback callback, boolean sendPayloadFromSameThread) {
packetReceived(in);
if (in.hasPayload()) {
callback.onPayloadProgressChanged(0);
in.setPayload(in.getPayload());
callback.onPayloadProgressChanged(100);
}
callback.onSuccess();
return true;
}
@Override
public DeviceInfo getDeviceInfo() {
return DeviceHelper.getDeviceInfo(context);
}
}

View File

@@ -0,0 +1,34 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Backends.LoopbackBackend
import android.content.Context
import androidx.annotation.WorkerThread
import org.kde.kdeconnect.Backends.BaseLink
import org.kde.kdeconnect.Backends.BaseLinkProvider
import org.kde.kdeconnect.Device
import org.kde.kdeconnect.DeviceInfo
import org.kde.kdeconnect.Helpers.DeviceHelper.getDeviceInfo
import org.kde.kdeconnect.NetworkPacket
class LoopbackLink : BaseLink {
constructor(context: Context, linkProvider: BaseLinkProvider) : super(context, linkProvider)
override fun getName(): String = "LoopbackLink"
override fun getDeviceInfo(): DeviceInfo = getDeviceInfo(context)
@WorkerThread
override fun sendPacket(packet: NetworkPacket, callback: Device.SendPacketStatusCallback, sendPayloadFromSameThread: Boolean): Boolean {
packetReceived(packet)
if (packet.hasPayload()) {
callback.onPayloadProgressChanged(0)
packet.payload = packet.payload // this triggers logic in the setter
callback.onPayloadProgressChanged(100)
}
callback.onSuccess()
return true
}
}

View File

@@ -1,46 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Backends.LoopbackBackend;
import android.content.Context;
import android.net.Network;
import androidx.annotation.Nullable;
import org.kde.kdeconnect.Backends.BaseLinkProvider;
public class LoopbackLinkProvider extends BaseLinkProvider {
private final Context context;
public LoopbackLinkProvider(Context context) {
this.context = context;
}
@Override
public void onStart() {
onNetworkChange(null);
}
@Override
public void onStop() {
}
@Override
public void onNetworkChange(@Nullable Network network) {
LoopbackLink link = new LoopbackLink(context, this);
onConnectionReceived(link);
}
@Override
public String getName() {
return "LoopbackLinkProvider";
}
@Override
public int getPriority() { return 0; }
}

View File

@@ -0,0 +1,32 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Backends.LoopbackBackend
import android.content.Context
import android.net.Network
import org.kde.kdeconnect.Backends.BaseLinkProvider
class LoopbackLinkProvider : BaseLinkProvider {
private val context: Context
constructor(context: Context) : super() {
this.context = context
}
override fun getName(): String = "LoopbackLinkProvider"
override fun getPriority(): Int = 0
override fun onStart() {
onNetworkChange(null)
}
override fun onStop() { }
override fun onNetworkChange(network: Network?) {
val link = LoopbackLink(context, this)
onConnectionReceived(link)
}
}

View File

@@ -1,304 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect;
import android.Manifest;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Build;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import org.kde.kdeconnect.Backends.BaseLinkProvider;
import org.kde.kdeconnect.Backends.BluetoothBackend.BluetoothLinkProvider;
import org.kde.kdeconnect.Backends.LanBackend.LanLinkProvider;
import org.kde.kdeconnect.Helpers.NotificationHelper;
import org.kde.kdeconnect.Plugins.ClibpoardPlugin.ClipboardFloatingActivity;
import org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandActivity;
import org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandPlugin;
import org.kde.kdeconnect.Plugins.SharePlugin.SendFileActivity;
import org.kde.kdeconnect.UserInterface.MainActivity;
import org.kde.kdeconnect_tp.R;
import java.util.ArrayList;
/*
* This class (still) does 3 things:
* - Keeps the app running by creating a foreground notification.
* - Holds references to the active LinkProviders, but doesn't handle the DeviceLink those create (the KdeConnect class does that).
* - Listens for network connectivity changes and tells the LinkProviders to re-check for devices.
* It can be started by the KdeConnectBroadcastReceiver on some events or when the MainActivity is launched.
*/
public class BackgroundService extends Service {
private static final int FOREGROUND_NOTIFICATION_ID = 1;
private static BackgroundService instance;
private KdeConnect applicationInstance;
private final ArrayList<BaseLinkProvider> linkProviders = new ArrayList<>();
public static BackgroundService getInstance() {
return instance;
}
private static boolean initialized = false;
// This indicates when connected over wifi/usb/bluetooth/(anything other than cellular)
private final MutableLiveData<Boolean> connectedToNonCellularNetwork = new MutableLiveData<>();
public LiveData<Boolean> isConnectedToNonCellularNetwork() {
return connectedToNonCellularNetwork;
}
public void updateForegroundNotification() {
if (NotificationHelper.isPersistentNotificationEnabled(this)) {
//Update the foreground notification with the currently connected device list
NotificationManager nm = ContextCompat.getSystemService(this, NotificationManager.class);
nm.notify(FOREGROUND_NOTIFICATION_ID, createForegroundNotification());
}
}
private void registerLinkProviders() {
linkProviders.add(new LanLinkProvider(this));
// linkProviders.add(new LoopbackLinkProvider(this));
linkProviders.add(new BluetoothLinkProvider(this));
}
public void onNetworkChange(@Nullable Network network) {
if (!initialized) {
Log.d("KDE/BackgroundService", "ignoring onNetworkChange called before the service is initialized");
return;
}
Log.d("KDE/BackgroundService", "onNetworkChange");
for (BaseLinkProvider a : linkProviders) {
a.onNetworkChange(network);
}
}
public void addConnectionListener(BaseLinkProvider.ConnectionReceiver cr) {
for (BaseLinkProvider a : linkProviders) {
a.addConnectionReceiver(cr);
}
}
public void removeConnectionListener(BaseLinkProvider.ConnectionReceiver cr) {
for (BaseLinkProvider a : linkProviders) {
a.removeConnectionReceiver(cr);
}
}
//This will called only once, even if we launch the service intent several times
@Override
public void onCreate() {
super.onCreate();
Log.d("KdeConnect/BgService", "onCreate");
instance = this;
KdeConnect.getInstance().addDeviceListChangedCallback("BackgroundService", this::updateForegroundNotification);
// Register screen on listener
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
// See: https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
}
registerReceiver(new KdeConnectBroadcastReceiver(), filter);
// Watch for changes on all network connections except cellular networks
NetworkRequest.Builder networkRequestBuilder = getNonCellularNetworkRequestBuilder();
ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.registerNetworkCallback(networkRequestBuilder.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
Log.i("BackgroundService", "Valid network available");
connectedToNonCellularNetwork.postValue(true);
onNetworkChange(network);
}
@Override
public void onLost(Network network) {
Log.i("BackgroundService", "Valid network lost");
connectedToNonCellularNetwork.postValue(false);
}
});
applicationInstance = KdeConnect.getInstance();
registerLinkProviders();
addConnectionListener(applicationInstance.getConnectionListener()); // Link Providers need to be already registered
for (BaseLinkProvider a : linkProviders) {
a.onStart();
}
initialized = true;
}
private static NetworkRequest.Builder getNonCellularNetworkRequestBuilder() {
NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_VPN)
.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE);
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) {
networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_USB)
.addTransportType(NetworkCapabilities.TRANSPORT_LOWPAN);
}
return networkRequestBuilder;
}
public void changePersistentNotificationVisibility(boolean visible) {
if (visible) {
updateForegroundNotification();
} else {
Stop();
Start(this);
}
}
private Notification createForegroundNotification() {
//Why is this needed: https://developer.android.com/guide/components/services#Foreground
ArrayList<String> connectedDevices = new ArrayList<>();
ArrayList<String> connectedDeviceIds = new ArrayList<>();
for (Device device : applicationInstance.getDevices().values()) {
if (device.isReachable() && device.isPaired()) {
connectedDeviceIds.add(device.getDeviceId());
connectedDevices.add(device.getName());
}
}
Intent intent = new Intent(this, MainActivity.class);
if (connectedDeviceIds.size() == 1) {
// Force open screen of the only connected device
intent.putExtra(MainActivity.EXTRA_DEVICE_ID, connectedDeviceIds.get(0));
}
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
NotificationCompat.Builder notification = new NotificationCompat.Builder(this, NotificationHelper.Channels.PERSISTENT);
notification
.setSmallIcon(R.drawable.ic_notification)
.setOngoing(true)
.setContentIntent(pi)
.setPriority(NotificationCompat.PRIORITY_MIN) //MIN so it's not shown in the status bar before Oreo, on Oreo it will be bumped to LOW
.setShowWhen(false)
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)
.setAutoCancel(false);
notification.setGroup("BackgroundService");
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
//Pre-oreo, the notification will have an empty title line without this
notification.setContentTitle(getString(R.string.kde_connect));
}
if (connectedDevices.isEmpty()) {
notification.setContentText(getString(R.string.foreground_notification_no_devices));
} else {
notification.setContentText(getString(R.string.foreground_notification_devices, TextUtils.join(", ", connectedDevices)));
// Adding an action button to send clipboard manually in Android 10 and later.
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P &&
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_LOGS) == PackageManager.PERMISSION_DENIED) {
Intent sendClipboard = ClipboardFloatingActivity.getIntent(this, true);
PendingIntent sendPendingClipboard = PendingIntent.getActivity(this, 3, sendClipboard, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
notification.addAction(0, getString(R.string.foreground_notification_send_clipboard), sendPendingClipboard);
}
if (connectedDeviceIds.size() == 1) {
String deviceId = connectedDeviceIds.get(0);
Device device = KdeConnect.getInstance().getDevice(deviceId);
if (device != null) {
// Adding two action buttons only when there is a single device connected.
// Setting up Send File Intent.
Intent sendFile = new Intent(this, SendFileActivity.class);
sendFile.putExtra("deviceId", deviceId);
PendingIntent sendPendingFile = PendingIntent.getActivity(this, 1, sendFile, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
notification.addAction(0, getString(R.string.send_files), sendPendingFile);
// Checking if there are registered commands and adding the button.
RunCommandPlugin plugin = (RunCommandPlugin) device.getPlugin("RunCommandPlugin");
if (plugin != null && !plugin.getCommandList().isEmpty()) {
Intent runCommand = new Intent(this, RunCommandActivity.class);
runCommand.putExtra("deviceId", connectedDeviceIds.get(0));
PendingIntent runPendingCommand = PendingIntent.getActivity(this, 2, runCommand, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
notification.addAction(0, getString(R.string.pref_plugin_runcommand), runPendingCommand);
}
}
}
}
return notification.build();
}
@Override
public void onDestroy() {
Log.d("KdeConnect/BgService", "onDestroy");
initialized = false;
for (BaseLinkProvider a : linkProviders) {
a.onStop();
}
KdeConnect.getInstance().removeDeviceListChangedCallback("BackgroundService");
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("KDE/BackgroundService", "onStartCommand");
if (NotificationHelper.isPersistentNotificationEnabled(this)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
startForeground(FOREGROUND_NOTIFICATION_ID, createForegroundNotification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE);
} else {
startForeground(FOREGROUND_NOTIFICATION_ID, createForegroundNotification());
}
}
if (intent != null && intent.getBooleanExtra("refresh", false)) {
onNetworkChange(null);
}
return Service.START_STICKY;
}
public static void Start(Context context) {
Log.d("KDE/BackgroundService", "Start");
Intent intent = new Intent(context, BackgroundService.class);
ContextCompat.startForegroundService(context, intent);
}
public static void ForceRefreshConnections(Context context) {
Log.d("KDE/BackgroundService", "ForceRefreshConnections");
Intent intent = new Intent(context, BackgroundService.class);
intent.putExtra("refresh", true);
ContextCompat.startForegroundService(context, intent);
}
public void Stop() {
stopForeground(true);
}
}

View File

@@ -0,0 +1,291 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect
import android.Manifest
import android.app.Notification
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.content.pm.ServiceInfo
import android.net.ConnectivityManager
import android.net.ConnectivityManager.NetworkCallback
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import android.os.Build
import android.os.IBinder
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import org.kde.kdeconnect.Backends.BaseLinkProvider
import org.kde.kdeconnect.Backends.BaseLinkProvider.ConnectionReceiver
import org.kde.kdeconnect.Backends.BluetoothBackend.BluetoothLinkProvider
import org.kde.kdeconnect.Backends.LanBackend.LanLinkProvider
import org.kde.kdeconnect.Helpers.NotificationHelper
import org.kde.kdeconnect.Plugins.ClibpoardPlugin.ClipboardFloatingActivity
import org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandActivity
import org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandPlugin
import org.kde.kdeconnect.Plugins.SharePlugin.SendFileActivity
import org.kde.kdeconnect.UserInterface.MainActivity
import org.kde.kdeconnect_tp.R
/**
* This class (still) does 3 things:
* - Keeps the app running by creating a foreground notification.
* - Holds references to the active LinkProviders, but doesn't handle the DeviceLink those create (the KdeConnect class does that).
* - Listens for network connectivity changes and tells the LinkProviders to re-check for devices.
* It can be started by the KdeConnectBroadcastReceiver on some events or when the MainActivity is launched.
*/
class BackgroundService : Service() {
private lateinit var applicationInstance: KdeConnect
private val linkProviders = ArrayList<BaseLinkProvider>()
private val connectedToNonCellularNetwork = MutableLiveData<Boolean>()
/** Indicates whether device is connected over wifi / usb / bluetooth / (anything other than cellular) */
val isConnectedToNonCellularNetwork: LiveData<Boolean>
get() = connectedToNonCellularNetwork
fun updateForegroundNotification() {
if (NotificationHelper.isPersistentNotificationEnabled(this)) {
// Update the foreground notification with the currently connected device list
val notificationManager = getSystemService<NotificationManager>()
notificationManager?.notify(FOREGROUND_NOTIFICATION_ID, createForegroundNotification())
}
}
private fun registerLinkProviders() {
linkProviders.add(LanLinkProvider(this))
//linkProviders.add(LoopbackLinkProvider(this))
linkProviders.add(BluetoothLinkProvider(this))
}
fun onNetworkChange(network: Network?) {
if (!initialized) {
Log.d(LOG_TAG, "ignoring onNetworkChange called before the service is initialized")
return
}
Log.d(LOG_TAG, "onNetworkChange")
for (linkProvider in linkProviders) {
linkProvider.onNetworkChange(network)
}
}
fun addConnectionListener(connectionReceiver: ConnectionReceiver) {
for (linkProvider in linkProviders) {
linkProvider.addConnectionReceiver(connectionReceiver)
}
}
fun removeConnectionListener(connectionReceiver: ConnectionReceiver) {
for (linkProvider in linkProviders) {
linkProvider.removeConnectionReceiver(connectionReceiver)
}
}
/** This will called only once, even if we launch the service intent several times */
override fun onCreate() {
super.onCreate()
Log.d("KdeConnect/BgService", "onCreate")
this.applicationInstance = KdeConnect.getInstance()
instance = this
KdeConnect.getInstance().addDeviceListChangedCallback("BackgroundService", this::updateForegroundNotification)
// Register screen on listener
val filter = IntentFilter(Intent.ACTION_SCREEN_ON)
// See: https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
}
registerReceiver(KdeConnectBroadcastReceiver(), filter)
// Watch for changes on all network connections except cellular networks
val networkRequestBuilder = createNonCellularNetworkRequestBuilder()
val connectivityManager = this.getSystemService<ConnectivityManager>()
connectivityManager?.registerNetworkCallback(networkRequestBuilder.build(), object : NetworkCallback() {
override fun onAvailable(network: Network) {
Log.i("BackgroundService", "Valid network available")
connectedToNonCellularNetwork.postValue(true)
onNetworkChange(network)
}
override fun onLost(network: Network) {
Log.i("BackgroundService", "Valid network lost")
connectedToNonCellularNetwork.postValue(false)
}
})
registerLinkProviders()
addConnectionListener(applicationInstance.connectionListener) // Link Providers need to be already registered
for (linkProvider in linkProviders) {
linkProvider.onStart()
}
initialized = true
}
fun changePersistentNotificationVisibility(visible: Boolean) {
if (visible) {
updateForegroundNotification()
}
else {
stopForeground(true)
Start(this)
}
}
private fun createForegroundNotification(): Notification {
// Why is this needed: https://developer.android.com/guide/components/services#Foreground
val connectedDevices = ArrayList<String>()
val connectedDeviceIds = ArrayList<String>()
for (device in applicationInstance.devices.values) {
if (device.isReachable && device.isPaired) {
connectedDeviceIds.add(device.deviceId)
connectedDevices.add(device.name)
}
}
val intent = Intent(this, MainActivity::class.java)
if (connectedDeviceIds.size == 1) {
// Force open screen of the only connected device
intent.putExtra(MainActivity.EXTRA_DEVICE_ID, connectedDeviceIds[0])
}
val pi = PendingIntent.getActivity(this, 0, intent, UPDATE_IMMUTABLE_FLAGS)
val notification = NotificationCompat.Builder(this, NotificationHelper.Channels.PERSISTENT).apply {
setSmallIcon(R.drawable.ic_notification)
setOngoing(true)
setContentIntent(pi)
setPriority(NotificationCompat.PRIORITY_MIN) //MIN so it's not shown in the status bar before Oreo, on Oreo it will be bumped to LOW
setShowWhen(false)
setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)
setAutoCancel(false)
setGroup("BackgroundService")
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
// Pre-oreo, the notification will have an empty title line without this
notification.setContentTitle(getString(R.string.kde_connect))
}
if (connectedDevices.isEmpty()) {
notification.setContentText(getString(R.string.foreground_notification_no_devices))
}
else {
notification.setContentText(getString(R.string.foreground_notification_devices, connectedDevices.joinToString(", ")))
// Adding an action button to send clipboard manually in Android 10 and later.
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_LOGS) == PackageManager.PERMISSION_DENIED) {
val sendClipboard = ClipboardFloatingActivity.getIntent(this, true)
val sendPendingClipboard = PendingIntent.getActivity(this, 3, sendClipboard, UPDATE_IMMUTABLE_FLAGS)
notification.addAction(0, getString(R.string.foreground_notification_send_clipboard), sendPendingClipboard)
}
if (connectedDeviceIds.size == 1) {
val deviceId = connectedDeviceIds[0]
val device = KdeConnect.getInstance().getDevice(deviceId)
if (device != null) {
// Adding two action buttons only when there is a single device connected.
// Setting up Send File Intent.
val sendFile = Intent(this, SendFileActivity::class.java)
sendFile.putExtra("deviceId", deviceId)
val sendPendingFile = PendingIntent.getActivity(this, 1, sendFile, UPDATE_IMMUTABLE_FLAGS)
notification.addAction(0, getString(R.string.send_files), sendPendingFile)
// Checking if there are registered commands and adding the button.
val plugin = device.getPlugin("RunCommandPlugin") as RunCommandPlugin?
if (plugin != null && plugin.commandList.isNotEmpty()) {
val runCommand = Intent(this, RunCommandActivity::class.java)
runCommand.putExtra("deviceId", connectedDeviceIds[0])
val runPendingCommand = PendingIntent.getActivity(this, 2, runCommand, UPDATE_IMMUTABLE_FLAGS)
notification.addAction(0, getString(R.string.pref_plugin_runcommand), runPendingCommand)
}
}
}
}
return notification.build()
}
override fun onDestroy() {
Log.d("KdeConnect/BgService", "onDestroy")
initialized = false
for (linkProvider in linkProviders) {
linkProvider.onStop()
}
KdeConnect.getInstance().removeDeviceListChangedCallback("BackgroundService")
super.onDestroy()
}
override fun onBind(intent: Intent): IBinder? = null
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d(LOG_TAG, "onStartCommand")
if (NotificationHelper.isPersistentNotificationEnabled(this)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
startForeground(FOREGROUND_NOTIFICATION_ID, createForegroundNotification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE)
}
else {
startForeground(FOREGROUND_NOTIFICATION_ID, createForegroundNotification())
}
}
if (intent != null && intent.getBooleanExtra("refresh", false)) {
onNetworkChange(null)
}
return START_STICKY
}
companion object {
const val LOG_TAG = "KDE/BackgroundService"
const val UPDATE_IMMUTABLE_FLAGS = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
private const val FOREGROUND_NOTIFICATION_ID = 1
@JvmStatic
var instance: BackgroundService? = null
private set
private var initialized = false
private fun createNonCellularNetworkRequestBuilder(): NetworkRequest.Builder {
return NetworkRequest.Builder().apply {
addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
addTransportType(NetworkCapabilities.TRANSPORT_VPN)
addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
addTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH)
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) {
addTransportType(NetworkCapabilities.TRANSPORT_USB)
addTransportType(NetworkCapabilities.TRANSPORT_LOWPAN)
}
}
}
fun Start(context: Context) {
Log.d(LOG_TAG, "Start")
val intent = Intent(context, BackgroundService::class.java)
ContextCompat.startForegroundService(context, intent)
}
@JvmStatic
fun ForceRefreshConnections(context: Context) {
Log.d(LOG_TAG, "ForceRefreshConnections")
val intent = Intent(context, BackgroundService::class.java)
intent.putExtra("refresh", true)
ContextCompat.startForegroundService(context, intent)
}
}
}

View File

@@ -112,7 +112,7 @@ class Device : PacketReceiver {
this.settings = context.getSharedPreferences(deviceId, Context.MODE_PRIVATE)
this.deviceInfo = loadFromSettings(context, deviceId, settings)
this.pairingHandler = PairingHandler(this, createDefaultPairingCallback(), PairingHandler.PairState.Paired)
this.supportedPlugins = Vector(PluginFactory.getAvailablePlugins()) // Assume all are supported until we receive capabilities
this.supportedPlugins = Vector(PluginFactory.availablePlugins) // Assume all are supported until we receive capabilities
Log.i("Device", "Loading trusted device: ${deviceInfo.name}")
}
@@ -126,7 +126,7 @@ class Device : PacketReceiver {
this.deviceInfo = link.deviceInfo
this.settings = context.getSharedPreferences(deviceInfo.id, Context.MODE_PRIVATE)
this.pairingHandler = PairingHandler(this, createDefaultPairingCallback(), PairingHandler.PairState.NotPaired)
this.supportedPlugins = Vector(PluginFactory.getAvailablePlugins()) // Assume all are supported until we receive capabilities
this.supportedPlugins = Vector(PluginFactory.availablePlugins) // Assume all are supported until we receive capabilities
Log.i("Device", "Creating untrusted device: " + deviceInfo.name)
addLink(link)
}
@@ -257,7 +257,7 @@ class Device : PacketReceiver {
context,
1,
intent,
PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val acceptIntent = Intent(context, MainActivity::class.java).apply {
@@ -273,13 +273,13 @@ class Device : PacketReceiver {
context,
2,
acceptIntent,
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
)
val rejectedPendingIntent = PendingIntent.getActivity(
context,
4,
rejectIntent,
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
)
val res = context.resources
@@ -622,7 +622,7 @@ class Device : PacketReceiver {
supportedPlugins.forEach { pluginKey ->
val pluginInfo = PluginFactory.getPluginInfo(pluginKey)
val listenToUnpaired = pluginInfo.listenToUnpaired()
val listenToUnpaired = pluginInfo.listenToUnpaired
val pluginEnabled = (isPaired || listenToUnpaired) && this.isReachable && isPluginEnabled(pluginKey)

View File

@@ -160,8 +160,8 @@ object DeviceHelper {
getDeviceName(context),
deviceType,
ProtocolVersion,
PluginFactory.getIncomingCapabilities(),
PluginFactory.getOutgoingCapabilities()
PluginFactory.incomingCapabilities,
PluginFactory.outgoingCapabilities
)
}

View File

@@ -1,251 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Log;
import android.webkit.MimeTypeMap;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.kde.kdeconnect.NetworkPacket;
import java.io.File;
import java.io.InputStream;
import java.util.Arrays;
public class FilesHelper {
public static final String LOG_TAG = "SendFileActivity";
public static String getMimeTypeFromFile(String file) {
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(FilenameUtils.getExtension(file));
return StringUtils.defaultString(mime, "*/*");
}
public static String findNonExistingNameForNewFile(String path, String filename) {
String name = FilenameUtils.getBaseName(filename);
String ext = FilenameUtils.getExtension(filename);
int num = 1;
while (new File(path + "/" + filename).exists()) {
filename = name + " (" + num + ")." + ext;
num++;
}
return filename;
}
//Following code from http://activemq.apache.org/maven/5.7.0/kahadb/apidocs/src-html/org/apache/kahadb/util/IOHelper.html
/**
* Converts any string into a string that is safe to use as a file name.
* The result will only include ascii characters and numbers, and the "-","_", and "." characters.
*/
private static String toFileSystemSafeName(String name, boolean dirSeparators, int maxFileLength) {
int size = name.length();
StringBuilder rc = new StringBuilder(size * 2);
for (int i = 0; i < size; i++) {
char c = name.charAt(i);
boolean valid = c >= 'a' && c <= 'z';
valid = valid || (c >= 'A' && c <= 'Z');
valid = valid || (c >= '0' && c <= '9');
valid = valid || (c == '_') || (c == '-') || (c == '.');
valid = valid || (dirSeparators && ((c == '/') || (c == '\\')));
if (valid) {
rc.append(c);
}
}
String result = rc.toString();
if (result.length() > maxFileLength) {
result = result.substring(result.length() - maxFileLength);
}
return result;
}
public static String toFileSystemSafeName(String name, boolean dirSeparators) {
return toFileSystemSafeName(name, dirSeparators, 255);
}
public static String toFileSystemSafeName(String name) {
return toFileSystemSafeName(name, true, 255);
}
private static int GetOpenFileCount() {
return new File("/proc/self/fd").listFiles().length;
}
public static void LogOpenFileCount() {
Log.e("KDE/FileCount", "" + GetOpenFileCount());
}
//Create the network packet from the URI
public static NetworkPacket uriToNetworkPacket(final Context context, final Uri uri, String type) {
try {
ContentResolver cr = context.getContentResolver();
InputStream inputStream = cr.openInputStream(uri);
NetworkPacket np = new NetworkPacket(type);
String filename = null;
long size = -1;
Long lastModified = null;
if (uri.getScheme().equals("file")) {
// file:// is a non media uri, so we cannot query the ContentProvider
try {
File mFile = new File(uri.getPath());
filename = mFile.getName();
size = mFile.length();
lastModified = mFile.lastModified();
} catch (NullPointerException e) {
Log.e(LOG_TAG, "Received bad file URI", e);
}
} else {
// Since we used Intent.CATEGORY_OPENABLE, these two columns are the only ones we are
// guaranteed to have: https://developer.android.com/reference/android/provider/OpenableColumns
String[] proj = {
OpenableColumns.SIZE,
OpenableColumns.DISPLAY_NAME,
};
try (Cursor cursor = cr.query(uri, proj, null, null, null)) {
int nameColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME);
int sizeColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE);
cursor.moveToFirst();
filename = cursor.getString(nameColumnIndex);
// It is recommended to check for the value to be null because there are
// situations were we don't know the size (for instance, if the file is
// not local to the device)
if (!cursor.isNull(sizeColumnIndex)) {
size = cursor.getLong(sizeColumnIndex);
}
lastModified = getLastModifiedTime(context, uri);
} catch (Exception e) {
Log.e(LOG_TAG, "Problem getting file information", e);
}
}
if (filename != null) {
np.set("filename", filename);
} else {
// It would be very surprising if this happens
Log.e(LOG_TAG, "Unable to read filename");
}
if (lastModified != null) {
np.set("lastModified", lastModified);
} else {
// This would not be too surprising, and probably means we need to improve
// FilesHelper.getLastModifiedTime
Log.w(LOG_TAG, "Unable to read file last modified time");
}
np.setPayload(new NetworkPacket.Payload(inputStream, size));
return np;
} catch (Exception e) {
Log.e(LOG_TAG, "Exception creating network packet", e);
return null;
}
}
/**
* By hook or by crook, get the last modified time of the passed content:// URI
*
* This is a challenge because different content sources have different columns defined, and
* I don't know how to tell what the source of the content is.
*
* Therefore, my brilliant solution is to just try everything until something works.
*
* Will return null if nothing worked.
*/
public static Long getLastModifiedTime(final Context context, final Uri uri) {
ContentResolver cr = context.getContentResolver();
Long lastModifiedTime = null;
// Open a cursor without a column because we do not yet know what columns are defined
try (Cursor cursor = cr.query(uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
String[] allColumns = cursor.getColumnNames();
// MediaStore.MediaColumns.DATE_MODIFIED resolves to "date_modified"
// I see this column defined in case we used the Gallery app to select the file to transfer
// This can occur both for devices running Storage Access Framework (SAF) if we select
// the Gallery to provide the file to transfer, as well as for older devices by doing the same
int mediaDataModifiedColumnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DATE_MODIFIED);
// DocumentsContract.Document.COLUMN_LAST_MODIFIED resolves to "last_modified"
// I see this column defined when, on a device using SAF we select a file using the
// file browser
// According to https://developer.android.com/reference/kotlin/android/provider/DocumentsContract
// all "document providers" must provide certain columns. Do we actually have a DocumentProvider here?
// I do not think this code path will ever happen for a non-media file is selected on
// an API < KitKat device, since those will be delivered as a file:// URI and handled
// accordingly. Therefore, it is safe to ignore the warning that this field requires
// API 19
@SuppressLint("InlinedApi")
int documentLastModifiedColumnIndex = cursor.getColumnIndex(DocumentsContract.Document.COLUMN_LAST_MODIFIED);
// If we have an image, it may be the case that MediaStore.MediaColumns.DATE_MODIFIED
// catches the modification date, but if not, here is another column we can look for.
// This should be checked *after* DATE_MODIFIED since I think that column might give
// better information
int imageDateTakenColumnIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATE_TAKEN);
// Report whether the captured timestamp is in milliseconds or seconds
// The truthy-ness of this value for each different type of column is known from either
// experimentation or the docs (when docs exist...)
boolean milliseconds;
int properColumnIndex;
if (mediaDataModifiedColumnIndex >= 0) {
properColumnIndex = mediaDataModifiedColumnIndex;
milliseconds = false;
} else if (documentLastModifiedColumnIndex >= 0) {
properColumnIndex = documentLastModifiedColumnIndex;
milliseconds = true;
} else if (imageDateTakenColumnIndex >= 0) {
properColumnIndex = imageDateTakenColumnIndex;
milliseconds = true;
} else {
// Nothing worked :(
String formattedColumns = Arrays.toString(allColumns);
Log.w("SendFileActivity", "Unable to get file modification time. Available columns were: " + formattedColumns);
return null;
}
if (!cursor.isNull(properColumnIndex)) {
lastModifiedTime = cursor.getLong(properColumnIndex);
}
if (!milliseconds) {
lastModifiedTime *= 1000;
milliseconds = true;
}
}
}
return lastModifiedTime;
}
}

View File

@@ -0,0 +1,206 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers
import android.annotation.SuppressLint
import android.content.Context
import android.net.Uri
import android.provider.DocumentsContract
import android.provider.MediaStore
import android.provider.OpenableColumns
import android.util.Log
import android.webkit.MimeTypeMap
import org.apache.commons.io.FilenameUtils
import org.kde.kdeconnect.NetworkPacket
import java.io.File
import kotlin.math.min
object FilesHelper {
private const val LOG_TAG: String = "SendFileActivity"
@JvmStatic
fun getMimeTypeFromFile(file: String?): String {
val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(FilenameUtils.getExtension(file))
return mime ?: "*/*"
}
@JvmStatic
fun findNonExistingNameForNewFile(path: String, filename: String): String {
var newFilename = filename
val name = FilenameUtils.getBaseName(newFilename)
val ext = FilenameUtils.getExtension(newFilename)
var num = 1
while (File("$path/$newFilename").exists()) {
newFilename = "$name ($num).$ext"
num++
}
return newFilename
}
/**
* Converts any string into a string that is safe to use as a file name.
* The result will only include ascii characters and numbers, and the "-","_", and "." characters.
*/
private fun toFileSystemSafeName(name: String, dirSeparators: Boolean, maxFileLength: Int): String {
fun isSafeChar(c: Char): Boolean =
c in 'a'..'z' || c in 'A'..'Z' || c in '0'..'9' ||
c == '_' || c == '-' || c == '.' ||
(dirSeparators && ((c == '/') || (c == '\\')))
val nameSafeChars = name.filter(::isSafeChar)
val nameSafeLength = nameSafeChars.substring(nameSafeChars.length - min(nameSafeChars.length, maxFileLength))
return nameSafeLength
}
fun toFileSystemSafeName(name: String, dirSeparators: Boolean): String = toFileSystemSafeName(name, dirSeparators, 255)
fun toFileSystemSafeName(name: String): String = toFileSystemSafeName(name, true, 255)
private fun getOpenFileCount(): Int? = File("/proc/self/fd").listFiles()?.size
fun LogOpenFileCount() {
Log.e("KDE/FileCount", "" + getOpenFileCount())
}
/**
* Creates a network packet from the given URI
*/
@JvmStatic
fun uriToNetworkPacket(context: Context, uri: Uri, type: String?): NetworkPacket? {
try {
val contentResolver = context.contentResolver
val inputStream = contentResolver.openInputStream(uri)
val packet = NetworkPacket(type!!)
val sizeDefault = -1L
// file:// is a non media uri, so we cannot query the ContentProvider
fun fileSchemeExtract(): Triple<String?, Long, Long?> {
val path = uri.path
if (path != null) {
val mFile = File(path)
val filename = mFile.name
val size = mFile.length()
val lastModified = mFile.lastModified()
return Triple(filename, size, lastModified)
}
else {
Log.e(LOG_TAG, "Received bad file URI, path was null")
return Triple(null, sizeDefault, null)
}
}
fun contentResolverExtract(): Triple<String?, Long, Long?> {
// Since we used Intent.CATEGORY_OPENABLE, these two columns are the only ones we are guaranteed to have: https://developer.android.com/reference/android/provider/OpenableColumns
val proj = arrayOf(OpenableColumns.SIZE, OpenableColumns.DISPLAY_NAME,)
try {
contentResolver.query(uri, proj, null, null, null).use { cursor ->
val nameColumnIndex = cursor!!.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)
val sizeColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE)
cursor.moveToFirst()
val filename = cursor.getString(nameColumnIndex)
// It is recommended to check for the value to be null because there are situations were we don't know the size (for instance, if the file is not local to the device)
val size = if (!cursor.isNull(sizeColumnIndex)) cursor.getLong(sizeColumnIndex) else sizeDefault
val lastModified = getLastModifiedTime(context, uri)
return Triple(filename, size, lastModified)
}
}
catch (e: Exception) {
Log.e(LOG_TAG, "Problem getting file information", e)
}
return Triple(null, sizeDefault, null)
}
val (filename, size, lastModified) = when (uri.scheme) {
"file" -> fileSchemeExtract()
else -> contentResolverExtract()
}
if (filename != null) {
packet["filename"] = filename
}
else {
// It would be very surprising if this happens
Log.e(LOG_TAG, "Unable to read filename")
}
if (lastModified != null) {
packet["lastModified"] = lastModified
}
else {
// This would not be too surprising, and probably means we need to improve FilesHelper.getLastModifiedTime
Log.w(LOG_TAG, "Unable to read file last modified time")
}
packet.payload = NetworkPacket.Payload(inputStream, size)
return packet
}
catch (e: Exception) {
Log.e(LOG_TAG, "Exception creating network packet", e)
return null
}
}
/**
* By hook or by crook, get the last modified time of the passed content:// URI
*
* This is a challenge because different content sources have different columns defined, and
* I don't know how to tell what the source of the content is.
*
* Therefore, my brilliant solution is to just try everything until something works.
*
* Will return null if nothing worked.
*
* @return Time last modified in milliseconds or null
*/
fun getLastModifiedTime(context: Context, uri: Uri): Long? {
context.contentResolver.query(uri, null, null, null, null).use { cursor ->
if (cursor != null && cursor.moveToFirst()) {
val allColumns = cursor.columnNames
// MediaStore.MediaColumns.DATE_MODIFIED resolves to "date_modified"
// I see this column defined in case we used the Gallery app to select the file to transfer
// This can occur both for devices running Storage Access Framework (SAF) if we select the Gallery to provide the file to transfer, as well as for older devices by doing the same
val mediaDataModifiedColumnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DATE_MODIFIED)
// DocumentsContract.Document.COLUMN_LAST_MODIFIED resolves to "last_modified"
// I see this column defined when, on a device using SAF we select a file using the file browser
// According to https://developer.android.com/reference/kotlin/android/provider/DocumentsContract all "document providers" must provide certain columns.
// Do we actually have a DocumentProvider here?
// I do not think this code path will ever happen for a non-media file is selected on an API < KitKat device, since those will be delivered as a file:// URI and handled accordingly.
// Therefore, it is safe to ignore the warning that this field requires API 19
@SuppressLint("InlinedApi") val documentLastModifiedColumnIndex = cursor.getColumnIndex(DocumentsContract.Document.COLUMN_LAST_MODIFIED)
// If we have an image, it may be the case that MediaStore.MediaColumns.DATE_MODIFIED catches the modification date, but if not, here is another column we can look for.
// This should be checked *after* DATE_MODIFIED since I think that column might give better information
val imageDateTakenColumnIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATE_TAKEN)
// Report whether the captured timestamp is in milliseconds or seconds
// The truthy-ness of this value for each different type of column is known from either experimentation or the docs (when docs exist...)
val (properColumnIndex: Int, milliseconds: Boolean) = when {
mediaDataModifiedColumnIndex >= 0 -> Pair(mediaDataModifiedColumnIndex, false)
documentLastModifiedColumnIndex >= 0 -> Pair(documentLastModifiedColumnIndex, true)
imageDateTakenColumnIndex >= 0 -> Pair(imageDateTakenColumnIndex, true)
else -> {
// Nothing worked :(
Log.w("SendFileActivity", "Unable to get file modification time. Available columns were: ${allColumns.contentToString()}")
return null
}
}
val lastModifiedTime: Long? = if (!cursor.isNull(properColumnIndex)) cursor.getLong(properColumnIndex) else null
return if (!milliseconds) lastModifiedTime!! * 1000 else lastModifiedTime
}
}
return null
}
}

View File

@@ -28,7 +28,7 @@ public class IntentHelper {
*/
public static void startActivityFromBackgroundOrCreateNotification(Context context, Intent intent, String title) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !LifecycleHelper.isInForeground()) {
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_MUTABLE);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
Notification notification = new NotificationCompat
.Builder(context, NotificationHelper.Channels.HIGHPRIORITY)
.setContentIntent(pendingIntent)

View File

@@ -1,43 +0,0 @@
/*
* SPDX-FileCopyrightText: 2020 Erik Duisters <e.duisters1@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers;
import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;
public class LifecycleHelper {
private static class LifecycleObserver implements DefaultLifecycleObserver {
private boolean inForeground = false;
@Override
public void onStart(@NonNull LifecycleOwner owner) {
inForeground = true;
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
inForeground = false;
}
boolean isInForeground() {
return inForeground;
}
}
private final static LifecycleObserver foregroundTracker = new LifecycleObserver();
public static boolean isInForeground() {
return foregroundTracker.isInForeground();
}
public static void initializeObserver() {
ProcessLifecycleOwner.get().getLifecycle().addObserver(foregroundTracker);
}
}

View File

@@ -0,0 +1,33 @@
/*
* SPDX-FileCopyrightText: 2020 Erik Duisters <e.duisters1@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner
object LifecycleHelper {
fun initializeObserver() {
ProcessLifecycleOwner.get().lifecycle.addObserver(foregroundTracker)
}
@JvmStatic
val isInForeground: Boolean
get() = foregroundTracker.isInForeground
private val foregroundTracker = object : DefaultLifecycleObserver {
var isInForeground: Boolean = false
private set
override fun onStart(owner: LifecycleOwner) {
this.isInForeground = true
}
override fun onStop(owner: LifecycleOwner) {
this.isInForeground = false
}
}
}

View File

@@ -1,23 +0,0 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
public class MediaStoreHelper {
//Maybe this class could batch successive calls together
public static void indexFile(Context context, Uri path) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
mediaScanIntent.setData(path);
context.sendBroadcast(mediaScanIntent);
}
}

View File

@@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers
import android.content.Context
import android.content.Intent
import android.net.Uri
object MediaStoreHelper {
// Maybe this class could batch successive calls together
@JvmStatic
fun indexFile(context: Context, path: Uri?) {
val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
mediaScanIntent.setData(path)
context.sendBroadcast(mediaScanIntent)
}
}

View File

@@ -1,28 +0,0 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers;
import java.security.SecureRandom;
public class RandomHelper {
public static final SecureRandom secureRandom = new SecureRandom();
private static final char[] symbols = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz" +
"1234567890").toCharArray();
public static String randomString(int length) {
char[] buffer = new char[length];
for (int idx = 0; idx < length; ++idx) {
buffer[idx] = symbols[secureRandom.nextInt(symbols.length)];
}
return new String(buffer);
}
}

View File

@@ -0,0 +1,22 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers
import java.security.SecureRandom
object RandomHelper {
@JvmField
val secureRandom: SecureRandom = SecureRandom()
private val symbols = (('A'..'Z').toList() + ('a'..'z').toList() + ('0'..'9').toList()).toCharArray()
fun randomString(length: Int): String {
val buffer = CharArray(length)
for (i in 0 until length) {
buffer[i] = symbols[secureRandom.nextInt(symbols.size)]
}
return String(buffer)
}
}

View File

@@ -1,85 +0,0 @@
/*
* SPDX-FileCopyrightText: 2015 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers.SecurityHelpers;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import android.security.keystore.KeyProperties;
import android.util.Base64;
import android.util.Log;
import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RsaHelper {
public static void initialiseRsaKeys(Context context) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
if (!settings.contains("publicKey") || !settings.contains("privateKey")) {
KeyPair keyPair;
String keyAlgorithm;
try {
KeyPairGenerator keyGen;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
keyAlgorithm = KeyProperties.KEY_ALGORITHM_EC;
keyGen = KeyPairGenerator.getInstance(keyAlgorithm);
ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1");
keyGen.initialize(spec);
} else {
keyAlgorithm = "RSA";
keyGen = KeyPairGenerator.getInstance(keyAlgorithm);
keyGen.initialize(2048);
}
keyPair = keyGen.generateKeyPair();
} catch (Exception e) {
Log.e("KDE/initializeRsaKeys", "Exception", e);
return;
}
byte[] publicKey = keyPair.getPublic().getEncoded();
byte[] privateKey = keyPair.getPrivate().getEncoded();
SharedPreferences.Editor edit = settings.edit();
edit.putString("publicKey", Base64.encodeToString(publicKey, 0).trim() + "\n");
edit.putString("privateKey", Base64.encodeToString(privateKey, 0));
edit.putString("keyAlgorithm", keyAlgorithm);
edit.apply();
}
}
public static PublicKey getPublicKey(Context context) throws GeneralSecurityException {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
byte[] publicKeyBytes = Base64.decode(settings.getString("publicKey", ""), 0);
// For backwards compat: if no keyAlgorithm setting is set, it means it was generated using RSA
String keyAlgorithm = settings.getString("keyAlgorithm", "RSA");
return KeyFactory.getInstance(keyAlgorithm).generatePublic(new X509EncodedKeySpec(publicKeyBytes));
}
public static PrivateKey getPrivateKey(Context context) throws GeneralSecurityException {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
byte[] privateKeyBytes = Base64.decode(settings.getString("privateKey", ""), 0);
// For backwards compat: if no keyAlgorithm setting is set, it means it was generated using RSA
String keyAlgorithm = settings.getString("keyAlgorithm", "RSA");
return KeyFactory.getInstance(keyAlgorithm).generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
}
}

View File

@@ -0,0 +1,83 @@
/*
* SPDX-FileCopyrightText: 2015 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers.SecurityHelpers
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import android.preference.PreferenceManager
import android.security.keystore.KeyProperties
import android.util.Base64
import android.util.Log
import java.security.GeneralSecurityException
import java.security.KeyFactory
import java.security.KeyPair
import java.security.KeyPairGenerator
import java.security.PrivateKey
import java.security.PublicKey
import java.security.spec.ECGenParameterSpec
import java.security.spec.PKCS8EncodedKeySpec
import java.security.spec.X509EncodedKeySpec
object RsaHelper {
private const val RSA = "RSA" // KeyProperties.KEY_ALGORITHM_RSA isn't available until API 23+
@JvmStatic
fun initialiseRsaKeys(context: Context?) {
val settings = PreferenceManager.getDefaultSharedPreferences(context)
if (!settings.contains("publicKey") || !settings.contains("privateKey")) {
val keyPair: KeyPair
val keyAlgorithm: String
try {
val newSdk = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
keyAlgorithm = if (newSdk) KeyProperties.KEY_ALGORITHM_EC else RSA
val generator = KeyPairGenerator.getInstance(keyAlgorithm)
if (newSdk) {
val spec = ECGenParameterSpec("secp256r1")
generator.initialize(spec)
}
else {
generator.initialize(2048)
}
keyPair = generator.generateKeyPair()
}
catch (e: Exception) {
Log.e("KDE/initializeRsaKeys", "Exception", e)
return
}
val publicKey = keyPair.public.encoded
val privateKey = keyPair.private.encoded
settings.edit().apply {
putString("publicKey", Base64.encodeToString(publicKey, 0))
putString("privateKey", Base64.encodeToString(privateKey, 0))
putString("keyAlgorithm", keyAlgorithm)
apply()
}
}
}
/** For backwards compat: if no keyAlgorithm setting is set, it means it was generated using RSA */
private fun algorithmFromSettings(pref: SharedPreferences) = pref.getString("keyAlgorithm", RSA)
@JvmStatic
@Throws(GeneralSecurityException::class)
fun getPublicKey(context: Context?): PublicKey {
val settings = PreferenceManager.getDefaultSharedPreferences(context)
val publicKeyBytes = Base64.decode(settings.getString("publicKey", ""), 0)
return KeyFactory.getInstance(algorithmFromSettings(settings)).generatePublic(X509EncodedKeySpec(publicKeyBytes))
}
@JvmStatic
@Throws(GeneralSecurityException::class)
fun getPrivateKey(context: Context?): PrivateKey {
val settings = PreferenceManager.getDefaultSharedPreferences(context)
val privateKeyBytes = Base64.decode(settings.getString("privateKey", ""), 0)
return KeyFactory.getInstance(algorithmFromSettings(settings)).generatePrivate(PKCS8EncodedKeySpec(privateKeyBytes))
}
}

View File

@@ -26,6 +26,7 @@ import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.util.Arrays;
import org.kde.kdeconnect.Helpers.DeviceHelper;
import org.kde.kdeconnect.Helpers.RandomHelper;
import org.kde.kdeconnect.KdeConnect;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -104,7 +105,9 @@ public class SslHelper {
boolean needsToGenerateCertificate = false;
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
if (settings.contains("certificate")) {
final Date currDate = new Date();
try {
SharedPreferences globalSettings = PreferenceManager.getDefaultSharedPreferences(context);
byte[] certificateBytes = Base64.decode(globalSettings.getString("certificate", ""), 0);
@@ -114,7 +117,14 @@ public class SslHelper {
if (!certDeviceId.equals(deviceId)) {
Log.e("KDE/SslHelper", "The certificate stored is from a different device id! (found: " + certDeviceId + " expected:" + deviceId + ")");
needsToGenerateCertificate = true;
} else {
}
else if(cert.getNotAfter().getTime() < currDate.getTime()) {
Log.e("KDE/SslHelper", "The certificate expired: "+cert.getNotAfter());
needsToGenerateCertificate = true;
} else if(cert.getNotBefore().getTime() > currDate.getTime()) {
Log.e("KDE/SslHelper", "The certificate is not effective yet: "+cert.getNotBefore());
needsToGenerateCertificate = true;
}else {
certificate = cert;
}
} catch (Exception e) {
@@ -127,6 +137,7 @@ public class SslHelper {
}
if (needsToGenerateCertificate) {
KdeConnect.getInstance().removeRememberedDevices();
Log.i("KDE/SslHelper", "Generating a certificate");
try {
//Fix for https://issuetracker.google.com/issues/37095309

View File

@@ -1,177 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.util.Log;
import androidx.annotation.NonNull;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.stream.Collectors;
//Code from http://stackoverflow.com/questions/9340332/how-can-i-get-the-list-of-mounted-external-storage-of-android-device/19982338#19982338
//modified to work on Lollipop and other devices
public class StorageHelper {
public static class StorageInfo {
public final String path;
public final boolean readonly;
public final boolean removable;
public final int number;
public StorageInfo(String path, boolean readonly, boolean removable, int number) {
this.path = path;
this.readonly = readonly;
this.removable = removable;
this.number = number;
}
}
/*
* This function is bullshit because there is no proper way to do this in Android.
* Patch after patch I'm making it even more horrible by trying to make it work for *more*
* devices while trying no to break previously working ones.
* If this function was a living being, it would be begging "please kill me".
*/
public static List<StorageInfo> getStorageList() {
List<StorageInfo> list = new ArrayList<>();
String def_path = Environment.getExternalStorageDirectory().getPath();
boolean def_path_removable = Environment.isExternalStorageRemovable();
String def_path_state = Environment.getExternalStorageState();
boolean def_path_available = def_path_state.equals(Environment.MEDIA_MOUNTED)
|| def_path_state.equals(Environment.MEDIA_MOUNTED_READ_ONLY);
boolean def_path_readonly = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY);
HashSet<String> paths = new HashSet<>();
int cur_removable_number = 1;
if (def_path_available) {
paths.add(def_path);
list.add(0, new StorageInfo(def_path, def_path_readonly, def_path_removable, def_path_removable ? cur_removable_number++ : -1));
}
File storage = new File("/storage/");
if (storage.exists() && storage.isDirectory() && storage.canRead()) {
String mounts = null;
try (Scanner scanner = new Scanner(new File("/proc/mounts"))) {
mounts = scanner.useDelimiter("\\A").next();
} catch (Exception e) {
Log.e("StorageHelper", "Exception while getting storageList", e);
}
File[] dirs = storage.listFiles();
for (File dir : dirs) {
//Log.e("getStorageList", "path: "+dir.getAbsolutePath());
if (dir.isDirectory() && dir.canRead() && dir.canExecute()) {
String path, path2;
path2 = dir.getAbsolutePath();
try {
//Log.e(dir.getAbsolutePath(), dir.getCanonicalPath());
path = dir.getCanonicalPath();
} catch (Exception e) {
path = path2;
}
if (!path.startsWith("/storage/emulated") || dirs.length == 1) {
if (!paths.contains(path) && !paths.contains(path2)) {
if (mounts == null || StringUtils.containsAny(mounts, path, path2)) {
list.add(0, new StorageInfo(path, dir.canWrite(), true, cur_removable_number++));
paths.add(path);
}
}
}
}
}
} else {
//Legacy code for Android < 4.0 that still didn't have /storage
List<String> entries = new ArrayList<>();
try (FileReader fileReader = new FileReader("/proc/mounts")) {
// The reader is buffered internally, so buffering it separately is unnecessary.
final List<String> lines = IOUtils.readLines(fileReader).stream()
.filter(line -> StringUtils.containsAny(line, "vfat", "exfat", "ntfs", "/mnt"))
.collect(Collectors.toList());
for (String line : lines) {
if (line.contains("/storage/sdcard"))
entries.add(0, line);
else
entries.add(line);
}
} catch (Exception e) {
Log.e("StorageHelper", "Exception", e);
}
for (String line : entries) {
StringTokenizer tokens = new StringTokenizer(line, " ");
tokens.nextToken(); //device
String mount_point = tokens.nextToken(); //mount point
if (paths.contains(mount_point)) {
continue;
}
tokens.nextToken(); //file system
String[] flags = tokens.nextToken().split(","); //flags
boolean readonly = ArrayUtils.contains(flags, "ro");
if (line.contains("/dev/block/vold") && !StringUtils.containsAny(line, "/mnt/secure",
"/mnt/asec", "/mnt/obb", "/dev/mapper", "tmpfs")) {
paths.add(mount_point);
list.add(new StorageInfo(mount_point, readonly, true, cur_removable_number++));
}
}
}
return list;
}
/* treeUri documentId
* ==================================================================================================
* content://com.android.providers.downloads.documents/tree/downloads => downloads
* content://com.android.externalstorage.documents/tree/1715-1D1F: => 1715-1D1F:
* content://com.android.externalstorage.documents/tree/1715-1D1F:My%20Photos => 1715-1D1F:My Photos
* content://com.android.externalstorage.documents/tree/primary: => primary:
* content://com.android.externalstorage.documents/tree/primary:DCIM => primary:DCIM
* content://com.android.externalstorage.documents/tree/primary:Download/bla => primary:Download/bla
*/
public static String getDisplayName(@NonNull Context context, @NonNull Uri treeUri) {
List<String> pathSegments = treeUri.getPathSegments();
if (!pathSegments.get(0).equals("tree")) {
throw new IllegalArgumentException("treeUri is not valid");
}
String documentId = DocumentsContract.getTreeDocumentId(treeUri);
int colonIdx = pathSegments.get(1).indexOf(':');
if (colonIdx >= 0) {
String tree = pathSegments.get(1).substring(0, colonIdx + 1);
if (!documentId.equals(tree)) {
return documentId.substring(tree.length());
} else {
return documentId.substring(0, colonIdx);
}
}
return documentId;
}
}

View File

@@ -0,0 +1,19 @@
/*
* SPDX-FileCopyrightText: 2024 TPJ Schikhof <kde@schikhof.eu>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers
import android.net.Uri
import android.provider.DocumentsContract
object StorageHelper {
fun getDisplayName(treeUri: Uri): String {
val pathSegments = treeUri.pathSegments
require(pathSegments[0] == "tree") { "treeUri is not valid" }
val segmentsWithoutTree = pathSegments.drop(1).joinToString("/")
return segmentsWithoutTree.split(":").last(String::isNotBlank)
}
}

View File

@@ -310,7 +310,7 @@ public class TelephonyHelper {
* @param requestType Value which we would like to find in types
* @return True if the APN supports the requested type, false otherwise
*/
private static boolean isValidApnType(String types, String requestType) {
public static boolean isValidApnType(String types, String requestType) {
// If APN type is unspecified, assume APN_TYPE_ALL.
if (types.isEmpty()) {
return true;

View File

@@ -19,7 +19,7 @@ class TrustedNetworkHelper(private val context: Context) {
var trustedNetworks: List<String>
get() {
val serializedNetworks = PreferenceManager.getDefaultSharedPreferences(context).getString(KEY_CUSTOM_TRUSTED_NETWORKS, "") ?: ""
return NETWORK_SSID_DELIMITER.split(serializedNetworks).filter { it.isNotEmpty() }
return serializedNetworks.split(NETWORK_SSID_DELIMITER, "#_#" /* TODO remove old delimiter in 2025 */).filter { it.isNotEmpty() }
}
set(value) {
PreferenceManager.getDefaultSharedPreferences(context)
@@ -36,7 +36,8 @@ class TrustedNetworkHelper(private val context: Context) {
.putBoolean(KEY_CUSTOM_TRUST_ALL_NETWORKS, value)
.apply()
val hasPermissions: Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
val hasPermissions: Boolean
get() = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
/** @return The current SSID or null if it's not available for any reason */
val currentSSID: String?
@@ -61,7 +62,7 @@ class TrustedNetworkHelper(private val context: Context) {
companion object {
private const val KEY_CUSTOM_TRUSTED_NETWORKS = "trusted_network_preference"
private const val KEY_CUSTOM_TRUST_ALL_NETWORKS = "trust_all_network_preference"
private const val NETWORK_SSID_DELIMITER = "#_#"
private const val NETWORK_SSID_DELIMITER = "\u0000"
private const val NOT_AVAILABLE_SSID_RESULT = "<unknown ssid>"
@JvmStatic

View File

@@ -22,6 +22,8 @@ import org.kde.kdeconnect.UserInterface.ThemeUtil
import org.kde.kdeconnect_tp.BuildConfig
import org.slf4j.impl.HandroidLoggerAdapter
import java.security.cert.CertificateException
import java.security.cert.X509Certificate
import java.util.Date
import java.util.concurrent.ConcurrentHashMap
/*
@@ -90,7 +92,7 @@ class KdeConnect : Application() {
}
private fun loadRememberedDevicesFromSettings() {
// Log.e("BackgroundService", "Loading remembered trusted devices");
// Log.e("BackgroundService", "Loading remembered trusted devices")
val preferences = getSharedPreferences("trusted_devices", MODE_PRIVATE)
val trustedDevices: Set<String> = preferences.all.keys
trustedDevices.map { id ->
@@ -99,6 +101,14 @@ class KdeConnect : Application() {
}.filter { preferences.getBoolean(it, false) }.forEach {
try {
val device = Device(applicationContext, it)
val now = Date()
val x509Cert = device.certificate as X509Certificate
if(now < x509Cert.notBefore) {
throw CertificateException("Certificate not effective yet: "+x509Cert.notBefore)
}
else if(now > x509Cert.notAfter) {
throw CertificateException("Certificate already expired: "+x509Cert.notAfter)
}
devices[it] = device
device.addPairingCallback(devicePairingCallback)
} catch (e: CertificateException) {
@@ -110,6 +120,16 @@ class KdeConnect : Application() {
}
}
}
fun removeRememberedDevices() {
// Log.e("BackgroundService", "Removing remembered trusted devices")
val preferences = getSharedPreferences("trusted_devices", MODE_PRIVATE)
val trustedDevices: Set<String> = preferences.all.keys
trustedDevices.filter { preferences.getBoolean(it, false) }
.forEach {
Log.d("KdeConnect", "Removing devices: $it")
preferences.edit().remove(it).apply()
}
}
private val devicePairingCallback: PairingCallback = object : PairingCallback {
override fun incomingPairRequest() {
@@ -158,7 +178,7 @@ class KdeConnect : Application() {
// - When a device becomes unreachable, if it's unpaired (this case here)
// - When a device becomes unpaired, if it's unreachable (not implemented ATM)
// if (!device.isReachable && !device.isPaired) {
// Log.i("onConnectionLost","Removing device because it was not paired");
// Log.i("onConnectionLost","Removing device because it was not paired")
// devices.remove(link.deviceId)
// device.removePairingCallback(devicePairingCallback)
// }

View File

@@ -141,7 +141,7 @@ public class FindMyPhonePlugin extends Plugin {
intent.setAction(FindMyPhoneReceiver.ACTION_FOUND_IT);
intent.putExtra(FindMyPhoneReceiver.EXTRA_DEVICE_ID, getDevice().getDeviceId());
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
createNotification(pendingIntent);
}
@@ -150,7 +150,7 @@ public class FindMyPhonePlugin extends Plugin {
Intent intent = new Intent(context, FindMyPhoneActivity.class);
intent.putExtra(FindMyPhoneActivity.EXTRA_DEVICE_ID, getDevice().getDeviceId());
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
createNotification(pi);
}

View File

@@ -1,64 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Plugins.FindRemoteDevicePlugin;
import android.app.Activity;
import androidx.annotation.NonNull;
import org.apache.commons.lang3.ArrayUtils;
import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhonePlugin;
import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R;
@PluginFactory.LoadablePlugin
public class FindRemoteDevicePlugin extends Plugin {
@Override
public @NonNull String getDisplayName() {
return context.getResources().getString(R.string.pref_plugin_findremotedevice);
}
@Override
public @NonNull String getDescription() {
return context.getResources().getString(R.string.pref_plugin_findremotedevice_desc);
}
@Override
public boolean onPacketReceived(@NonNull NetworkPacket np) {
return true;
}
@Override
public @NonNull String getActionName() {
return context.getString(R.string.ring);
}
@Override
public void startMainActivity(Activity activity) {
if (isDeviceInitialized()) {
getDevice().sendPacket(new NetworkPacket(FindMyPhonePlugin.PACKET_TYPE_FINDMYPHONE_REQUEST));
}
}
@Override
public boolean displayInContextMenu() {
return true;
}
@Override
public @NonNull String[] getSupportedPacketTypes() {
return ArrayUtils.EMPTY_STRING_ARRAY;
}
@Override
public @NonNull String[] getOutgoingPacketTypes() {
return new String[]{FindMyPhonePlugin.PACKET_TYPE_FINDMYPHONE_REQUEST};
}
}

View File

@@ -0,0 +1,41 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Plugins.FindRemoteDevicePlugin
import android.app.Activity
import org.kde.kdeconnect.NetworkPacket
import org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhonePlugin
import org.kde.kdeconnect.Plugins.Plugin
import org.kde.kdeconnect.Plugins.PluginFactory.LoadablePlugin
import org.kde.kdeconnect_tp.R
@LoadablePlugin
class FindRemoteDevicePlugin : Plugin() {
override val displayName: String
get() = context.resources.getString(R.string.pref_plugin_findremotedevice)
override val description: String
get() = context.resources.getString(R.string.pref_plugin_findremotedevice_desc)
override fun onPacketReceived(np: NetworkPacket): Boolean = true
override val actionName: String
get() = context.getString(R.string.ring)
override fun startMainActivity(activity: Activity) {
if (isDeviceInitialized) {
device.sendPacket(NetworkPacket(FindMyPhonePlugin.PACKET_TYPE_FINDMYPHONE_REQUEST))
}
}
override fun displayInContextMenu(): Boolean = true
override val supportedPacketTypes: Array<String>
get() = arrayOf()
override val outgoingPacketTypes: Array<String>
get() = arrayOf(FindMyPhonePlugin.PACKET_TYPE_FINDMYPHONE_REQUEST)
}

View File

@@ -13,6 +13,7 @@ import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.HapticFeedbackConstants;
import android.view.Menu;
@@ -55,6 +56,7 @@ public class MousePadActivity
private double scrollCoefficient = 1.0;
private boolean allowGyro = false;
private boolean gyroEnabled = false;
private boolean doubleTapDragEnabled = false;
private int gyroscopeSensitivity = 100;
private boolean isScrolling = false;
private float accumulatedDistanceY = 0;
@@ -376,14 +378,16 @@ public class MousePadActivity
@Override
public void onLongPress(MotionEvent e) {
getWindow().getDecorView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
MousePadPlugin plugin = KdeConnect.getInstance().getDevicePlugin(deviceId, MousePadPlugin.class);
if (plugin == null) {
finish();
return;
}
plugin.sendSingleHold();
dragging = true;
if (!doubleTapDragEnabled) {
getWindow().getDecorView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
MousePadPlugin plugin = KdeConnect.getInstance().getDevicePlugin(deviceId, MousePadPlugin.class);
if (plugin == null) {
finish();
return;
}
plugin.sendSingleHold();
dragging = true;
}
}
@Override
@@ -415,13 +419,18 @@ public class MousePadActivity
finish();
return true;
}
plugin.sendDoubleClick();
if (doubleTapDragEnabled) {
plugin.sendSingleHold();
dragging = true;
} else {
plugin.sendDoubleClick();
}
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
return true;
}
@Override
@@ -578,6 +587,8 @@ public class MousePadActivity
findViewById(R.id.mouse_buttons).setVisibility(View.GONE);
}
doubleTapDragEnabled = prefs.getBoolean(getString(R.string.mousepad_doubletap_drag_enabled_pref), true);
prefsApplied = true;
}

View File

@@ -302,7 +302,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
context,
0,
iPlay,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val aPlay = NotificationCompat.Action.Builder(
R.drawable.ic_play_white, context!!.getString(R.string.mpris_play), piPlay
@@ -317,7 +317,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
context,
0,
iPause,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val aPause = NotificationCompat.Action.Builder(
R.drawable.ic_pause_white, context!!.getString(R.string.mpris_pause), piPause
@@ -332,7 +332,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
context,
0,
iPrevious,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val aPrevious = NotificationCompat.Action.Builder(
R.drawable.ic_previous_white, context!!.getString(R.string.mpris_previous), piPrevious
@@ -347,7 +347,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
context,
0,
iNext,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val aNext = NotificationCompat.Action.Builder(
R.drawable.ic_next_white, context!!.getString(R.string.mpris_next), piNext
@@ -360,7 +360,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
val piOpenActivity = TaskStackBuilder.create(context!!)
.addNextIntentWithParentStack(iOpenActivity)
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE)
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
val notification = NotificationCompat.Builder(context!!, NotificationHelper.Channels.MEDIA_CONTROL)
@@ -398,7 +398,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
context,
0,
iCloseNotification,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
notification.setDeleteIntent(piCloseNotification)
}

View File

@@ -1,132 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Plugins.PingPlugin;
import android.Manifest;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;
import org.kde.kdeconnect.Helpers.NotificationHelper;
import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.MainActivity;
import org.kde.kdeconnect_tp.R;
import java.util.Objects;
@PluginFactory.LoadablePlugin
public class PingPlugin extends Plugin {
private final static String PACKET_TYPE_PING = "kdeconnect.ping";
@Override
public @NonNull String getDisplayName() {
return context.getResources().getString(R.string.pref_plugin_ping);
}
@Override
public @NonNull String getDescription() {
return context.getResources().getString(R.string.pref_plugin_ping_desc);
}
@Override
public boolean onPacketReceived(@NonNull NetworkPacket np) {
if (!np.getType().equals(PACKET_TYPE_PING)) {
Log.e("PingPlugin", "Ping plugin should not receive packets other than pings!");
return false;
}
//Log.e("PingPacketReceiver", "was a ping!");
PendingIntent resultPendingIntent = PendingIntent.getActivity(
context,
0,
new Intent(context, MainActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE
);
int id;
String message;
if (np.has("message")) {
message = np.getString("message");
id = (int) System.currentTimeMillis();
} else {
message = "Ping!";
id = 42; //A unique id to create only one notification
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
int permissionResult = ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS);
if (permissionResult != PackageManager.PERMISSION_GRANTED) {
// If notifications are not allowed, show a toast instead of a notification
new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, message, Toast.LENGTH_LONG).show());
return true;
}
}
NotificationManager notificationManager = ContextCompat.getSystemService(context, NotificationManager.class);
Notification noti = new NotificationCompat.Builder(context, NotificationHelper.Channels.DEFAULT)
.setContentTitle(getDevice().getName())
.setContentText(message)
.setContentIntent(resultPendingIntent)
.setTicker(message)
.setSmallIcon(R.drawable.ic_notification)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setStyle(new NotificationCompat.BigTextStyle().bigText(message))
.build();
NotificationHelper.notifyCompat(notificationManager, id, noti);
return true;
}
@Override
public @NonNull String getActionName() {
return context.getString(R.string.send_ping);
}
@Override
public void startMainActivity(Activity activity) {
if (isDeviceInitialized()) {
getDevice().sendPacket(new NetworkPacket(PACKET_TYPE_PING));
}
}
@Override
public boolean displayInContextMenu() {
return true;
}
@Override
public @NonNull String[] getSupportedPacketTypes() {
return new String[]{PACKET_TYPE_PING};
}
@Override
public @NonNull String[] getOutgoingPacketTypes() {
return new String[]{PACKET_TYPE_PING};
}
}

View File

@@ -0,0 +1,108 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Plugins.PingPlugin
import android.Manifest
import android.app.Activity
import android.app.Notification
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.widget.Toast
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import androidx.core.content.ContextCompat.getSystemService
import androidx.core.content.getSystemService
import org.kde.kdeconnect.Helpers.NotificationHelper
import org.kde.kdeconnect.NetworkPacket
import org.kde.kdeconnect.Plugins.Plugin
import org.kde.kdeconnect.Plugins.PluginFactory.LoadablePlugin
import org.kde.kdeconnect.UserInterface.MainActivity
import org.kde.kdeconnect_tp.R
@LoadablePlugin
class PingPlugin : Plugin() {
override val displayName: String
get() = context.resources.getString(R.string.pref_plugin_ping)
override val description: String
get() = context.resources.getString(R.string.pref_plugin_ping_desc)
override fun onPacketReceived(np: NetworkPacket): Boolean {
if (np.type != PACKET_TYPE_PING) {
Log.e(LOG_TAG, "Ping plugin should not receive packets other than pings!")
return false
}
val mutableUpdateFlags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
val resultPendingIntent = PendingIntent.getActivity(context, 0, Intent(context, MainActivity::class.java), mutableUpdateFlags)
val (id: Int, message: String) = if (np.has("message")) {
val id = System.currentTimeMillis().toInt()
Pair(id, np.getString("message"))
} else {
val id = 42 // A unique id to create only one notification
Pair(id, "Ping!")
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val permissionResult = ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS)
if (permissionResult != PackageManager.PERMISSION_GRANTED) {
// If notifications are not allowed, show a toast instead of a notification
Handler(Looper.getMainLooper()).post {
Toast.makeText(context, message, Toast.LENGTH_LONG).show()
}
return true
}
}
val notificationManager = context.getSystemService<NotificationManager>()
val notification = NotificationCompat.Builder(context, NotificationHelper.Channels.DEFAULT)
.setContentTitle(device.name)
.setContentText(message)
.setContentIntent(resultPendingIntent)
.setTicker(message)
.setSmallIcon(R.drawable.ic_notification)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setStyle(NotificationCompat.BigTextStyle().bigText(message))
.build()
NotificationHelper.notifyCompat(notificationManager, id, notification)
return true
}
override val actionName: String
get() = context.getString(R.string.send_ping)
override fun startMainActivity(parentActivity: Activity) {
if (isDeviceInitialized) {
device.sendPacket(NetworkPacket(PACKET_TYPE_PING))
}
}
override fun displayInContextMenu(): Boolean {
return true
}
override val supportedPacketTypes: Array<String>
get() = arrayOf(PACKET_TYPE_PING)
override val outgoingPacketTypes: Array<String>
get() = arrayOf(PACKET_TYPE_PING)
companion object {
private const val PACKET_TYPE_PING = "kdeconnect.ping"
private const val LOG_TAG = "PingPlugin"
}
}

View File

@@ -1,179 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Plugins;
import static org.apache.commons.collections4.SetUtils.unmodifiableSet;
import android.content.Context;
import android.util.Log;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.atteo.classindex.ClassIndex;
import org.atteo.classindex.IndexAnnotated;
import org.kde.kdeconnect.Device;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class PluginFactory {
public static void sortPluginList(@NonNull List<String> plugins) {
plugins.sort(Comparator.comparing(o -> pluginInfo.get(o).displayName));
}
@IndexAnnotated
public @interface LoadablePlugin { } //Annotate plugins with this so PluginFactory finds them
public static class PluginInfo {
PluginInfo(@NonNull String displayName, @NonNull String description, @DrawableRes int icon,
boolean enabledByDefault, boolean hasSettings, boolean supportsDeviceSpecificSettings,
boolean listenToUnpaired, @NonNull String[] supportedPacketTypes, @NonNull String[] outgoingPacketTypes,
@NonNull Class<? extends Plugin> instantiableClass) {
this.displayName = displayName;
this.description = description;
this.icon = icon;
this.enabledByDefault = enabledByDefault;
this.hasSettings = hasSettings;
this.supportsDeviceSpecificSettings = supportsDeviceSpecificSettings;
this.listenToUnpaired = listenToUnpaired;
this.supportedPacketTypes = unmodifiableSet(supportedPacketTypes);
this.outgoingPacketTypes = unmodifiableSet(outgoingPacketTypes);
this.instantiableClass = instantiableClass;
}
public @NonNull String getDisplayName() {
return displayName;
}
public @NonNull String getDescription() {
return description;
}
public @DrawableRes int getIcon() {
return icon;
}
public boolean hasSettings() {
return hasSettings;
}
public boolean supportsDeviceSpecificSettings() { return supportsDeviceSpecificSettings; }
public boolean isEnabledByDefault() {
return enabledByDefault;
}
public boolean listenToUnpaired() {
return listenToUnpaired;
}
Set<String> getOutgoingPacketTypes() {
return outgoingPacketTypes;
}
public Set<String> getSupportedPacketTypes() {
return supportedPacketTypes;
}
Class<? extends Plugin> getInstantiableClass() {
return instantiableClass;
}
private final @NonNull String displayName;
private final @NonNull String description;
private final @DrawableRes int icon;
private final boolean enabledByDefault;
private final boolean hasSettings;
private final boolean supportsDeviceSpecificSettings;
private final boolean listenToUnpaired;
private final @NonNull Set<String> supportedPacketTypes;
private final @NonNull Set<String> outgoingPacketTypes;
private final Class<? extends Plugin> instantiableClass;
}
private static final Map<String, PluginInfo> pluginInfo = new ConcurrentHashMap<>();
public static PluginInfo getPluginInfo(String pluginKey) {
return pluginInfo.get(pluginKey);
}
public static void initPluginInfo(Context context) {
try {
for (Class<?> pluginClass : ClassIndex.getAnnotated(LoadablePlugin.class)) {
Plugin p = ((Plugin) pluginClass.newInstance());
p.setContext(context, null);
PluginInfo info = new PluginInfo(p.getDisplayName(), p.getDescription(), p.getIcon(),
p.isEnabledByDefault(), p.hasSettings(), p.supportsDeviceSpecificSettings(),
p.listensToUnpairedDevices(), p.getSupportedPacketTypes(),
p.getOutgoingPacketTypes(), p.getClass());
pluginInfo.put(p.getPluginKey(), info);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
Log.i("PluginFactory","Loaded "+pluginInfo.size()+" plugins");
}
public static @NonNull Set<String> getAvailablePlugins() {
return pluginInfo.keySet();
}
public static @Nullable Plugin instantiatePluginForDevice(Context context, String pluginKey, Device device) {
PluginInfo info = pluginInfo.get(pluginKey);
try {
Plugin plugin = info.getInstantiableClass().newInstance();
plugin.setContext(context, device);
return plugin;
} catch (Exception e) {
Log.e("PluginFactory", "Could not instantiate plugin: " + pluginKey, e);
return null;
}
}
public static @NonNull Set<String> getIncomingCapabilities() {
HashSet<String> capabilities = new HashSet<>();
for (PluginInfo plugin : pluginInfo.values()) {
capabilities.addAll(plugin.getSupportedPacketTypes());
}
return capabilities;
}
public static @NonNull Set<String> getOutgoingCapabilities() {
HashSet<String> capabilities = new HashSet<>();
for (PluginInfo plugin : pluginInfo.values()) {
capabilities.addAll(plugin.getOutgoingPacketTypes());
}
return capabilities;
}
public static @NonNull Set<String> pluginsForCapabilities(Set<String> incoming, Set<String> outgoing) {
HashSet<String> plugins = new HashSet<>();
for (Map.Entry<String, PluginInfo> entry : pluginInfo.entrySet()) {
String pluginId = entry.getKey();
PluginInfo info = entry.getValue();
//Check incoming against outgoing
if (Collections.disjoint(outgoing, info.getSupportedPacketTypes())
&& Collections.disjoint(incoming, info.getOutgoingPacketTypes())) {
Log.d("PluginFactory", "Won't load " + pluginId + " because of unmatched capabilities");
continue; //No capabilities in common, do not load this plugin
}
plugins.add(pluginId);
}
return plugins;
}
}

View File

@@ -0,0 +1,94 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Plugins
import android.content.Context
import android.util.Log
import androidx.annotation.DrawableRes
import org.atteo.classindex.ClassIndex
import org.atteo.classindex.IndexAnnotated
import org.kde.kdeconnect.Device
object PluginFactory {
private var pluginInfo: Map<String, PluginInfo> = mapOf()
fun initPluginInfo(context: Context) {
try {
val plugins = ClassIndex.getAnnotated(LoadablePlugin::class.java)
.map { it.newInstance() as Plugin }
.map { plugin -> plugin.apply { setContext(context, null) } }
pluginInfo = plugins.associate { plugin -> Pair(plugin.pluginKey, PluginInfo(plugin)) }
} catch (e: Exception) {
throw RuntimeException(e)
}
Log.i("PluginFactory", "Loaded " + pluginInfo.size + " plugins")
}
val availablePlugins: Set<String>
get() = pluginInfo.keys
val incomingCapabilities: Set<String>
get() = pluginInfo.values.flatMap { plugin -> plugin.supportedPacketTypes }.toSet()
val outgoingCapabilities: Set<String>
get() = pluginInfo.values.flatMap { plugin -> plugin.outgoingPacketTypes }.toSet()
@JvmStatic
fun getPluginInfo(pluginKey: String): PluginInfo = pluginInfo[pluginKey]!!
@JvmStatic
fun sortPluginList(plugins: List<String>): List<String> {
return plugins.sortedBy { pluginInfo[it]?.displayName }
}
fun instantiatePluginForDevice(context: Context, pluginKey: String, device: Device): Plugin? {
try {
val plugin = pluginInfo[pluginKey]?.instantiableClass?.newInstance()?.apply { setContext(context, device) }
return plugin
} catch (e: Exception) {
Log.e("PluginFactory", "Could not instantiate plugin: $pluginKey", e)
return null
}
}
fun pluginsForCapabilities(incoming: Set<String>, outgoing: Set<String>): Set<String> {
fun hasCommonCapabilities(info: PluginInfo): Boolean =
outgoing.any { it in info.supportedPacketTypes } ||
incoming.any { it in info.outgoingPacketTypes }
val (used, unused) = pluginInfo.entries.partition { hasCommonCapabilities(it.value) }
for (pluginId in unused.map { it.key }) {
Log.d("PluginFactory", "Won't load $pluginId because of unmatched capabilities")
}
return used.map { it.key }.toSet()
}
@IndexAnnotated
annotation class LoadablePlugin //Annotate plugins with this so PluginFactory finds them
class PluginInfo private constructor(
val displayName: String,
val description: String,
// DrawableRes needs to be in the primary constructor, which is why we need 2 constructors
@field:DrawableRes @get:DrawableRes @param:DrawableRes val icon: Int,
val isEnabledByDefault: Boolean,
val hasSettings: Boolean,
val supportsDeviceSpecificSettings: Boolean,
val listenToUnpaired: Boolean,
supportedPacketTypes: Array<String>,
outgoingPacketTypes: Array<String>,
val instantiableClass: Class<out Plugin>,
) {
internal constructor(p: Plugin) : this(p.displayName, p.description, p.icon,
p.isEnabledByDefault, p.hasSettings(), p.supportsDeviceSpecificSettings(),
p.listensToUnpairedDevices(), p.supportedPacketTypes,
p.outgoingPacketTypes, p.javaClass)
val supportedPacketTypes: Set<String> = supportedPacketTypes.toSet()
val outgoingPacketTypes: Set<String> = outgoingPacketTypes.toSet()
}
}

View File

@@ -77,7 +77,7 @@ public class ReceiveNotificationsPlugin extends Plugin {
context,
0,
new Intent(context, MainActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);
Bitmap largeIcon = null;

Some files were not shown because too many files have changed in this diff Show More