2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-09-05 00:25:09 +00:00

Compare commits

...

63 Commits

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

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

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

The previous implementation used a for loop to iterate over the list of enabled input methods and check if the package name matched the current context. This has been replaced with a more concise stream-based approach using `anyMatch`.
2024-10-04 02:42:19 +00:00
ShellWen Chen
78050a158a refactor(remotekeyboard): use package name from context instead of hard-coded 2024-10-04 02:42:19 +00:00
TPJ Schikhof
a5057df1c8 Migrate EntryItem to Kotlin 2024-10-04 02:40:42 +00:00
TPJ Schikhof
b856bdbb0b Migrate LifecycleHelper to Kotlin 2024-10-03 03:14:21 +00:00
TPJ Schikhof
8cb9a1809d Migrate SettingsFragment to Kotlin 2024-10-03 03:07:41 +00:00
86 changed files with 1079 additions and 905 deletions

1
.gitignore vendored
View File

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

View File

@@ -8,8 +8,8 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:versionCode="13205"
android:versionName="1.32.5">
android:versionCode="13209"
android:versionName="1.32.9">
<uses-feature
android:name="android.hardware.telephony"
@@ -20,6 +20,15 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />
<uses-feature
android:name="android.hardware.location.gps"
android:required="false" />
<uses-feature
android:name="android.hardware.microphone"
android:required="false" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />

View File

