2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-29 05:07:40 +00:00

Compare commits

...

88 Commits

Author SHA1 Message Date
l10n daemon script
90f7b190dd GIT_SILENT made messages (after extraction) 2025-08-22 02:01:24 +00:00
l10n daemon script
f08b0f0f1c GIT_SILENT Sync po/docbooks with svn 2025-08-21 02:34:28 +00:00
l10n daemon script
0fbbf1d6ed GIT_SILENT made messages (after extraction) 2025-08-16 02:03:09 +00:00
l10n daemon script
66db45b39e GIT_SILENT Sync po/docbooks with svn 2025-08-15 02:45:26 +00:00
l10n daemon script
c9bdcbbf9b GIT_SILENT made messages (after extraction) 2025-08-15 02:17:56 +00:00
l10n daemon script
ccaccee653 GIT_SILENT made messages (after extraction) 2025-08-13 02:01:55 +00:00
l10n daemon script
2ced849bd0 GIT_SILENT Sync po/docbooks with svn 2025-08-12 02:29:00 +00:00
l10n daemon script
f0b879e830 GIT_SILENT made messages (after extraction) 2025-08-11 02:03:04 +00:00
l10n daemon script
e84568ffb5 GIT_SILENT made messages (after extraction) 2025-08-06 02:10:15 +00:00
l10n daemon script
6cc41ab890 GIT_SILENT Sync po/docbooks with svn 2025-08-05 02:51:31 +00:00
l10n daemon script
038c96fe35 GIT_SILENT made messages (after extraction) 2025-08-05 02:23:48 +00:00
l10n daemon script
56e4b20d1f GIT_SILENT made messages (after extraction) 2025-07-29 02:01:57 +00:00
l10n daemon script
689ccff843 GIT_SILENT Sync po/docbooks with svn 2025-07-16 03:01:09 +00:00
Mohammed Aquib Azad
4e83693dc7 Bug 494056 - Smooth volume changes on media control plugin 2025-07-12 14:57:19 -07:00
Philip Cohn-Cort
a0a6accc66 Fix Regex syntax in DeviceHost.kt 2025-07-07 17:43:26 -04:00
David Barouh
f6f7d1e970 Edit DeviceHost.kt
Add the `:` character in the regex recognizing the IP address, to recognize IPv6 too.
2025-07-04 17:50:43 +00:00
l10n daemon script
ddda58e896 GIT_SILENT made messages (after extraction) 2025-07-03 08:11:42 +00:00
Albert Vaca Cintora
4f796446d6
Bump deps 2025-07-02 21:14:07 +02:00
Albert Vaca Cintora
04f5863f6a
Add TODO 2025-07-02 08:55:18 +02:00
Albert Vaca Cintora
c0c5ba1024
Fix devices not being clickable in share activity 2025-07-02 08:34:29 +02:00
Zan Xey
a733433551 Fix Dynamic Colors not being applied in some places 2025-06-14 00:09:25 +00:00
l10n daemon script
c362f16837 GIT_SILENT Sync po/docbooks with svn 2025-06-09 02:27:58 +00:00
Michael Centeno
90ff6df189 Changed command widget minimum width to 120dp to allow for smaller widget. 2025-06-04 14:14:26 +02:00
Albert Vaca Cintora
388b6f5a20
Fix not being able to input spaces when renaming the device 2025-06-04 14:11:45 +02:00
Albert Vaca Cintora
b463adda73
Bump deps 2025-06-04 14:06:07 +02:00
l10n daemon script
6687a09d2e GIT_SILENT made messages (after extraction) 2025-06-03 02:02:44 +00:00
l10n daemon script
63776ac57a GIT_SILENT made messages (after extraction) 2025-06-02 01:57:56 +00:00
l10n daemon script
925f428873 GIT_SILENT Sync po/docbooks with svn 2025-06-01 02:31:52 +00:00
l10n daemon script
9e4c53aa1c GIT_SILENT made messages (after extraction) 2025-06-01 02:05:45 +00:00
l10n daemon script
f5ff06a4d0 GIT_SILENT Sync po/docbooks with svn 2025-05-31 02:29:22 +00:00
l10n daemon script
07064a5766 GIT_SILENT Add new file (after extraction) 2025-05-31 02:02:01 +00:00
l10n daemon script
a77ac7ac47 GIT_SILENT made messages (after extraction) 2025-05-31 02:01:56 +00:00
l10n daemon script
7cd06cf581 GIT_SILENT made messages (after extraction) 2025-05-30 02:01:55 +00:00
l10n daemon script
30fbc14a80 GIT_SILENT made messages (after extraction) 2025-05-29 02:04:13 +00:00
l10n daemon script
431d087b88 GIT_SILENT made messages (after extraction) 2025-05-28 02:01:50 +00:00
Albert Vaca Cintora
5678100352
Fix ripple effect 2025-05-26 18:57:24 +02:00
Albert Vaca Cintora
c6b3d1b100
Scrollbar on the outside 2025-05-26 18:57:24 +02:00
Albert Vaca Cintora
c0a41034fa
Port device list items to Kotlin 2025-05-26 18:57:24 +02:00
Albert Vaca Cintora
5bc41367ed
Homegenize devices look in device lists 2025-05-26 18:57:24 +02:00
Albert Vaca Cintora
17010e533f
Fix NPE if displayArt changes while getArtAsArray is running 2025-05-26 18:56:06 +02:00
Philip Cohn-Cort
d5c47a1c4c Migrate 2 Fragments to Kotlin
This is a rebased version of !522, with the same key changes.

* `PairingFragment` and `SystemVolumeFragment` are now written in Kotlin
* A new `BaseFragment` defines a common 'binding' property for `AboutFragment`,
`DeviceFragment`, `PairingFragment`, and `SystemVolumeFragment`
* Calls in and out of `Intent`s and `Bundle`s for `Parcelable` values now go through `IntentCompat` and `BundleCompat`
2025-05-24 15:52:41 +00:00
l10n daemon script
08b1a9dce4 GIT_SILENT made messages (after extraction) 2025-05-21 02:02:38 +00:00
l10n daemon script
74146b83e2 GIT_SILENT made messages (after extraction) 2025-05-16 02:03:20 +00:00
Swapnil Devesh
938df620fa Check for different format of logcat line for Android 15 and up when detecting a failed clipboard access in logs
After upgrading to Android 15 I noticed the automatic clipboard push from Android stopped working,
debugging it, figured out that it looks like the format of lines in the logcat has changed,
this patch got it working again.
2025-05-13 21:14:34 -04:00
Albert Astals Cid
d4b8a07ee7 Remove "he", android uses "iw" now 2025-05-08 20:54:56 +00:00
l10n daemon script
44aa7824f7 GIT_SILENT made messages (after extraction) 2025-05-06 01:58:06 +00:00
Albert Vaca Cintora
feae6b54a9
Ignore ForegroundServiceStartNotAllowedException 2025-05-05 22:08:51 +02:00
l10n daemon script
dbbce2aee1 GIT_SILENT made messages (after extraction) 2025-05-04 02:05:02 +00:00
Albert Vaca Cintora
ed1dcdab52
Release 1.33.4 2025-05-02 17:24:53 +02:00
Albert Vaca Cintora
e3ccfb1b25
Bump deps 2025-05-02 17:12:15 +02:00
Albert Vaca Cintora
4ae04ae060 Refactor shared code out, apply ratelimit also to TCP 2025-05-02 17:05:55 +02:00
Albert Vaca Cintora
801367458e Improve rate-limit to also limit by IP 2025-05-02 17:05:55 +02:00
Albert Vaca Cintora
26c72fae89
Do not filter logs by PID
So we can see crashes in previous sessions of the app. Also, Android only
lets apps see their own logs anyway (at least in recent versions), so there
should be no privacy concerns from someone sharing those logs.
2025-05-02 17:02:40 +02:00
l10n daemon script
b981f9234b GIT_SILENT made messages (after extraction) 2025-04-29 01:55:52 +00:00
l10n daemon script
7f07e4658f GIT_SILENT made messages (after extraction) 2025-04-28 01:58:08 +00:00
l10n daemon script
f182d27ebe GIT_SILENT made messages (after extraction) 2025-04-27 01:57:46 +00:00
l10n daemon script
3b9d6ac61e GIT_SILENT made messages (after extraction) 2025-04-22 01:56:54 +00:00
l10n daemon script
6f24ac8d25 GIT_SILENT made messages (after extraction) 2025-04-20 01:54:52 +00:00
l10n daemon script
2891ec2092 GIT_SILENT made messages (after extraction) 2025-04-19 01:56:31 +00:00
Albert Vaca Cintora
fc1424c67c
Better pairing fragment layout 2025-04-18 19:51:51 +02:00
Albert Vaca Cintora
83efd6b355 Add a warning if multiple devices have the same name 2025-04-18 17:42:08 +00:00
Albert Vaca Cintora
05e14bb81c
Remove setting to disable UDP broadcast 2025-04-18 10:30:22 +02:00
l10n daemon script
1236cbe4e3 GIT_SILENT made messages (after extraction) 2025-04-17 01:54:46 +00:00
l10n daemon script
5f9159a13f GIT_SILENT made messages (after extraction) 2025-04-16 01:55:03 +00:00
l10n daemon script
fbd9f8f216 GIT_SILENT made messages (after extraction) 2025-04-15 01:56:01 +00:00
l10n daemon script
e32b6b67e0 GIT_SILENT made messages (after extraction) 2025-04-14 01:55:17 +00:00
Vala Zadeh
63a849b80a Extend offline URL sharing behavior
## Summary

Previously, URLs shared to offline targets via the ShareActivity were
delivered to them once they became online. This change extends this
behavior to direct share targets.

## Test Plan

Test 1

* Make sure a PC device is already paired with the phone. Let's say the name of this device is "PC".
* Make PC unreachable, e.g., close the KDE app on it.
* On the phone, open Chrome and share a couple of webpages to KDE's PC's direct share target.
* Open the KDE app on the PC.
* Observe that the webpages are opened on PC.

Test 2

* Make sure a PC device is already paired with the phone. Let's say the name of this device is "PC".
* Make PC unreachable, e.g., close the KDE app on it.
* On the phone, share a file to KDE's PC's direct share target.
* Open the KDE app on the PC.
* Observe that the file is sent to PC.

Test 3

* Make sure two PC devices are already paired with the phone. Let's say the name of these devices are "PC1" and "PC2".
* Make PC1 and PC2 unreachable, e.g., close the KDE app on them.
* On the phone, open Chrome and share a couple of webpages to KDE's PC1's direct share target.
* Open the KDE app on the PC2.
* Observe that the webpages are NOT opened on PC2.
* Open the KDE app on the PC1.
* Observe that the webpages are opened on PC1.

Test 4

* Make sure a PC device is already paired with the phone. Let's say the name of this device is "PC".
* Make PC reachable, e.g., have the KDE app open on it.
* Try to share a URL from the phone to the KDE's PC's direct share target.
* Observe that the URL opens instantly on the PC.
2025-04-13 00:20:04 +00:00
l10n daemon script
170bb5e717 GIT_SILENT made messages (after extraction) 2025-04-12 01:51:20 +00:00
l10n daemon script
f121e4982e GIT_SILENT made messages (after extraction) 2025-04-10 01:54:33 +00:00
l10n daemon script
937289730d GIT_SILENT made messages (after extraction) 2025-04-09 01:54:22 +00:00
l10n daemon script
624a9302fd GIT_SILENT made messages (after extraction) 2025-04-08 02:00:37 +00:00
l10n daemon script
e6f4b69464 GIT_SILENT made messages (after extraction) 2025-04-07 02:06:50 +00:00
Albert Vaca Cintora
2190c9cdaa
Missed updated changelog 2025-04-06 10:32:38 +02:00
Albert Vaca Cintora
864d44cb5b
Release 1.33.3 2025-04-06 10:30:22 +02:00
Albert Vaca Cintora
72e958a891
Allow exporting the logs form the app 2025-04-06 10:24:28 +02:00
Albert Vaca Cintora
d4ab2ca6cf
Bump deps 2025-04-06 10:24:14 +02:00
Albert Vaca Cintora
fd51ec7c14
Fix linter warnings 2025-04-05 00:44:08 +02:00
Albert Vaca Cintora
28070954a6
Regenerate device ID if the stored ID is not valid 2025-04-05 00:05:56 +02:00
Albert Vaca Cintora
e10f2496de
Simplify running git in gradle 2025-04-04 14:06:20 +02:00
Albert Vaca Cintora
95b4c08605
Bump deps 2025-04-04 12:15:11 +02:00
l10n daemon script
51d4de34c4 GIT_SILENT made messages (after extraction) 2025-04-04 02:01:41 +00:00
l10n daemon script
de2001bbe1 GIT_SILENT made messages (after extraction) 2025-03-31 01:55:34 +00:00
Albert Vaca Cintora
9c80cb9a40
Remove old code that used Android IDs as device IDs 2025-03-30 21:01:32 +02:00
Albert Vaca Cintora
0b03a66c37
Generate IDs with only alphanumeric values
As per https://invent.kde.org/network/kdeconnect-meta/-/merge_requests/13
2025-03-30 20:59:38 +02:00
l10n daemon script
6d66d69820 GIT_SILENT made messages (after extraction) 2025-03-27 01:58:41 +00:00
Albert Vaca Cintora
c0fc19baaa
Bump version of classindexksp 2025-03-18 12:56:45 +01:00
Albert Vaca Cintora
03ea5eae4c
Fix NPE 2025-03-17 14:03:15 +01:00
l10n daemon script
b373c28cdd GIT_SILENT made messages (after extraction) 2025-03-16 01:58:31 +00:00
139 changed files with 2077 additions and 1573 deletions

View File

@ -298,6 +298,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:name="android.support.PARENT_ACTIVITY"
android:value="org.kde.kdeconnect.Plugins.MousePadPlugin.MousePadActivity" />
</activity>
<!-- TODO: Remove? This is only used by https://github.com/andOTP/andOTP, which is unmaintained since 2021. Do people use forks or can we remove this? -->
<activity
android:name="org.kde.kdeconnect.Plugins.MousePadPlugin.SendKeystrokesToHostActivity"
android:label="@string/pref_plugin_mousepad_send_keystrokes"

View File

@ -28,23 +28,10 @@ plugins {
val licenseResDir = File("$projectDir/build/dependency-license-res")
fun String.runCommand(
workingDir: File = File("."),
timeoutAmount: Long = 60,
timeoutUnit: TimeUnit = TimeUnit.SECONDS
): String = ProcessBuilder(split("\\s(?=(?:[^'\"`]*(['\"`])[^'\"`]*\\1)*[^'\"`]*$)".toRegex()))
.directory(workingDir)
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE)
.start()
.apply { waitFor(timeoutAmount, timeoutUnit) }
.run {
val error = errorStream.bufferedReader().readText().trim()
if (error.isNotEmpty()) {
throw Exception(error)
}
inputStream.bufferedReader().readText().trim()
}
val hashProvider = project.providers.exec {
workingDir = rootDir
commandLine("git", "rev-parse", "--short", "HEAD")
}.standardOutput.asText.map { it.trim() }
android {
namespace = "org.kde.kdeconnect_tp"
@ -53,8 +40,8 @@ android {
applicationId = "org.kde.kdeconnect_tp"
minSdk = 21
targetSdk = 35
versionCode = 13302
versionName = "1.33.2"
versionCode = 13304
versionName = "1.33.4"
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
buildFeatures {
@ -134,8 +121,7 @@ android {
// Default output filename is "${project.name}-${v.name}.apk". We want
// the Git commit short-hash to be added onto that default filename.
try {
val hash = "git rev-parse --short HEAD".runCommand(workingDir = rootDir)
val newName = "${project.name}-${variant.name}-${hash}.apk"
val newName = "${project.name}-${variant.name}-${hashProvider.get()}.apk"
logger.quiet(" Found an output file ${output.outputFile.name}, renaming to $newName")
output.outputFileName = newName
} catch (ignored: Exception) {

View File

@ -1,21 +1,21 @@
يوفر كِيدِي المتّصل مجموعة من الميزات لدمج سير عملك عبر الأجهزة:
يوفر جسر كِيدِي مجموعة من الميزات لدمج سير عملك عبر الأجهزة:
- نقل الملفات بين أجهزتك.
- الوصول إلى الملفات الموجودة على هاتفك من جهاز الكمبيوتر الخاص بك، دون أسلاك.
- الوصول إلى الملفات الموجودة على هاتفك من حاسوبك، دون أسلاك.
- الحافظة المشتركة: النسخ واللصق بين أجهزتك.
- الحصول على إشعارات للمكالمات والرسائل الواردة على جهاز الكمبيوتر الخاص بك.
- لوحة اللمس الافتراضية: استخدم شاشة هاتفك كلوحة لمس لجهاز الكمبيوتر الخاص بك.
- مزامنة الإشعارات: الوصول إلى إشعارات هاتفك من جهاز الكمبيوتر الخاص بك والرد على الرسائل.
- الحصول على إشعارات للمكالمات والرسائل الواردة على حاسوبك.
- لوحة اللمس افتراضية: استخدم شاشة هاتفك كلوحة لمس لحاسوبك.
- مزامنة الإشعارات: الوصول إلى إشعارات هاتفك من حاسوبك والرد على الرسائل.
- التحكم عن بعد في الوسائط المتعددة: استخدم هاتفك كجهاز تحكم عن بعد لمشغلات الوسائط لينكس.
- اتصال WiFi: لا حاجة إلى سلك USB أو بلوتوث.
- تشفير TLS من البداية إلى النهاية: معلوماتك آمنة.
- اتصال واي فاي: لا حاجة إلى سلك يو اس بي أو بلوتوث.
- تعمية TLS من البداية إلى النهاية: معلوماتك آمنة.
يرجى ملاحظة أنك ستحتاج إلى تثبيت كِيدِي المتّصل على حاسوبك حتى يعمل هذا التطبيق، والحفاظ على تحديث إصدار سطح المكتب بإصدار أندوريد حتى تعمل أحدث الميزات.
يرجى ملاحظة أنك ستحتاج إلى تثبيت جسر كِيدِي على حاسوبك حتى يعمل هذا التطبيق، والحفاظ على تحديث إصدار سطح المكتب بإصدار أندوريد حتى تعمل أحدث الميزات.
معلومات الأذونات الحساسة:
* إذن إمكانية الوصول: مطلوب لتلقي إدخال من جهاز آخر للتحكم في هاتف أندرويد خاص بك، إذا كنت تستخدم ميزة الإدخال عن بُعد.
* إذن تحديد الموقع في الخلفية: مطلوب لمعرفة شبكة واي فاي التي تتصل بها، إذا كنت تستخدم ميزة الشبكات الموثوقة.
لا يرسل كِيدِي المتّصل أي معلومات إلى كيدي أو إلى أي طرف ثالث. يرسل كِيدِي المتّصل البيانات من جهاز إلى آخر مباشرةً باستخدام الشبكة المحلية، وليس عبر الإنترنت، وباستخدام التشفير من البداية إلى النهاية.
لا يرسل جسر كِيدِي أي معلومات إلى كيدي أو إلى أي طرف ثالث. يرسل جسر كِيدِي البيانات من جهاز إلى آخر مباشرةً باستخدام الشبكة المحلية، وليس عبر الإنترنت، وباستخدام التعمية من البداية إلى النهاية.
هذا التطبيق جزء من مشروع مفتوح المصدر وهو موجود بفضل جميع الأشخاص الذين ساهموا فيه. قم بزيارة الموقع الإلكتروني للحصول على الكود المصدر.
هذا التطبيق جزء من مشروع مفتوح المصدر وهو موجود بفضل جميع الأشخاص الذين ساهموا فيه. زر الموقع الإلكتروني للحصول على الشفرة المصدرية.

View File

@ -1 +1 @@
يقوم كِيدِي المتّصل بدمج هاتفك الذكي والحاسوب
يدمج جسر كِيدِي هاتفك الذكي مع حاسوبك

View File

@ -0,0 +1,16 @@
1.33.3
* Fix more connection issues. Pairing again might be needed in some setups.
* Add a setting to export the application logs.
1.33.2
* Fix connection issues on some devices.
1.33.1
* Fix compatibility with GSConnect.
1.33.0
* Add support for PeerTube links.
* Allow filtering notifications from work profile.
* Fix bug where devices would unpair without user interaction.
* Verification key now changes every second (only if both devices support it).
* Fix crashes.

View File

@ -0,0 +1,16 @@
1.33.4
* Extend offline URL sharing behavior to direct share targets.
* Improve paring screen.
1.33.3
* Fix connection issues. Pairing again might be needed in some cases.
* Add a setting to export the application logs.
1.33.1
* Fix compatibility with GSConnect.
1.33.0
* Add support for PeerTube links.
* Allow filtering notifications from work profile.
* Fix bug where devices would unpair without user interaction.
* Verification key now changes every second (if both devices support it).

View File

@ -0,0 +1,20 @@
KDE Connect предоставляет набор функций для интеграции рабочего процесса между устройствами:
- Передача файлов между устройствами.
- Доступ к файлам на телефоне с компьютера без проводов.
- Общий буфер обмена: копирование и вставка между устройствами.
- Уведомления о входящих вызовах и сообщениях на компьютере.
- Виртуальный тачпад: использование экрана телефона в качестве тачпада для компьютера.
- Синхронизация уведомлений: доступ к уведомлениям телефона с компьютера и возможность отвечать на сообщения.
- Дистанционное управление мультимедиа: использование телефона как пульта для медиаплееров в Linux.
- Подключение по Wi-Fi: без проводов USB или Bluetooth.
- Сквозное шифрование TLS: безопасность передаваемой информации.
Обратите внимание, что для работы приложения требуется установка KDE Connect на компьютере. Для поддержки всех функций, версия на компьютере должна быть актуальной и соответствовать версии на Android .
Информация о чувствительных разрешениях:
- Разрешение «Специальные возможности»: необходимо для получения ввода с другого устройства при использовании функции дистанционного ввода.
- Разрешение «Фоновое определение местоположения»: необходимо для определения текущей Wi-Fi-сети при использовании функции «Доверенные сети».
KDE Connect никогда не отправляет данные ни в KDE, ни третьим лицам. Передача данных осуществляется напрямую между устройствами через локальную сеть, без использования интернета, с применением сквозного шифрования.
Приложение является частью проекта с открытым исходным кодом и существует благодаря сообществу участников. Исходный код доступен на официальном сайте.

View File

@ -0,0 +1 @@
KDE Connect позволяет соединить смартфон и компьютер

View File

@ -0,0 +1 @@
KDE Connect

View File

@ -1,33 +1,33 @@
[versions]
activityCompose = "1.10.1"
androidDesugarJdkLibs = "2.1.5"
androidGradlePlugin = "8.9.0"
androidGradlePlugin = "8.11.0"
androidSmsmms = "kdeconnect-1-21-0"
appcompat = "1.7.0"
appcompat = "1.7.1"
bcpkixJdk15on = "1.70"
classindexksp = "1.1"
commonsCollections4 = "4.4"
commonsIo = "2.18.0"
classindexksp = "1.2"
commonsCollections4 = "4.5.0"
commonsIo = "2.19.0"
commonsLang3 = "3.17.0"
constraintlayoutCompose = "1.1.1"
coreKtx = "1.15.0"
dependencyLicenseReport = "2.7"
coreKtx = "1.16.0"
dependencyLicenseReport = "2.9"
disklrucache = "2.0.2"
documentfile = "1.0.1"
gridlayout = "1.0.0"
documentfile = "1.1.0"
gridlayout = "1.1.0"
jsonassert = "1.5.3"
junit = "4.13.2"
kotlin = "2.1.10"
kspPlugin = "2.1.10-1.0.30"
kotlinxCoroutinesCore = "1.10.1"
kotlin = "2.2.0"
kspPlugin = "2.2.0-2.0.2"
kotlinxCoroutinesCore = "1.10.2"
lifecycleExtensions = "2.2.0"
lifecycleRuntimeKtx = "2.8.7"
lifecycleRuntimeKtx = "2.9.1"
logger = "1.0.3"
material = "1.12.0"
material3 = "1.3.1"
material3 = "1.3.2"
media = "1.7.0"
minaCore = "2.2.4"
mockitoCore = "5.16.0"
mockitoCore = "5.18.0"
preferenceKtx = "1.2.1"
reactiveStreams = "1.0.4"
recyclerview = "1.4.0"
@ -35,7 +35,7 @@ rxjava = "2.2.21"
sl4j = "2.0.13"
sshdCore = "2.15.0"
swiperefreshlayout = "1.1.0"
uiToolingPreview = "1.7.8"
uiToolingPreview = "1.8.3"
univocityParsers = "2.9.1"
[libraries]

View File

@ -1,7 +1,7 @@
#Sat Sep 28 01:39:16 AM EDT 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

View File

@ -5,7 +5,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2025-02-09 17:40+0400\n"
"PO-Revision-Date: 2025-08-20 21:20+0400\n"
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
"Language-Team: ar\n"
"Language: ar\n"
@ -13,7 +13,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Lokalize 23.08.5\n"
msgid ""
@ -49,26 +49,21 @@ 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 ""
"يوفر كِيدِي المتّصل مجموعة من الميزات لدمج سير عملك عبر الأجهزة:\n"
"يوفر جسر كِيدِي مجموعة من الميزات لدمج سير عملك عبر الأجهزة:\n"
"\n"
"- نقل الملفات بين أجهزتك.\n"
"- الوصول إلى الملفات الموجودة على هاتفك من جهاز الكمبيوتر الخاص بك، دون "
"أسلاك.\n"
"- الوصول إلى الملفات الموجودة على هاتفك من حاسوبك، دون أسلاك.\n"
"- الحافظة المشتركة: النسخ واللصق بين أجهزتك.\n"
"- الحصول على إشعارات للمكالمات والرسائل الواردة على جهاز الكمبيوتر الخاص "
"بك.\n"
"- لوحة اللمس الافتراضية: استخدم شاشة هاتفك كلوحة لمس لجهاز الكمبيوتر الخاص "
"بك.\n"
"- مزامنة الإشعارات: الوصول إلى إشعارات هاتفك من جهاز الكمبيوتر الخاص بك "
"والرد على الرسائل.\n"
"- الحصول على إشعارات للمكالمات والرسائل الواردة على حاسوبك.\n"
"- لوحة اللمس افتراضية: استخدم شاشة هاتفك كلوحة لمس لحاسوبك.\n"
"- مزامنة الإشعارات: الوصول إلى إشعارات هاتفك من حاسوبك والرد على الرسائل.\n"
"- التحكم عن بعد في الوسائط المتعددة: استخدم هاتفك كجهاز تحكم عن بعد لمشغلات "
"الوسائط لينكس.\n"
"- اتصال WiFi: لا حاجة إلى سلك USB أو بلوتوث.\n"
"- تشفير TLS من البداية إلى النهاية: معلوماتك آمنة.\n"
"- اتصال واي فاي: لا حاجة إلى سلك يو اس بي أو بلوتوث.\n"
"- تعمية TLS من البداية إلى النهاية: معلوماتك آمنة.\n"
"\n"
"يرجى ملاحظة أنك ستحتاج إلى تثبيت كِيدِي المتّصل على حاسوبك حتى يعمل هذا "
"التطبيق، والحفاظ على تحديث إصدار سطح المكتب بإصدار أندوريد حتى تعمل أحدث "
"الميزات.\n"
"يرجى ملاحظة أنك ستحتاج إلى تثبيت جسر كِيدِي على حاسوبك حتى يعمل هذا التطبيق، "
"والحفاظ على تحديث إصدار سطح المكتب بإصدار أندوريد حتى تعمل أحدث الميزات.\n"
"\n"
"معلومات الأذونات الحساسة:\n"
"* إذن إمكانية الوصول: مطلوب لتلقي إدخال من جهاز آخر للتحكم في هاتف أندرويد "
@ -76,9 +71,9 @@ msgstr ""
"* إذن تحديد الموقع في الخلفية: مطلوب لمعرفة شبكة واي فاي التي تتصل بها، إذا "
"كنت تستخدم ميزة الشبكات الموثوقة.\n"
"\n"
"لا يرسل كِيدِي المتّصل أي معلومات إلى كيدي أو إلى أي طرف ثالث. يرسل كِيدِي المتّصل "
"لا يرسل جسر كِيدِي أي معلومات إلى كيدي أو إلى أي طرف ثالث. يرسل جسر كِيدِي "
"البيانات من جهاز إلى آخر مباشرةً باستخدام الشبكة المحلية، وليس عبر الإنترنت، "
"وباستخدام التشفير من البداية إلى النهاية.\n"
"وباستخدام التعمية من البداية إلى النهاية.\n"
"\n"
"هذا التطبيق جزء من مشروع مفتوح المصدر وهو موجود بفضل جميع الأشخاص الذين "
"ساهموا فيه. قم بزيارة الموقع الإلكتروني للحصول على الكود المصدر.\n"
"ساهموا فيه. زر الموقع الإلكتروني للحصول على الشفرة المصدرية.\n"

View File

@ -5,7 +5,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2025-02-09 17:40+0400\n"
"PO-Revision-Date: 2025-05-31 17:30+0400\n"
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
"Language-Team: ar\n"
"Language: ar\n"
@ -13,8 +13,8 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Lokalize 23.08.5\n"
msgid "KDE Connect integrates your smartphone and computer"
msgstr "يقوم كِيدِي المتّصل بدمج هاتفك الذكي والحاسوب"
msgstr "يدمج جسر كِيدِي هاتفك الذكي مع حاسوبك"

View File

@ -1,5 +1,5 @@
# Frederik Schwarzer <schwarzer@kde.org>, 2023.
# tobi <onewayme001@posteo.de>, 2024.
# SPDX-FileCopyrightText: 2023 Frederik Schwarzer <schwarzer@kde.org>
# SPDX-FileCopyrightText: 2024 tobi <onewayme001@posteo.de>
#. extracted from ./metadata/android/en-US/full_description.txt
msgid ""
msgstr ""

View File

@ -1,4 +1,4 @@
# Frederik Schwarzer <schwarzer@kde.org>, 2023.
# SPDX-FileCopyrightText: 2023 Frederik Schwarzer <schwarzer@kde.org>
#. extracted from ./metadata/android/en-US/short_description.txt
msgid ""
msgstr ""

View File

@ -1,11 +1,15 @@
# SPDX-FileCopyrightText: 2023 Víctor Rodrigo Córdoba <vrcordoba@gmail.com>
# Spanish translations for kdeconnect-android-store-full.po package.
# Copyright (C) 2023-2025 This file is copyright:
# This file is distributed under the same license as the kdeconnect-android package.
#
# SPDX-FileCopyrightText: 2023, 2025 Víctor Rodrigo Córdoba <vrcordoba@gmail.com>
#. 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-30 18:49+0200\n"
"PO-Revision-Date: 2025-06-09 02:36+0100\n"
"Last-Translator: Víctor Rodrigo Córdoba <vrcordoba@gmail.com>\n"
"Language-Team: Spanish <kde-l10n-es@kde.org>\n"
"Language: es\n"

View File

@ -1,11 +1,15 @@
# SPDX-FileCopyrightText: 2023 Víctor Rodrigo Córdoba <vrcordoba@gmail.com>
# Spanish translations for kdeconnect-android-store-short.po package.
# Copyright (C) 2023-2025 This file is copyright:
# This file is distributed under the same license as the kdeconnect-android package.
#
# SPDX-FileCopyrightText: 2023, 2025 Víctor Rodrigo Córdoba <vrcordoba@gmail.com>
#. extracted from ./metadata/android/en-US/short_description.txt
msgid ""
msgstr ""
"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"
"PO-Revision-Date: 2025-06-09 02:36+0100\n"
"Last-Translator: Víctor Rodrigo Córdoba <vrcordoba@gmail.com>\n"
"Language-Team: Spanish <kde-l10n-es@kde.org>\n"
"Language: es\n"

View File

@ -0,0 +1,83 @@
# Alexander Yavorskiy <kekcuha@gmail.com>, 2025.
#. 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: 2025-05-30 20:22+0200\n"
"Last-Translator: Alexander Yavorskiy <kekcuha@gmail.com>\n"
"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 21.08.3\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
msgid ""
"KDE Connect provides a set of features to integrate your workflow across "
"devices:\n"
"\n"
"- Transfer files between your devices.\n"
"- Access files on your phone from your computer, without wires.\n"
"- Shared clipboard: copy and paste between your devices.\n"
"- Get notifications for incoming calls and messages on your computer.\n"
"- Virtual touchpad: Use your phone screen as your computer's touchpad.\n"
"- Notifications sync: Access your phone notifications from your computer and "
"reply to messages.\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"
msgstr ""
"KDE Connect предоставляет набор функций для интеграции рабочего процесса "
"между устройствами:\n"
"- Передача файлов между устройствами.\n"
"- Доступ к файлам на телефоне с компьютера без проводов.\n"
"- Общий буфер обмена: копирование и вставка между устройствами.\n"
"- Уведомления о входящих вызовах и сообщениях на компьютере.\n"
"- Виртуальный тачпад: использование экрана телефона в качестве тачпада для "
"компьютера.\n"
"- Синхронизация уведомлений: доступ к уведомлениям телефона с компьютера и "
"возможность отвечать на сообщения.\n"
"- Дистанционное управление мультимедиа: использование телефона как пульта "
"для медиаплееров в Linux.\n"
"- Подключение по Wi-Fi: без проводов USB или Bluetooth.\n"
"- Сквозное шифрование TLS: безопасность передаваемой информации.\n"
"\n"
"Обратите внимание, что для работы приложения требуется установка KDE Connect "
"на компьютере. Для поддержки всех функций, версия на компьютере должна быть "
"актуальной и соответствовать версии на Android .\n"
"\n"
"Информация о чувствительных разрешениях:\n"
"\n"
"- Разрешение «Специальные возможности»: необходимо для получения ввода с "
"другого устройства при использовании функции дистанционного ввода.\n"
"- Разрешение «Фоновое определение местоположения»: необходимо для "
"определения текущей Wi-Fi-сети при использовании функции «Доверенные сети».\n"
"\n"
"KDE Connect никогда не отправляет данные ни в KDE, ни третьим лицам. "
"Передача данных осуществляется напрямую между устройствами через локальную "
"сеть, без использования интернета, с применением сквозного шифрования.\n"
"Приложение является частью проекта с открытым исходным кодом и существует "
"благодаря сообществу участников. Исходный код доступен на официальном "
"сайте.\n"

View File

@ -0,0 +1,20 @@
# Alexander Yavorskiy <kekcuha@gmail.com>, 2025.
#. 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: 2025-05-30 20:17+0200\n"
"Last-Translator: Alexander Yavorskiy <kekcuha@gmail.com>\n"
"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 21.08.3\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
msgid "KDE Connect integrates your smartphone and computer"
msgstr "KDE Connect позволяет соединить смартфон и компьютер"

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:drawablePadding="8dp"
android:paddingTop="16dp"
android:paddingBottom="12dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/pairing_duplicate_names"
app:drawableStartCompat="@drawable/ic_warning"
app:drawableTint="?attr/colorControlNormal">
</TextView>

View File

@ -11,19 +11,21 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:id="@+id/refresh_list_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/activity_horizontal_margin">
>
<ListView
android:id="@+id/devices_list"
android:scrollbarStyle="outsideOverlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:addStatesFromChildren="true"
android:divider="@null"
android:padding="@dimen/activity_horizontal_margin"
android:descendantFocusability="afterDescendants"
android:dividerHeight="12dp"
android:orientation="vertical"
android:clipToPadding="false"
tools:listitem="@layout/list_card_entry"
tools:listitem="@layout/list_item_device_entry"
tools:context=".MainActivity" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

View File

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
SPDX-FileCopyrightText: 2023 Dmitry Yudin <dgyudin@gmail.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
-->
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
style="@style/KdeConnectCardStyle.Filled"
app:contentPadding="@dimen/view_default_padding"
tools:layout_width="240dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:gravity="center_vertical"
android:layout_marginTop="8dp"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="vertical">
<ImageView
android:id="@+id/list_item_entry_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_device_laptop_32dp"
android:layout_marginBottom="12dp"
android:importantForAccessibility="no"
app:tint="?attr/colorOnSurface" />
<TextView
android:id="@+id/list_item_entry_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:ellipsize="end"
android:lines="2"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?attr/colorOnSurface"
tools:maxLength="30"
tools:text="@tools:sample/lorem/random" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
SPDX-FileCopyrightText: 2023 Dmitry Yudin <dgyudin@gmail.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
-->
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:focusable="true"
android:clickable="true"
android:background="?android:attr/selectableItemBackground"
style="@style/KdeConnectCardStyle.Filled"
app:contentPadding="@dimen/view_default_padding">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/list_item_entry_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@drawable/ic_device_laptop_32dp"
android:importantForAccessibility="no"
app:tint="?attr/colorControlNormal"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/list_item_entry_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dip"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium"
tools:text="A very long device name that might wrap into multiple lines"/>
<TextView
android:id="@+id/list_item_entry_summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dip"
android:singleLine="true"
android:text=""
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#CC2222"
android:visibility="gone"
tools:text="Other (optional) info"
tools:visibility="gone"/>
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>

View File

@ -1,67 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:baselineAligned="false"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/list_item_entry_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@drawable/ic_device_laptop_32dp"
android:importantForAccessibility="no"
app:tint="?attr/colorControlNormal"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/list_item_entry_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dip"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:singleLine="true"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium"
tools:maxLength="20"
tools:text="@tools:sample/lorem/random"/>
<TextView
android:id="@+id/list_item_entry_summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dip"
android:singleLine="true"
android:text=""
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#CC2222"
android:visibility="gone"
tools:text="Other (optional) info"
tools:visibility="visible"/>
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:drawablePadding="8dp"
android:paddingTop="16dp"
android:paddingBottom="12dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/pairing_duplicate_names"
app:drawableStartCompat="@drawable/ic_warning"
app:drawableLeftCompat="@drawable/ic_warning">
</TextView>

View File

@ -13,6 +13,4 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:clipToPadding="false"
android:orientation="vertical"
android:paddingHorizontal="@dimen/activity_horizontal_margin"
android:paddingVertical="@dimen/activity_vertical_margin">
</androidx.recyclerview.widget.RecyclerView>
android:paddingVertical="@dimen/activity_vertical_margin" />

View File

@ -19,12 +19,6 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:visibility="gone"
tools:visibility="visible">
<ProgressBar
android:id="@+id/pair_progress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone" />
<TextView
android:id="@+id/pair_message"
android:layout_width="wrap_content"
@ -33,6 +27,13 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:text="@string/device_not_paired"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/pairing_explanation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="12dip"
android:text="@string/pairing_explanation" />
<TextView
android:id="@+id/pair_verification"
android:layout_width="wrap_content"
@ -43,6 +44,12 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:textAppearance="?android:attr/textAppearanceMedium"
app:drawableStartCompat="@drawable/ic_key" />
<ProgressBar
android:id="@+id/pair_progress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone" />
<com.google.android.material.button.MaterialButton
android:id="@+id/pair_button"
android:layout_width="match_parent"

View File

@ -7,11 +7,20 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dip"
android:text="@string/pairing_title"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ListView
android:id="@+id/run_commands_device_list"
android:layout_width="match_parent"
@ -20,13 +29,12 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:addStatesFromChildren="true"
android:orientation="vertical"
android:divider="@null"
android:dividerHeight="0dp" />
android:dividerHeight="12dp" />
<TextView
android:id="@+id/no_devices"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dip"
android:text="@string/device_list_empty"
android:textAppearance="?android:attr/textAppearanceSmall"

View File

@ -1,51 +1,69 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kde_connect">كِيدِي المتّصل</string>
<string name="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_send_clipboard">أرسل الحافظة</string>
<string name="pref_plugin_telephony">مُخطِر المهاتفة</string>
<string name="pref_plugin_telephony_desc">أرسل إخطارات للمكالمات الواردة</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_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_mousepad">الدّخل البعيد</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_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_runcommand_desc">شغّل أوامر عن بعد من الهاتف أو اللوحيّ</string>
<string name="pref_plugin_contacts">مزامن المتراسلين</string>
<string name="pref_plugin_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">استقبل الإخطارات من الجهاز الآخر واعرضها على أندرويد</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_receive_notifications">استقبل الإشعارات</string>
<string name="pref_plugin_receive_notifications_desc">استقبل الإشعارات من الجهاز الآخر واعرضها على أندرويد</string>
<string name="pref_plugin_sharereceiver">شارك واستقبل</string>
<string name="pref_plugin_sharereceiver_desc">شارك الملفّات والعناوين بين الجهازين</string>
<string name="device_list_empty">لا أجهزة</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="send_ping">أرسل وخزة</string>
<string name="open_mpris_controls">تحكّمات الوسائط المتعدّدة</string>
<string name="open_mousepad">الدّخل البعيد</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="no_permissions">عليك إعطاء التّطبيق صلاحيّات للنّفاذ إلى الإشعارات</string>
<string name="no_permission_mprisreceiver">لتكون قادرًا على التحكم في مشغلات الوسائط الخاصة بك، تحتاج إلى منح حق الوصول إلى الإشعارات</string>
<string name="no_permissions_remotekeyboard">لتلقي ضغطات المفاتيح تحتاج إلى تنشيط لوحة المفاتيح البعيدة لجسر كِيدِي</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">لا يوجد اتصال لوحة المفاتيح بعيدة نشط، وإنشاء واحد في جسر كِيدِي</string>
<string name="remotekeyboard_connected">اتصال لوحة المفاتيح بعيدة نشط</string>
<string name="remotekeyboard_multiple_connections">هناك أكثر من اتصال لوحة مفاتيح بعيدة، حدد الجهاز لتضبطه</string>
<string name="open_mousepad">الإدخال البعيد</string>
<string name="mousepad_info">حرك إصبعًا على الشاشة لتحريك مؤشر الفأرة. اطرق للنقرة، واستخدم اثنين أو ثلاث أصابع للأزرار اليمنى والوسطى. استخدام أصبعين للتمرير. استخدم الضغط طويلًا للسحب والإفلات. يمكن تمكين وظيفة الفأرة التوجيهية Gyro من تفضيلات الملحقة.</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_mouse_buttons_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>
@ -55,18 +73,33 @@
<string-array name="mousepad_sensitivity_entries">
<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>
</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_pref_category_title">أرسل ضغطات المفاتيح</string>
<string name="sendkeystrokes_pref_enabled">مكّن إرسال ضغطات المفاتيح</string>
<string name="sendkeystrokes_pref_enabled_summary">ستمع إلى البيانات التي تحتوي على نوع ملف التعريف \'text/x-keystrokes\'</string>
<string name="sendkeystrokes_safe_text_enabled">أرسل نص آمن فورًا</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="view_status_title">الحالة</string>
<string name="battery_status_format">البطارية: %d%%</string>
<string name="battery_status_low_format">البطارية: %d%% منخفضة</string>
@ -80,8 +113,9 @@
<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_clocks_not_match">ساعات الجهاز غير متزامنة</string>
<string name="error_canceled_by_user">ألغاه المستخدم</string>
<string name="error_canceled_by_other_peer">ألغاه ندّ آخر</string>
<string name="encryption_info_title">معلومات التّعمية</string>
@ -90,17 +124,84 @@
<string name="pair_requested">طُلب الاقتران</string>
<string name="pair_succeeded">نجح الاقتران</string>
<string name="pairing_request_from">اطلب اقتران من \'%1s\'</string>
<plurals name="incoming_file_title">
<item quantity="zero">لا يستقبل شيء</item>
<item quantity="one">يستقبل %1$d ملف من %2$s</item>
<item quantity="two">يستقبل %1$d ملفات من %2$s</item>
<item quantity="few">يستقبل %1$d ملفات من %2$s</item>
<item quantity="many">يستقبل %1$d ملفًا من %2$s</item>
<item quantity="other">يستقبل %1$d ملف من %2$s</item>
</plurals>
<plurals name="incoming_files_text">
<item quantity="zero">ملف: %1s</item>
<item quantity="one">ملف: %1s</item>
<item quantity="two">(الملف %2$d من %3$d) : %1$s</item>
<item quantity="few">(الملف %2$d من %3$d) : %1$s</item>
<item quantity="many">(الملف %2$d من %3$d) : %1$s</item>
<item quantity="other">(الملف %2$d من %3$d) : %1$s</item>
</plurals>
<plurals name="outgoing_file_title">
<item quantity="zero">لا يرسل شيء</item>
<item quantity="one">يرسل %1$d ملف إلى %2$s</item>
<item quantity="two">يرسل %1$d ملفات إلى %2$s</item>
<item quantity="few">يرسل %1$d ملفات إلى %2$s</item>
<item quantity="many">يرسل %1$d ملفًا إلى %2$s</item>
<item quantity="other">يرسل %1$d ملف إلى %2$s</item>
</plurals>
<plurals name="outgoing_files_text">
<item quantity="zero">ملف: %1$s</item>
<item quantity="one">ملف: %1$s</item>
<item quantity="two">(الملف %2$d من %3$d) : %1$s</item>
<item quantity="few">(الملف %2$d من %3$d) : %1$s</item>
<item quantity="many">(الملف %2$d من %3$d) : %1$s</item>
<item quantity="other">(الملف %2$d من %3$d) : %1$s</item>
</plurals>
<plurals name="received_files_title">
<item quantity="zero">لم استلم شيئًا</item>
<item quantity="one">استُلمت %2$d ملف من %1$s</item>
<item quantity="two">استُلمت ملفين من %1$s</item>
<item quantity="few">استُلمت %2$d ملفات من %1$s</item>
<item quantity="many">استُلمت %2$d ملفًا من %1$s</item>
<item quantity="other">استُلمت %2$d ملف من %1$s</item>
</plurals>
<plurals name="received_files_fail_title">
<item quantity="zero">فشل استلام ملف من %1$s</item>
<item quantity="one">فشل استلام ملف من %1$s</item>
<item quantity="two">فشل استلام %2$d من %3$d ملفًا من %1$s</item>
<item quantity="few">فشل استلام %2$d من %3$d ملفًا من %1$s</item>
<item quantity="many">فشل استلام %2$d من %3$d ملفًا من %1$s</item>
<item quantity="other">فشل استلام %2$d من %3$d ملفًا من %1$s</item>
</plurals>
<plurals name="sent_files_title">
<item quantity="zero">لم يرسل شيء إلى %1$s</item>
<item quantity="one">أرسل ملف إلى %1$s</item>
<item quantity="two">أرسل ملفين إلى %1$s</item>
<item quantity="few">أرسل %2$d ملفات إلى %1$s</item>
<item quantity="many">أرسل %2$d ملفًا إلى %1$s</item>
<item quantity="other">أرسل %2$d ملف إلى %1$s</item>
</plurals>
<plurals name="send_files_fail_title">
<item quantity="zero">فشل في إرسال ملف إلى %1$s</item>
<item quantity="one">فشل في إرسال ملف إلى %1$s</item>
<item quantity="two">فشل في إرسال %2$d من %3$d ملفًا إلى %1$s</item>
<item quantity="few">فشل في إرسال %2$d من %3$d ملفًا إلى %1$s</item>
<item quantity="many">فشل في إرسال %2$d من %3$d ملفًا إلى %1$s</item>
<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_answer">المس للإجابة</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="show_keyboard">أظهر لوحة المفاتيح</string>
<string name="device_not_paired">الجهاز غير مقترن</string>
<string name="pairing_duplicate_names">تنبيه: هناك عدة أجهزة تحمل نفس الاسم.</string>
<string name="request_pairing">اطلب الاقتران</string>
<string name="pairing_accept">اقبل</string>
<string name="pairing_reject">ارفض</string>
<string name="pairing_explanation">سيؤدي إقران جهازين إلى منحهما إمكانية الوصول إلى بعضهما البعض. أقرن أجهزتك الخاصة بك فقط.</string>
<string name="settings">إعدادات</string>
<string name="mpris_play">شغّل</string>
<string name="mpris_pause">ألبث</string>
@ -120,95 +221,165 @@
<item>دقيقة واحدة</item>
<item>دقيقتان</item>
</string-array>
<string name="mpris_notifications_explanation">يلزم الحصول على إذن الإشعارات لإظهار الوسائط البعيدة في درج الإشعارات</string>
<string name="mpris_notification_settings_title">أظهر إشعار التحكم في الوسائط</string>
<string name="mpris_notification_settings_summary">اسمح بالتحكم في مشغلات الوسائط دون فتح جسر كِيدِي</string>
<string name="share_to">شارك مع…</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">شاركنا العناوين إلى جهاز لا يمكن الوصول إليه، ستُسلم إليه بمجرد أن يصبح الوصول إليه ممكناً.\n\n</string>
<string name="protocol_version">إصدار الميفاق:</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">أضف أجهزة بميفاق الإنترنت م​إ</string>
<string name="custom_devices_settings_summary">%d أجهزة مضافة يدوياً</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">إشعارات مزعجة</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">ستُزامن الإخطارات من التّطبيقات المحدّدة.</string>
<string name="title_activity_notification_filter">مرشّح الإشعارات</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_storage_preference_storage_location_already_configured">هذا المكان مضبوط مسبقًا</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_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">للسماح بالوصول عن بُعد إلى الملفات الموجودة على هذا الجهاز، يجب أن تسمح لـ جسر كِيدِي بإدارة التخزين.</string>
<string name="no_players_connected">لم يُعثر على مشغّلات</string>
<string name="send_files">أرسل ملفّات</string>
<string name="pairing_title">أجهزة «كِيدِي المتّصل»</string>
<string name="pairing_description">الأجهزة الأخرى التي تشغّل «كِيدِي المتّصل» وعلى نفس الشّبكة ستظهر هنا.</string>
<string name="block_notification_contents">احظر محتويات الإشعار</string>
<string name="block_notification_images">احظر صور الإشعار</string>
<string name="pairing_title">أجهزة «جسر كِيدِي»</string>
<string name="pairing_description">الأجهزة الأخرى التي تشغّل «جسر كِيدِي» وعلى نفس الشّبكة ستظهر هنا.</string>
<string name="device_rename_title">أعد تسمية الجهاز</string>
<string name="device_rename_confirm">أعد التّسمية</string>
<string name="refresh">أنعش</string>
<string name="refresh">حدّث</string>
<string name="unreachable_description">الجهاز المقترن هذا لا يمكن الوصول إليه. تأكّد من اتّصاله بنفس الشّبكة.</string>
<string name="no_wifi">أنت غير متصل بشبكة واي فاي، لذلك قد لا تتمكن من رؤية أي أجهزة. انقر هنا لتمكين واي فاي.</string>
<string name="on_non_trusted_message">ليس على شبكة موثوق بها: الاكتشاف الآليّ معطل.</string>
<string name="no_file_browser">لا متصفّحات ملفّات مثبّتة.</string>
<string name="pref_plugin_telepathy">أرسل SMS</string>
<string name="pref_plugin_telepathy">أرسل رسالة نصية قصيرة</string>
<string name="pref_plugin_telepathy_desc">أرسل رسائل نصّيّة من سطح المكتب</string>
<string name="pref_plugin_telepathy_mms">أرسل رسالة قصيرة</string>
<string name="pref_plugin_telepathy_mms">أرسل رسالة وسائط</string>
<string name="pref_plugin_telepathy_mms_desc">لتتمكن من إرسال رسائل الوسائط المتعددة من جسر كِيدِي، عليك تعيينه كتطبيق الرسائل القصيرة المبدئي.</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="findmyphone_found">عثرت عليه</string>
<string name="open">افتح</string>
<string name="close">أغلق</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">ستُنسخ جهات اتصال هاتفك إلى هذا الجهاز، بحيث يمكن استخدامها من قبل تطبيق جسر كِيدِي للرسائل النصية القصيرة والتطبيقات الأخرى.</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="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">يمكنك إضافة أوامر جديدة في إعدادات نظام جسر كِيدِي في إعدادات نظام جسر كِيدِي</string>
<string name="add_command_description">يمكنك إضافة أوامر على سطح المكتب</string>
<string name="pref_plugin_mprisreceiver">متحكم الوسائط</string>
<string name="notification_channel_default">إخطارات أخرى</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>
<string name="notification_channel_filetransfer">نقل الملفات الواردة</string>
<string name="notification_channel_filetransfer_upload">نقل الملفات الصادرة</string>
<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">انسخ المسار إلى الحافظة</string>
<string name="clipboard_toast">نُسخ إلى الحافظة</string>
<string name="runcommand_notreachable">الجهاز غير قابل الوصول</string>
<string name="runcommand_notpaired">الجهاز غير مقترن</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="set_runcommand_name_as_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>
<string name="pref_plugin_systemvolume">صوت النظام</string>
<string name="pref_plugin_systemvolume_desc">تحكّم في مستوى صوت النظام للجهاز البعيد</string>
<string name="mute">اكتم</string>
<string name="all">الكلّ</string>
<string name="devices">الأجهزة</string>
<string name="settings_rename">اسم الجهاز</string>
<string name="settings_dark_mode">سمة مظلمة</string>
<string name="settings_export_logs">صدّر سجل جسر كِيدِي</string>
<string name="settings_export_logs_text">أنشئ ملفًا يحتوي على معلومات التنفيذ التي يمكن أن تساعد في استكشاف المشكلات وإصلاحها.</string>
<string name="settings_more_settings_title">المزيد من الإعدادات</string>
<string name="setting_persistent_notification_oreo">الإخطارات المستمرّة</string>
<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="extra_options">الخيارات الإضافية</string>
<string name="privacy_options">خيارات الخصوصية</string>
<string name="set_privacy_options">حدد خيارات الخصوصية</string>
<string name="block_contents">امنح محتويات الإخطارات</string>
<string name="block_images">امنع الصور في الإخطارات</string>
<string name="notification_channel_receivenotification">إخطارات من أجهزة أخرى</string>
<string name="block_contents">امنح محتويات الإشعارات</string>
<string name="block_images">امنع الصور في الإشعارات</string>
<string name="notification_channel_receivenotification">إشعارات من أجهزة أخرى</string>
<string name="no_app_for_opening">لا يوجد تطبيق مناسب لفتح هذا الملف</string>
<string name="remote_keyboard_service">لوحة مفاتيح بعيده لجسر كِيدِي</string>
<string name="presenter_pointer">المؤشر</string>
<string name="trusted_networks">الشّبكات الموثوقة</string>
<string name="add_trusted_network">أضف %s</string>
<string name="trusted_networks_desc">اقَصْر الاكتشاف الآليّ على الشبكات المعروفة</string>
<string name="add_trusted_network">أضف %1s</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="bluetooth_permission_needed_desc">يحتاج جسر كِيدِي إلى إذن للاتصال بالأجهزة القريبة لإتاحة الأجهزة المقترنة باستخدام البلوتوث في جسر كِيدِي.</string>
<string name="location_permission_needed_desc">يحتاج جسر كِيدِي إلى إذن الموقع في الخلفية لمعرفة شبكة الواي فاي التي تتصل بها حتى عندما يكون التطبيق في الخلفية. وذلك لأنه يمكن استخدام اسم شبكات الواي فاي من حولك للعثور على موقعك، حتى وإن لم يكن هذا ما يفعله جسر كِيدِي.</string>
<string name="clipboard_android_x_incompat">أزال أندرويد 10 الوصول للحافظة إلى جميع التطبيقات. ستعطل هذه الملحقة.</string>
<string name="mpris_open_url">استمر في التشغيل هنا</string>
<string name="cant_open_url">تعذر فتح العنوان للاستمرار في التشغيل</string>
<string name="bigscreen_home">المنزل</string>
<string name="bigscreen_up">أعلى</string>
<string name="bigscreen_left">يسار</string>
<string name="bigscreen_select">اختر</string>
<string name="bigscreen_right">يمين</string>
<string name="bigscreen_down">أسفل</string>
<string name="bigscreen_mic">اللاقط</string>
<string name="bigscreen_mic">ميكروفون</string>
<string name="pref_plugin_bigscreen">متحكم الشاشة الكبيرة</string>
<string name="pref_plugin_bigscreen_desc">استخدم جهازك كجهاز تحكم عن بُعد لشاشة البلازما الكبيرة</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>
@ -227,13 +398,13 @@
<string name="theme_dialog_title">اختر سمة</string>
<string-array name="theme_list">
<item>معينة بواسطة حافظ البطارية</item>
<item>خفيف</item>
<item>فاتح</item>
<item>مظلمة</item>
</string-array>
<string-array name="theme_list_v28">
<item>افتراضيات النظام</item>
<item>خفيف</item>
<item>مظلمة</item>
<item>مبدئيات النظام</item>
<item>فاتح</item>
<item>مظلم</item>
</string-array>
<string name="report_bug">أبلغ عن علة</string>
<string name="donate">تبرّع</string>
@ -245,7 +416,7 @@
<string name="thanks_to">الشكر إلى</string>
<string name="easter_egg">بيض الفصح</string>
<string name="email_contributor">راسل المساهم:\n%s</string>
<string name="visit_contributors_homepage">زر صفحة المساهم الرئيسية\n%s</string>
<string name="visit_contributors_homepage">زر صفحة المساهم الرئيسة\n%s</string>
<string name="version">الإصدار %s</string>
<string name="about_kde">عن كِيدِي</string>
<string name="kde_be_free">كِيدِي- كن حرًّا!</string>
@ -253,12 +424,44 @@
<string name="konqi">كوينكي</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="click_here_to_type">اطُرق هنا لتكتب</string>
<string name="clear_compose">امحُ</string>
<string name="send_compose">أرسل</string>
<string name="open_compose_send">ألف نص</string>
<string name="maintainer_and_developer">المصين ومطوّر</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"><h1>حول</h1>" "<p>كيدي مجتمع عالمي من مهندسي البرمجيات والفنانين والكتاب والمترجمين والمبدعين الملتزمين بتطوير البرمجيات الحرة. تُنتج كيدي بيئة سطح المكتب بلازما، ومئات التطبيقات، والعديد من مكتبات البرمجيات التي تدعمها.</p>" "<p>كيدي مشروع تعاوني: لا تتحكم جهة واحدة في توجهاته أو منتجاته. بل نعمل معًا لتحقيق هدفنا المشترك المتمثل في بناء أفضل برمجيات حرة في العالم. الجميع مدعوون للانضمام والمساهمة في كيدي، بمن فيهم أنت.</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;الإبلاغ عن الأخطاء أو الرغبات&lt;/h1&gt; &lt;p&gt;يمكن دائمًا تحسين البرامج، وفريق كيدي مستعدٌّ لذلك. ومع ذلك، يجب عليك - كمستخدم - إبلاغنا عندما لا يعمل شيءٌ ما كما هو متوقع أو عندما يكون من الممكن تحسينه.&lt;/p&gt; &lt;p&gt;تحتوي كيدي على نظام تتبع للأخطاء. تفضل بزيارة &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; أو استخدم زر \"الإبلاغ عن خطأ\" من شاشة \"حول\" للإبلاغ عن الأخطاء.&lt;/p&gt; إذا كانت لديك أي اقتراحات للتحسين، فنرحب بك باستخدام نظام تتبع الأخطاء لتسجيل رغبتك. تأكد من استخدام مستوى الخطورة المسمى \"قائمة الأمنيات\".</string>
<string name="about_kde_join_kde">&lt;h1&gt;انضم إلى كيدي&lt;/h1&gt; &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>
<string name="about_kde_support_kde">"&lt;h1&gt;دعم كيدي&lt;/h1&gt; &lt;p&gt;برامج كيدي متاحة دائمًا بالمجان، ولكن إنشاءها ليس مجانيًا.&lt;/p&gt; &lt;p&gt;لدعم التطوير، أسس مجتمع كيدي KDE e.V.، وهي منظمة غير ربحية تأسست بشكل قانوني في ألمانيا. تمثل KDE e.V. مجتمع كيدي في الشؤون القانونية والمالية. انظر &lt;a href=https://ev.kde.org/&gt;https://ev.kde.org/&lt;/a&gt; للحصول على معلومات حول KDE e.V.&lt;/p&gt; &lt;p&gt;تستفيد كيدي من العديد من أنواع المساهمات، بما في ذلك المساهمات المالية. نحن نستخدم الأموال لتعويض الأعضاء وغيرهم عن النفقات التي يتكبد عند المساهمة. وتستخدم الأموال للدعم القانوني وتنظيم المؤتمرات والاجتماعات.&lt;/p&gt; &lt;p&gt;نود أن نشجعكم على دعم جهودنا من خلال التبرع المالي، باستخدام إحدى الطرق الموضحة في &lt;a href=https://www.kde.org/community/donations/&gt;https://www.kde.org/community/donations/&lt;/a&gt;.&lt;/p&gt; نشكركم جزيل الشكر مقدمًا على دعمكم."</string>
<string name="maintainer_and_developer">الصائن ومطوّر</string>
<string name="developer">مطوّر</string>
<string name="apple_support">دعم ماك أو إس. العمل على دعم iOS</string>
<string name="bug_fixes_and_general_improvements">إصلاح علل وتحسينات عامة</string>
<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="holger_kaelberer_task">ملحق لوحة المفاتيح عن بُعد وإصلاح الأخطاء</string>
<string name="saikrishna_arcot_task">دعم استخدام لوحة المفاتيح في ملحق الإدخال عن بُعد، وإصلاح الأخطاء والتحسينات العامة</string>
<string name="shellwen_chen_task">تحسين أمان SFTP، وتحسين قابلية صيانة هذا المشروع، وإصلاح الأخطاء والتحسينات العامة</string>
<string name="everyone_else">كل من ساهم في جسر كِيدِي على مدار السنوات الماضية</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>
<string name="ping_result">تعقبت في %1$d ميلي ثانية</string>
<string name="ping_failed">تعذر الوصول إلى الجهاز</string>
<string name="ping_in_progress">يتعقب…</string>
<string name="device_host_invalid">المضيف غير صالح. استخدم اسم مضيف أو IPv4 أو IPv6 صالحاً</string>
<string name="device_host_duplicate">المضيف موجود مسبقًا في القائمة</string>
</resources>

View File

@ -115,6 +115,7 @@
<string name="error_not_reachable">Устройството е недостъпно</string>
<string name="error_already_paired">Устройството вече е сдвоено</string>
<string name="error_timed_out">Просрочка</string>
<string name="error_clocks_not_match">Часовниците на устройствата не са синхронизирани</string>
<string name="error_canceled_by_user">Отхвърлена от потребителя</string>
<string name="error_canceled_by_other_peer">Отказана от другата страна</string>
<string name="encryption_info_title">Информация за криптиране</string>
@ -190,8 +191,8 @@
<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">Версия на протокол:</string>
<string name="protocol_version_newer">Това устройство използва по-нова версия на протокола</string>
<string name="plugin_settings_with_name">%s настройки</string>
<string name="invalid_device_name">Невалидно име на устройство</string>
@ -307,6 +308,8 @@
<string name="devices">Устройства</string>
<string name="settings_rename">Име на устройство</string>
<string name="settings_dark_mode">Тъмна тема</string>
<string name="settings_export_logs">Експортиране на дневниците на KDE Connect</string>
<string name="settings_export_logs_text">Генерирайте файл с информация за изпълнени команди, която може да помогне за отстраняването на проблеми.</string>
<string name="settings_more_settings_title">Още настройки</string>
<string name="settings_more_settings_text">Настройките за всяко устройство могат да бъдат намерени в раздел \"Настройки на плъгина\" в рамките на устройство.</string>
<string name="setting_persistent_notification">Показване на постоянна нотификация</string>

View File

@ -165,9 +165,11 @@
<string name="middle_click">Envia un clic del mig</string>
<string name="show_keyboard">Mostra el teclat</string>
<string name="device_not_paired">El dispositiu no està aparellat</string>
<string name="pairing_duplicate_names">Precaució: hi ha diversos dispositius amb el mateix nom.</string>
<string name="request_pairing">Demana aparellar</string>
<string name="pairing_accept">Accepta</string>
<string name="pairing_reject">Rebutja</string>
<string name="pairing_explanation">L\'aparellament de dos dispositius els donarà accés l\'un a l\'altre. Només aparelleu els vostres propis dispositius.</string>
<string name="settings">Arranjament</string>
<string name="mpris_play">Reprodueix</string>
<string name="mpris_pause">Pausa</string>
@ -191,7 +193,7 @@
<string name="mpris_notification_settings_title">Mostra les notificacions dels reproductors</string>
<string name="mpris_notification_settings_summary">Permet controlar els reproductors multimèdia sense obrir el KDE Connect</string>
<string name="share_to">Comparteix amb…</string>
<string name="unreachable_device">%s (no s\'hi pot accedir)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Els URL compartits amb un dispositiu no accessible es lliuraran un cop s\'hi pugui accedir.\n\n</string>
<string name="protocol_version">Versió del protocol:</string>
<string name="protocol_version_newer">Aquest dispositiu usa una versió nova del protocol</string>
@ -309,6 +311,8 @@
<string name="devices">Dispositius</string>
<string name="settings_rename">Nom del dispositiu</string>
<string name="settings_dark_mode">Tema fosc</string>
<string name="settings_export_logs">Exporta els registres del KDE Connect</string>
<string name="settings_export_logs_text">Genera un fitxer amb informació d\'execució que pot ajudar a resoldre problemes.</string>
<string name="settings_more_settings_title">Més opcions</string>
<string name="settings_more_settings_text">La configuració per dispositiu es pot trobar a «Arranjament dels connectors» des d\'un dispositiu.</string>
<string name="setting_persistent_notification">Mostra les notificacions persistents</string>
@ -393,7 +397,7 @@
<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="double_tap_to_drag">Dos tocs per a arrossegar</string>
<string name="double_tap_to_drag">Toc doble 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>

View File

@ -206,7 +206,6 @@
<string name="mpris_notification_settings_title">Obrazit oznámení pro ovládání médií</string>
<string name="mpris_notification_settings_summary">Umožnit ovládání přehrávače médií bez otevření KDE Connect</string>
<string name="share_to">Sdílet s...</string>
<string name="unreachable_device">%s (nedostupná)</string>
<string name="unreachable_device_url_share_text">URL sdílená s nedostupným zařízením budou zaslána jakmile se stane dostupným.\n\n</string>
<string name="protocol_version_newer">Toto zařízení používá novější verzi protokolu</string>
<string name="plugin_settings_with_name">Nastavení %s</string>

View File

@ -94,6 +94,7 @@
<string name="sendkeystrokes_pref_category_title">Tastendrücke senden</string>
<string name="sendkeystrokes_pref_enabled">Senden von Tastendrücken aktivieren</string>
<string name="sendkeystrokes_pref_enabled_summary">Auf Daten mit dem MIME-Typ „text/x-keystrokes“ warten</string>
<string name="sendkeystrokes_safe_text_enabled_summary">Kurze Ziffernfolgen ohne Bestätigung senden</string>
<string name="pref_plugin_mousepad_send_keystrokes">Als Tastendruck senden</string>
<string name="mouse_receiver_plugin_description">Empfänger für entfernte Mauseingaben</string>
<string name="mouse_receiver_plugin_name">Maus-Empfänger</string>
@ -112,6 +113,7 @@
<string name="error_not_reachable">Das Gerät ist nicht erreichbar</string>
<string name="error_already_paired">Das Gerät ist bereits verbunden</string>
<string name="error_timed_out">Zeitüberschreitung</string>
<string name="error_clocks_not_match">Uhren der Geräte sind nicht synchron</string>
<string name="error_canceled_by_user">Abbruch durch Benutzer</string>
<string name="error_canceled_by_other_peer">Abbruch durch Gegenstelle</string>
<string name="encryption_info_title">Verschlüsselungsinformationen</string>
@ -161,9 +163,11 @@
<string name="middle_click">Mittelklick senden</string>
<string name="show_keyboard">Tastatur anzeigen</string>
<string name="device_not_paired">Das Gerät ist nicht verbunden</string>
<string name="pairing_duplicate_names">Achtung: Es gibt mehrere Geräte mit dem gleichen Namen.</string>
<string name="request_pairing">Kopplung anfordern</string>
<string name="pairing_accept">Annehmen</string>
<string name="pairing_reject">Ablehnen</string>
<string name="pairing_explanation">Zwei Geräte zu koppeln ermöglicht diesen, auf das jeweils andere zuzugreifen. Koppeln Sie nur Ihre eigenen Geräte.</string>
<string name="settings">Einstellungen</string>
<string name="mpris_play">Wiedergabe</string>
<string name="mpris_pause">Anhalten</string>
@ -186,14 +190,16 @@
<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="share_to">Freigeben für …</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</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">Protokollversion:</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>
<string name="shareplugin_text_saved">Text empfangen und in die Zwischenablage kopiert</string>
<string name="custom_devices_settings">Benutzerdefinierte Geräteliste</string>
<string name="custom_devices_settings_summary">%d Geräte manuell hinzugefügt</string>
<string name="custom_device_list">Geräte nach IP-Adresse hinzufügen</string>
<string name="custom_device_deleted">Benutzerdefinierte Geräte gelöscht</string>
<string name="custom_device_list_help">Falls Ihr Gerät nicht automatisch erkannt wird, können Sie es über die IP-Adresse oder den Gerätenamen hinzufügen. Klicken Sie dafür auf den schwebenden Aktionsknopf</string>
@ -360,7 +366,7 @@
<item>Hell</item>
<item>Dunkel</item>
</string-array>
<string name="report_bug">Probleme oder Wünsche berichten</string>
<string name="report_bug">Problem melden</string>
<string name="donate">Spenden</string>
<string name="source_code">Quelltext</string>
<string name="licenses">Lizenzen</string>
@ -376,6 +382,7 @@
<string name="kde_be_free">KDE - Freiheit genießen.</string>
<string name="kde">KDE</string>
<string name="konqi">Konqi</string>
<string name="click_here_to_type">Hier tippen, um zu schreiben</string>
<string name="clear_compose">Leeren</string>
<string name="send_compose">Senden</string>
<string name="open_compose_send">Text schreiben</string>
@ -392,10 +399,14 @@
<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="plugin_stats">Modul-Statistik</string>
<string name="enable_udp_broadcast">UDP-Geräteerkennung einschalten</string>
<string name="enable_bluetooth">Bluetooth aktivieren (Beta)</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>
<string name="ping_result">Ping-Dauer: %1$d Millisekunden</string>
<string name="ping_in_progress">Ping läuft </string>
</resources>

View File

@ -190,7 +190,6 @@
<string name="mpris_notification_settings_title">Show media control notification</string>
<string name="mpris_notification_settings_summary">Allow controlling your media players without opening KDE Connect</string>
<string name="share_to">Share to…</string>
<string name="unreachable_device">%s (Unreachable)</string>
<string name="unreachable_device_url_share_text">URLs shared to an unreachable device will be delivered to it once it becomes reachable.\n\n</string>
<string name="protocol_version_newer">This device uses a newer protocol version</string>
<string name="plugin_settings_with_name">%s settings</string>

View File

@ -17,7 +17,7 @@
<string name="pref_plugin_clipboard_desc">Kunhavigi la enhavon de la tondujo</string>
<string name="pref_plugin_clipboard_sent">Clipboard Sendita</string>
<string name="pref_plugin_mousepad">Fora enigo</string>
<string name="pref_plugin_mousepad_desc">Uzu vian telefonon aŭ tablojdon kiel tuŝplaton kaj klavaron</string>
<string name="pref_plugin_mousepad_desc">Uzu vian telefonon aŭ tabuleton kiel tuŝplaton kaj klavaron</string>
<string name="pref_plugin_presenter">Prezento fora</string>
<string name="pref_plugin_presenter_desc">Uzu vian aparaton por ŝanĝi lumbildojn en prezento</string>
<string name="pref_plugin_remotekeyboard">Ricevi forajn klavojn</string>
@ -25,7 +25,7 @@
<string name="pref_plugin_mpris">Plurmedia regiloj</string>
<string name="pref_plugin_mpris_desc">Provizas teleregilon por via plurmedia ludilo</string>
<string name="pref_plugin_runcommand">Lanĉi Komandon</string>
<string name="pref_plugin_runcommand_desc">Ekigi forajn komandojn de via telefono aŭ tablojdo</string>
<string name="pref_plugin_runcommand_desc">Ekigi forajn komandojn de via telefono aŭ tabuleto</string>
<string name="pref_plugin_contacts">Sinkronigilo de Kontaktoj</string>
<string name="pref_plugin_contacts_desc">Permesi sinkronigi la kontaktlibron de la aparato</string>
<string name="pref_plugin_ping">Ping</string>
@ -115,6 +115,7 @@
<string name="error_not_reachable">Aparato ne atingebla</string>
<string name="error_already_paired">Aparato jam parigita</string>
<string name="error_timed_out">Tempo elĉerpita</string>
<string name="error_clocks_not_match">Aparataj horloĝoj estas malsinkronaj</string>
<string name="error_canceled_by_user">Nuligite de uzanto</string>
<string name="error_canceled_by_other_peer">Nuligite de alia kunulo</string>
<string name="encryption_info_title">Ĉifrada Informo</string>
@ -190,13 +191,14 @@
<string name="mpris_notification_settings_title">Montri sciigon pri rego de amaskomunikiloj</string>
<string name="mpris_notification_settings_summary">Permesu mastrumi viajn plurmediajn ludilojn sen malfermi KDE Connect</string>
<string name="share_to">Kunhavigi al…</string>
<string name="unreachable_device">%s (Neatingebla)</string>
<string name="unreachable_device_url_share_text">URL-oj kundividitaj al neatingebla aparato estos liveritaj al ĝi post kiam ĝi fariĝos atingebla.\n\n</string>
<string name="protocol_version">Protokolversio:</string>
<string name="protocol_version_newer">Ĉi tiu aparato uzas pli novan protokolversion</string>
<string name="plugin_settings_with_name">%s agordoj</string>
<string name="invalid_device_name">Nevalida aparato nomo</string>
<string name="shareplugin_text_saved">Ricevita teksto, konservita en tondujo</string>
<string name="custom_devices_settings">Propra aparato listo</string>
<string name="custom_devices_settings_summary">%d aparatoj aldoniĝis permane</string>
<string name="custom_device_list">Aldoni aparatojn per IP</string>
<string name="custom_device_deleted">Propra aparato forigita</string>
<string name="custom_device_list_help">Se via aparato ne estas aŭtomate detektita, vi povas aldoni ĝian IP-adreson aŭ gastigan nomon alklakante la Ŝveban Ago-Butonon</string>
@ -326,6 +328,7 @@
<string name="empty_trusted_networks_list_text">Vi ankoraŭ ne aldonis neniun fidindan reton</string>
<string name="allow_all_networks_text">Permesi ĉion</string>
<string name="location_permission_needed_title">Permeso bezonata</string>
<string name="bluetooth_permission_needed_desc">KDE Connect bezonas permeson por konekti al proksimaj aparatoj por fari aparatojn parigitaj per Bluetooth disponebla en KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect bezonas la fonlokan permeson por scii la WiFi-reton al kiu vi estas konektita eĉ kiam la programo estas en la fono. Ĉi tio estas ĉar la nomo de la WiFi-retoj ĉirkaŭ vi povus esti uzata por trovi vian lokon, eĉ kiam tion ne faras KDE Connect.</string>
<string name="clipboard_android_x_incompat">Android 10 forigis aliron al tondujo al ĉiuj aplikaĵoj. Ĉi tiu kromaĵo estos malŝaltita.</string>
<string name="mpris_open_url">Daŭre ludi ĉi tie</string>
@ -411,6 +414,7 @@
<string name="tap_to_execute">Frapi por plenumi</string>
<string name="plugin_stats">Statistiko de kromprogramoj</string>
<string name="enable_udp_broadcast">Ebligi UDP-aparatan malkovron</string>
<string name="enable_bluetooth">Ŝalti bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Sciigoj devas esti permesitaj ricevi ilin de aliaj aparatoj</string>
<string name="findmyphone_notifications_explanation">La sciiga permeso estas necesa por ke la telefono povu sonori kiam la app estas en la fono</string>
<string name="no_notifications">Sciigoj estas malŝaltitaj, vi ne ricevos alvenantajn parajn sciigojn.</string>

View File

@ -165,9 +165,11 @@
<string name="middle_click">Enviar clic del botón central</string>
<string name="show_keyboard">Mostrar teclado</string>
<string name="device_not_paired">Dispositivo no vinculado</string>
<string name="pairing_duplicate_names">Precaución: Hay varios dispositivos con el mismo nombre.</string>
<string name="request_pairing">Solicitar vinculación</string>
<string name="pairing_accept">Aceptar</string>
<string name="pairing_reject">Rechazar</string>
<string name="pairing_explanation">Vincular dos dispositivos les dará acceso recíproco. Vincule solo dispositivos que le pertenezcan.</string>
<string name="settings">Preferencias</string>
<string name="mpris_play">Reproducir</string>
<string name="mpris_pause">Pausar</string>
@ -190,8 +192,8 @@
<string name="mpris_notifications_explanation">Se necesita el permiso de notificaciones para mostrar los medios remotos en el panel de notificaciones</string>
<string name="mpris_notification_settings_title">Mostrar notificación del control de medios</string>
<string name="mpris_notification_settings_summary">Permite controlar sus reproductores de medios sin abrir KDE Connect</string>
<string name="share_to">Compartir con...</string>
<string name="unreachable_device">%s (no accesible)</string>
<string name="share_to">Compartir con</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Las URLs compartidas con dispositivos no accesibles se entregarán una vez que vuelvan a estar accesibles.\n\n</string>
<string name="protocol_version">Versión del protocolo:</string>
<string name="protocol_version_newer">Este dispositivo usa una versión más reciente del protocolo</string>
@ -309,6 +311,8 @@
<string name="devices">Dispositivos</string>
<string name="settings_rename">Nombre del dispositivo</string>
<string name="settings_dark_mode">Tema oscuro</string>
<string name="settings_export_logs">Exportar registros de KDE Connect</string>
<string name="settings_export_logs_text">Generar un archivo con la información de ejecución que puede ayudar a solventar problemas.</string>
<string name="settings_more_settings_title">Más preferencias</string>
<string name="settings_more_settings_text">Las preferencias por dispositivo se pueden encontrar bajo «Preferencias del complemento» dentro de cada dispositivo.</string>
<string name="setting_persistent_notification">Mostrar notificación persistente</string>

View File

@ -115,6 +115,7 @@
<string name="error_not_reachable">Gailua ez dago eskuragarri</string>
<string name="error_already_paired">Gailua dagoeneko parekatuta</string>
<string name="error_timed_out">Denbora-muga agortu da</string>
<string name="error_clocks_not_match">Gailuetako erlojuak ez daude sinkronizatuta</string>
<string name="error_canceled_by_user">Erabiltzaileak utzita</string>
<string name="error_canceled_by_other_peer">Beste kideak utzita</string>
<string name="encryption_info_title">Zifratze informazioa</string>
@ -164,9 +165,11 @@
<string name="middle_click">Bidali erdiko klik</string>
<string name="show_keyboard">Erakutsi teklatua</string>
<string name="device_not_paired">Gailua parekatu gabe</string>
<string name="pairing_duplicate_names">Kontuz: Izen bereko hainbat gailu daude.</string>
<string name="request_pairing">Eskatu parekatzea</string>
<string name="pairing_accept">Onartu</string>
<string name="pairing_reject">Errefusatu</string>
<string name="pairing_explanation">Bi gailu parekatzea elkarren sarbidea emango die. Zure gailu propioak baino ez parekatu.</string>
<string name="settings">Ezarpenak</string>
<string name="mpris_play">Jo</string>
<string name="mpris_pause">Eten</string>
@ -189,9 +192,10 @@
<string name="mpris_notifications_explanation">Urruneko euskarria jakinarazpen tiraderan erakusteko jakinarazpen-baimena behar da</string>
<string name="mpris_notification_settings_title">Erakutsi euskarri kontrolaren jakinarazpena</string>
<string name="mpris_notification_settings_summary">Utzi zure euskarri-jotzaileak kontrolatzen KDE Connect ireki gabe</string>
<string name="share_to">Partekatu honekin...</string>
<string name="unreachable_device">%s (eskuraezin)</string>
<string name="share_to">Partekatu honekin</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Gailu eskuraezinekin partekatutako URLak, hartara bidaliko dira eskuragarri dagoenean.\n\n</string>
<string name="protocol_version">Protokoloaren bertsioa:</string>
<string name="protocol_version_newer">Gailu honek protokoloaren bertsio berriago bat erabiltzen du</string>
<string name="plugin_settings_with_name">%s ezarpenak</string>
<string name="invalid_device_name">Gailuaren izen baliogabea</string>
@ -307,6 +311,8 @@
<string name="devices">Gailuak</string>
<string name="settings_rename">Gailuaren izena</string>
<string name="settings_dark_mode">Gai iluna</string>
<string name="settings_export_logs">Esportatu KDE Connect-en egunkariak</string>
<string name="settings_export_logs_text">Sortu arazoak konpontzen lagun dezakeen exekuzio informazioa duen fitxategi bat.</string>
<string name="settings_more_settings_title">Ezarpen gehiago</string>
<string name="settings_more_settings_text">Gailu-bakoitzeko ezarpenak aurki daitezke \'Pluginen ezarpenak\' barruan.</string>
<string name="setting_persistent_notification">Erakutsi jakinarazpen iraunkorra</string>
@ -423,7 +429,7 @@
<string name="notification_channel_keepwatching">Jarraitu jotzen</string>
<string name="ping_result">«Ping» %1$d milisegundotan egin da</string>
<string name="ping_failed">Ezin izan dio gailuari «ping» egin</string>
<string name="ping_in_progress">«Ping» egiten...</string>
<string name="ping_in_progress">«Ping» egiten</string>
<string name="device_host_invalid">Ostalaria baliogabea da. Erabili balio duen ostalari-izen bat, IPv4, edo IPv6</string>
<string name="device_host_duplicate">Ostalaria jada zerrendan dago</string>
</resources>

View File

@ -115,6 +115,7 @@
<string name="error_not_reachable">Laite tavoittamattomissa</string>
<string name="error_already_paired">Laite on jo kytketty pariksi</string>
<string name="error_timed_out">Aikakatkaisu</string>
<string name="error_clocks_not_match">Laitteiden kelloja ei ole tahdistettu</string>
<string name="error_canceled_by_user">Käyttäjä perui</string>
<string name="error_canceled_by_other_peer">Vertaiskäyttäjä perui</string>
<string name="encryption_info_title">Salaustiedot</string>
@ -164,9 +165,11 @@
<string name="middle_click">Lähetä keskipainikkeen napsautus</string>
<string name="show_keyboard">Näytä näppäimistö</string>
<string name="device_not_paired">Laitetta ei ole kytketty pariksi</string>
<string name="pairing_duplicate_names">Varoitus: Useammalla laitteella on sama nimi.</string>
<string name="request_pairing">Pyydä pariksi kytkemistä</string>
<string name="pairing_accept">Hyväksy</string>
<string name="pairing_reject">Hylkää</string>
<string name="pairing_explanation">Laitteiden paritus sallii niiden käyttää toisiaan. Parita vain omia laitteitasi.</string>
<string name="settings">Asetukset</string>
<string name="mpris_play">Toista</string>
<string name="mpris_pause">Tauko</string>
@ -190,8 +193,9 @@
<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_dynamic_shortcut">%s (✕)</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">Yhteyskäytäntöversio:</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>
@ -307,6 +311,8 @@
<string name="devices">Laitteet</string>
<string name="settings_rename">Laitenimi</string>
<string name="settings_dark_mode">Tumma teema</string>
<string name="settings_export_logs">Vie KDE Connectin lokit</string>
<string name="settings_export_logs_text">Luo suoritustietotiedosto, josta voi olla apua ongelmien selvityksessä.</string>
<string name="settings_more_settings_title">Lisää asetuksia</string>
<string name="settings_more_settings_text">Laitekohtaiset asetukset löytyvät laitteen ”Liitännäisasetuksista”.</string>
<string name="setting_persistent_notification">Näytä pysyvä ilmoitus</string>

View File

@ -165,9 +165,11 @@
<string name="middle_click">Envoyer un clic central</string>
<string name="show_keyboard">Afficher le clavier</string>
<string name="device_not_paired">Périphérique non associé</string>
<string name="pairing_duplicate_names">Attention : Il existe plusieurs périphériques portant le même nom.</string>
<string name="request_pairing">Demande d\'association</string>
<string name="pairing_accept">Accepter</string>
<string name="pairing_reject">Rejeter</string>
<string name="pairing_explanation">L\'association de deux périphériques leur donnera un accès réciproque. Veuillez n\'associer que vos propres périphériques.</string>
<string name="settings">Configuration</string>
<string name="mpris_play">Lire</string>
<string name="mpris_pause">Pause</string>
@ -191,7 +193,7 @@
<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_dynamic_shortcut">%s (✕)</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">Version de protocole :</string>
<string name="protocol_version_newer">Le périphérique utilise une version plus récente du protocole</string>
@ -309,6 +311,8 @@
<string name="devices">Périphériques</string>
<string name="settings_rename">Nom du périphérique</string>
<string name="settings_dark_mode">Thème sombre</string>
<string name="settings_export_logs">Exporter les journaux de KDEConnect</string>
<string name="settings_export_logs_text">Générez un fichier avec des informations d\'exécution pouvant aider à résoudre les problèmes.</string>
<string name="settings_more_settings_title">Plus de paramètres</string>
<string name="settings_more_settings_text">Les paramètres par appareil sont disponibles dans la rubrique « Paramètres des modules externes » sur l\'appareil.</string>
<string name="setting_persistent_notification">Afficher une notification persistante</string>

View File

@ -165,9 +165,11 @@
<string name="middle_click">Enviar un clic central</string>
<string name="show_keyboard">Amosar o teclado</string>
<string name="device_not_paired">O dispositivo non está emparellado</string>
<string name="pairing_duplicate_names">Ollo: Hai varios dispositivos co mesmo nome.</string>
<string name="request_pairing">Solicitar emparellarse</string>
<string name="pairing_accept">Aceptar</string>
<string name="pairing_reject">Rexeitar</string>
<string name="pairing_explanation">Emparellar dispositivos permítelles acceder o un ao outro. Emparelle só os seus propios dispositivos.</string>
<string name="settings">Configuración</string>
<string name="mpris_play">Reproducir</string>
<string name="mpris_pause">Deter</string>
@ -191,7 +193,7 @@
<string name="mpris_notification_settings_title">Amosar a notificación de control de reprodución.</string>
<string name="mpris_notification_settings_summary">Permitir controlar os reprodutores sen abrir KDE Connect</string>
<string name="share_to">Compartir con…</string>
<string name="unreachable_device">%s (inaccesíbel)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Os URL que se compartan cun dispositivo inaccesíbel entregaranse cando o dispositivo estea accesíbel.\n\n</string>
<string name="protocol_version">Versión do protocolo:</string>
<string name="protocol_version_newer">Este dispositivo usa unha versión máis nova do protocolo.</string>
@ -309,6 +311,8 @@
<string name="devices">Dispositivos</string>
<string name="settings_rename">Nome do dispositivo</string>
<string name="settings_dark_mode">Tema escuro</string>
<string name="settings_export_logs">Exportar os rexistros de KDE Connect</string>
<string name="settings_export_logs_text">Xerar un ficheiro con información de execución que pode axudar a solucionar problemas.</string>
<string name="settings_more_settings_title">Máis opcións</string>
<string name="settings_more_settings_text">As opcións específicas dun dispositivo atópanse en «Configuración dos complementos» no dispositivo.</string>
<string name="setting_persistent_notification">Amosar unha notificación persistente</string>

View File

@ -1,143 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="pref_plugin_telephony">התראות טלפוניות</string>
<string name="pref_plugin_battery">דיווח סוללה</string>
<string name="pref_plugin_battery_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_mousepad">שליטה מרחוק</string>
<string name="pref_plugin_mousepad_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_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">קבל התראות מהתקן אחר והצג אותם במכשיר שלך</string>
<string name="pref_plugin_sharereceiver">שתף וקבל קבצים וכתובות</string>
<string name="pref_plugin_sharereceiver_desc">שתף וקבל קבצים וכתובת אינטרנט בין התקנים</string>
<string name="device_list_empty">אין התקנים</string>
<string name="ok">אישור</string>
<string name="cancel">בטל</string>
<string name="open_settings">פתח הגדרות</string>
<string name="no_permissions">אתה צריך לתת הרשאות לגישה להתראות</string>
<string name="send_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="open_mousepad">שליטה מרחוק</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_scroll_direction_title">הפוך את כיוון הגלילה</string>
<string-array name="mousepad_tap_entries">
<item>"לחיצה ימנית "</item>
<item>לחיצה אצמעית (גלגלת)</item>
<item>שום דבר</item>
</string-array>
<string-array name="mousepad_sensitivity_entries">
<item>הכי איטי</item>
<item>יותר מההכי איטי</item>
<item>ברירת החדל</item>
<item>יותר מהברירת מחדל</item>
<item>הכי מהיר</item>
</string-array>
<string-array name="mousepad_acceleration_profile_entries">
<item>No Acceleration</item>
<item>Weakest</item>
<item>Weaker</item>
<item>Medium</item>
<item>Stronger</item>
<item>Strongest</item>
</string-array>
<string name="category_connected_devices">התקנים מחוברים</string>
<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="unknown_device">התקן לא ידוע</string>
<string name="error_not_reachable">ההתקן לא זמין</string>
<string name="error_already_paired">ההתקן כבר מותאם</string>
<string name="error_could_not_send_package">לא יכול לשלוח חבילה</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="encryption_info_msg_no_ssl">ההתקן השני אינו משתמש בגרסה האחרונה של KDE Connect, משתמש בשיטת ההצפנה הישנה.</string>
<string name="my_device_fingerprint">טביעת האצבע SHA1 של ההתקן היא:</string>
<string name="remote_device_fingerprint">"טביעת האצבע SHA1 של ההתקן המרוחק היא: "</string>
<string name="pair_requested">בקשת התאמה</string>
<string name="pairing_request_from">בוקשה התאמה מ־%1s</string>
<string name="received_file_text">לחץ כדי לפתוח את \"%1s\"</string>
<string name="tap_to_answer">לחץ כדי לענות</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="pairing_accept">אשר</string>
<string name="pairing_reject">דחה</string>
<string name="mpris_play">נגן</string>
<string name="mpris_previous">הקודם</string>
<string name="mpris_rew">דילוג אחורה</string>
<string name="mpris_ff">דילוג קדימה</string>
<string name="mpris_next">הבא</string>
<string name="mpris_volume">עוצמה</string>
<string name="mpris_time_settings_title">כפתור דילוג קדימה או אחורה</string>
<string-array name="mpris_time_entries">
<item>10 שניות</item>
<item>20 שניות</item>
<item>חצי דקה</item>
<item>דקה</item>
<item>שתי דקות</item>
</string-array>
<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="share_notification_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="title_activity_notification_filter">סנן התראות</string>
<string name="filter_apps_info">התראות יסונכרנו רק לאפליקציות נבחרות</string>
<string name="sftp_sdcard_num">כרטיס זיכרון %d</string>
<string name="sftp_sdcard">כרטיס זיכרון</string>
<string name="sftp_readonly">(לקריאה בלבד)</string>
<string name="sftp_camera">תמונות מצלמה</string>
<string name="no_players_connected">לא נמצא נגן</string>
<string name="send_files">שלח קובץ</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="refresh">רענן</string>
<string name="unreachable_description">ההתקן המתואם לא זמין, וודא שהוא מחובר לאותה רשת אליה אתה מחובר.</string>
<string name="no_file_browser">לא נמצאו מנהלי קבצים מותקנים במכשיר זה.</string>
<string name="pref_plugin_telepathy">שליחת הודעת SMS</string>
<string name="pref_plugin_telepathy_desc">שלח הודעות מהמחשב שלך</string>
<string name="findmyphone_title">מצא את הפלאפון שלי</string>
<string name="findmyphone_title_tablet">מצא את הטבלט שלי</string>
<string name="findmyphone_description">מפעיל רעש במכשיר כדי שתוכל למצוא אותו.</string>
<string name="open">פתח</string>
<string name="close">סגור</string>
<string-array name="theme_list">
<item>Set by Battery Saver</item>
<item/>
<item>Dark</item>
</string-array>
</resources>

View File

@ -94,7 +94,6 @@
<item>2 minutas</item>
</string-array>
<string name="share_to">Comparti a…</string>
<string name="unreachable_device">%s (non attingibile)</string>
<string name="custom_device_fab_hint">Adde un dispositivo</string>
<string name="undo">Annulla</string>
<string name="share">Comparti</string>

View File

@ -184,12 +184,14 @@
<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="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="protocol_version">Útgáfa samskiptamáta:</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>
<string name="shareplugin_text_saved">Tók við texta, vistaði á klippispjald</string>
<string name="custom_devices_settings">Listi yfir sérsniðin tæki</string>
<string name="custom_devices_settings_summary">%d tækjum bætt við handvirkt</string>
<string name="custom_device_list">Bæta við tækjum eftir auðkennum</string>
<string name="custom_device_deleted">Sérsniðnu tæki eytt</string>
<string name="custom_device_fab_hint">Bæta við tæki</string>
@ -279,6 +281,7 @@
<string name="devices">Tæki</string>
<string name="settings_rename">Heiti tækis</string>
<string name="settings_dark_mode">Dökkt þema</string>
<string name="settings_export_logs">Flytja út atvikaskrár KDE Connect</string>
<string name="settings_more_settings_title">Fleiri stillingar</string>
<string name="setting_persistent_notification">Birta viðvarandi tilkynningu</string>
<string name="setting_persistent_notification_oreo">Viðvarandi tilkynning</string>
@ -380,4 +383,7 @@
<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>
<string name="ping_failed">Gat ekki pikkað í tæki</string>
<string name="device_host_invalid">Ógilt vélarheiti. Notaðu gilt vélarheiti, IPv4 eða IPv6</string>
<string name="device_host_duplicate">Hýsivélin er nú þegar á listanum</string>
</resources>

View File

@ -165,9 +165,11 @@
<string name="middle_click">Invia clic tasto centrale</string>
<string name="show_keyboard">Mostra tastiera</string>
<string name="device_not_paired">Dispositivo non associato</string>
<string name="pairing_duplicate_names">Attenzione: ci sono più dispositivi con lo stesso nome.</string>
<string name="request_pairing">Richiedi associazione</string>
<string name="pairing_accept">Accetta</string>
<string name="pairing_reject">Rifiuta</string>
<string name="pairing_explanation">L\'associazione di due dispositivi consentirà loro l\'accesso reciproco. Associa solo i tuoi dispositivi.</string>
<string name="settings">Impostazioni</string>
<string name="mpris_play">Riproduci</string>
<string name="mpris_pause">Pausa</string>
@ -191,7 +193,7 @@
<string name="mpris_notification_settings_title">Mostra la notifica del controllo multimediale</string>
<string name="mpris_notification_settings_summary">Consenti di controllare i lettori multimediali senza aprire KDE Connect</string>
<string name="share_to">Condividi con…</string>
<string name="unreachable_device">%s (non raggiungibile)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Gli URL condivisi su un dispositivo irraggiungibile saranno recapitati una volta che sarà tornato raggiungibile.\n\n</string>
<string name="protocol_version">Versione del protocollo:</string>
<string name="protocol_version_newer">Questo dispositivo usa una nuova versione del protocollo di rete</string>
@ -309,6 +311,8 @@
<string name="devices">Dispositivi</string>
<string name="settings_rename">Nome dispositivo</string>
<string name="settings_dark_mode">Tema scuro</string>
<string name="settings_export_logs">Esporta i registri di KDE Connect</string>
<string name="settings_export_logs_text">Genera un file con informazioni di esecuzione che possono aiutare a risolvere i problemi.</string>
<string name="settings_more_settings_title">Altre impostazioni</string>
<string name="settings_more_settings_text">Le impostazioni per dispositivo sono disponibili sotto «Impostazioni estensioni» dall\'interno del dispositivo.</string>
<string name="setting_persistent_notification">Mostra notifica persistente</string>

View File

@ -181,9 +181,11 @@
<string name="middle_click">שליחת לחיצה אמצעית (גלגלת)</string>
<string name="show_keyboard">הצגת מקלדת</string>
<string name="device_not_paired">המכשיר לא מצומד</string>
<string name="pairing_duplicate_names">אזהרה: יש כמה מכשירים שונים באותו השם.</string>
<string name="request_pairing">בקשת צימוד</string>
<string name="pairing_accept">אישור</string>
<string name="pairing_reject">דחייה</string>
<string name="pairing_explanation">צימוד שני מכשירים יעניק להם גישה מאחד לשני ולהפך. יש לצמד רק אם המכשירים הם שלך.</string>
<string name="settings">הגדרות</string>
<string name="mpris_play">נגינה</string>
<string name="mpris_pause">השהיה</string>
@ -207,7 +209,7 @@
<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_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">כתובות שותפו להתקן בלתי נגיש והן תועברנה אליו ברגע שישוב להיות נגיש.\n\n</string>
<string name="protocol_version">גרסת פרוטוקול:</string>
<string name="protocol_version_newer">המכשיר משתמש בגרסה חדשה יותר</string>
@ -325,6 +327,8 @@
<string name="devices">מכשירים</string>
<string name="settings_rename">שם המכשיר</string>
<string name="settings_dark_mode">ערכת עיצוב כהה</string>
<string name="settings_export_logs">ייצוא היומנים של KDE Connect</string>
<string name="settings_export_logs_text">ליצור קובץ עם פרטי הפעלה שיכול לסייע בפתרון תקלות.</string>
<string name="settings_more_settings_title">הגדרות נוספות</string>
<string name="settings_more_settings_text">אפשר למצוא הגדרות נקודתיות למכשיר תחת ‚הגדרות תוסף’ מתוך המכשיר.</string>
<string name="setting_persistent_notification">הצגת התראה קבועה</string>

View File

@ -182,7 +182,6 @@
<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>

View File

@ -89,15 +89,12 @@
<string name="error_not_reachable">მოწყობილობა მიუწვდოელია</string>
<string name="error_already_paired">მოწყობილობა უკვე დაწყვილებულია</string>
<string name="error_timed_out">ვადა გავიდა</string>
<string name="error_clocks_not_match">მოწყობილობის საათების სინქრონიზაცია დარღვეულია</string>
<string name="error_canceled_by_user">გაუქმებულია მომხმარებლის მიერ</string>
<string name="error_canceled_by_other_peer">გაუქმებულია პარტნიორის მიერ</string>
<string name="encryption_info_title">დაშიფვრის ინფორმაცია</string>
<string name="pair_requested">დაწყვილების მოთხოვნა</string>
<string name="pair_succeeded">დაწყვილება წარმატებულია</string>
<plurals name="incoming_files_text">
<item quantity="one">File: %1s</item>
<item quantity="other">(File %2$d of %3$d) : %1$s</item>
</plurals>
<plurals name="outgoing_files_text">
<item quantity="one">ფაილი: %1$s</item>
<item quantity="other">(ფაილი %2$d of %3$d) : %1$s</item>
@ -133,7 +130,7 @@
<item>2 წუთი</item>
</string-array>
<string name="share_to">გაზიარება…</string>
<string name="unreachable_device">%s (მიუწვდომელია)</string>
<string name="protocol_version">პროტოკოლის ვერსია:</string>
<string name="protocol_version_newer">მოწყობილობა პროტოკოლის უფრო ახალ ვერსიას იყენებს</string>
<string name="plugin_settings_with_name">%s-ის მორგება</string>
<string name="invalid_device_name">მოწყობილობის არასწორი სახელი</string>
@ -217,6 +214,7 @@
<string name="devices">მოწყობილობები</string>
<string name="settings_rename">მოწყობილობის სახელი</string>
<string name="settings_dark_mode">ბნელი თემა</string>
<string name="settings_export_logs">KDE Connect-ის ჟურნალის გატანა</string>
<string name="settings_more_settings_title">მეტი პარამეტრი</string>
<string name="extra_options">დამატებითი პარამეტრები</string>
<string name="privacy_options">კონფიდენციალობის პარამეტრები</string>
@ -292,4 +290,5 @@
<string name="send_clipboard">ბუფერის გაგზავნა</string>
<string name="tap_to_execute">ქმედების შესასრულებლად დაატყაპუნეთ</string>
<string name="plugin_stats">მოდულის სტატისტიკა</string>
<string name="ping_failed">მოწყობილობა არ იპინგება</string>
</resources>

View File

@ -115,6 +115,7 @@
<string name="error_not_reachable">장치에 접근할 수 없음</string>
<string name="error_already_paired">장치가 이미 페어링됨</string>
<string name="error_timed_out">시간 초과됨</string>
<string name="error_clocks_not_match">장치 시계가 맞지 않음</string>
<string name="error_canceled_by_user">사용자가 취소함</string>
<string name="error_canceled_by_other_peer">다른 쪽에서 취소함</string>
<string name="encryption_info_title">암호화 정보</string>
@ -156,9 +157,11 @@
<string name="middle_click">가운데 단추 클릭 신호 보내기</string>
<string name="show_keyboard">키보드 표시</string>
<string name="device_not_paired">장치가 페어링되지 않음</string>
<string name="pairing_duplicate_names">경고: 이름이 같은 장치가 여러 대 있습니다.</string>
<string name="request_pairing">페어링 요청</string>
<string name="pairing_accept">수락</string>
<string name="pairing_reject">거부</string>
<string name="pairing_explanation">두 장치를 페어링하면 서로간의 접근을 허용합니다. 내 장치끼리만 페어링하십시오.</string>
<string name="settings">설정</string>
<string name="mpris_play">재생</string>
<string name="mpris_pause">일시 정지</string>
@ -182,13 +185,15 @@
<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_dynamic_shortcut">%s(✕)</string>
<string name="unreachable_device_url_share_text">접근할 수 없는 장치와 공유한 URL은 장치에 다시 접근할 수 있게 될 때 전달됩니다.\n\n</string>
<string name="protocol_version">프로토콜 버전:</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_devices_settings_summary">장치 %d개를 수동으로 추가함</string>
<string name="custom_device_list">IP로 장치 추가</string>
<string name="custom_device_deleted">사용자 정의 장치 삭제됨</string>
<string name="custom_device_list_help">장치가 자동으로 감지되지 않았다면 떠 다니는 동작 단추를 클릭해서 IP 주소나 호스트 이름으로 장치를 수동으로 추가할 수 있습니다</string>
@ -298,6 +303,8 @@
<string name="devices">장치</string>
<string name="settings_rename">장치 이름</string>
<string name="settings_dark_mode">어두운 테마</string>
<string name="settings_export_logs">KDE Connect 로그 내보내기</string>
<string name="settings_export_logs_text">문제 해결을 위해서 실행 정보를 포함하는 파일을 생성합니다.</string>
<string name="settings_more_settings_title">더 많은 설정</string>
<string name="settings_more_settings_text">장치별 설정은 각각 장치의 \'플러그인 설정\'에서 확인할 수 있습니다.</string>
<string name="setting_persistent_notification">항상 표시되는 알림 표시</string>

View File

@ -165,9 +165,11 @@
<string name="middle_click">Verstuur een middelste muisklik</string>
<string name="show_keyboard">Toetsenbord tonen</string>
<string name="device_not_paired">Apparaat is niet gepaard</string>
<string name="pairing_duplicate_names">Voorzichtig: er zijn meerdere apparaten met dezelfde naam.</string>
<string name="request_pairing">Verzoek voor maken van paar</string>
<string name="pairing_accept">Accepteren</string>
<string name="pairing_reject">Afwijzen</string>
<string name="pairing_explanation">Twee apparaten paren zal ze toegang geven tot elkaar. Paar alleen uw eigen apparaten.</string>
<string name="settings">Instellingen</string>
<string name="mpris_play">Afspelen</string>
<string name="mpris_pause">Pauzeren</string>
@ -191,7 +193,7 @@
<string name="mpris_notification_settings_title">Mediabesturingsmelding tonen</string>
<string name="mpris_notification_settings_summary">Staat besturing van uw mediaspelers toe zonder KDE Connect te openen</string>
<string name="share_to">Delen met…</string>
<string name="unreachable_device">%s (niet bereikbaar)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">URL\'s gedeeld met een niet bereikbaar apparaat zullen er afgeleverd worden wanneer deze bereikbaar wordt.\n\n</string>
<string name="protocol_version">Protocolversie:</string>
<string name="protocol_version_newer">Dit apparaat gebruikt een nieuwere protocolversie</string>
@ -309,6 +311,8 @@
<string name="devices">Apparaten</string>
<string name="settings_rename">Apparaatnaam</string>
<string name="settings_dark_mode">Donker thema</string>
<string name="settings_export_logs">Logs van KDE Connect exporteren</string>
<string name="settings_export_logs_text">Genereert een bestand met uitvoeringsinformatie die kan helpen problemen op te lossen.</string>
<string name="settings_more_settings_title">Meer instellingen</string>
<string name="settings_more_settings_text">Instellingen per apparaat kunnen gevonden worden onder \'Plug-in-instellingen\' vanuit een apparaat.</string>
<string name="setting_persistent_notification">Blijvende melding tonen</string>

View File

@ -115,6 +115,7 @@
<string name="error_not_reachable">Får ikkje kontakt med eininga</string>
<string name="error_already_paired">Eininga er alt para</string>
<string name="error_timed_out">Tidsavbrot</string>
<string name="error_clocks_not_match">Einingsklokkene er ikkje synkroniserte</string>
<string name="error_canceled_by_user">Avbroten av brukar</string>
<string name="error_canceled_by_other_peer">Avbroten av den andre eininga</string>
<string name="encryption_info_title">Krypteringsinfo</string>
@ -164,9 +165,11 @@
<string name="middle_click">Send midtklikk</string>
<string name="show_keyboard">Vis tastatur</string>
<string name="device_not_paired">Eininga er ikkje para</string>
<string name="pairing_duplicate_names">Åtvaring: Det finst fleire einingar med same namn.</string>
<string name="request_pairing">Be om paring</string>
<string name="pairing_accept">Godta</string>
<string name="pairing_reject">Avvis</string>
<string name="pairing_explanation">Ved paring av einingar, gjev du dei tilgang til kvarandre. Berre par saman einingar som du sjølv eig.</string>
<string name="settings">Innstillingar</string>
<string name="mpris_play">Spel</string>
<string name="mpris_pause">Pause</string>
@ -190,13 +193,15 @@
<string name="mpris_notification_settings_title">Vis varsling med avspelingskontrollar</string>
<string name="mpris_notification_settings_summary">Tillat å kontrollera mediespelarar utan å opna KDE Connect</string>
<string name="share_to">Del til </string>
<string name="unreachable_device">%s (får ikkje kontakt med)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Adresser delte til ei utilgjengeleg eining vert leverte når eininga vert tilgjengeleg att.\n\n</string>
<string name="protocol_version">Protokollversjon:</string>
<string name="protocol_version_newer">Denne eininga brukar ein nyare protokollversjon</string>
<string name="plugin_settings_with_name">%s-innstillingar</string>
<string name="invalid_device_name">Ugyldig einingsnamn</string>
<string name="shareplugin_text_saved">Fekk tekst, som vart lagra på utklippstavla</string>
<string name="custom_devices_settings">Tilpassa einingsliste</string>
<string name="custom_devices_settings_summary">%d lagde til manuelt</string>
<string name="custom_device_list">Legg til eining basert på IP</string>
<string name="custom_device_deleted">Tilpassa eining er sletta</string>
<string name="custom_device_list_help">Viss eininga ikkje vert funnen automatisk, kan du leggja til IP-adressa eller vertsnamnet til eininga ved å trykka på handlingsknappen</string>
@ -306,6 +311,7 @@
<string name="devices">Einingar</string>
<string name="settings_rename">Einingsnamn</string>
<string name="settings_dark_mode">Mørkt tema</string>
<string name="settings_export_logs">Eksporter KDE Connect-loggar</string>
<string name="settings_more_settings_title">Fleire innstillingar</string>
<string name="settings_more_settings_text">Innstillingar for einskildeiningar finn du under «Programtillegg-oppsett» på kvar eining.</string>
<string name="setting_persistent_notification">Vis evigvarande varsling</string>
@ -419,4 +425,9 @@
<string name="mpris_keepwatching_settings_title">Hald fram avspeling</string>
<string name="mpris_keepwatching_settings_summary">Vis ei stille varsling om framhald av medie­avspeling på eininga etter avspelingsstopp</string>
<string name="notification_channel_keepwatching">Hald fram avspeling</string>
<string name="ping_result">Pinga på %1$d millisekund</string>
<string name="ping_failed">Klarte ikkje pinga eininga</string>
<string name="ping_in_progress">Pingar </string>
<string name="device_host_invalid">Ugyldig vert. Bruk eit gyldig vertsnamn, IPv4 eller IPv6.</string>
<string name="device_host_duplicate">Verten finst i lista frå før</string>
</resources>

View File

@ -115,6 +115,7 @@
<string name="error_not_reachable">Urządzenie nieosiągalne</string>
<string name="error_already_paired">Urządzenie już sparowano</string>
<string name="error_timed_out">Upłynął czas na odpowiedź</string>
<string name="error_clocks_not_match">Zegary urządzenia nie są zsynchronizowane</string>
<string name="error_canceled_by_user">Użytkownik zaniechał</string>
<string name="error_canceled_by_other_peer">Inny uczestnik zaniechał</string>
<string name="encryption_info_title">Dane o szyfrowaniu</string>
@ -180,9 +181,11 @@
<string name="middle_click">Wyślij kliknięcie środkowym</string>
<string name="show_keyboard">Pokaż klawiaturę</string>
<string name="device_not_paired">Urządzenie niesparowane</string>
<string name="pairing_duplicate_names">Uwaga: Istnieje wiele urządzeń o tej samej nazwie.</string>
<string name="request_pairing">Prośba o sparowanie</string>
<string name="pairing_accept">Przyjmij</string>
<string name="pairing_reject">Odrzuć</string>
<string name="pairing_explanation">Sparowanie dwóch urządzeń da im dostęp do siebie nawzajem. Paruj tylko swoje własne urządzenia.</string>
<string name="settings">Ustawienia</string>
<string name="mpris_play">Odtwórz</string>
<string name="mpris_pause">Wstrzymaj</string>
@ -206,8 +209,9 @@
<string name="mpris_notification_settings_title">Pokaż powiadomienia sterowania mediami</string>
<string name="mpris_notification_settings_summary">Steruje odtwarzaczami bez otwierania KDE Connect</string>
<string name="share_to">Udostępnij urządzeniu...</string>
<string name="unreachable_device">%s (nieosiągalne)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Adres URL udostępniony nieosiągalnemu urządzeniu zostanie do niego dostarczony zaraz po tym jak stanie się osiągalne.\n\n</string>
<string name="protocol_version">Wersja protokołu:</string>
<string name="protocol_version_newer">Urządzenie to używa nowszej wersji protokołu</string>
<string name="plugin_settings_with_name">Ustawienia %s</string>
<string name="invalid_device_name">Nieprawidłowa nazwa urządzenia</string>
@ -323,6 +327,8 @@
<string name="devices">Urządzenia</string>
<string name="settings_rename">Nazwa urządzenia</string>
<string name="settings_dark_mode">Ciemny wygląd</string>
<string name="settings_export_logs">Wyeksportuj dziennik KDE Connect</string>
<string name="settings_export_logs_text">Utwórz plik zawierający ślad wykonywania, który może pomóc w rozwiązywaniu błędów.</string>
<string name="settings_more_settings_title">Więcej ustawień</string>
<string name="settings_more_settings_text">Dodatkowe ustawienia, dotyczące danego urządzenia, można znaleźć po wejściu na nie i wybranie „Ustawienia wtyczek”.</string>
<string name="setting_persistent_notification">Pokaż nieznikające powiadomienia</string>

View File

@ -190,7 +190,6 @@
<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>

File diff suppressed because one or more lines are too long

View File

@ -181,9 +181,11 @@
<string name="middle_click">Pošlji sredinski klik</string>
<string name="show_keyboard">Pokaži tipkovnico</string>
<string name="device_not_paired">Naprava ni uparjena</string>
<string name="pairing_duplicate_names">POZOR: Obstaja več naprav z istim imenom.</string>
<string name="request_pairing">Zahtevaj uparjanje</string>
<string name="pairing_accept">Sprejmi</string>
<string name="pairing_reject">Zavrni</string>
<string name="pairing_explanation">Uparjanje dveh naprav jim bo omogočilo dostop ene do druge. Uparjajte samo svoje lastne naprave.</string>
<string name="settings">Nastavitve</string>
<string name="mpris_play">Predvajaj</string>
<string name="mpris_pause">Premor</string>
@ -207,7 +209,7 @@
<string name="mpris_notification_settings_title">Pokaži obvestilo o nadzoru medija</string>
<string name="mpris_notification_settings_summary">Dovoli nadzor nad predvajalniki medijev, ne da bi odprli KDE Connect</string>
<string name="share_to">Deli z…</string>
<string name="unreachable_device">%s (Nedosegljiva)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">URL-ji, ki so v skupni rabi z nedosegljivo napravo, ji bodo dostavljeni, ko postane dosegljiva.\n\n</string>
<string name="protocol_version">Protokol različice:</string>
<string name="protocol_version_newer">Ta naprava uporablja novejšo različico protokola</string>
@ -325,6 +327,8 @@
<string name="devices">Naprave</string>
<string name="settings_rename">Ime naprave</string>
<string name="settings_dark_mode">Temna tema</string>
<string name="settings_export_logs">Izvozi dnevnike KDE Connect</string>
<string name="settings_export_logs_text">Ustvari datoteko z informacijami o izvajanju, ki lahko pomagajo pri odpravljanju težav.</string>
<string name="settings_more_settings_title">Več nastavitev</string>
<string name="settings_more_settings_text">Nastavitve posamezne naprave najdete v razdelku \'Nastavitve vtičnikov\' v napravi.</string>
<string name="setting_persistent_notification">Prikazuj trajno obvestilo</string>

View File

@ -165,9 +165,11 @@
<string name="middle_click">Skicka mittenklick</string>
<string name="show_keyboard">Visa tangentbord</string>
<string name="device_not_paired">Apparat inte parkopplad</string>
<string name="pairing_duplicate_names">Varning: Det finns flera enheter med samma namn.</string>
<string name="request_pairing">Begär parkoppling</string>
<string name="pairing_accept">Acceptera</string>
<string name="pairing_reject">Avslå</string>
<string name="pairing_explanation">Parkoppling av två enheter ger dem tillgång till varandra. Parkoppla bara dina egna enheter.</string>
<string name="settings">Inställningar</string>
<string name="mpris_play">Spela</string>
<string name="mpris_pause">Paus</string>
@ -191,7 +193,7 @@
<string name="mpris_notification_settings_title">Visa underrättelser om mediastyrning</string>
<string name="mpris_notification_settings_summary">Tillåt att styra mediaspelare utan att KDE-anslut öppnas</string>
<string name="share_to">Dela med…</string>
<string name="unreachable_device">%s (kan inte nås)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Webbadress som delas med en apparat som inte kan nås levereras till den när den väl blir möjlig att nå.\n\n</string>
<string name="protocol_version">Protokollversion:</string>
<string name="protocol_version_newer">Apparaten använder en nyare protokollversion</string>
@ -309,6 +311,8 @@
<string name="devices">Apparater</string>
<string name="settings_rename">Apparatnamn</string>
<string name="settings_dark_mode">Mörkt tema</string>
<string name="settings_export_logs">Exportera loggar från KDE anslut</string>
<string name="settings_export_logs_text">Generera en fil med körinformation som kan hjälpa till att felsöka problem.</string>
<string name="settings_more_settings_title">Fler inställningar</string>
<string name="settings_more_settings_text">Inställningar per apparat hittas i \'Insticksprograminställningar\' på apparaten.</string>
<string name="setting_persistent_notification">Visa permanent underrättelse</string>

View File

@ -130,7 +130,7 @@
</plurals>
<plurals name="incoming_files_text">
<item quantity="one">Dosya: %1s</item>
<item quantity="other">(Dosya %2$d %3$d) : %1$s</item>
<item quantity="other">(Dosya %2$d/%3$d) : %1$s</item>
</plurals>
<plurals name="outgoing_file_title">
<item quantity="one">%1$d dosya %2$s gönderiliyor</item>
@ -165,9 +165,11 @@
<string name="middle_click">Orta Tık Gönder</string>
<string name="show_keyboard">Klavyeyi Göster</string>
<string name="device_not_paired">Aygıt eşleşmemiş</string>
<string name="pairing_duplicate_names">Dikkat: Aynı adlı birden çok aygıt var.</string>
<string name="request_pairing">Eşleşme isteği</string>
<string name="pairing_accept">Onayla</string>
<string name="pairing_reject">Reddet</string>
<string name="pairing_explanation">İki aygıtı eşleştirmek, onlara birbirlerine erişim hakkını verecektir. Yalnızca kendi aygıtlarınızı eşleştirin.</string>
<string name="settings">Ayarlar</string>
<string name="mpris_play">Oynat</string>
<string name="mpris_pause">Duraklat</string>
@ -191,7 +193,7 @@
<string name="mpris_notification_settings_title">Ortam denetim bildirimini göster</string>
<string name="mpris_notification_settings_summary">KDE Bağlanı açmadan ortam oynatıcılarınızı denetlemenize izin verin</string>
<string name="share_to">Şuraya Paylaş…</string>
<string name="unreachable_device">%s (Erişilebilir değil)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Erişilemeyen bir aygıta gönderilen URLler, aygıt erişilebilir olduğunda teslim edilir.\n\n</string>
<string name="protocol_version">Protokol sürümü:</string>
<string name="protocol_version_newer">Bu aygıt, daha yeni bir protokol sürümü kullanıyor</string>
@ -309,6 +311,8 @@
<string name="devices">Aygıtlar</string>
<string name="settings_rename">Aygıt adı</string>
<string name="settings_dark_mode">Karanlık tema</string>
<string name="settings_export_logs">KDE Bağlan Günlüklerini Dışa Aktar</string>
<string name="settings_export_logs_text">Sorun tanılama konusunda yandımcı olabilecek yürütme bilgisini içeren bir dosya üretin.</string>
<string name="settings_more_settings_title">Daha fazla ayar</string>
<string name="settings_more_settings_text">Aygıt başına ayarlar, bir aygıt içinden “Eklenti Ayarları” altında bulunabilir.</string>
<string name="setting_persistent_notification">Kalıcı bildirim göster</string>
@ -427,5 +431,5 @@
<string name="ping_failed">Aygıt pinglenemedi</string>
<string name="ping_in_progress">Pingleniyor…</string>
<string name="device_host_invalid">Makine geçersiz. Geçerli bir makine adı kullanın; IPv4 veya IPv6 gibi</string>
<string name="device_host_duplicate">Listede makine halihazırda var</string>
<string name="device_host_duplicate">Makine listede halihazırda var</string>
</resources>

View File

@ -181,9 +181,11 @@
<string name="middle_click">Надіслати клацання лівою кнопкою</string>
<string name="show_keyboard">Показати клавіатуру</string>
<string name="device_not_paired">Пристрій не пов’язано</string>
<string name="pairing_duplicate_names">Попередження: маємо декілька пристроїв із однією назвою.</string>
<string name="request_pairing">Надіслати запит щодо пов’язування</string>
<string name="pairing_accept">Прийняти</string>
<string name="pairing_reject">Відмовити</string>
<string name="pairing_explanation">Пов\'язування двох пристроїв надасть їм взаємний доступ. Пов\'язуйте між собою лише ваші власні пристрої.</string>
<string name="settings">Параметри</string>
<string name="mpris_play">Пуск</string>
<string name="mpris_pause">Пауза</string>
@ -207,7 +209,7 @@
<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_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Адреси, які оприлюднено на недоступному пристрої, буде надіслано, щойно пристрій стане доступним.\n\n</string>
<string name="protocol_version">Версія протоколу:</string>
<string name="protocol_version_newer">На цьому пристрої використовується новіша версія протоколу</string>
@ -325,6 +327,8 @@
<string name="devices">Пристрої</string>
<string name="settings_rename">Назва пристрою</string>
<string name="settings_dark_mode">Темна тема</string>
<string name="settings_export_logs">Експортувати журнал KDE Connect</string>
<string name="settings_export_logs_text">Створити файл з даними щодо виконання, які можуть допомогти у діагностиці вад.</string>
<string name="settings_more_settings_title">Додаткові параметри</string>
<string name="settings_more_settings_text">Окремі параметри пристроїв наведено на сторінці «Параметри додатків» сторінки пристрою.</string>
<string name="setting_persistent_notification">Показувати постійне сповіщення</string>

View File

@ -157,9 +157,11 @@
<string name="middle_click">发送中键点击</string>
<string name="show_keyboard">显示键盘</string>
<string name="device_not_paired">设备未配对</string>
<string name="pairing_duplicate_names">注意:存在多个同名设备。</string>
<string name="request_pairing">请求配对</string>
<string name="pairing_accept">接受</string>
<string name="pairing_reject">拒绝</string>
<string name="pairing_explanation">两个设备在配对后即可相互访问。请只配对您自己的设备。</string>
<string name="settings">设置</string>
<string name="mpris_play">播放</string>
<string name="mpris_pause">暂停</string>
@ -183,7 +185,7 @@
<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_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">URL 被分享到了不可访问的设备。它将在设备能够访问时自动传输到该设备。\n</string>
<string name="protocol_version">协议版本:</string>
<string name="protocol_version_newer">此设备使用较新版本的协议</string>
@ -301,6 +303,8 @@
<string name="devices">设备</string>
<string name="settings_rename">设备名</string>
<string name="settings_dark_mode">深色主题</string>
<string name="settings_export_logs">导出 KDE Connect 日志</string>
<string name="settings_export_logs_text">生成一个包含程序执行信息的文件,有助于排查故障。</string>
<string name="settings_more_settings_title">更多设置</string>
<string name="settings_more_settings_text">每个设备的独立设置可以在设备页内的“插件设置”下找到。</string>
<string name="setting_persistent_notification">启用常驻通知栏</string>

View File

@ -115,6 +115,7 @@
<string name="error_not_reachable">裝置無法存取</string>
<string name="error_already_paired">裝置已經配對</string>
<string name="error_timed_out">逾時</string>
<string name="error_clocks_not_match">裝置時鐘不同步</string>
<string name="error_canceled_by_user">使用者中斷</string>
<string name="error_canceled_by_other_peer">被其他同等功能應用中斷</string>
<string name="encryption_info_title">加密資訊</string>
@ -156,9 +157,11 @@
<string name="middle_click">傳送中鍵點擊</string>
<string name="show_keyboard">顯示鍵盤</string>
<string name="device_not_paired">裝置未配對</string>
<string name="pairing_duplicate_names">請小心:有多台裝置有相同的名稱。</string>
<string name="request_pairing">請求配對</string>
<string name="pairing_accept">接受</string>
<string name="pairing_reject">拒絕</string>
<string name="pairing_explanation">配對兩台裝置會讓它們能夠互相存取。請只配對您自己的裝置。</string>
<string name="settings">設定</string>
<string name="mpris_play">播放</string>
<string name="mpris_pause">暫停</string>
@ -182,8 +185,9 @@
<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_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">若分享網址 (URL) 到無法存取的裝置,將在該裝置變得可存取後再傳送過去。\n\n</string>
<string name="protocol_version">協定版本:</string>
<string name="protocol_version_newer">此裝置使用較新的通訊協定版本</string>
<string name="plugin_settings_with_name">%s的設定</string>
<string name="invalid_device_name">無效的裝置名稱</string>
@ -299,6 +303,8 @@
<string name="devices">裝置</string>
<string name="settings_rename">裝置名稱</string>
<string name="settings_dark_mode">暗色主題</string>
<string name="settings_export_logs">匯出 KDE Connect 紀錄</string>
<string name="settings_export_logs_text">產生包含執行資訊的檔案來幫助發現問題。</string>
<string name="settings_more_settings_title">更多設定</string>
<string name="settings_more_settings_text">各裝置設定可在裝置內的「外掛程式設定」底下找到。</string>
<string name="setting_persistent_notification">顯示一致設定</string>

View File

@ -227,9 +227,11 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="middle_click">Send Middle Click</string>
<string name="show_keyboard">Show Keyboard</string>
<string name="device_not_paired">Device not paired</string>
<string name="pairing_duplicate_names">Caution: There are multiple devices with the same name.</string>
<string name="request_pairing">Request pairing</string>
<string name="pairing_accept">Accept</string>
<string name="pairing_reject">Reject</string>
<string name="pairing_explanation">Pairing two devices will give them access to each other. Only pair together your own devices.</string>
<string name="settings">Settings</string>
<string name="mpris_play">Play</string>
<string name="mpris_pause">Pause</string>
@ -263,7 +265,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="mpris_notification_settings_summary">Allow controlling your media players without opening KDE Connect</string>
<string name="mpris_notification_key" translatable="false">mpris_notification_enabled</string>
<string name="share_to">Share to…</string>
<string name="unreachable_device">%s (Unreachable)</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">URLs shared to an unreachable device will be delivered to it once it becomes reachable.\n\n</string>
<string name="protocol_version">Protocol version:</string>
<string name="protocol_version_newer">This device uses a newer protocol version</string>
@ -401,6 +403,9 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="settings_rename">Device name</string>
<string name="settings_dark_mode">Dark theme</string>
<string name="settings_export_logs">Export KDE Connect logs</string>
<string name="settings_export_logs_text">Generate a file with execution information that can help troubleshoot issues.</string>
<string name="settings_more_settings_title">More settings</string>
<string name="settings_more_settings_text">Per-device settings can be found under \'Plugin settings\' from within a device.</string>
<string name="setting_persistent_notification">Show persistent notification</string>

View File

@ -6,7 +6,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- NoActionBar because we use a Toolbar widget as ActionBar -->
<style name="KdeConnectThemeBase" parent="Theme.Material3.DayNight.NoActionBar">
<style name="KdeConnectThemeBase" parent="Theme.Material3.DynamicColors.DayNight.NoActionBar">
<!-- The main color attributes -->
<!-- Drawable definitions and overrides -->

View File

@ -19,7 +19,6 @@
<locale android:name="fi"/>
<locale android:name="fr"/>
<locale android:name="gl"/>
<locale android:name="he"/>
<locale android:name="hu"/>
<locale android:name="ia"/>
<locale android:name="id"/>

View File

@ -8,7 +8,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="180dp"
android:minWidth="120dp"
android:minHeight="80dp"
android:initialLayout="@layout/widget_remotecommandplugin"
android:resizeMode="horizontal|vertical"

View File

@ -24,13 +24,16 @@ import java.io.Reader
import java.util.UUID
import kotlin.text.Charsets.UTF_8
class BluetoothLink(context: Context?, connection: ConnectionMultiplexer, input: InputStream, output: OutputStream, remoteAddress: BluetoothDevice, deviceInfo: DeviceInfo, linkProvider: BluetoothLinkProvider) : BaseLink(context!!, linkProvider) {
private val connection: ConnectionMultiplexer?
private val input: InputStream
private val output: OutputStream
private val remoteAddress: BluetoothDevice
private val linkProvider: BluetoothLinkProvider
private val deviceInfo: DeviceInfo
class BluetoothLink(
context: Context?,
connection: ConnectionMultiplexer,
val input: InputStream,
val output: OutputStream,
val remoteAddress: BluetoothDevice,
val theDeviceInfo: DeviceInfo,
val linkProvider: BluetoothLinkProvider
) : BaseLink(context!!, linkProvider) {
private val connection: ConnectionMultiplexer? = connection
private var continueAccepting = true
private val receivingThread = Thread(object : Runnable {
override fun run() {
@ -64,8 +67,7 @@ class BluetoothLink(context: Context?, connection: ConnectionMultiplexer, input:
}
private fun processMessage(message: String) {
val np: NetworkPacket
np = try {
val np = try {
NetworkPacket.unserialize(message)
} catch (e: JSONException) {
Log.e("BluetoothLink/receiving", "Unable to parse message.", e)
@ -84,15 +86,6 @@ class BluetoothLink(context: Context?, connection: ConnectionMultiplexer, input:
}
})
init {
this.connection = connection
this.input = input
this.output = output
this.deviceInfo = deviceInfo
this.remoteAddress = remoteAddress
this.linkProvider = linkProvider
}
fun startListening() {
receivingThread.start()
}
@ -102,7 +95,7 @@ class BluetoothLink(context: Context?, connection: ConnectionMultiplexer, input:
}
override fun getDeviceInfo(): DeviceInfo {
return deviceInfo
return theDeviceInfo
}
override fun disconnect() {

View File

@ -16,6 +16,7 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Network
import android.os.Parcelable
import android.preference.PreferenceManager
import android.util.Base64
import android.util.Log
@ -29,12 +30,15 @@ import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper
import org.kde.kdeconnect.Helpers.ThreadHelper.execute
import org.kde.kdeconnect.NetworkPacket
import org.kde.kdeconnect.UserInterface.SettingsFragment
import org.kde.kdeconnect.extensions.getParcelableArrayCompat
import org.kde.kdeconnect.extensions.getParcelableCompat
import java.io.IOException
import java.io.InputStreamReader
import java.io.Reader
import java.security.cert.CertificateException
import java.util.UUID
import kotlin.text.Charsets.UTF_8
import androidx.core.content.edit
class BluetoothLinkProvider(private val context: Context) : BaseLinkProvider() {
private val visibleDevices: MutableMap<String, BluetoothLink> = HashMap()
@ -73,7 +77,7 @@ class BluetoothLinkProvider(private val context: Context) : BaseLinkProvider() {
if (!preferences.getBoolean(SettingsFragment.KEY_BLUETOOTH_ENABLED, false)) {
return
}
if (bluetoothAdapter == null || bluetoothAdapter.isEnabled == false) {
if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled) {
return
}
Log.i("BluetoothLinkProvider", "onStart called")
@ -138,9 +142,9 @@ class BluetoothLinkProvider(private val context: Context) : BaseLinkProvider() {
} catch (e: SecurityException) {
Log.e("KDEConnect", "Security Exception for CONNECT", e)
val prefenceEditor = PreferenceManager.getDefaultSharedPreferences(context).edit()
prefenceEditor.putBoolean(SettingsFragment.KEY_BLUETOOTH_ENABLED, false)
prefenceEditor.apply()
PreferenceManager.getDefaultSharedPreferences(context).edit {
putBoolean(SettingsFragment.KEY_BLUETOOTH_ENABLED, false)
}
return
}
@ -296,8 +300,8 @@ class BluetoothLinkProvider(private val context: Context) : BaseLinkProvider() {
val action = intent.action
if (BluetoothDevice.ACTION_UUID == action) {
Log.i("BluetoothLinkProvider", "Action matches")
val device = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
val activeUuids = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID)
val device = intent.getParcelableCompat<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
val activeUuids = intent.getParcelableArrayCompat<Parcelable>(BluetoothDevice.EXTRA_UUID)
if (sockets.containsKey(device)) {
Log.i("BluetoothLinkProvider", "sockets contains device")
return

View File

@ -21,7 +21,7 @@ import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock
class ConnectionMultiplexer(socket: BluetoothSocket) : Closeable {
private class ChannelInputStream constructor(val channel: Channel) : InputStream(), Closeable {
private class ChannelInputStream(val channel: Channel) : InputStream(), Closeable {
override fun available(): Int {
return channel.available()
}
@ -49,7 +49,7 @@ class ConnectionMultiplexer(socket: BluetoothSocket) : Closeable {
}
}
private class ChannelOutputStream constructor(val channel: Channel) : OutputStream(), Closeable {
private class ChannelOutputStream(val channel: Channel) : OutputStream(), Closeable {
@Throws(IOException::class)
override fun close() {
channel.close()
@ -78,7 +78,7 @@ class ConnectionMultiplexer(socket: BluetoothSocket) : Closeable {
}
}
private class Channel constructor(val multiplexer: ConnectionMultiplexer, val id: UUID) : Closeable {
private class Channel(val multiplexer: ConnectionMultiplexer, val id: UUID) : Closeable {
val readBuffer: ByteBuffer = ByteBuffer.allocate(BUFFER_SIZE)
val lock = ReentrantLock()
var lockCondition: Condition = lock.newCondition()
@ -371,14 +371,9 @@ class ConnectionMultiplexer(socket: BluetoothSocket) : Closeable {
}
}
private inner class ListenRunnable constructor(socket: BluetoothSocket) : Runnable {
var input: InputStream
var output: OutputStream
init {
input = socket.inputStream
output = socket.outputStream
}
private inner class ListenRunnable(socket: BluetoothSocket) : Runnable {
var input: InputStream = socket.inputStream
var output: OutputStream = socket.outputStream
@Throws(IOException::class)
private fun readBuffer(buffer: ByteArray, len: Int) {

View File

@ -10,8 +10,8 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.net.Network;
import android.os.Build;
import android.preference.PreferenceManager;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
@ -27,7 +27,6 @@ import org.kde.kdeconnect.Helpers.ThreadHelper;
import org.kde.kdeconnect.Helpers.TrustedNetworkHelper;
import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.UserInterface.CustomDevicesActivity;
import org.kde.kdeconnect.UserInterface.SettingsFragment;
import java.io.IOException;
import java.io.InputStream;
@ -68,13 +67,15 @@ public class LanLinkProvider extends BaseLinkProvider {
final static int MAX_IDENTITY_PACKET_SIZE = 1024 * 512;
final static int MAX_UDP_PACKET_SIZE = 1024 * 512;
final static long MILLIS_DELAY_BETWEEN_CONNECTIONS_TO_SAME_DEVICE = 500L;
final static long MILLIS_DELAY_BETWEEN_CONNECTIONS_TO_SAME_DEVICE = 1000L;
private final Context context;
final HashMap<String, LanLink> visibleDevices = new HashMap<>(); // Links by device id
final ConcurrentHashMap<String, Long> lastConnectionTime = new ConcurrentHashMap<>();
final static int MAX_RATE_LIMIT_ENTRIES = 255;
final ConcurrentHashMap<String, Long> lastConnectionTimeByDeviceId = new ConcurrentHashMap<>();
final ConcurrentHashMap<InetAddress, Long> lastConnectionTimeByIp = new ConcurrentHashMap<>();
private ServerSocket tcpServer;
private DatagramSocket udpServer;
@ -92,29 +93,70 @@ public class LanLinkProvider extends BaseLinkProvider {
super.onConnectionLost(link);
}
Pair<NetworkPacket, Boolean> unserializeReceivedIdentityPacket(String message) {
NetworkPacket identityPacket;
try {
identityPacket = NetworkPacket.unserialize(message);
} catch (JSONException e) {
Log.w("KDE/LanLinkProvider", "Invalid identity packet received: " + e.getMessage());
return null;
}
if (!DeviceInfo.isValidIdentityPacket(identityPacket)) {
Log.w("KDE/LanLinkProvider", "Invalid identity packet received.");
return null;
}
final String deviceId = identityPacket.getString("deviceId");
String myId = DeviceHelper.getDeviceId(context);
if (deviceId.equals(myId)) {
//Ignore my own broadcast
return null;
}
if (rateLimitByDeviceId(deviceId)) {
Log.i("LanLinkProvider", "Discarding second packet from the same device " + deviceId + " received too quickly");
return null;
}
boolean deviceTrusted = isDeviceTrusted(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 null;
}
return new Pair<>(identityPacket, deviceTrusted);
}
//They received my UDP broadcast and are connecting to me. The first thing they send should be their identity packet.
@WorkerThread
private void tcpPacketReceived(Socket socket) throws IOException {
NetworkPacket networkPacket;
InetAddress address = socket.getInetAddress();
if (rateLimitByIp(address)) {
Log.i("LanLinkProvider", "Discarding second TCP packet from the same ip " + address + " received too quickly");
return;
}
String message;
try {
String message = readSingleLine(socket);
networkPacket = NetworkPacket.unserialize(message);
//Log.e("TcpListener", "Received TCP packet: " + networkPacket.serialize());
message = readSingleLine(socket);
//Log.e("TcpListener", "Received TCP packet: " + identityPacket.serialize());
} catch (Exception e) {
Log.e("KDE/LanLinkProvider", "Exception while receiving TCP packet", e);
return;
}
Log.i("KDE/LanLinkProvider", "identity packet received from a TCP connection from " + networkPacket.getString("deviceName"));
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.");
final Pair<NetworkPacket, Boolean> pair = unserializeReceivedIdentityPacket(message);
if (pair == null) {
return;
}
final NetworkPacket identityPacket = pair.first;
final boolean deviceTrusted = pair.second;
identityPacketReceived(networkPacket, socket, LanLink.ConnectionStarted.Locally, deviceTrusted);
Log.i("KDE/LanLinkProvider", "identity packet received from a TCP connection from " + identityPacket.getString("deviceName"));
identityPacketReceived(identityPacket, socket, LanLink.ConnectionStarted.Locally, deviceTrusted);
}
/**
@ -136,40 +178,53 @@ public class LanLinkProvider extends BaseLinkProvider {
throw new IOException("Couldn't read a line from the socket");
}
boolean rateLimitByIp(InetAddress address) {
long now = System.currentTimeMillis();
Long last = lastConnectionTimeByIp.get(address);
if (last != null && (last + MILLIS_DELAY_BETWEEN_CONNECTIONS_TO_SAME_DEVICE > now)) {
return true;
}
lastConnectionTimeByIp.put(address, now);
if (lastConnectionTimeByIp.size() > MAX_RATE_LIMIT_ENTRIES) {
lastConnectionTimeByIp.entrySet().removeIf(e -> e.getValue() + MILLIS_DELAY_BETWEEN_CONNECTIONS_TO_SAME_DEVICE < now);
}
return false;
}
boolean rateLimitByDeviceId(String deviceId) {
long now = System.currentTimeMillis();
Long last = lastConnectionTimeByDeviceId.get(deviceId);
if (last != null && (last + MILLIS_DELAY_BETWEEN_CONNECTIONS_TO_SAME_DEVICE > now)) {
return true;
}
lastConnectionTimeByDeviceId.put(deviceId, now);
if (lastConnectionTimeByDeviceId.size() > MAX_RATE_LIMIT_ENTRIES) {
lastConnectionTimeByDeviceId.entrySet().removeIf(e -> e.getValue() + MILLIS_DELAY_BETWEEN_CONNECTIONS_TO_SAME_DEVICE < now);
}
return false;
}
//I've received their broadcast and should connect to their TCP socket and send my identity.
@WorkerThread
private void udpPacketReceived(DatagramPacket packet) throws JSONException, IOException {
final InetAddress address = packet.getAddress();
if (rateLimitByIp(address)) {
Log.i("LanLinkProvider", "Discarding second UDP packet from the same ip " + address + " received too quickly");
return;
}
String message = new String(packet.getData(), Charsets.UTF_8);
final NetworkPacket identityPacket;
try {
identityPacket = NetworkPacket.unserialize(message);
} catch (JSONException e) {
Log.w("KDE/LanLinkProvider", "Invalid identity packet received: " + e.getMessage());
return;
}
if (!DeviceInfo.isValidIdentityPacket(identityPacket)) {
Log.w("KDE/LanLinkProvider", "Invalid identity packet received.");
final Pair<NetworkPacket, Boolean> pair = unserializeReceivedIdentityPacket(message);
if (pair == null) {
return;
}
final NetworkPacket identityPacket = pair.first;
final boolean deviceTrusted = pair.second;
final String deviceId = identityPacket.getString("deviceId");
String myId = DeviceHelper.getDeviceId(context);
if (deviceId.equals(myId)) {
//Ignore my own broadcast
return;
}
long now = System.currentTimeMillis();
Long last = lastConnectionTime.get(deviceId);
if (last != null && (last + MILLIS_DELAY_BETWEEN_CONNECTIONS_TO_SAME_DEVICE > now)) {
Log.i("LanLinkProvider", "Discarding second UDP packet from the same device " + deviceId + " received too quickly");
return;
}
lastConnectionTime.put(deviceId, now);
Log.i("KDE/LanLinkProvider", "Broadcast identity packet received from " + identityPacket.getString("deviceName"));
int tcpPort = identityPacket.getInt("tcpPort", MIN_PORT);
if (tcpPort < MIN_PORT || tcpPort > MAX_PORT) {
@ -177,14 +232,6 @@ public class LanLinkProvider extends BaseLinkProvider {
return;
}
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);
@ -224,18 +271,7 @@ public class LanLinkProvider extends BaseLinkProvider {
*/
@WorkerThread
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.");
return;
}
String myId = DeviceHelper.getDeviceId(context);
final String deviceId = identityPacket.getString("deviceId");
if (deviceId.equals(myId)) {
Log.e("KDE/LanLinkProvider", "Somehow I'm connected to myself, ignoring. This should not happen.");
return;
}
int protocolVersion = identityPacket.getInt("protocolVersion");
if (deviceTrusted && isProtocolDowngrade(deviceId, protocolVersion)) {
@ -420,12 +456,6 @@ public class LanLinkProvider extends BaseLinkProvider {
}
private void broadcastUdpIdentityPacket(@Nullable Network network) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
if (!preferences.getBoolean(SettingsFragment.KEY_UDP_BROADCAST_ENABLED, true)) {
Log.i("LanLinkProvider", "UDP broadcast is disabled in settings. Skipping.");
return;
}
ThreadHelper.execute(() -> {
List<DeviceHost> hostList = CustomDevicesActivity
.getCustomDeviceList(context);

View File

@ -41,7 +41,7 @@ public class MdnsDiscovery {
this.lanLinkProvider = lanLinkProvider;
this.mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
this.mNsdResolveQueue = new NsdResolveQueue(this.mNsdManager);
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
multicastLock = wifiManager.createMulticastLock("kdeConnectMdnsMulticastLock");
}
@ -132,7 +132,7 @@ public class MdnsDiscovery {
// Also, on Android Lollipop those fields aren't resolved.
String deviceName = DeviceHelper.getDeviceName(context);
String deviceType = DeviceHelper.getDeviceType().toString();
String protocolVersion = Integer.toString(DeviceHelper.ProtocolVersion);
String protocolVersion = Integer.toString(DeviceHelper.PROTOCOL_VERSION);
serviceInfo.setAttribute("id", deviceId);
serviceInfo.setAttribute("name", deviceName);
serviceInfo.setAttribute("type", deviceType);

View File

@ -32,7 +32,6 @@ 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.Backends.LoopbackBackend.LoopbackLinkProvider
import org.kde.kdeconnect.Helpers.NotificationHelper
import org.kde.kdeconnect.Plugins.ClibpoardPlugin.ClipboardFloatingActivity
import org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandActivity
@ -235,7 +234,12 @@ class BackgroundService : Service() {
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)
try {
startForeground(FOREGROUND_NOTIFICATION_ID, createForegroundNotification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE)
} catch (e: IllegalStateException) { // To catch ForegroundServiceStartNotAllowedException
Log.w("BackgroundService", "Couldn't startForeground", e);
return START_STICKY
}
}
else {
startForeground(FOREGROUND_NOTIFICATION_ID, createForegroundNotification())

View File

@ -33,7 +33,6 @@ import org.kde.kdeconnect.DeviceStats.countReceived
import org.kde.kdeconnect.DeviceStats.countSent
import org.kde.kdeconnect.Helpers.DeviceHelper
import org.kde.kdeconnect.Helpers.NotificationHelper
import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper
import org.kde.kdeconnect.PairingHandler.PairingCallback
import org.kde.kdeconnect.Plugins.Plugin
import org.kde.kdeconnect.Plugins.Plugin.Companion.getPluginKey
@ -46,6 +45,7 @@ import java.util.Vector
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ConcurrentMap
import java.util.concurrent.CopyOnWriteArrayList
import androidx.core.content.edit
class Device : PacketReceiver {
@ -164,7 +164,7 @@ class Device : PacketReceiver {
// Returns 0 if the version matches, < 0 if it is older or > 0 if it is newer
fun compareProtocolVersion(): Int =
deviceInfo.protocolVersion - DeviceHelper.ProtocolVersion
deviceInfo.protocolVersion - DeviceHelper.PROTOCOL_VERSION
val isPaired: Boolean
get() = pairingHandler.state == PairingHandler.PairState.Paired
@ -209,7 +209,7 @@ class Device : PacketReceiver {
// Store as trusted device
val preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE)
preferences.edit().putBoolean(deviceInfo.id, true).apply()
preferences.edit { putBoolean(deviceInfo.id, true) }
try {
reloadPluginsFromSettings()
@ -228,10 +228,10 @@ class Device : PacketReceiver {
override fun unpaired() {
Log.i("Device", "unpaired, removing from trusted devices list")
val preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE)
preferences.edit().remove(deviceInfo.id).apply()
preferences.edit { remove(deviceInfo.id) }
val devicePreferences = context.getSharedPreferences(deviceInfo.id, Context.MODE_PRIVATE)
devicePreferences.edit().clear().apply()
devicePreferences.edit { clear() }
pairingCallbacks.forEach(PairingCallback::unpaired)
@ -596,7 +596,7 @@ class Device : PacketReceiver {
}
fun setPluginEnabled(pluginKey: String, value: Boolean) {
settings.edit().putBoolean(pluginKey, value).apply()
settings.edit { putBoolean(pluginKey, value) }
reloadPluginsFromSettings()
}

View File

@ -43,7 +43,7 @@ class DeviceHost private constructor(private val host: String) {
companion object {
/** Ping timeout */
private const val PING_TIMEOUT = 3_000
private val hostnameValidityPattern = Regex("^[0-9A-Za-z._-]+$")
private val hostnameValidityPattern = Regex("^[0-9A-Za-z.:_-]+$")
@JvmStatic
fun isValidDeviceHost(host: String): Boolean {

View File

@ -59,12 +59,12 @@ class DeviceInfo(
*/
fun toIdentityPacket(): NetworkPacket =
NetworkPacket(NetworkPacket.PACKET_TYPE_IDENTITY).also { np ->
np.set("deviceId", id)
np.set("deviceName", name)
np.set("protocolVersion", protocolVersion)
np.set("deviceType", type.toString())
np.set("incomingCapabilities", incomingCapabilities!!)
np.set("outgoingCapabilities", outgoingCapabilities!!)
np["deviceId"] = id
np["deviceName"] = name
np["protocolVersion"] = protocolVersion
np["deviceType"] = type.toString()
np["incomingCapabilities"] = incomingCapabilities!!
np["outgoingCapabilities"] = outgoingCapabilities!!
}
companion object {
@ -94,7 +94,7 @@ class DeviceInfo(
with(identityPacket) {
DeviceInfo(
id = getString("deviceId"), // Redundant: We could read this from the certificate instead
name = DeviceHelper.filterName(getString("deviceName", "unknown")),
name = DeviceHelper.filterInvalidCharactersFromDeviceNameAndLimitLength(getString("deviceName", "unknown")),
type = DeviceType.fromString(getString("deviceType", "desktop")),
certificate = certificate,
protocolVersion = getInt("protocolVersion"),
@ -106,11 +106,11 @@ class DeviceInfo(
@JvmStatic
fun isValidIdentityPacket(identityPacket: NetworkPacket): Boolean = with(identityPacket) {
type == NetworkPacket.PACKET_TYPE_IDENTITY &&
DeviceHelper.filterName(getString("deviceName", "")).isNotBlank() &&
isValidDeviceId(getString("deviceId", ""));
DeviceHelper.filterInvalidCharactersFromDeviceNameAndLimitLength(getString("deviceName", "")).isNotBlank() &&
isValidDeviceId(getString("deviceId", ""))
}
private val DEVICE_ID_REGEX = "^[a-zA-Z0-9_-]{32,38}\$".toRegex()
private val DEVICE_ID_REGEX = "^[a-zA-Z0-9_-]{32,38}$".toRegex()
@JvmStatic
fun isValidDeviceId(deviceId: String): Boolean = deviceId.matches(DEVICE_ID_REGEX)

View File

@ -115,7 +115,7 @@ object DeviceStats {
val entry = iterator.next()
val events = entry.value
var index = Collections.binarySearch(events, cutoutTimestamp)
var index = events.binarySearch(cutoutTimestamp)
if (index < 0) {
index = -(index + 1) // Convert the negative index to insertion point
}

View File

@ -91,7 +91,7 @@ public final class CollectionsBackport {
}
static boolean eq(Object o1, Object o2) {
return o1 == null ? o2 == null : o1.equals(o2);
return Objects.equals(o1, o2);
}
static class UnmodifiableNavigableSetBackport<E>

View File

@ -214,7 +214,7 @@ public class ContactsHelper {
Map<uID, Map<String, String>> databaseValue = accessContactsDatabase(context, projection, selection, selectionArgs, null);
if (databaseValue.size() == 0) {
if (databaseValue.isEmpty()) {
throw new ContactNotFoundException("Querying for contact with id " + contactID + " returned no results.");
}

View File

@ -0,0 +1,27 @@
package org.kde.kdeconnect.Helpers
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.activity.result.contract.ActivityResultContract
data class CreateFileParams(
val fileMimeType: String,
val suggestedFileName: String,
)
class CreateFileResultContract : ActivityResultContract<CreateFileParams, Uri?>() {
override fun createIntent(context: Context, input: CreateFileParams): Intent =
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
setTypeAndNormalize(input.fileMimeType)
putExtra(Intent.EXTRA_TITLE, input.suggestedFileName)
}
override fun parseResult(resultCode: Int, intent: Intent?): Uri? = when (resultCode) {
Activity.RESULT_OK -> intent?.data
else -> null
}
}

View File

@ -11,7 +11,6 @@ import android.content.res.Configuration
import android.content.res.Resources
import android.os.Build
import android.preference.PreferenceManager
import android.provider.Settings
import android.util.Log
import com.univocity.parsers.common.TextParsingException
import com.univocity.parsers.csv.CsvParser
@ -26,9 +25,10 @@ import java.io.InputStreamReader
import java.net.URL
import java.nio.charset.StandardCharsets
import java.util.UUID
import androidx.core.content.edit
object DeviceHelper {
const val ProtocolVersion = 8
const val PROTOCOL_VERSION = 8
const val KEY_DEVICE_NAME_PREFERENCE = "device_name_preference"
private const val KEY_DEVICE_NAME_FETCHED_FROM_THE_INTERNET = "device_name_downloaded_preference"
@ -85,7 +85,7 @@ object DeviceHelper {
// If we get here we managed to download the file. Mark that as done so we don't try again even if we don't end up finding a name.
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
preferences.edit().putBoolean(KEY_DEVICE_NAME_FETCHED_FROM_THE_INTERNET, true).apply()
preferences.edit { putBoolean(KEY_DEVICE_NAME_FETCHED_FROM_THE_INTERNET, true) }
BufferedReader(
InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_16)
@ -122,28 +122,19 @@ object DeviceHelper {
}
fun setDeviceName(context: Context, name: String) {
val filteredName = filterName(name)
val filteredName = filterInvalidCharactersFromDeviceNameAndLimitLength(name)
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
preferences.edit().putString(KEY_DEVICE_NAME_PREFERENCE, filteredName).apply()
preferences.edit { putString(KEY_DEVICE_NAME_PREFERENCE, filteredName) }
}
fun initializeDeviceId(context: Context) {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
val preferenceKeys: Set<String> = preferences.all.keys
if (preferenceKeys.contains(KEY_DEVICE_ID_PREFERENCE)) {
val deviceId = preferences.getString(KEY_DEVICE_ID_PREFERENCE, "")!!
if (DeviceInfo.isValidDeviceId(deviceId)) {
return // We already have an ID
}
@SuppressLint("HardwareIds")
val deviceName = if (preferenceKeys.isEmpty()) {
// For new installations, use random IDs
Log.i("DeviceHelper","No device ID found and this looks like a new installation, creating a random ID")
UUID.randomUUID().toString().replace('-', '_')
} else {
// Use the ANDROID_ID as device ID for existing installations, for backwards compatibility
Log.i("DeviceHelper", "No device ID found but this seems an existing installation, using the Android ID")
Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
}
preferences.edit().putString(KEY_DEVICE_ID_PREFERENCE, deviceName).apply()
val deviceName = UUID.randomUUID().toString().replace("-", "")
preferences.edit { putString(KEY_DEVICE_ID_PREFERENCE, deviceName) }
}
@JvmStatic
@ -159,12 +150,16 @@ object DeviceHelper {
SslHelper.certificate,
getDeviceName(context),
deviceType,
ProtocolVersion,
PROTOCOL_VERSION,
PluginFactory.incomingCapabilities,
PluginFactory.outgoingCapabilities
)
}
@JvmStatic
fun filterName(input: String): String = input.replace(NAME_INVALID_CHARACTERS_REGEX, "").take(MAX_DEVICE_NAME_LENGTH)
fun filterInvalidCharactersFromDeviceNameAndLimitLength(input: String): String = filterInvalidCharactersFromDeviceName(input).trim().take(MAX_DEVICE_NAME_LENGTH)
@JvmStatic
fun filterInvalidCharactersFromDeviceName(input: String): String = input.replace(NAME_INVALID_CHARACTERS_REGEX, "")
}

View File

@ -97,7 +97,7 @@ object FilesHelper {
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,)
val proj = arrayOf(OpenableColumns.SIZE, OpenableColumns.DISPLAY_NAME)
try {
contentResolver.query(uri, proj, null, null, null).use { cursor ->

View File

@ -11,7 +11,6 @@ import android.content.ContentUris
import android.content.Context
import android.database.ContentObserver
import android.database.sqlite.SQLiteException
import android.graphics.Bitmap
import android.media.MediaMetadataRetriever
import android.media.ThumbnailUtils
import android.net.Uri
@ -23,6 +22,8 @@ import android.telephony.TelephonyManager
import android.util.Log
import android.util.Pair
import androidx.annotation.RequiresApi
import androidx.core.graphics.scale
import androidx.core.net.toUri
import com.google.android.mms.pdu_alt.MultimediaMessagePdu
import com.google.android.mms.pdu_alt.PduPersister
import com.google.android.mms.util_alt.PduCache
@ -37,13 +38,11 @@ import org.kde.kdeconnect.Helpers.TelephonyHelper.LocalPhoneNumber
import org.kde.kdeconnect.Plugins.SMSPlugin.MimeType
import org.kde.kdeconnect.Plugins.SMSPlugin.SmsMmsUtils
import java.io.IOException
import java.util.Arrays
import java.util.Objects
import java.util.SortedMap
import java.util.TreeMap
import java.util.concurrent.locks.Lock
import java.util.concurrent.locks.ReentrantLock
import java.util.stream.Collectors
import kotlin.text.Charsets.UTF_8
@SuppressLint("InlinedApi")
@ -52,7 +51,7 @@ object SMSHelper {
private const val THUMBNAIL_WIDTH = 100
// The constant Telephony.Mms.Part.CONTENT_URI was added in API 29
val mMSPartUri : Uri = Uri.parse("content://mms/part/")
val mMSPartUri : Uri = "content://mms/part/".toUri()
/**
* Get the base address for all message conversations
@ -67,14 +66,14 @@ object SMSHelper {
if ("Samsung".equals(Build.MANUFACTURER, ignoreCase = true)) {
Log.i("SMSHelper", "This appears to be a Samsung device. This may cause some features to not work properly.")
}
return Uri.parse("content://mms-sms/conversations?simple=true")
return "content://mms-sms/conversations?simple=true".toUri()
}
private fun getCompleteConversationsUri(): Uri {
// This glorious - but completely undocumented - content URI gives us all messages, both MMS and SMS,
// in all conversations
// See https://stackoverflow.com/a/36439630/3723163
return Uri.parse("content://mms-sms/complete-conversations")
return "content://mms-sms/complete-conversations".toUri()
}
/**
@ -651,12 +650,7 @@ object SMSHelper {
)
val videoThumbnail = retriever.frameAtTime
val encodedThumbnail = SmsMmsUtils.bitMapToBase64(
Bitmap.createScaledBitmap(
videoThumbnail!!,
THUMBNAIL_WIDTH,
THUMBNAIL_HEIGHT,
true
)
videoThumbnail!!.scale(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT)
)
attachments.add(
Attachment(

View File

@ -24,7 +24,6 @@ import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.operator.ContentSigner;
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;

View File

@ -6,7 +6,6 @@
package org.kde.kdeconnect.Helpers
import android.net.Uri
import android.provider.DocumentsContract
object StorageHelper {
fun getDisplayName(treeUri: Uri): String {

View File

@ -13,6 +13,7 @@ import android.net.wifi.WifiManager
import android.preference.PreferenceManager
import android.util.Log
import androidx.core.content.ContextCompat
import androidx.core.content.edit
class TrustedNetworkHelper(private val context: Context) {
@ -22,19 +23,19 @@ class TrustedNetworkHelper(private val context: Context) {
return serializedNetworks.split(NETWORK_SSID_DELIMITER, "#_#" /* TODO remove old delimiter in 2025 */).filter { it.isNotEmpty() }
}
set(value) {
PreferenceManager.getDefaultSharedPreferences(context)
.edit()
.putString(KEY_CUSTOM_TRUSTED_NETWORKS, value.joinToString(NETWORK_SSID_DELIMITER))
.apply()
PreferenceManager.getDefaultSharedPreferences(context).edit {
putString(
KEY_CUSTOM_TRUSTED_NETWORKS,
value.joinToString(NETWORK_SSID_DELIMITER)
)
}
}
var allNetworksAllowed: Boolean
get() = !hasPermissions || PreferenceManager.getDefaultSharedPreferences(context).getBoolean(KEY_CUSTOM_TRUST_ALL_NETWORKS, true)
set(value) = PreferenceManager
.getDefaultSharedPreferences(context)
.edit()
.putBoolean(KEY_CUSTOM_TRUST_ALL_NETWORKS, value)
.apply()
set(value) = PreferenceManager.getDefaultSharedPreferences(context).edit {
putBoolean(KEY_CUSTOM_TRUST_ALL_NETWORKS, value)
}
val hasPermissions: Boolean
get() = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED

View File

@ -25,6 +25,7 @@ import java.security.cert.CertificateException
import java.security.cert.X509Certificate
import java.util.Date
import java.util.concurrent.ConcurrentHashMap
import androidx.core.content.edit
/*
* This class holds all the active devices and makes them accessible from every other class.
@ -116,7 +117,7 @@ class KdeConnect : Application() {
"KdeConnect",
"Couldn't load the certificate for a remembered device. Removing from trusted list.", e
)
preferences.edit().remove(it).apply()
preferences.edit { remove(it) }
}
}
}
@ -127,7 +128,7 @@ class KdeConnect : Application() {
trustedDevices.filter { preferences.getBoolean(it, false) }
.forEach {
Log.d("KdeConnect", "Removing devices: $it")
preferences.edit().remove(it).apply()
preferences.edit { remove(it) }
}
}

View File

@ -11,9 +11,7 @@ import org.json.JSONObject
import java.io.ByteArrayInputStream
import java.io.IOException
import java.io.InputStream
import java.lang.RuntimeException
import java.net.Socket
import kotlin.concurrent.Volatile
class NetworkPacket private constructor(
val type: String,

View File

@ -25,8 +25,6 @@ import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R;
import java.util.Objects;
@PluginFactory.LoadablePlugin
public class BigscreenPlugin extends Plugin {

View File

@ -75,7 +75,13 @@ public class ClipboardListener {
try {
String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US).format(new Date());
// Listen only ClipboardService errors after now
Process process = Runtime.getRuntime().exec(new String[]{"logcat", "-T", timeStamp, "ClipboardService:E", "*:S"});
String logcatFilter;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.VANILLA_ICE_CREAM) {
logcatFilter = "E ClipboardService";
} else {
logcatFilter = "ClipboardService:E";
}
Process process = Runtime.getRuntime().exec(new String[]{"logcat", "-T", timeStamp, logcatFilter, "*:S"});
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(
process.getInputStream()

View File

@ -25,8 +25,6 @@ import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R;
import java.util.Objects;
@PluginFactory.LoadablePlugin
public class ClipboardPlugin extends Plugin {

View File

@ -37,7 +37,6 @@ import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
import org.kde.kdeconnect_tp.R;
import java.io.IOException;
import java.util.Objects;
@PluginFactory.LoadablePlugin
public class FindMyPhonePlugin extends Plugin {

View File

@ -15,6 +15,7 @@ import android.os.Bundle;
import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.core.content.IntentCompat;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
@ -85,7 +86,7 @@ public class FindMyPhoneSettingsFragment extends PluginSettingsFragment {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_SELECT_RINGTONE && resultCode == Activity.RESULT_OK) {
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
Uri uri = IntentCompat.getParcelableExtra(data, RingtoneManager.EXTRA_RINGTONE_PICKED_URI, Uri.class);
if (uri != null) {
sharedPreferences.edit()

View File

@ -19,8 +19,6 @@ import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
import org.kde.kdeconnect_tp.R;
import java.util.Objects;
@PluginFactory.LoadablePlugin
public class MousePadPlugin extends Plugin {

View File

@ -157,9 +157,6 @@ public class PointerAccelerationProfileFactory {
public static PointerAccelerationProfile getProfileWithName(String name) {
switch (name) {
case "noacceleration":
default:
return new DefaultProfile();
case "weaker":
return new PolynomialProfile(0.25f);
case "weak":
@ -170,6 +167,9 @@ public class PointerAccelerationProfileFactory {
return new PolynomialProfile(1.5f);
case "stronger":
return new PolynomialProfile(2.0f);
case "noacceleration":
default:
return new DefaultProfile();
}
}
}

View File

@ -21,7 +21,7 @@ import org.kde.kdeconnect.Helpers.SafeTextChecker;
import org.kde.kdeconnect.Helpers.WindowHelper;
import org.kde.kdeconnect.KdeConnect;
import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.UserInterface.List.EntryItemWithIcon;
import org.kde.kdeconnect.UserInterface.List.DeviceItem;
import org.kde.kdeconnect.UserInterface.List.ListAdapter;
import org.kde.kdeconnect.UserInterface.List.SectionItem;
import org.kde.kdeconnect.base.BaseActivity;
@ -36,6 +36,7 @@ import java.util.stream.Collectors;
import kotlin.Lazy;
import kotlin.LazyKt;
import kotlin.Unit;
public class SendKeystrokesToHostActivity extends BaseActivity<ActivitySendkeystrokesBinding> {
@ -166,17 +167,16 @@ public class SendKeystrokesToHostActivity extends BaseActivity<ActivitySendkeyst
for (Device d : devices) {
if (d.isReachable() && d.isPaired()) {
devicesList.add(d);
items.add(new EntryItemWithIcon(d.getName(), d.getIcon()));
items.add(new DeviceItem(d, this::deviceClicked));
section.isEmpty = false;
}
}
getBinding().devicesList.setAdapter(new ListAdapter(SendKeystrokesToHostActivity.this, items));
getBinding().devicesList.setOnItemClickListener((adapterView, view, i, l) -> {
Device device = devicesList.get(i - 1); // NOTE: -1 because of the title!
sendKeys(device);
this.finish(); // close the activity
});
// Configure focus order for Accessibility, for touchpads, and for TV remotes
// (allow focus of items in the device list)
getBinding().devicesList.setItemsCanFocus(true);
// only one device is connected and we trust the text to send -> send it and close the activity.
// Usually we already check it in `onStart` - but if the BackgroundService was not started/connected to the host
@ -185,8 +185,15 @@ public class SendKeystrokesToHostActivity extends BaseActivity<ActivitySendkeyst
if (devicesList.size() == 1 && contentIsOkay) {
Device device = devicesList.get(0);
sendKeys(device);
this.finish(); // close the activity
finish(); // close the activity
}
}
private Unit deviceClicked(Device device) {
sendKeys(device);
finish(); // close the activity
return Unit.INSTANCE;
}
}

View File

@ -29,6 +29,7 @@ import java.net.URL
import java.net.URLDecoder
import java.security.MessageDigest
import java.util.concurrent.CopyOnWriteArrayList
import androidx.core.net.toUri
/**
* Handles the cache for album art
@ -130,7 +131,7 @@ internal object AlbumArtCache {
if (albumUrl.isNullOrEmpty()) {
return null
}
val url = Uri.parse(albumUrl)
val url = albumUrl.toUri()
//We currently only support http(s), file, and kdeconnect urls
if (url.scheme !in ALLOWED_SCHEMES) {
@ -221,7 +222,7 @@ internal object AlbumArtCache {
* Does the actual fetching and makes sure only not too many fetches are running at the same time
*/
private fun initiateFetch() {
var url : Uri;
var url : Uri
synchronized(fetchUrlList) {
if (numFetching >= 2 || fetchUrlList.isEmpty()) return
//Fetch the last-requested url first, it will probably be needed first
@ -283,7 +284,7 @@ internal object AlbumArtCache {
payload.close()
return
}
val url = Uri.parse(albumUrl)
val url = albumUrl.toUri()
if (url.scheme !in REMOTE_FETCH_SCHEMES) {
//Shouldn't happen (checked on receival of the url), but just to be sure
Log.e("KDE/Mpris/AlbumArtCache", "Got invalid art url with payload: $albumUrl")

View File

@ -10,6 +10,7 @@ import android.content.Context
import android.content.Intent
import android.util.Log
import org.kde.kdeconnect.KdeConnect
import org.kde.kdeconnect.extensions.getParcelableCompat
/**
* Called when the mpris media notification's buttons are pressed
@ -20,7 +21,7 @@ class MprisMediaNotificationReceiver : BroadcastReceiver() {
if (Intent.ACTION_MEDIA_BUTTON == intent.action) {
// Route these buttons to the media session, which will handle them
val mediaSession = MprisMediaSession.getMediaSession() ?: return
mediaSession.controller.dispatchMediaButtonEvent(intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT))
mediaSession.controller.dispatchMediaButtonEvent(intent.getParcelableCompat(Intent.EXTRA_KEY_EVENT))
} else {
// Second case: buttons on the notification, which we created ourselves
// Get the correct device, the mpris plugin and the mpris player

View File

@ -99,7 +99,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
* @param device The device id
*/
fun onCreate(context: Context?, plugin: MprisPlugin, device: String) {
if (mprisDevices.isEmpty) {
if (mprisDevices.isEmpty()) {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
prefs.registerOnSharedPreferenceChangeListener(this)
}
@ -137,7 +137,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
plugin.removePlayerListUpdatedHandler("media_notification")
updateMediaNotification()
if (mprisDevices.isEmpty) {
if (mprisDevices.isEmpty()) {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
prefs.unregisterOnSharedPreferenceChangeListener(this)
}

View File

@ -34,6 +34,7 @@ import org.kde.kdeconnect_tp.databinding.MprisNowPlayingBinding
import java.net.MalformedURLException
import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
import androidx.core.net.toUri
private typealias MprisPlayerCallback = (MprisPlayer) -> Unit
@ -102,14 +103,14 @@ class MprisNowPlayingFragment : Fragment(), VolumeKeyListener {
performActionOnClick(mprisControlBinding.stopButton, MprisPlayer::sendStop)
mprisControlBinding.volumeSeek.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
val targetPlayer = targetPlayer ?: return
targetPlayer.sendSetVolume(seekBar.progress)
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
})
positionSeekUpdateRunnable = Runnable {
@ -370,7 +371,7 @@ class MprisNowPlayingFragment : Fragment(), VolumeKeyListener {
if (targetPlayer != null && item.itemId == MENU_OPEN_URL) {
try {
val url = VideoUrlsHelper.formatUriWithSeek(targetPlayer.url, targetPlayer.position).toString()
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
val browserIntent = Intent(Intent.ACTION_VIEW, url.toUri())
startActivity(browserIntent)
targetPlayer.sendPause()
return true

View File

@ -33,6 +33,7 @@ import org.kde.kdeconnect.UserInterface.PluginSettingsFragment
import org.kde.kdeconnect_tp.R
import java.net.MalformedURLException
import java.util.concurrent.ConcurrentHashMap
import androidx.core.net.toUri
@LoadablePlugin
class MprisPlugin : Plugin() {
@ -273,7 +274,7 @@ class MprisPlugin : Plugin() {
playerStatus.isGoPreviousAllowed = np.getBoolean("canGoPrevious", playerStatus.isGoPreviousAllowed)
playerStatus.seekAllowed = np.getBoolean("canSeek", playerStatus.seekAllowed)
val newAlbumArtUrlString = np.getString("albumArtUrl", playerStatus.albumArtUrl)
val newAlbumArtUrl = Uri.parse(newAlbumArtUrlString)
val newAlbumArtUrl = newAlbumArtUrlString.toUri()
if (newAlbumArtUrl.scheme in AlbumArtCache.ALLOWED_SCHEMES) {
playerStatus.albumArtUrl = newAlbumArtUrl.toString()
} else {
@ -334,7 +335,7 @@ class MprisPlugin : Plugin() {
) {
try {
val url = VideoUrlsHelper.formatUriWithSeek(playerStatus.url, playerStatus.position).toString()
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
val browserIntent = Intent(Intent.ACTION_VIEW, url.toUri())
val pendingIntent = PendingIntent.getActivity(context, 0, browserIntent, PendingIntent.FLAG_IMMUTABLE)
val notificationManager = ContextCompat.getSystemService(context, NotificationManager::class.java)
@ -350,7 +351,7 @@ class MprisPlugin : Plugin() {
builder.build()
)
} catch (e: MalformedURLException) {
e.printStackTrace();
e.printStackTrace()
}
}
}

View File

@ -200,6 +200,7 @@ class MprisReceiverCallback extends MediaController.Callback {
* @return null if no art is available, otherwise a PNG image serialized into a bytearray
*/
public byte[] getArtAsArray() {
Bitmap displayArt = this.displayArt;
if (displayArt == null) {
return null;
}

View File

@ -34,6 +34,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;
import androidx.core.os.BundleCompat;
import androidx.fragment.app.DialogFragment;
import org.apache.commons.collections4.MultiValuedMap;
@ -358,7 +359,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
if (!notification.extras.containsKey(Notification.EXTRA_MESSAGES))
return new Pair<>(null, null);
Parcelable[] ms = notification.extras.getParcelableArray(Notification.EXTRA_MESSAGES);
Parcelable[] ms = BundleCompat.getParcelableArray(notification.extras, Notification.EXTRA_MESSAGES, Parcelable.class);
if (ms == null)
return new Pair<>(null, null);

View File

@ -19,7 +19,6 @@ 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

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