@@ -48,7 +48,7 @@ fun String.runCommand(
android {
namespace = "org.kde.kdeconnect_tp"
compileSdk = 34
compileSdk = 35
defaultConfig {
minSdk = 21
targetSdk = 35

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
[versions]
activityCompose = "1.9.2"
androidDesugarJdkLibs = "2.1.2"
androidGradlePlugin = "8.6.1"
activityCompose = "1.9.3"
androidDesugarJdkLibs = "2.1.3"
androidGradlePlugin = "8.7.3"
androidSmsmms = "kdeconnect-1-21-0"
appcompat = "1.7.0"
bcpkixJdk15on = "1.70"
@@ -9,32 +9,32 @@ classindex = "3.13"
commonsCollections4 = "4.4"
commonsIo = "2.17.0"
commonsLang3 = "3.17.0"
constraintlayoutCompose = "1.0.1"
coreKtx = "1.13.1"
constraintlayoutCompose = "1.1.0"
coreKtx = "1.15.0"
dependencyLicenseReport = "2.7"
disklrucache = "2.0.2"
documentfile = "1.0.1"
gridlayout = "1.0.0"
jsonassert = "1.5.3"
junit = "4.13.2"
kotlin = "2.0.20"
kotlin = "2.0.21"
kotlinxCoroutinesCore = "1.9.0"
lifecycleExtensions = "2.2.0"
lifecycleRuntimeKtx = "2.8.6"
lifecycleRuntimeKtx = "2.8.7"
logger = "1.0.3"
material = "1.12.0"
material3 = "1.3.0"
material3 = "1.3.1"
media = "1.7.0"
minaCore = "2.2.3"
mockitoCore = "5.14.0"
mockitoCore = "5.14.2"
preferenceKtx = "1.2.1"
reactiveStreams = "1.0.4"
recyclerview = "1.3.2"
rxjava = "2.2.21"
sl4j = "2.0.13"
sshdCore = "2.13.2"
sshdCore = "2.14.0"
swiperefreshlayout = "1.1.0"
uiToolingPreview = "1.7.2"
uiToolingPreview = "1.7.5"
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.7-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Все още не сте добавили надеждна мрежа</string>
<string name="allow_all_networks_text">Allow all</string>
<string name="location_permission_needed_title">Изисква се разрешение</string>
<string name="bluetooth_permission_needed_desc">KDE Connect се нуждае от разрешение за свързване с устройства наблизо, за да направи устройства, сдвоени чрез Bluetooth, достъпни в KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect се нуждае от разрешение за местоположението във фонов режим, за да познава WiFi към която сте свързани, дори когато приложението е във фонов режим. Това е така, защото имената на WiFi мрежите около вас могат да бъдат използвани за намиране на вашето местоположение, дори когато KDE Connect не прави това.</string>
<string name="clipboard_android_x_incompat">Android 10 премахна достъпа до клипборда за всички приложения. Тази приставка ще бъде деактивирана.</string>
<string name="mpris_open_url">Продължаване на възпроизвеждането тук</string>
@@ -411,6 +412,7 @@
<string name="tap_to_execute">Докоснете, за да се изпълни</string>
<string name="plugin_stats">Данни на приставки</string>
<string name="enable_udp_broadcast">Активиране на откриване на устройства чрез UDP</string>
<string name="enable_bluetooth">Активиране на Bluetooth(бета)</string>
<string name="receive_notifications_permission_explanation">Известията трябва са разрешени, за да може да се получават от други устройства</string>
<string name="findmyphone_notifications_explanation">Разрешение за известия е необходимо, за да може телефонът да звъни, когато приложението е във фонов режим</string>
<string name="no_notifications">Известията са деактивирани, няма да получавате известия за входящи двойки.</string>

View File

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

View File

@@ -423,6 +423,7 @@
<string name="tap_to_execute">Pro spuštění ťukněte sem</string>
<string name="plugin_stats">Statistiky modulů</string>
<string name="enable_udp_broadcast">Povolit prohledávání sítě UDP</string>
<string name="enable_bluetooth">Povolit Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Je potřeba povolit oznámení aby e šlo přijímat z ostatních zařízení</string>
<string name="findmyphone_notifications_explanation">Oprávnění k upozorněním je potřeba aby telefon mohl zvonit když je aplikace na pozadí</string>
<string name="no_notifications">Upozornění jsou zakázána. Neuvidíte upozornění na párování.</string>

View File

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

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">You have not added any trusted network yet</string>
<string name="allow_all_networks_text">Allow all</string>
<string name="location_permission_needed_title">Permission required</string>
<string name="bluetooth_permission_needed_desc">KDE Connect needs permission to connect to nearby devices to make devices paired using Bluetooth available in KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect needs the background location permission to know the WiFi network you are connected to even when the app is in the background. This is because the name of the WiFi networks around you could be used to find your location, even when this is not what KDE Connect does.</string>
<string name="clipboard_android_x_incompat">Android 10 has removed clipboard access to all apps. This plugin will be disabled.</string>
<string name="mpris_open_url">Continue playing here</string>
@@ -411,6 +412,7 @@
<string name="tap_to_execute">Tap to execute</string>
<string name="plugin_stats">Plugin stats</string>
<string name="enable_udp_broadcast">Enable UDP device discovery</string>
<string name="enable_bluetooth">Enable bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Notifications need to be allowed to receive them from other devices</string>
<string name="findmyphone_notifications_explanation">The notifications permission is needed so the phone can ring when the app is in the background</string>
<string name="no_notifications">Notifications are disabled, you won\'t receive incoming pair notifications.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">No ha añadido ninguna red confiable de momento</string>
<string name="allow_all_networks_text">Permitir todas</string>
<string name="location_permission_needed_title">Permisos requeridos</string>
<string name="bluetooth_permission_needed_desc">KDE Connect necesitas permisos para conectar a dispositivos cercanos para mostrar como disponibles en KDE Connect dispositivos vinculados por Bluetooth.</string>
<string name="location_permission_needed_desc">KDE Connect requiere permisos de localización para saber a que red está conectado incluso cuando la aplicación está en segundo plano. Esto es así porque el nombre de las redes WiFi a su alrededor se pueden usar para encontrar su localización, aunque no es esto lo que KDE Connect hace.</string>
<string name="clipboard_android_x_incompat">Android 10 ha eliminado el acceso al portapapeles para todas las aplicaciones. Este complemento se desactivará.</string>
<string name="mpris_open_url">Continuar reproduciendo aquí</string>
@@ -411,6 +412,7 @@
<string name="tap_to_execute">Pulse para ejecutar</string>
<string name="plugin_stats">Estadísticas del complemento</string>
<string name="enable_udp_broadcast">Activar descubrimiento de dispositivos por UDP</string>
<string name="enable_bluetooth">Activar Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Las notificaciones tienen que estar activadas para recibirlas desde otros dispositivos</string>
<string name="findmyphone_notifications_explanation">Se necesita el permiso de notificaciones para que el teléfono pueda sonar cuando la aplicación está en segundo plano</string>
<string name="no_notifications">Las notificaciones están desactivadas, no recibirá notificaciones de vinculación entrantes.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Oraindik ez duzu gehitu konfiantza duen sarerik</string>
<string name="allow_all_networks_text">Baimendu guztiak</string>
<string name="location_permission_needed_title">Baimena beharrezkoa da</string>
<string name="bluetooth_permission_needed_desc">KDE Connect-ek hurbileko gailuetara konektatzeko baimena behar du, Bluetooth bidez parekatutako gailuak KDE Connect-en erabilgarri ipintzeko.</string>
<string name="location_permission_needed_desc">KDE Connect-ek konektatuta zauden Wi-Fi sarea zein den jakiteko atzeko planoko kokapen baimena behar du, baita aplikazioa atzeko planoan dagoenean ere. Hori horrela da, zure inguruko Wi-Fi sareen izenak zure kokalekua aurkitzeko erabil daitezkeelako, nahiz eta hori ez izan KDE Connect-ek egiten duena.</string>
<string name="clipboard_android_x_incompat">Android 10ek arbela atzitzeko aukera kendu die aplikazio guztiei. Plugin hau desgaitu egingo da.</string>
<string name="mpris_open_url">Jarraitu hemen jotzen</string>
@@ -411,6 +412,7 @@
<string name="tap_to_execute">Tak egin exekutatzeko</string>
<string name="plugin_stats">Pluginaren estatistikak</string>
<string name="enable_udp_broadcast">Gaitu UDP bidez gailua aurkitzea</string>
<string name="enable_bluetooth">Gaitu bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Jakinarazpenak baimendu behar dira beste gailuetatik haiek jasotzeko</string>
<string name="findmyphone_notifications_explanation">Aplikazioa atzeko planoan dagoenean telefonoak jo dezan jakinarazpen-baimena behar da</string>
<string name="no_notifications">Jakinarazpenak ezgaituta daude, ez duzu jasoko parekatzeko sarrerako jakinarazpenik.</string>

View File

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

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Vous n\'avez pas encore ajouté de réseau de confiance</string>
<string name="allow_all_networks_text">Tout autoriser</string>
<string name="location_permission_needed_title">Permissions requises</string>
<string name="bluetooth_permission_needed_desc">KDEConnect a besoin d\'autorisations pour se connecter aux périphériques proches afin que les périphériques couplés à l\'aide de Bluetooth soient disponibles dans KDEConnect.</string>
<string name="location_permission_needed_desc">KDEConnect a besoin de la permission d\'accéder à la localisation en arrière-plan pour connaître le réseau Wifi sur lequel vous êtes connecté, même si l\'application est en arrière-plan. En effet, le nom des réseaux Wifi autour de vous pourrait être utilisé pour trouver votre emplacement, même si ce n\'est pas ce que KDEConnect fait.</string>
<string name="clipboard_android_x_incompat">Android 10 a supprimé l\'accès des applications au presse-papier. Ce module externe sera désactivé.</string>
<string name="mpris_open_url">Continuer la lecture ici</string>
@@ -411,6 +412,7 @@
<string name="tap_to_execute">Tapotez pour lancer</string>
<string name="plugin_stats">Statistiques des modules externes</string>
<string name="enable_udp_broadcast">Activer la découverte de périphériques « UDP »</string>
<string name="enable_bluetooth">Activer l\'interface Bluetooth (Bêta)</string>
<string name="receive_notifications_permission_explanation">Les notifications doivent être autorisées pour en recevoir d\'autres périphériques</string>
<string name="findmyphone_notifications_explanation">Les permissions pour les notifications sont nécessaires pour que le téléphone puisse sonner lorsque l\'application s\'exécute en tâche de fond</string>
<string name="no_notifications">Les notifications sont désactivées,. Vous ne recevrez pas de notifications d\'appairages entrants.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Aínda non engadiu ningunha rede de confianza</string>
<string name="allow_all_networks_text">Permitilas todas</string>
<string name="location_permission_needed_title">Require permiso</string>
<string name="bluetooth_permission_needed_desc">KDE Connect require permisos para conectarse a dispositivos próximos para poñer dispositivos emparellados mediante Bluetooth a disposición de KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect necesita o permiso de localización en segundo planto para saber a que rede WiFi se conectou incluso cando a aplicación está en segundo plano. Isto é porque o nome das redes WiFi ao redor seu podería usarse para descubrir a súa localización, aínda que KDE Connect non faga tal cousa.</string>
<string name="clipboard_android_x_incompat">Android 10 retirou o acceso ao portapapeis a todas as aplicacións. Desactivarase este complemento.</string>
<string name="mpris_open_url">Continuar reproducindo aquí</string>
@@ -411,6 +412,7 @@
<string name="tap_to_execute">Toque para executar</string>
<string name="plugin_stats">Estatísticas do complemento</string>
<string name="enable_udp_broadcast">Activar o descubrimento de dispositivos UDP.</string>
<string name="enable_bluetooth">Activar o Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Debe permitir notificacións para recibilas doutros dispositivos.</string>
<string name="findmyphone_notifications_explanation">Necesita o permiso de notificacións para que o teléfono poda soar cando a aplicación está en segundo plano.</string>
<string name="no_notifications">As notificacións están desactivadas, non recibirá notificacións entrantes de emparellamento.</string>

View File

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

View File

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

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Non hai aggiunto ancora alcuna rete affidabile</string>
<string name="allow_all_networks_text">Consenti tutte</string>
<string name="location_permission_needed_title">Permesso richiesto</string>
<string name="bluetooth_permission_needed_desc">KDE Connect necessita dell\'autorizzazione per connettersi ai dispositivi nelle vicinanze per rendere disponibili in KDE Connect i dispositivi associati tramite Bluetooth.</string>
<string name="location_permission_needed_desc">KDE Connect necessita dell\'autorizzazione alla posizione in background per conoscere la rete Wi-Fi a cui sei connesso anche quando l\'applicazione è in esecuzione sullo sfondo. Questo perché il nome delle reti Wi-Fi nelle tue vicinanze potrebbe essere utilizzata per trovare la tua posizione, anche se questo non è un utilizzo previsto da KDE Connect.</string>
<string name="clipboard_android_x_incompat">Android 10 ha rimosso l\'accesso agli appunti a tutte le applicazioni. Questa estensione sarà disabilitata.</string>
<string name="mpris_open_url">Continua qui la riproduzione</string>
@@ -411,6 +412,7 @@
<string name="tap_to_execute">Tocca per eseguire</string>
<string name="plugin_stats">Statistiche delle estensioni</string>
<string name="enable_udp_broadcast">Abilita rilevamento UDP dei dispositivi</string>
<string name="enable_bluetooth">Abilita bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Le notifiche devono essere consentite per riceverle da altri dispositivi</string>
<string name="findmyphone_notifications_explanation">L\'autorizzazione alle notifiche è necessaria affinché il telefono possa squillare quando l\'applicazione è sullo sfondo</string>
<string name="no_notifications">Le notifiche sono disabilitate, non riceverai notifiche di associazione in arrivo.</string>

View File

@@ -342,6 +342,7 @@
<string name="empty_trusted_networks_list_text">עדיין לא הוספת רשתות מהימנות</string>
<string name="allow_all_networks_text">לאפשר הכול</string>
<string name="location_permission_needed_title">נדרשת הרשאה</string>
<string name="bluetooth_permission_needed_desc">KDE Connect זקוק להרשאה להתחבר להתקנים קרובים כדי שהתקנים שצומדו עם בלוטות׳ יהיו זמינים ב־KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect צריך הרשאת איתור מקום ברקע כדי לדעת לאיזו רשת אלחוטית התחברת, אפילו אם היישום ברקע. מצב זה נחוץ כיוון ששם הרשתות האלחוטיות מסביבך יכולים לשמש לאיתור המקום שלך, אפילו אם זה לא מה ש־KDE Connect תוכנן לעשות.</string>
<string name="clipboard_android_x_incompat">ב־Android 10 הוסרה הגישה ללוח הגזירים לכל היישומונים. התוסף הזה יושבת.</string>
<string name="mpris_open_url">להמשיך לנגן מכאן</string>
@@ -427,6 +428,7 @@
<string name="tap_to_execute">נגיעה תפעיל</string>
<string name="plugin_stats">סטטיסטיקת תוסף</string>
<string name="enable_udp_broadcast">הפעלת גילוי מכשירים ב־UDP</string>
<string name="enable_bluetooth">הפעלת בלוטות׳ (בטא)</string>
<string name="receive_notifications_permission_explanation">יש לאשר התראות כדי לקבל אותן במכשירים אחרים</string>
<string name="findmyphone_notifications_explanation">הרשאת ההתראות נחוצה כדי שהטלפון יצלצל גם אם היישומון ברקע</string>
<string name="no_notifications">התראות מושבתות, לא תתקבלנה התראות צימוד נכנסות.</string>

View File

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

View File

@@ -108,21 +108,21 @@
<string name="category_not_paired_devices">사용 가능한 장치</string>
<string name="category_remembered_devices">기억하는 장치</string>
<string name="device_menu_plugins">플러그인 설정</string>
<string name="device_menu_unpair">연결 해제</string>
<string name="pair_new_device">새 장치 연결</string>
<string name="device_menu_unpair">페어링 해제</string>
<string name="pair_new_device">새 장치 페어링</string>
<string name="cancel_pairing">페어링 취소</string>
<string name="unknown_device">알 수 없는 장치</string>
<string name="error_not_reachable">장치에 접근할 수 없음</string>
<string name="error_already_paired">장치가 이미 연결</string>
<string name="error_already_paired">장치가 이미 페어링</string>
<string name="error_timed_out">시간 초과됨</string>
<string name="error_canceled_by_user">사용자가 취소함</string>
<string name="error_canceled_by_other_peer">다른 쪽에서 취소함</string>
<string name="encryption_info_title">암호화 정보</string>
<string name="my_device_fingerprint">내 장치 인증서의 SHA256 지문:</string>
<string name="remote_device_fingerprint">원격 장치 인증서의 SHA256 지문:</string>
<string name="pair_requested">연결 요청됨</string>
<string name="pair_succeeded">연결 성공</string>
<string name="pairing_request_from">\'%1s\'에서 연결 요청</string>
<string name="pair_requested">페어링 요청됨</string>
<string name="pair_succeeded">페어링 성공</string>
<string name="pairing_request_from">\'%1s\'에서 페어링 요청</string>
<plurals name="incoming_file_title">
<item quantity="other">%2$s에서 보낸 파일 %1$d개 받음</item>
</plurals>
@@ -155,8 +155,8 @@
<string name="right_click">오른쪽 단추 클릭 신호 보내기</string>
<string name="middle_click">가운데 단추 클릭 신호 보내기</string>
<string name="show_keyboard">키보드 표시</string>
<string name="device_not_paired">장치가 연결되지 않음</string>
<string name="request_pairing">연결 요청</string>
<string name="device_not_paired">장치가 페어링되지 않음</string>
<string name="request_pairing">페어링 요청</string>
<string name="pairing_accept">수락</string>
<string name="pairing_reject">거부</string>
<string name="settings">설정</string>
@@ -229,7 +229,7 @@
<string name="device_rename_title">장치 이름 바꾸기</string>
<string name="device_rename_confirm">이름 바꾸기</string>
<string name="refresh">새로 고침</string>
<string name="unreachable_description">연결된 장치에 접근할 수 없습니다. 같은 네트워크에 있는지 확인하십시오.</string>
<string name="unreachable_description">페어링된 장치에 접근할 수 없습니다. 같은 네트워크에 있는지 확인하십시오.</string>
<string name="no_wifi">Wi-Fi 네트워크에 연결된 것 같지 않습니다. 다른 장치를 볼 수 없습니다. 여기를 클릭하면 Wi-Fi를 활성화합니다.</string>
<string name="on_non_trusted_message">신뢰할 수 없는 네트워크: 자동 발견을 비활성화했습니다.</string>
<string name="no_file_browser">설치된 파일 탐색기가 없습니다.</string>
@@ -281,7 +281,7 @@
<string name="copy_url_to_clipboard">클립보드로 URL 복사</string>
<string name="clipboard_toast">클립보드에 복사됨</string>
<string name="runcommand_notreachable">장치에 접근할 수 없음</string>
<string name="runcommand_notpaired">장치가 연결되지 않음</string>
<string name="runcommand_notpaired">장치가 페어링되지 않음</string>
<string name="runcommand_nosuchdevice">장치가 없음</string>
<string name="runcommand_noruncommandplugin">이 장치에서 명령 실행 플러그인이 활성화되어 있지 않음</string>
<string name="runcommand_category_device_controls_title">장치 제어</string>
@@ -318,6 +318,7 @@
<string name="empty_trusted_networks_list_text">신뢰할 수 있는 네트워크를 추가하지 않았습니다</string>
<string name="allow_all_networks_text">모두 허용</string>
<string name="location_permission_needed_title">권한이 필요함</string>
<string name="bluetooth_permission_needed_desc">KDE Connect에서 블루투스를 사용하여 페어링된 장치를 사용하려면 근처 장치에 연결할 수 있는 권한이 필요합니다.</string>
<string name="location_permission_needed_desc">KDE Connect에서 현재 연결된 Wi-Fi 네트워크 정보를 얻으려면 앱이 백그라운드에서 실행 중일 때에도 백그라운드 권한이 필요합니다. KDE Connect에서는 사용자의 위치를 찾지 않지만, 내 주변에 있는 Wi-Fi 네트워크의 이름으로도 위치를 찾을 수 있기 때문입니다.</string>
<string name="clipboard_android_x_incompat">안드로이드 10부터는 앱에서 클립보드에 접근할 수 없습니다. 이 플러그인이 비활성화되었습니다.</string>
<string name="mpris_open_url">여기에서 계속 재생</string>
@@ -381,6 +382,8 @@
<string name="send_compose">보내기</string>
<string name="compose_send_title">텍스트 보내기</string>
<string name="open_compose_send">텍스트 작성</string>
<string name="double_tap_to_drag">두 번 탭하면 드래그</string>
<string name="hold_to_drag">누르고 있으면 드래그</string>
<string name="about_kde_about">&lt;h1&gt;정보&lt;h1&gt; &lt;p&gt;KDE는 &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;자유 소프트웨어&lt;/a&gt;를 개발하려고 모인 소프트웨어 개발자, 예술가, 집필가, 번역가 및 기타 인원의 모임입니다. KDE 커뮤니티에서는 Plasma 데스크톱 환경, 다양한 앱 및 지원 라이브러리를 개발합니다.&lt;p&gt; &lt;p&gt;KDE는 협동 조합입니다. 어떠한 단일 집단도 방향이나 제품을 결정하지 않습니다. 우리는 전 세계에서 가장 뛰어난 자유 소프트웨어 개발이라는 공통 목표를 향해 함께 힘을 모으고 있습니다. KDE에는 이 글을 읽는 여러분과 같은 누구나 &lt;a href=https://community.kde.org/Get_Involved&gt;참여하고 기여&lt;/a&gt;할 수 있습니다.&lt;p&gt; &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; 페이지를 방문하셔서 KDE 커뮤니티와 소프트웨어에 대해 알아 보십시오.</string>
<string name="about_kde_report_bugs_or_wishes">"&lt;h1&gt;버그나 요구 사항 보고&lt;/h1&gt; &lt;p&gt;소프트웨어는 항상 개선되며, KDE 팀도 그럴 준비가 되어 있습니다. 따라서 사용자 여러분은 무언가가 예상한 대로 작동하지 않거나 더 잘 작동하기를 바라면 개발자에게 알려 주십시오.&lt;/p&gt; &lt;p&gt;KDE는 버그 추적 시스템을 가지고 있습니다. &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt;를 방문하시거나 \"도움말\" 메뉴의 \"버그 보고...\" 대화 상자를 이용하셔서 버그를 보고해 주십시오.&lt;/p&gt; 개선 사항 제안을 하고 싶으시다면 버그 보고 시스템을 통해서 알려 주십시오. 이 경우 심각성 항목에서 \"Wishlist\"를 선택하셔야 합니다."</string>
<string name="about_kde_join_kde">&lt;h1&gt;KDE에 참여하기&lt;/h1&gt; &lt;p&gt;소프트웨어 개발자만이 KDE에 참가할 수 있는 것은 아닙니다. 프로그램 인터페이스를 번역하는 각 언어 번역팀을 도울 수도 있습니다. 또한 그래픽, 테마, 소리, 더 나은 문서 등을 기여할 수도 있습니다. 직접 결정하십시오!&lt;/p&gt; &lt;p&gt;&lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; 페이지를 방문하셔서 참여할 수 있는 프로젝트를 찾아 보십시오.&lt;/p&gt; 만약 더 많은 정보나 문서가 필요하다면, &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; 사이트를 방문하셔서 원하는 정보를 찾으십시오.</string>
@@ -401,6 +404,7 @@
<string name="tap_to_execute">실행하려면 누르십시오</string>
<string name="plugin_stats">플러그인 통계</string>
<string name="enable_udp_broadcast">UDP 서비스 발견 활성화</string>
<string name="enable_bluetooth">블루투스 활성화(베타)</string>
<string name="receive_notifications_permission_explanation">다른 장치에서 알림을 받으려면 알림을 허용해야 합니다</string>
<string name="findmyphone_notifications_explanation">앱이 백그라운드에서 실행 중일 때 장치를 울리게 하려면 알림 권한이 필요합니다</string>
<string name="no_notifications">알림이 비활성화되어 있습니다. 들어오는 페어링 알림을 받을 수 없습니다</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">U hebt nog geen vertrouwd netwerk toegevoegd</string>
<string name="allow_all_networks_text">Allen toestaan</string>
<string name="location_permission_needed_title">Toestemming vereist</string>
<string name="bluetooth_permission_needed_desc">KDE Connect heeft rechten nodig om te verbinden met apparaten dichtbij om apparaten te laten paren met Bluetooth beschikbaar in KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect heeft de permissie achtergrondlocatie nodig om het WiFi-netwerk te weten waarmee u bent verbonden zelfs wanneer de toepassing in de achtergrond is. Dit vanwege dat de naam van de WiFi-netwerken om u heen gebruikt zouden kunnen worden om uw locatie te vinden, zelfs wanneer dit niet is wat KDE Connect doet.</string>
<string name="clipboard_android_x_incompat">Android 10 heeft toegang tot het klembord naar alle toepassingen verwijderd. Deze plug-in zal uitgeschakeld worden.</string>
<string name="mpris_open_url">Hier doorgaan met afspelen</string>
@@ -411,6 +412,7 @@
<string name="tap_to_execute">Tik om uit te voeren</string>
<string name="plugin_stats">Plug-in-statistieken</string>
<string name="enable_udp_broadcast">Ontdekken van UDP-apparaat inschakelen</string>
<string name="enable_bluetooth">Bluetooth inschakelen (beta)</string>
<string name="receive_notifications_permission_explanation">Meldingen moeten toegestaan worden om ze te ontvangen van andere apparaten</string>
<string name="findmyphone_notifications_explanation">Het recht op meldingen is nodig zodat de telefoon af kan gaan wanneer de toepassing in de achtergrond is</string>
<string name="no_notifications">Meldingen zijn uitgeschakeld, u zult inkomende paringmeldingen ontvangen.</string>

View File

@@ -411,6 +411,7 @@
<string name="tap_to_execute">Tapp for å utføra handlinga</string>
<string name="plugin_stats">Programtillegg-statistikk</string>
<string name="enable_udp_broadcast">Slå på einingsoppdaging via UDP</string>
<string name="enable_bluetooth">Bruk Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Du må tillata varslingar for å kunna frå varslingar frå andre einingar</string>
<string name="findmyphone_notifications_explanation">Varslingsløyvet trengst for at telefonen skal kunna ringja når appen er i bakgrunnsmodus</string>
<string name="no_notifications">Varslingar er slåtte av, så du vil ikkje få varsling om parings­førespurnadar.</string>

View File

@@ -342,6 +342,7 @@
<string name="empty_trusted_networks_list_text">Nie dodałeś jeszcze żadnej zaufanej sieci</string>
<string name="allow_all_networks_text">Zezwól wszystkim</string>
<string name="location_permission_needed_title">Wymagana zgoda</string>
<string name="bluetooth_permission_needed_desc">KDE Connect wymaga pozwolenia na łączenie do sąsiednich urządzeń, aby urządzenia sparowane przy pomocy Bluetooth były widoczne w KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect potrzebuje uprawnień do sprawdzania twojego położenia w tle, aby móc poznać sieć WiFi, do której jesteś podłączony także wtedy, gdy aplikacja działa w tle. Jest tak dlatego, że nazwy sieci WiFi wokół ciebie mogą zostać użyte do ustalenia twojego położenia, mimo że KDE Connect nie robi tego w ten sposób.</string>
<string name="clipboard_android_x_incompat">Android 10 odebrał dostęp do schowka wszystkim programom. Ta wtyczka pozostanie wyłączona.</string>
<string name="mpris_open_url">Kontynuuj odtwarzanie tutaj</string>
@@ -427,6 +428,7 @@
<string name="tap_to_execute">Stuknij, aby wykonać</string>
<string name="plugin_stats">Statystyki wtyczek</string>
<string name="enable_udp_broadcast">Włącz wykrywanie urządzeń UDP</string>
<string name="enable_bluetooth">Włącz Bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Należy zezwolić na powiadomienia, aby móc je otrzymywać z innych urządzeń</string>
<string name="findmyphone_notifications_explanation">Uprawnienia powiadomień są potrzebne, aby telefon mógł dzwonić, gdy aplikacja działa w tle</string>
<string name="no_notifications">Powiadomienia są wyłączone, więc nie otrzymasz żadnych próśb o sparowanie.</string>

View File

@@ -342,6 +342,7 @@
<string name="empty_trusted_networks_list_text">Niste še dodali nobenega zaupanja vrednega omrežja</string>
<string name="allow_all_networks_text">Dovoli vse</string>
<string name="location_permission_needed_title">Zahtevano dovoljenje</string>
<string name="bluetooth_permission_needed_desc">KDE Connect potrebuje dovoljenje za povezavo z bližnjimi napravami, da bodo naprave, seznanjene z Bluetoothom, na voljo v KDE Connect.</string>
<string name="location_permission_needed_desc">"KDE Connect potrebuje dovoljenje omrežja, da pozna WiFi omrežje, s katerim ste povezani, tudi če je aplikacija v ozadju. To je zato, ker se ime omrežja wifi lahko uporabi za iskanje svoje lokacije, četudi to ne počne KDE Connect."</string>
<string name="clipboard_android_x_incompat">Android 10 je odstranil dostop do odložišča za vse aplikacije. Ta vtičnik bo onemogočen.</string>
<string name="mpris_open_url">Nadaljuj s predvajanjem tukaj</string>
@@ -427,6 +428,7 @@
<string name="tap_to_execute">Tapkajte za izvedbo</string>
<string name="plugin_stats">Stanje vtičnikov</string>
<string name="enable_udp_broadcast">Omogoči odkrivanje naprav UDP</string>
<string name="enable_bluetooth">Omogoči bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Morate imeti dovoljenje za obvestila, če jih želite sprejemati iz drugih naprav</string>
<string name="findmyphone_notifications_explanation">Potrebno je dovoljenje za obvestila, da lahko telefon zazvoni, ko je aplikacija v ozadju</string>
<string name="no_notifications">Obvestila so onemogočena, ne boste prejemali obvestil o dohodnih parih.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Du har inte lagt till några pålitliga nätverk ännu</string>
<string name="allow_all_networks_text">Tillåt alla</string>
<string name="location_permission_needed_title">Rättighet krävs</string>
<string name="bluetooth_permission_needed_desc">KDE-anslut behöver behörighet för att ansluta till närliggande apparater för att göra apparater som är parkopplade med Blåtand tillgängliga i KDE-anslut.</string>
<string name="location_permission_needed_desc">KDE-anslut behöver rättigheter för bakgrundsplats för att känna till WIFI-nätverket du är ansluten med även när programmet är i bakgrunden. Det beror på att namnen på WIFI-nätverk omkring dig skulle kunna användas för att ta reda på var du befinner dig, även om det inte är vad KDE-anslut gör.</string>
<string name="clipboard_android_x_incompat">Android 10 har tagit bort åtkomst till klippbordet för alla applikationer. Det här insticksprogrammet kommer att inaktiveras.</string>
<string name="mpris_open_url">Fortsätt spela här</string>
@@ -411,6 +412,7 @@
<string name="tap_to_execute">Rör för att köra</string>
<string name="plugin_stats">Insticksprogramstatistik</string>
<string name="enable_udp_broadcast">Aktivera UDP-enhetsupptäckt</string>
<string name="enable_bluetooth">Aktivera Blåtand (beta)</string>
<string name="receive_notifications_permission_explanation">Underrättelser måste vara tillåtna för att kunna ta emot dem från andra apparater</string>
<string name="findmyphone_notifications_explanation">Underrättelserättigheter krävs så att telefonen kan ringa när programmet är i bakgrunden</string>
<string name="no_notifications">Underrättelser är inaktiverade, så en underrättelse om inkommande begäran att para ihop inte tas emot.</string>

View File

@@ -326,6 +326,7 @@
<string name="empty_trusted_networks_list_text">Henüz herhangi bir güvenilen ağ eklemediniz</string>
<string name="allow_all_networks_text">Hepsine izin ver</string>
<string name="location_permission_needed_title">İzin gerekli</string>
<string name="bluetooth_permission_needed_desc">KDE Bağlan, Bluetooth kullanarak eşleştirilmiş aygıtların KDE Bağlanda görülebilir olmasını sağlamak için yakındaki aygıtlara bağlanma iznine gereksinim duyar.</string>
<string name="location_permission_needed_desc">KDE Bağlan, uygulama arka planda olsa bile bağlı olduğunuz Wi-Fi ağını bilmek için arka plan konumu iznine gereksinim duyar. Bunun nedeni, çevrenizdeki Wi-Fi ağlarının adının, KDE Bağlanın yaptığı bu olmasa bile konumunuzu bulmak için kullanılabilmesidir.</string>
<string name="clipboard_android_x_incompat">Android 10, tüm uygulamalara pano erişimini kaldırdı. Bu eklenti devre dışı bırakılacak.</string>
<string name="mpris_open_url">Oynamayı burada sürdürün</string>
@@ -407,10 +408,11 @@
<string name="saikrishna_arcot_task">Uzaktan girdi eklentisinde klavye kullanımı desteği, hata düzeltmeleri ve genel iyileştirmeler</string>
<string name="shellwen_chen_task">SFTP güvenliğini artır, projenin bakımını daha da kolaylaştır, hata düzeltmeleri ve genel iyileştirmeler</string>
<string name="everyone_else">KDE Bağlana yıllar boyunca katkıda bulunan herkes</string>
<string name="send_clipboard">Pano gönder</string>
<string name="tap_to_execute">Yürütmek için dokun</string>
<string name="plugin_stats">Eklenti istatistikleri</string>
<string name="enable_udp_broadcast">UDP aygıt keşfini etkinleştir</string>
<string name="send_clipboard">Pano Gönder</string>
<string name="tap_to_execute">Yürütmek için Dokun</string>
<string name="plugin_stats">Eklenti İstatistikleri</string>
<string name="enable_udp_broadcast">UDP Aygıt Keşfini Etkinleştir</string>
<string name="enable_bluetooth">Bluetoothu Etkinleştir (Beta)</string>
<string name="receive_notifications_permission_explanation">Başka aygıtlardan gelen bildirimleri alabilmek için bildirimlere izin verilmesi gereklidir</string>
<string name="findmyphone_notifications_explanation">Uygulama arka plandayken telefonun çalabilmesi için bildirim izni gereklidir</string>
<string name="no_notifications">Bildirimler devre dışı; herhangi bir gelen eş bildirimi almayacaksınız.</string>

View File

@@ -342,6 +342,7 @@
<string name="empty_trusted_networks_list_text">Вами ще не додано надійних мереж</string>
<string name="allow_all_networks_text">Дозволити всі</string>
<string name="location_permission_needed_title">Потрібні права доступу</string>
<string name="bluetooth_permission_needed_desc">KDE Connect потрібні права доступу до з\'єднання із сусідніми пристроями, щоб зробити пов\'язування пристроїв за допомогою Bluetooth доступним у KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect потрібні права на визначення місця перебування у фоновому режимі для роботи з мережею WiFi, з якою встановлено з\'єднання, навіть якщо програма працює у фоновому режимі. Причина полягає у тому, що назви сусідніх мереж WiFi може бути використано для визначення місця перебування, навіть якщо це не робить сама KDE Connect.</string>
<string name="clipboard_android_x_incompat">У Android 10 вилучено доступ до буфера даних для усіх програм. Цей додаток буде вимкнено.</string>
<string name="mpris_open_url">Продовжити відтворення тут</string>
@@ -427,6 +428,7 @@
<string name="tap_to_execute">Торкніться, щоб виконати</string>
<string name="plugin_stats">Статистика щодо додатків</string>
<string name="enable_udp_broadcast">Увімкнути виявлення пристроїв UDP</string>
<string name="enable_bluetooth">Увімкнути Bluetooth (тест)</string>
<string name="receive_notifications_permission_explanation">Для отримання сповіщень з інших пристроїв має бути уможливлено показ сповіщень</string>
<string name="findmyphone_notifications_explanation">Для уможливлення дзвінків, коли програма перебуває у фоновому режимі, потрібні права доступу до сповіщень</string>
<string name="no_notifications">Показ сповіщень вимкнено, ви не отримуватимете сповіщень щодо вхідних запитів на пов\'язування пристроїв.</string>

View File

@@ -318,6 +318,7 @@
<string name="empty_trusted_networks_list_text">您还没有添加任何可信的网络</string>
<string name="allow_all_networks_text">允许所有</string>
<string name="location_permission_needed_title">需要权限</string>
<string name="bluetooth_permission_needed_desc">KDE Connect 需要权限才能使用蓝牙连接并配对附近的设备。</string>
<string name="location_permission_needed_desc">KDE Connect 需要后台位置权限才能在后台检测您连接到的 WiFi 网络。后台位置权限是一个敏感权限,这是因为该权限可以让应用程序通过您周围的 WiFi 网络名称来查找您的位置。尽管 KDE Connect 申请了该权限,但它不会对您进行定位。</string>
<string name="clipboard_android_x_incompat">Android 10 已删除所有应用的剪贴板访问权限。此插件将被禁用。</string>
<string name="mpris_open_url">继续在此播放</string>
@@ -403,6 +404,7 @@
<string name="tap_to_execute">轻触执行</string>
<string name="plugin_stats">插件状态</string>
<string name="enable_udp_broadcast">启用 UPnP 设备发现</string>
<string name="enable_bluetooth">启用蓝牙 (测试)</string>
<string name="receive_notifications_permission_explanation">需要允许通知才能从其他设备接收通知</string>
<string name="findmyphone_notifications_explanation">需要通知权限,这样当应用程序处于后台时手机可以发出铃声</string>
<string name="no_notifications">通知已禁用,您将不会收到传入的配对通知。</string>

View File

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

View File

@@ -424,6 +424,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="allow_all_networks_text">Allow all</string>
<string name="location_permission_needed_title">Permission required</string>
<string name="bluetooth_permission_needed_desc">KDE Connect needs permission to connect to nearby devices to make devices paired using Bluetooth available in KDE Connect.</string>
<string name="location_permission_needed_desc">KDE Connect needs the background location permission to know the WiFi network you are connected to even when the app is in the background. This is because the name of the WiFi networks around you could be used to find your location, even when this is not what KDE Connect does.</string>
<string name="clipboard_android_x_incompat">Android 10 has removed clipboard access to all apps. This plugin will be disabled.</string>
<string name="mpris_open_url">Continue playing here</string>
@@ -567,6 +568,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="plugin_stats">Plugin stats</string>
<string name="enable_udp_broadcast">Enable UDP device discovery</string>
<string name="enable_bluetooth">Enable bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Notifications need to be allowed to receive them from other devices</string>
<string name="findmyphone_notifications_explanation">The notifications permission is needed so the phone can ring when the app is in the background</string>

View File

@@ -67,7 +67,7 @@ class BackgroundService : Service() {
private fun registerLinkProviders() {
linkProviders.add(LanLinkProvider(this))
// linkProviders.add(new LoopbackLinkProvider(this));
//linkProviders.add(LoopbackLinkProvider(this))
linkProviders.add(BluetoothLinkProvider(this))
}
@@ -163,7 +163,7 @@ class BackgroundService : Service() {
intent.putExtra(MainActivity.EXTRA_DEVICE_ID, connectedDeviceIds[0])
}
val pi = PendingIntent.getActivity(this, 0, intent, UPDATE_MUTABLE_FLAGS)
val pi = PendingIntent.getActivity(this, 0, intent, UPDATE_IMMUTABLE_FLAGS)
val notification = NotificationCompat.Builder(this, NotificationHelper.Channels.PERSISTENT).apply {
setSmallIcon(R.drawable.ic_notification)
setOngoing(true)
@@ -189,7 +189,7 @@ class BackgroundService : Service() {
// Adding an action button to send clipboard manually in Android 10 and later.
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_LOGS) == PackageManager.PERMISSION_DENIED) {
val sendClipboard = ClipboardFloatingActivity.getIntent(this, true)
val sendPendingClipboard = PendingIntent.getActivity(this, 3, sendClipboard, UPDATE_MUTABLE_FLAGS)
val sendPendingClipboard = PendingIntent.getActivity(this, 3, sendClipboard, UPDATE_IMMUTABLE_FLAGS)
notification.addAction(0, getString(R.string.foreground_notification_send_clipboard), sendPendingClipboard)
}
@@ -201,7 +201,7 @@ class BackgroundService : Service() {
// Setting up Send File Intent.
val sendFile = Intent(this, SendFileActivity::class.java)
sendFile.putExtra("deviceId", deviceId)
val sendPendingFile = PendingIntent.getActivity(this, 1, sendFile, UPDATE_MUTABLE_FLAGS)
val sendPendingFile = PendingIntent.getActivity(this, 1, sendFile, UPDATE_IMMUTABLE_FLAGS)
notification.addAction(0, getString(R.string.send_files), sendPendingFile)
// Checking if there are registered commands and adding the button.
@@ -209,7 +209,7 @@ class BackgroundService : Service() {
if (plugin != null && plugin.commandList.isNotEmpty()) {
val runCommand = Intent(this, RunCommandActivity::class.java)
runCommand.putExtra("deviceId", connectedDeviceIds[0])
val runPendingCommand = PendingIntent.getActivity(this, 2, runCommand, UPDATE_MUTABLE_FLAGS)
val runPendingCommand = PendingIntent.getActivity(this, 2, runCommand, UPDATE_IMMUTABLE_FLAGS)
notification.addAction(0, getString(R.string.pref_plugin_runcommand), runPendingCommand)
}
}
@@ -249,7 +249,7 @@ class BackgroundService : Service() {
companion object {
const val LOG_TAG = "KDE/BackgroundService"
const val UPDATE_MUTABLE_FLAGS = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
const val UPDATE_IMMUTABLE_FLAGS = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
private const val FOREGROUND_NOTIFICATION_ID = 1
@JvmStatic

View File

@@ -257,7 +257,7 @@ class Device : PacketReceiver {
context,
1,
intent,
PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val acceptIntent = Intent(context, MainActivity::class.java).apply {
@@ -273,13 +273,13 @@ class Device : PacketReceiver {
context,
2,
acceptIntent,
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
)
val rejectedPendingIntent = PendingIntent.getActivity(
context,
4,
rejectIntent,
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
)
val res = context.resources

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -42,7 +42,7 @@ class PingPlugin : Plugin() {
return false
}
val mutableUpdateFlags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
val mutableUpdateFlags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
val resultPendingIntent = PendingIntent.getActivity(context, 0, Intent(context, MainActivity::class.java), mutableUpdateFlags)
val (id: Int, message: String) = if (np.has("message")) {

View File

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

View File

@@ -419,12 +419,8 @@ public class RemoteKeyboardPlugin extends Plugin implements SharedPreferences.On
public boolean checkRequiredPermissions() {
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
List<InputMethodInfo> inputMethodList = inputMethodManager.getEnabledInputMethodList();
for (InputMethodInfo info : inputMethodList) {
if ("org.kde.kdeconnect_tp".equals(info.getPackageName())) {
return true;
}
}
return false;
return inputMethodList.stream().anyMatch(
info -> context.getPackageName().equals(info.getPackageName()));
}
@Override

View File

@@ -29,10 +29,10 @@ class CommandEntry extends EntryItem {
}
public String getName() {
return title;
return getTitle();
}
public String getCommand() {
return subtitle;
return getSubtitle();
}
}

View File

@@ -187,6 +187,7 @@ private fun assignListIntent(context: Context, appWidgetId: Int, views: RemoteVi
val runCommandTemplateIntent = Intent(context, RunCommandWidgetProvider::class.java)
runCommandTemplateIntent.action = RUN_COMMAND_ACTION
runCommandTemplateIntent.putExtra(EXTRA_APPWIDGET_ID, appWidgetId)
// Needs to be mutable because the launcher will modify it to indicate which command was selected
val runCommandTemplatePendingIntent = PendingIntent.getBroadcast(context, appWidgetId, runCommandTemplateIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE)
views.setPendingIntentTemplate(R.id.widget_command_list, runCommandTemplatePendingIntent)
}

View File

@@ -69,7 +69,7 @@ class ReceiveNotification {
cancelIntent.setAction(SharePlugin.ACTION_CANCEL_SHARE);
cancelIntent.putExtra(SharePlugin.CANCEL_SHARE_BACKGROUND_JOB_ID_EXTRA, jobId);
cancelIntent.putExtra(SharePlugin.CANCEL_SHARE_DEVICE_ID_EXTRA, device.getDeviceId());
PendingIntent cancelPendingIntent = PendingIntent.getBroadcast(device.getContext(), 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
PendingIntent cancelPendingIntent = PendingIntent.getBroadcast(device.getContext(), 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
builder.addAction(R.drawable.ic_reject_pairing_24dp, device.getContext().getString(R.string.cancel), cancelPendingIntent);
}
@@ -160,7 +160,7 @@ class ReceiveNotification {
device.getContext(),
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);
builder.setContentText(device.getContext().getResources().getString(R.string.received_file_text, filename))
@@ -169,7 +169,7 @@ class ReceiveNotification {
shareIntent = Intent.createChooser(shareIntent,
device.getContext().getString(R.string.share_received_file, destinationUri.getLastPathSegment()));
PendingIntent sharePendingIntent = PendingIntent.getActivity(device.getContext(), (int) System.currentTimeMillis(),
shareIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
shareIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
NotificationCompat.Action.Builder shareAction = new NotificationCompat.Action.Builder(
R.drawable.ic_share_white, device.getContext().getString(R.string.share), sharePendingIntent);
builder.addAction(shareAction.build());

View File

@@ -47,7 +47,7 @@ class UploadNotification {
cancelIntent.setAction(SharePlugin.ACTION_CANCEL_SHARE);
cancelIntent.putExtra(SharePlugin.CANCEL_SHARE_BACKGROUND_JOB_ID_EXTRA, jobId);
cancelIntent.putExtra(SharePlugin.CANCEL_SHARE_DEVICE_ID_EXTRA, device.getDeviceId());
PendingIntent cancelPendingIntent = PendingIntent.getBroadcast(device.getContext(), 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
PendingIntent cancelPendingIntent = PendingIntent.getBroadcast(device.getContext(), 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
builder.addAction(R.drawable.ic_reject_pairing_24dp, device.getContext().getString(R.string.cancel), cancelPendingIntent);
}

View File

@@ -98,7 +98,7 @@ class SinkItemHolder extends RecyclerView.ViewHolder
seekBar.setMax(sink.getMaxVolume());
seekBar.setProgress(sink.getVolume());
int iconRes = sink.isMute() ? R.drawable.ic_volume_mute_black : R.drawable.ic_volume_black;
int iconRes = sink.isMute() ? R.drawable.ic_volume_mute : R.drawable.ic_volume;
ImageButton button = viewBinding.systemvolumeMute;
button.setImageResource(iconRes);

View File

@@ -100,7 +100,7 @@ public class SystemVolumeFragment
}
this.plugin = plugin;
plugin.addSinkListener(SystemVolumeFragment.this);
plugin.requestSinkList();
sinksChanged();
}
private void disconnectFromPlugin(final String deviceId) {

View File

@@ -113,12 +113,6 @@ public class SystemVolumePlugin extends Plugin {
getDevice().sendPacket(np);
}
void requestSinkList() {
NetworkPacket np = new NetworkPacket(PACKET_TYPE_SYSTEMVOLUME_REQUEST);
np.set("requestSinks", true);
getDevice().sendPacket(np);
}
@Override
public @NonNull String[] getSupportedPacketTypes() {
return new String[]{PACKET_TYPE_SYSTEMVOLUME};

View File

@@ -155,21 +155,21 @@ class SystemVolumeProvider private constructor(plugin: SystemVolumePlugin) :
return sink != null
}
fun startListeningForSinks() {
systemVolumePlugin.addSinkListener(this)
systemVolumePlugin.requestSinkList()
}
fun release() {
stopListeningForSinks()
stateListeners.clear()
currentProvider = null
}
private fun startListeningForSinks() {
systemVolumePlugin.addSinkListener(this)
sinksChanged();
}
private fun stopListeningForSinks() {
for (sink in systemVolumePlugin.sinks) {
sink.removeListener(this)
}
systemVolumePlugin.removeSinkListener(this)
}
}
}

View File

@@ -95,7 +95,7 @@ class AboutFragment : Fragment() {
setupInfoButton(aboutData.websiteURL, binding!!.websiteButton)
// Update authors
binding!!.authorsList.adapter = ListAdapter(this.context, aboutData.authors.map { AboutPersonEntryItem(it) }, false)
binding!!.authorsList.adapter = ListAdapter(this.requireContext(), aboutData.authors.map { AboutPersonEntryItem(it) }, false)
if (aboutData.authorsFooterText != null) {
binding!!.authorsFooterText.text = context?.getString(aboutData.authorsFooterText!!)
}

View File

@@ -64,7 +64,7 @@ class EasterEggActivity : AppCompatActivity(), SensorEventListener {
R.drawable.ic_device_laptop_32dp, R.drawable.ic_device_phone_32dp,
R.drawable.ic_device_tablet_32dp, R.drawable.ic_device_tv_32dp,
R.drawable.ic_delete, R.drawable.ic_warning,
R.drawable.ic_volume_black, R.drawable.ic_wifi,
R.drawable.ic_volume, R.drawable.ic_wifi,
R.drawable.ic_add, R.drawable.touchpad_plugin_action_24dp,
R.drawable.konqi, R.drawable.run_command_plugin_icon_24dp,
R.drawable.ic_phonelink_36dp, R.drawable.ic_phonelink_off_36dp,
@@ -72,7 +72,7 @@ class EasterEggActivity : AppCompatActivity(), SensorEventListener {
R.drawable.ic_settings_white_32dp, R.drawable.ic_stop,
R.drawable.ic_rewind_black, R.drawable.ic_play_black,
R.drawable.ic_mic_black, R.drawable.ic_pause_black,
R.drawable.ic_volume_mute_black, R.drawable.ic_arrow_upward_black_24dp,
R.drawable.ic_volume_mute, R.drawable.ic_arrow_upward_black_24dp,
R.drawable.ic_next_black, R.drawable.ic_previous_black,
R.drawable.ic_presenter_24dp, R.drawable.ic_key,
R.drawable.ic_keyboard_return_black_24dp, R.drawable.ic_keyboard_hide_36dp,

View File

@@ -280,11 +280,15 @@ class DeviceFragment : Fragment() {
if (device.isPaired) {
requirePairingBinding().pairingButtons.visibility = View.GONE
if (device.isReachable) {
val context = requireContext()
val pluginsWithButtons = device.loadedPlugins.values.filter { it.displayAsButton(context) }
val pluginsNeedPermissions = device.pluginsWithoutPermissions.values.filter { device.isPluginEnabled(it.pluginKey) }
val pluginsNeedOptionalPermissions = device.pluginsWithoutOptionalPermissions.values.filter { device.isPluginEnabled(it.pluginKey) }
requireErrorBinding().errorMessageContainer.visibility = View.GONE
requireDeviceBinding().deviceView.visibility = View.VISIBLE
requireDeviceBinding().deviceViewCompose.apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent { KdeTheme(context) { PluginList(device) } }
setContent { KdeTheme(context) { PluginList(pluginsWithButtons, pluginsNeedPermissions, pluginsNeedOptionalPermissions) } }
}
displayBatteryInfoIfPossible()
} else {
@@ -373,7 +377,7 @@ class DeviceFragment : Fragment() {
fun PreviewCompose() {
val plugins = listOf(MprisPlugin(), RunCommandPlugin(), PresenterPlugin())
plugins.forEach { it.setContext(LocalContext.current, null) }
PluginButtons(plugins.iterator(), 2)
PluginButtons(plugins, 2)
}
@OptIn(ExperimentalMaterial3Api::class)
@@ -405,9 +409,10 @@ class DeviceFragment : Fragment() {
}
@Composable
fun PluginButtons(plugins: Iterator<Plugin>, numColumns: Int) {
fun PluginButtons(plugins: List<Plugin>, numColumns: Int) {
Column(modifier = Modifier.padding(horizontal = 16.dp)) {
while (plugins.hasNext()) {
val pluginIter = plugins.iterator()
while (pluginIter.hasNext()) {
Row(
modifier = Modifier
.fillMaxWidth()
@@ -415,9 +420,9 @@ class DeviceFragment : Fragment() {
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
repeat(numColumns) {
if (plugins.hasNext()) {
if (pluginIter.hasNext()) {
PluginButton(
plugin = plugins.next(),
plugin = pluginIter.next(),
modifier = Modifier.weight(1f)
)
} else {
@@ -448,14 +453,11 @@ class DeviceFragment : Fragment() {
}
@Composable
fun PluginList(device : Device) {
val context = requireContext()
val pluginsWithButtons = device.loadedPlugins.values.filter { it.displayAsButton(context) }.iterator()
val pluginsNeedPermissions = device.pluginsWithoutPermissions.values.filter { device.isPluginEnabled(it.pluginKey) }
val pluginsNeedOptionalPermissions = device.pluginsWithoutOptionalPermissions.values.filter { device.isPluginEnabled(it.pluginKey) }
fun PluginList(
pluginsWithButtons: List<Plugin>,
pluginsNeedPermissions: List<Plugin>,
pluginsNeedOptionalPermissions: List<Plugin>
) {
Surface {
Column(modifier = Modifier.padding(top = 16.dp)) {

View File

@@ -1,43 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List;
import android.view.LayoutInflater;
import android.view.View;
import androidx.annotation.NonNull;
import org.kde.kdeconnect_tp.databinding.ListItemEntryBinding;
public class EntryItem implements ListAdapter.Item {
protected final String title;
protected final String subtitle;
public EntryItem(String title) {
this(title, null);
}
protected EntryItem(String title, String subtitle) {
this.title = title;
this.subtitle = subtitle;
}
@NonNull
@Override
public View inflateView(@NonNull LayoutInflater layoutInflater) {
final ListItemEntryBinding binding = ListItemEntryBinding.inflate(layoutInflater);
binding.listItemEntryTitle.setText(title);
if (subtitle != null) {
binding.listItemEntrySummary.setVisibility(View.VISIBLE);
binding.listItemEntrySummary.setText(subtitle);
}
return binding.getRoot();
}
}

View File

@@ -0,0 +1,26 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List
import android.view.LayoutInflater
import android.view.View
import org.kde.kdeconnect_tp.databinding.ListItemEntryBinding
open class EntryItem protected constructor(protected val title: String, protected val subtitle: String?) : ListAdapter.Item {
override fun inflateView(layoutInflater: LayoutInflater): View {
val binding = ListItemEntryBinding.inflate(layoutInflater)
binding.listItemEntryTitle.text = title
if (subtitle != null) {
binding.listItemEntrySummary.visibility = View.VISIBLE
binding.listItemEntrySummary.text = subtitle
}
return binding.root
}
}

View File

@@ -1,36 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import androidx.annotation.NonNull;
import org.kde.kdeconnect_tp.databinding.ListCardEntryBinding;
public class EntryItemWithIcon implements ListAdapter.Item {
protected final String title;
protected final Drawable icon;
public EntryItemWithIcon(String title, Drawable icon) {
this.title = title;
this.icon = icon;
}
@NonNull
@Override
public View inflateView(@NonNull LayoutInflater layoutInflater) {
final ListCardEntryBinding binding = ListCardEntryBinding.inflate(layoutInflater);
binding.listItemEntryTitle.setText(title);
binding.listItemEntryIcon.setImageDrawable(icon);
return binding.getRoot();
}
}

View File

@@ -0,0 +1,30 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.View
import org.kde.kdeconnect_tp.databinding.ListCardEntryBinding
open class EntryItemWithIcon : ListAdapter.Item {
protected val title: String
protected val icon: Drawable
constructor(title: String, icon: Drawable) {
this.title = title
this.icon = icon
}
override fun inflateView(layoutInflater: LayoutInflater): View {
val binding = ListCardEntryBinding.inflate(layoutInflater)
binding.listItemEntryTitle.text = title
binding.listItemEntryIcon.setImageDrawable(icon)
return binding.root
}
}

View File

@@ -1,49 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import androidx.annotation.NonNull;
import java.util.List;
public class ListAdapter extends ArrayAdapter<ListAdapter.Item> {
public interface Item {
@NonNull
View inflateView(@NonNull LayoutInflater layoutInflater);
}
private final List<? extends Item> items;
private final boolean isEnabled;
public ListAdapter(Context context, List<? extends Item> items) {
this(context, items, true);
}
public ListAdapter(Context context, List<? extends Item> items, boolean isEnabled) {
super(context, 0, (List<Item>) items);
this.items = items;
this.isEnabled = isEnabled;
}
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
final Item i = items.get(position);
return i.inflateView(LayoutInflater.from(parent.getContext()));
}
@Override
public boolean isEnabled(int position) {
return isEnabled;
}
}

View File

@@ -0,0 +1,36 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
class ListAdapter : ArrayAdapter<ListAdapter.Item> {
private val items: List<Item>
private val isEnabled: Boolean
@JvmOverloads
constructor(context: Context, items: List<Item>, isEnabled: Boolean = true) : super(context, 0, items) {
this.items = items
this.isEnabled = isEnabled
}
interface Item {
fun inflateView(layoutInflater: LayoutInflater): View
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val i = items[position]
return i.inflateView(LayoutInflater.from(parent.context))
}
override fun isEnabled(position: Int): Boolean {
return isEnabled
}
}

View File

@@ -1,44 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List;
import android.view.LayoutInflater;
import android.view.View;
import androidx.annotation.NonNull;
import org.kde.kdeconnect_tp.databinding.ListItemCategoryBinding;
public class SectionItem implements ListAdapter.Item {
private final String title;
public boolean isEmpty;
public SectionItem(String title) {
this.title = title;
this.isEmpty = true;
}
@NonNull
@Override
public View inflateView(@NonNull LayoutInflater layoutInflater) {
final ListItemCategoryBinding binding = ListItemCategoryBinding.inflate(layoutInflater);
//Make it not selectable
binding.getRoot().setOnClickListener(null);
binding.getRoot().setOnLongClickListener(null);
binding.getRoot().setFocusable(false);
binding.getRoot().setClickable(false);
binding.listItemCategoryText.setText(title);
if (isEmpty) {
binding.listItemCategoryEmptyPlaceholder.setVisibility(View.VISIBLE);
}
return binding.getRoot();
}
}

View File

@@ -0,0 +1,39 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List
import android.view.LayoutInflater
import android.view.View
import org.kde.kdeconnect_tp.databinding.ListItemCategoryBinding
class SectionItem : ListAdapter.Item {
private val title: String
constructor(title: String) {
this.title = title
}
@JvmField
var isEmpty: Boolean = true
override fun inflateView(layoutInflater: LayoutInflater): View {
val binding = ListItemCategoryBinding.inflate(layoutInflater)
// Make it not selectable
binding.root.setOnClickListener(null)
binding.root.setOnLongClickListener(null)
binding.root.isFocusable = false
binding.root.isClickable = false
binding.listItemCategoryText.text = title
if (isEmpty) {
binding.listItemCategoryEmptyPlaceholder.visibility = View.VISIBLE
}
return binding.root
}
}

View File

@@ -1,45 +0,0 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
public class SmallEntryItem implements ListAdapter.Item {
private final String title;
private final View.OnClickListener clickListener;
SmallEntryItem(String title, View.OnClickListener clickListener) {
this.title = title;
this.clickListener = clickListener;
}
@NonNull
@Override
public View inflateView(@NonNull LayoutInflater layoutInflater) {
View v = layoutInflater.inflate(android.R.layout.simple_list_item_1, null);
final int padding = (int) (28 * layoutInflater.getContext().getResources().getDisplayMetrics().density);
v.setPadding(padding, 0, padding, 0);
TextView titleView = v.findViewById(android.R.id.text1);
if (titleView != null) {
titleView.setText(title);
if (clickListener != null) {
titleView.setOnClickListener(clickListener);
TypedValue outValue = new TypedValue();
layoutInflater.getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
v.setBackgroundResource(outValue.resourceId);
}
}
return v;
}
}

View File

@@ -0,0 +1,45 @@
/*
* SPDX-FileCopyrightText: 2014 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface.List
import android.R
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
class SmallEntryItem : ListAdapter.Item {
private val title: String
private val clickListener: View.OnClickListener?
constructor(title: String, clickListener: View.OnClickListener?) {
this.title = title
this.clickListener = clickListener
}
override fun inflateView(layoutInflater: LayoutInflater): View {
val v = layoutInflater.inflate(R.layout.simple_list_item_1, null)
val padding = (28 * layoutInflater.context.resources.displayMetrics.density).toInt()
v.setPadding(padding, 0, padding, 0)
val titleView = v.findViewById<TextView>(R.id.text1)
if (titleView != null) {
titleView.text = title
if (clickListener != null) {
titleView.setOnClickListener(clickListener)
val outValue = TypedValue()
layoutInflater.context.theme.resolveAttribute(
R.attr.selectableItemBackground,
outValue,
true
)
v.setBackgroundResource(outValue.resourceId)
}
}
return v
}
}

View File

@@ -362,6 +362,14 @@ class MainActivity : AppCompatActivity(), OnSharedPreferenceChangeListener {
startActivityForResult(intent, STORAGE_LOCATION_CONFIGURED)
}
if (isPermissionGranted(permissions, grantResults, Manifest.permission.BLUETOOTH_CONNECT) &&
isPermissionGranted(permissions, grantResults, Manifest.permission.BLUETOOTH_SCAN)) {
val preferenceEditor = PreferenceManager.getDefaultSharedPreferences(this).edit()
preferenceEditor.putBoolean(SettingsFragment.KEY_BLUETOOTH_ENABLED, true)
preferenceEditor.apply()
setContentFragment(SettingsFragment())
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && isPermissionGranted(permissions, grantResults, Manifest.permission.POST_NOTIFICATIONS)) {
// If PairingFragment is active, reload it
if (mCurrentDevice == null) {

View File

@@ -1,114 +0,0 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface;
import android.content.Context;
import android.util.TypedValue;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.preference.PreferenceViewHolder;
import androidx.preference.SwitchPreference;
import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R;
public class PluginPreference extends SwitchPreference {
private final Device device;
private final String pluginKey;
private final View.OnClickListener listener;
public PluginPreference(@NonNull final Context context, @NonNull final String pluginKey,
@NonNull final Device device, @NonNull PluginPreferenceCallback callback) {
super(context);
setLayoutResource(R.layout.preference_with_button);
this.device = device;
this.pluginKey = pluginKey;
PluginFactory.PluginInfo info = PluginFactory.getPluginInfo(pluginKey);
setTitle(info.getDisplayName());
setSummary(info.getDescription());
setChecked(device.isPluginEnabled(pluginKey));
if (info.getHasSettings()) {
this.listener = v -> {
Plugin plugin = device.getPluginIncludingWithoutPermissions(pluginKey);
if (plugin != null) {
callback.onStartPluginSettingsFragment(plugin);
} else { //Could happen if the device is not connected anymore
callback.onFinish();
}
};
} else {
this.listener = null;
}
}
@Override
public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
View.OnClickListener toggleListener = v -> {
boolean newState = !device.isPluginEnabled(pluginKey);
setChecked(newState); //It actually works on API<14
onStateChanged(holder, newState);
device.setPluginEnabled(pluginKey, newState);
};
View content = holder.findViewById(R.id.content);
View widget = holder.findViewById(android.R.id.widget_frame);
View parent = holder.itemView;
content.setOnClickListener(listener);
widget.setOnClickListener(toggleListener);
parent.setOnClickListener(toggleListener);
// Disable child backgrounds when known to be unneeded to prevent duplicate ripples
int selectableItemBackground;
if (listener == null) {
selectableItemBackground = 0;
} else {
TypedValue value = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, value, true);
selectableItemBackground = value.resourceId;
}
content.setBackgroundResource(selectableItemBackground);
widget.setBackgroundResource(selectableItemBackground);
onStateChanged(holder, isChecked());
}
private void onStateChanged(PreferenceViewHolder holder, boolean state) {
View content = holder.findViewById(R.id.content);
View divider = holder.findViewById(R.id.divider);
View widget = holder.findViewById(android.R.id.widget_frame);
View parent = holder.itemView;
boolean hasDetails = state && listener != null;
divider.setVisibility(hasDetails ? View.VISIBLE : View.GONE);
content.setClickable(hasDetails);
widget.setClickable(hasDetails);
parent.setClickable(!hasDetails);
if (hasDetails) {
// Cancel duplicate ripple caused by pressed state of parent propagating down
content.setPressed(false);
content.getBackground().jumpToCurrentState();
widget.setPressed(false);
widget.getBackground().jumpToCurrentState();
}
}
interface PluginPreferenceCallback {
void onStartPluginSettingsFragment(Plugin plugin);
void onFinish();
}
}

View File

@@ -0,0 +1,101 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface
import android.content.Context
import android.util.TypedValue
import android.view.View
import androidx.preference.PreferenceViewHolder
import androidx.preference.SwitchPreference
import org.kde.kdeconnect.Device
import org.kde.kdeconnect.Plugins.Plugin
import org.kde.kdeconnect.Plugins.PluginFactory.getPluginInfo
import org.kde.kdeconnect_tp.R
class PluginPreference : SwitchPreference {
private val device: Device
private val pluginKey: String
private val listener: View.OnClickListener?
constructor(context: Context, pluginKey: String, device: Device, callback: PluginPreferenceCallback) : super(context) {
layoutResource = R.layout.preference_with_button
this.device = device
this.pluginKey = pluginKey
val info = getPluginInfo(pluginKey)
title = info.displayName
summary = info.description
isChecked = device.isPluginEnabled(pluginKey)
fun createClickListener() = View.OnClickListener {
val plugin = device.getPluginIncludingWithoutPermissions(pluginKey)
if (plugin != null) {
callback.onStartPluginSettingsFragment(plugin)
}
else { // Could happen if the device is not connected anymore
callback.onFinish()
}
}
this.listener = if (info.hasSettings) createClickListener() else null
}
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
val toggleListener = View.OnClickListener { v: View? ->
val newState = !device.isPluginEnabled(pluginKey)
isChecked = newState // It actually works on API<14
onStateChanged(holder, newState)
device.setPluginEnabled(pluginKey, newState)
}
val content = holder.findViewById(R.id.content)
val widget = holder.findViewById(android.R.id.widget_frame)
val parent = holder.itemView
content.setOnClickListener(listener)
widget.setOnClickListener(toggleListener)
parent.setOnClickListener(toggleListener)
// Disable child backgrounds when known to be unneeded to prevent duplicate ripples
fun getSelectableItemBackgroundResource(): Int {
val value = TypedValue()
context.theme.resolveAttribute(android.R.attr.selectableItemBackground, value, true)
return value.resourceId
}
val selectableItemBackground: Int = if (listener == null) 0 else getSelectableItemBackgroundResource()
content.setBackgroundResource(selectableItemBackground)
widget.setBackgroundResource(selectableItemBackground)
onStateChanged(holder, isChecked)
}
private fun onStateChanged(holder: PreferenceViewHolder, state: Boolean) {
val content = holder.findViewById(R.id.content)
val divider = holder.findViewById(R.id.divider)
val widget = holder.findViewById(android.R.id.widget_frame)
val parent = holder.itemView
val hasDetails = state && listener != null
divider.visibility = if (hasDetails) View.VISIBLE else View.GONE
content.isClickable = hasDetails
widget.isClickable = hasDetails
parent.isClickable = !hasDetails
if (hasDetails) {
// Cancel duplicate ripple caused by pressed state of parent propagating down
content.isPressed = false
content.background.jumpToCurrentState()
widget.isPressed = false
widget.background.jumpToCurrentState()
}
}
interface PluginPreferenceCallback {
fun onStartPluginSettingsFragment(plugin: Plugin?)
fun onFinish()
}
}

View File

@@ -1,211 +0,0 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.text.InputFilter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.preference.EditTextPreference;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import androidx.preference.TwoStatePreference;
import com.google.android.material.snackbar.Snackbar;
import org.apache.commons.lang3.StringUtils;
import org.kde.kdeconnect.BackgroundService;
import org.kde.kdeconnect.Helpers.DeviceHelper;
import org.kde.kdeconnect.Helpers.NotificationHelper;
import org.kde.kdeconnect_tp.R;
public class SettingsFragment extends PreferenceFragmentCompat {
public static final String KEY_UDP_BROADCAST_ENABLED = "udp_broadcast_enabled";
public static final String KEY_BLUETOOTH_ENABLED = "bluetooth_enabled";
public static final String KEY_APP_THEME = "theme_pref";
private EditTextPreference renameDevice;
@NonNull
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (getActivity() != null) {
((MainActivity) requireActivity()).getSupportActionBar().setTitle(R.string.settings);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
Context context = getPreferenceManager().getContext();
PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(context);
// Rename device
renameDevice = new EditTextPreference(context);
renameDevice.setKey(DeviceHelper.KEY_DEVICE_NAME_PREFERENCE);
renameDevice.setSelectable(true);
renameDevice.setOnBindEditTextListener(TextView::setSingleLine);
renameDevice.setOnBindEditTextListener(editText -> editText.setFilters(new InputFilter[] {
(source, start, end, dest, dstart, dend) -> DeviceHelper.filterName(source.subSequence(start, end).toString()),
new InputFilter.LengthFilter(DeviceHelper.MAX_DEVICE_NAME_LENGTH),
}));
String deviceName = DeviceHelper.getDeviceName(context);
renameDevice.setTitle(R.string.settings_rename);
renameDevice.setSummary(deviceName);
renameDevice.setDialogTitle(R.string.device_rename_title);
renameDevice.setText(deviceName);
renameDevice.setPositiveButtonText(R.string.device_rename_confirm);
renameDevice.setNegativeButtonText(R.string.cancel);
renameDevice.setOnPreferenceChangeListener((preference, newValue) -> {
String name = (String) newValue;
if (StringUtils.isBlank(name)) {
if (getView() != null) {
Snackbar snackbar = Snackbar.make(getView(), R.string.invalid_device_name, Snackbar.LENGTH_LONG);
int currentTheme = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (currentTheme != Configuration.UI_MODE_NIGHT_YES) {
// white color is set to the background of snackbar if dark mode is off
snackbar.getView().setBackgroundColor(Color.WHITE);
}
snackbar.show();
}
return false;
}
renameDevice.setSummary((String)newValue);
return true;
});
screen.addPreference(renameDevice);
// Theme Selector
ListPreference themeSelector = new ListPreference(context);
themeSelector.setKey(KEY_APP_THEME);
themeSelector.setTitle(R.string.theme_dialog_title);
themeSelector.setDialogTitle(R.string.theme_dialog_title);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
themeSelector.setEntries(R.array.theme_list_v28);
} else {
themeSelector.setEntries(R.array.theme_list);
}
themeSelector.setEntryValues(R.array.theme_list_values);
themeSelector.setDefaultValue(ThemeUtil.DEFAULT_MODE);
themeSelector.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
themeSelector.setOnPreferenceChangeListener((preference, newValue) -> {
String themeValue = (String) newValue;
ThemeUtil.applyTheme(themeValue);
return true;
});
screen.addPreference(themeSelector);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Preference persistentNotif = new Preference(context);
persistentNotif.setTitle(R.string.setting_persistent_notification_oreo);
persistentNotif.setSummary(R.string.setting_persistent_notification_description);
persistentNotif.setOnPreferenceClickListener(preference -> {
Intent intent = new Intent();
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());
context.startActivity(intent);
return true;
});
screen.addPreference(persistentNotif);
} else {
// Persistent notification toggle for Android Versions below Oreo
final TwoStatePreference notificationSwitch = new SwitchPreference(context);
notificationSwitch.setPersistent(false);
notificationSwitch.setChecked(NotificationHelper.isPersistentNotificationEnabled(context));
notificationSwitch.setTitle(R.string.setting_persistent_notification);
notificationSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
final boolean isChecked = (Boolean) newValue;
NotificationHelper.setPersistentNotificationEnabled(context, isChecked);
BackgroundService service = BackgroundService.getInstance();
if (service != null) {
service.changePersistentNotificationVisibility(isChecked);
}
NotificationHelper.setPersistentNotificationEnabled(context, isChecked);
return true;
});
screen.addPreference(notificationSwitch);
}
// Trusted Networks
Preference trustedNetworkPref = new Preference(context);
trustedNetworkPref.setPersistent(false);
trustedNetworkPref.setTitle(R.string.trusted_networks);
trustedNetworkPref.setSummary(R.string.trusted_networks_desc);
screen.addPreference(trustedNetworkPref);
trustedNetworkPref.setOnPreferenceClickListener(preference -> {
startActivity(new Intent(context, TrustedNetworksActivity.class));
return true;
});
// Add device by IP
Preference devicesByIpPreference = new Preference(context);
devicesByIpPreference.setPersistent(false);
devicesByIpPreference.setTitle(R.string.custom_device_list);
screen.addPreference(devicesByIpPreference);
devicesByIpPreference.setOnPreferenceClickListener(preference -> {
startActivity(new Intent(context, CustomDevicesActivity.class));
return true;
});
// UDP broadcast toggle
final TwoStatePreference udpBroadcastDiscovery = new SwitchPreference(context);
udpBroadcastDiscovery.setDefaultValue(true);
udpBroadcastDiscovery.setKey(KEY_UDP_BROADCAST_ENABLED);
udpBroadcastDiscovery.setTitle(R.string.enable_udp_broadcast);
screen.addPreference(udpBroadcastDiscovery);
final TwoStatePreference enableBluetoothSupport = new SwitchPreference(context);
enableBluetoothSupport.setDefaultValue(false);
enableBluetoothSupport.setKey(KEY_BLUETOOTH_ENABLED);
enableBluetoothSupport.setTitle("Enable bluetooth (beta)");
enableBluetoothSupport.setOnPreferenceChangeListener((preference, newValue) -> {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && (boolean)newValue) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, 2);
}
return true;
});
screen.addPreference(enableBluetoothSupport);
// More settings text
Preference moreSettingsText = new Preference(context);
moreSettingsText.setPersistent(false);
moreSettingsText.setSelectable(false);
moreSettingsText.setTitle(R.string.settings_more_settings_title);
moreSettingsText.setSummary(R.string.settings_more_settings_text);
screen.addPreference(moreSettingsText);
setPreferenceScreen(screen);
}
}

View File

@@ -0,0 +1,204 @@
/*
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.UserInterface
import android.Manifest
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.text.InputFilter
import android.text.InputFilter.LengthFilter
import android.text.Spanned
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import androidx.core.content.ContextCompat
import androidx.preference.EditTextPreference
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference
import com.google.android.material.snackbar.Snackbar
import org.kde.kdeconnect.BackgroundService
import org.kde.kdeconnect.Helpers.DeviceHelper
import org.kde.kdeconnect.Helpers.DeviceHelper.filterName
import org.kde.kdeconnect.Helpers.DeviceHelper.getDeviceName
import org.kde.kdeconnect.Helpers.NotificationHelper
import org.kde.kdeconnect.UserInterface.ThemeUtil.applyTheme
import org.kde.kdeconnect_tp.R
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
if (activity != null) {
(activity as MainActivity).supportActionBar?.setTitle(R.string.settings)
}
return super.onCreateView(inflater, container, savedInstanceState)
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
val context = preferenceManager.context
val screen = preferenceManager.createPreferenceScreen(context)
listOf(
deviceNamePref(context),
themePref(context),
persistentNotificationPref(context),
trustedNetworkPref(context),
devicesByIpPref(context),
udpBroadcastPref(context),
bluetoothSupportPref(context),
moreSettingsPref(context),
).forEach(screen::addPreference)
preferenceScreen = screen
}
private fun deviceNamePref(context: Context) = EditTextPreference(context).apply {
key = DeviceHelper.KEY_DEVICE_NAME_PREFERENCE
isSelectable = true
setOnBindEditTextListener(EditText::setSingleLine)
setOnBindEditTextListener { editText: EditText ->
editText.filters = arrayOf(
InputFilter { source: CharSequence, start: Int, end: Int, _: Spanned?, _: Int, _: Int -> filterName(source.subSequence(start, end).toString()) },
LengthFilter(DeviceHelper.MAX_DEVICE_NAME_LENGTH),
)
}
val deviceName = getDeviceName(context)
setTitle(R.string.settings_rename)
summary = deviceName
setDialogTitle(R.string.device_rename_title)
text = deviceName
setPositiveButtonText(R.string.device_rename_confirm)
setNegativeButtonText(R.string.cancel)
onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, new: Any? ->
val name = new as String?
if (name.isNullOrBlank()) {
if (view != null) {
val snackbar = Snackbar.make(requireView(), R.string.invalid_device_name, Snackbar.LENGTH_LONG)
val currentTheme = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
if (currentTheme != Configuration.UI_MODE_NIGHT_YES) {
// white color is set to the background of snackbar if dark mode is off
snackbar.view.setBackgroundColor(Color.WHITE)
}
snackbar.show()
}
false
}
else {
summary = new
true
}
}
}
private fun themePref(context: Context) = ListPreference(context).apply {
key = KEY_APP_THEME
setTitle(R.string.theme_dialog_title)
setDialogTitle(R.string.theme_dialog_title)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) setEntries(R.array.theme_list_v28) else setEntries(R.array.theme_list)
setEntryValues(R.array.theme_list_values)
setDefaultValue(ThemeUtil.DEFAULT_MODE)
summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, new: Any? ->
if (new is String) {
applyTheme(new)
}
true
}
}
private fun persistentNotificationPref(context: Context): Preference =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) Preference(context).apply {
setTitle(R.string.setting_persistent_notification_oreo)
setSummary(R.string.setting_persistent_notification_description)
onPreferenceClickListener = Preference.OnPreferenceClickListener {
val intent = Intent()
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS")
intent.putExtra("android.provider.extra.APP_PACKAGE", context.packageName)
context.startActivity(intent)
true
}
}
// Persistent notification toggle for Android Versions below Oreo
else SwitchPreference(context).apply {
isPersistent = false
isChecked = NotificationHelper.isPersistentNotificationEnabled(context)
setTitle(R.string.setting_persistent_notification)
onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, new: Any ->
val isChecked = new as Boolean
NotificationHelper.setPersistentNotificationEnabled(context, isChecked)
BackgroundService.instance?.changePersistentNotificationVisibility(isChecked)
NotificationHelper.setPersistentNotificationEnabled(context, isChecked)
true
}
}
private fun trustedNetworkPref(context: Context) = Preference(context).apply {
isPersistent = false
setTitle(R.string.trusted_networks)
setSummary(R.string.trusted_networks_desc)
onPreferenceClickListener = Preference.OnPreferenceClickListener {
startActivity(Intent(context, TrustedNetworksActivity::class.java))
true
}
}
/** Opens activity to configure device by IP when clicked */
private fun devicesByIpPref(context: Context) = Preference(context).apply {
isPersistent = false
setTitle(R.string.custom_device_list)
onPreferenceClickListener = Preference.OnPreferenceClickListener {
startActivity(Intent(context, CustomDevicesActivity::class.java))
true
}
}
private fun udpBroadcastPref(context: Context) = SwitchPreference(context).apply {
setDefaultValue(true)
key = KEY_UDP_BROADCAST_ENABLED
setTitle(R.string.enable_udp_broadcast)
}
private fun bluetoothSupportPref(context: Context) = SwitchPreference(context).apply {
setDefaultValue(false)
key = KEY_BLUETOOTH_ENABLED
setTitle(R.string.enable_bluetooth)
onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && newValue as Boolean) {
val permissions = arrayOf(Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN)
val permissionsGranted = permissions.all { ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED }
if (!permissionsGranted) {
PermissionsAlertDialogFragment.Builder()
.setTitle(R.string.location_permission_needed_title)
.setMessage(R.string.bluetooth_permission_needed_desc)
.setPermissions(permissions)
.setRequestCode(2)
.create().show(childFragmentManager, null)
return@OnPreferenceChangeListener false
}
}
true
}
}
private fun moreSettingsPref(context: Context) = Preference(context).apply {
isPersistent = false
isSelectable = false
setTitle(R.string.settings_more_settings_title)
setSummary(R.string.settings_more_settings_text)
}
companion object {
const val KEY_UDP_BROADCAST_ENABLED: String = "udp_broadcast_enabled"
const val KEY_BLUETOOTH_ENABLED: String = "bluetooth_enabled"
const val KEY_APP_THEME: String = "theme_pref"
}
}

View File

@@ -22,7 +22,6 @@ object ThemeUtil {
const val DARK_MODE: String = "dark"
const val DEFAULT_MODE: String = "default"
@JvmStatic
fun applyTheme(themePref: String) {
when (themePref) {
LIGHT_MODE -> {

View File

@@ -0,0 +1,57 @@
/*
* SPDX-FileCopyrightText: 2024 TPJ Schikhof <kde@schikhof.eu>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Helpers
import org.junit.Assert
import org.junit.Test
class TelephonyHelperTest {
@Test
fun canonicalizePhoneNumber() {
val phoneNumbers = mapOf(
"12025550173" to "+1-202-555-0173", // US number
"447911123456" to "+44 7911 123456", // UK mobile number
"33142685300" to "+33 1 42 68 53 00", // France number with spaces
"919876543210" to "+91-9876543210", // India number with dashes
"61400123456" to "(+61) 400 123 456", // Australia number with country code in parentheses
"81312345678" to "+81-3-1234-5678", // Japan number with dashes
"5511912345678" to "+55 (11) 91234-5678", // Brazil mobile with parentheses
"4930123456" to "+49 30 123456", // Germany number with spaces
"861012345678" to "+86 10 1234 5678", // China number with spaces
"34600123456" to "+34 600 123 456", // Spain mobile number
"74951234567" to "+7 495 123-45-67", // Russia number with dashes
"6512345678" to "+65 1234 5678", // Singapore number
)
for ((expected, input) in phoneNumbers) {
val result = TelephonyHelper.canonicalizePhoneNumber(input)
Assert.assertEquals(expected, result)
}
}
@Test
fun isValidApnType() {
val apnTypes = mapOf(
// Valid combinations
Pair("mms,supl", "mms") to true,
Pair("mms,*", "") to true,
Pair("", "hipri") to true,
Pair("mms,hipri", "mms") to true,
Pair("default,mms,dun", "dun") to true,
// Invalid combinations
Pair("mms,supl", "default") to false,
Pair("hipri,supl", "*") to false,
Pair("supl", "mms") to false,
Pair("mms,supl", "default") to false,
)
for ((input, expected) in apnTypes) {
val result = TelephonyHelper.isValidApnType(input.first, input.second)
val message = "Expected $expected for $input, but got $result"
Assert.assertEquals(message, expected, result)
}
}
}