diff --git a/app/build.gradle b/app/build.gradle index 37ad6f5..d34de50 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,19 +1,21 @@ +repositories { + mavenCentral() +} apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'com.google.gms.google-services' android { - compileSdkVersion 31 + compileSdkVersion 33 defaultConfig { applicationId "io.heckel.ntfy" minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 33 - versionCode 28 - versionName "1.14.0" + versionCode 29 + versionName "1.15.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -56,6 +58,9 @@ android { kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() + freeCompilerArgs += [ + '-Xjvm-default=all-compatibility' // https://stackoverflow.com/a/71234042/1440785 + ] } } @@ -67,30 +72,30 @@ android.applicationVariants.all { variant -> dependencies { // AndroidX, The Basics - implementation "androidx.appcompat:appcompat:1.4.2" - implementation "androidx.core:core-ktx:1.8.0" + implementation "androidx.appcompat:appcompat:1.5.1" + implementation "androidx.core:core-ktx:1.9.0" implementation "androidx.constraintlayout:constraintlayout:2.1.4" - implementation "androidx.activity:activity-ktx:1.4.0" - implementation "androidx.fragment:fragment-ktx:1.4.1" + implementation "androidx.activity:activity-ktx:1.6.1" + implementation "androidx.fragment:fragment-ktx:1.5.4" implementation "androidx.work:work-runtime-ktx:2.7.1" implementation 'androidx.preference:preference-ktx:1.2.0' // JSON serialization - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10' // Room (SQLite) - def room_version = "2.4.2" + def room_version = "2.4.3" implementation "androidx.room:room-ktx:$room_version" kapt "androidx.room:room-compiler:$room_version" // OkHttp (HTTP library) - implementation 'com.squareup.okhttp3:okhttp:4.9.3' + implementation 'com.squareup.okhttp3:okhttp:4.10.0' // Firebase, sigh ... (only Google Play) - playImplementation 'com.google.firebase:firebase-messaging:23.0.5' + playImplementation 'com.google.firebase:firebase-messaging:23.1.0' // RecyclerView - implementation "androidx.recyclerview:recyclerview:1.3.0-alpha02" + implementation "androidx.recyclerview:recyclerview:1.3.0-rc01" // Swipe down to refresh implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' @@ -99,7 +104,7 @@ dependencies { implementation "com.google.android.material:material:1.6.1" // LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" implementation 'androidx.legacy:legacy-support-v4:1.0.0' // Image viewer diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cbdab92..4cbdf60 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + enqueueAttachment(context, notificationId, userAction) DownloadType.ICON -> enqueueIcon(context, notificationId) DownloadType.BOTH -> enqueueAttachmentAndIcon(context, notificationId, userAction) - else -> Log.w(DownloadManager.TAG, "This should never happen. No download type given") } } diff --git a/app/src/main/java/io/heckel/ntfy/ui/DetailViewModel.kt b/app/src/main/java/io/heckel/ntfy/ui/DetailViewModel.kt index c1ac041..8606a64 100644 --- a/app/src/main/java/io/heckel/ntfy/ui/DetailViewModel.kt +++ b/app/src/main/java/io/heckel/ntfy/ui/DetailViewModel.kt @@ -21,7 +21,7 @@ class DetailViewModel(private val repository: Repository) : ViewModel() { class DetailViewModelFactory(private val repository: Repository) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class) = + override fun create(modelClass: Class): T = with(modelClass){ when { isAssignableFrom(DetailViewModel::class.java) -> DetailViewModel(repository) as T diff --git a/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt b/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt index d946fc6..fc5b01d 100644 --- a/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt +++ b/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt @@ -1,10 +1,12 @@ package io.heckel.ntfy.ui +import android.Manifest import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.app.AlertDialog import android.content.ActivityNotFoundException import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.os.Bundle @@ -20,6 +22,7 @@ import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView @@ -208,6 +211,18 @@ class MainActivity : AppCompatActivity(), ActionMode.Callback, AddFragment.Subsc schedulePeriodicPollWorker() schedulePeriodicServiceRestartWorker() schedulePeriodicDeleteWorker() + + // Permissions + maybeRequestNotificationPermission() + } + + private fun maybeRequestNotificationPermission() { + // Android 13 (SDK 33) requires that we ask for permission to post notifications + // https://developer.android.com/develop/ui/views/notifications/notification-permission + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), 0) + } } override fun onResume() { diff --git a/app/src/main/java/io/heckel/ntfy/ui/MainViewModel.kt b/app/src/main/java/io/heckel/ntfy/ui/MainViewModel.kt index 6f5f446..84857db 100644 --- a/app/src/main/java/io/heckel/ntfy/ui/MainViewModel.kt +++ b/app/src/main/java/io/heckel/ntfy/ui/MainViewModel.kt @@ -51,7 +51,7 @@ class SubscriptionsViewModel(private val repository: Repository) : ViewModel() { class SubscriptionsViewModelFactory(private val repository: Repository) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class) = + override fun create(modelClass: Class): T = with(modelClass){ when { isAssignableFrom(SubscriptionsViewModel::class.java) -> SubscriptionsViewModel(repository) as T diff --git a/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt b/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt index a6a8469..cc6f882 100644 --- a/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt +++ b/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt @@ -85,7 +85,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - // Save current activity title so we can set it again after a configuration change + // Save current activity title, so we can set it again after a configuration change outState.putCharSequence(TITLE_TAG, title) } @@ -165,9 +165,8 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return repository.getGlobalMutedUntil().toString() } } - mutedUntil?.summaryProvider = Preference.SummaryProvider { _ -> - val mutedUntilValue = repository.getGlobalMutedUntil() - when (mutedUntilValue) { + mutedUntil?.summaryProvider = Preference.SummaryProvider { + when (val mutedUntilValue = repository.getGlobalMutedUntil()) { Repository.MUTED_UNTIL_SHOW_ALL -> getString(R.string.settings_notifications_muted_until_show_all) Repository.MUTED_UNTIL_FOREVER -> getString(R.string.settings_notifications_muted_until_forever) else -> { @@ -191,8 +190,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere } } minPriority?.summaryProvider = Preference.SummaryProvider { pref -> - val minPriorityValue = pref.value.toIntOrNull() ?: 1 // 1/low means all priorities - when (minPriorityValue) { + when (val minPriorityValue = pref.value.toIntOrNull() ?: 1) { // 1/low means all priorities 1 -> getString(R.string.settings_notifications_min_priority_summary_any) 5 -> getString(R.string.settings_notifications_min_priority_summary_max) else -> { @@ -230,8 +228,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere } } autoDownload?.summaryProvider = Preference.SummaryProvider { pref -> - val maxSize = pref.value.toLongOrNull() ?: repository.getAutoDownloadMaxSize() - when (maxSize) { + when (val maxSize = pref.value.toLongOrNull() ?: repository.getAutoDownloadMaxSize()) { Repository.AUTO_DOWNLOAD_NEVER -> getString(R.string.settings_notifications_auto_download_summary_never) Repository.AUTO_DOWNLOAD_ALWAYS -> getString(R.string.settings_notifications_auto_download_summary_always) else -> getString(R.string.settings_notifications_auto_download_summary_smaller_than_x, formatBytes(maxSize, decimals = 0)) @@ -263,8 +260,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere } } autoDelete?.summaryProvider = Preference.SummaryProvider { pref -> - val seconds = pref.value.toLongOrNull() ?: repository.getAutoDeleteSeconds() - when (seconds) { + when (pref.value.toLongOrNull() ?: repository.getAutoDeleteSeconds()) { Repository.AUTO_DELETE_NEVER -> getString(R.string.settings_notifications_auto_delete_summary_never) Repository.AUTO_DELETE_ONE_DAY_SECONDS -> getString(R.string.settings_notifications_auto_delete_summary_one_day) Repository.AUTO_DELETE_THREE_DAYS_SECONDS -> getString(R.string.settings_notifications_auto_delete_summary_three_days) @@ -395,7 +391,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere getString(R.string.settings_advanced_record_logs_summary_disabled) } } - recordLogsEnabled?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, v -> + recordLogsEnabled?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, _ -> lifecycleScope.launch(Dispatchers.IO) { repository.getSubscriptions().forEach { s -> Log.addScrubTerm(shortUrl(s.baseUrl), Log.TermType.Domain) @@ -440,7 +436,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere backup?.preferenceDataStore = object : PreferenceDataStore() { } // Dummy store to protect from accidentally overwriting backup?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, v -> backupSelection = v.toString() - val timestamp = SimpleDateFormat("yyMMdd-HHmm").format(Date()); + val timestamp = SimpleDateFormat("yyMMdd-HHmm").format(Date()) val suggestedFilename = when (backupSelection) { BACKUP_EVERYTHING_NO_USERS -> "ntfy-backup-no-users-$timestamp.json" BACKUP_SETTINGS_ONLY -> "ntfy-settings-$timestamp.json" @@ -587,10 +583,9 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere throw Exception("Unexpected response ${response.code}") } val body = response.body?.string()?.trim() - if (body == null || body.isEmpty()) throw Exception("Return body is empty") + if (body.isNullOrEmpty()) throw Exception("Return body is empty") Log.d(TAG, "Logs uploaded successfully: $body") val resp = gson.fromJson(body.toString(), NopasteResponse::class.java) - val context = context ?: return@launch requireActivity().runOnUiThread { val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText("logs URL", resp.url) @@ -606,7 +601,6 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere } } catch (e: Exception) { Log.w(TAG, "Error uploading logs", e) - val context = context ?: return@launch requireActivity().runOnUiThread { Toast .makeText(context, getString(R.string.settings_advanced_export_logs_error_uploading, e.message), Toast.LENGTH_LONG) diff --git a/app/src/main/java/io/heckel/ntfy/ui/ShareActivity.kt b/app/src/main/java/io/heckel/ntfy/ui/ShareActivity.kt index 5f31281..1db1c33 100644 --- a/app/src/main/java/io/heckel/ntfy/ui/ShareActivity.kt +++ b/app/src/main/java/io/heckel/ntfy/ui/ShareActivity.kt @@ -326,7 +326,7 @@ class ShareActivity : AppCompatActivity() { contentText.text.isNotEmpty() && topicText.text.isNotEmpty() } sendItem.isEnabled = enabled - sendItem.icon.alpha = if (enabled) 255 else 130 + sendItem.icon?.alpha = if (enabled) 255 else 130 } private fun getBaseUrl(): String { diff --git a/app/src/main/java/io/heckel/ntfy/util/Util.kt b/app/src/main/java/io/heckel/ntfy/util/Util.kt index ca69cdf..6bc5267 100644 --- a/app/src/main/java/io/heckel/ntfy/util/Util.kt +++ b/app/src/main/java/io/heckel/ntfy/util/Util.kt @@ -472,9 +472,8 @@ fun ensureSafeNewFile(dir: File, name: String): File { fun copyToClipboard(context: Context, notification: Notification) { val message = decodeMessage(notification) - val text = message + "\n\n" + formatDateShort(notification.timestamp) val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText("notification message", text) + val clip = ClipData.newPlainText("notification message", message) clipboard.setPrimaryClip(clip) Toast .makeText(context, context.getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG) diff --git a/app/src/main/java/io/heckel/ntfy/work/DeleteWorker.kt b/app/src/main/java/io/heckel/ntfy/work/DeleteWorker.kt index 01fdebd..52fe565 100644 --- a/app/src/main/java/io/heckel/ntfy/work/DeleteWorker.kt +++ b/app/src/main/java/io/heckel/ntfy/work/DeleteWorker.kt @@ -9,14 +9,12 @@ import io.heckel.ntfy.BuildConfig import io.heckel.ntfy.db.ATTACHMENT_PROGRESS_DELETED import io.heckel.ntfy.db.Repository import io.heckel.ntfy.msg.DownloadIconWorker -import io.heckel.ntfy.ui.DetailAdapter import io.heckel.ntfy.util.Log -import io.heckel.ntfy.util.fileStat +import io.heckel.ntfy.util.maybeFileStat import io.heckel.ntfy.util.topicShortUrl import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.File -import java.util.* /** * Deletes notifications marked for deletion and attachments for deleted notifications. @@ -32,9 +30,23 @@ class DeleteWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx override suspend fun doWork(): Result { return withContext(Dispatchers.IO) { - deleteExpiredIcons() // Before notifications, so we will also catch manually deleted notifications - deleteExpiredAttachments() // Before notifications, so we will also catch manually deleted notifications - deleteExpiredNotifications() + // Run "expired icons" and "expired attachments" before notifications, + // so we will also catch manually deleted notifications + try { + deleteExpiredIcons() + } catch (e: Exception) { + Log.w(TAG, "Failed to delete expired icons", e) + } + try { + deleteExpiredAttachments() + } catch (e: Exception) { + Log.w(TAG, "Failed to delete expired attachments", e) + } + try { + deleteExpiredNotifications() + } catch (e: Exception) { + Log.w(TAG, "Failed to delete expired notifications", e) + } return@withContext Result.success() } } @@ -69,7 +81,9 @@ class DeleteWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx Log.d(TAG, "Deleting icons for deleted notifications") val repository = Repository.getInstance(applicationContext) val activeIconUris = repository.getActiveIconUris() - val activeIconFilenames = activeIconUris.map{ fileStat(applicationContext, Uri.parse(it)).filename }.toSet() + val activeIconFilenames = activeIconUris + .mapNotNull { maybeFileStat(applicationContext, it)?.filename } + .toSet() val iconDir = File(applicationContext.cacheDir, DownloadIconWorker.ICON_CACHE_DIR) val allIconFilenames = iconDir.listFiles()?.map{ file -> file.name }.orEmpty() val filenamesToDelete = allIconFilenames.minus(activeIconFilenames) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000..b2bd0f1 --- /dev/null +++ b/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,10 @@ + + + إشعارات (أولوية منخفضة) + إشعارات (أعلى أولوية) + إشعارات (أدني أولوية) + الإستماع (إلتقاط) الإشعارات الواردة + إشعارات (أولوية طبيعية) + خدمة الاشتراك + إشعارات (أولوية عالية) + \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml new file mode 100644 index 0000000..6564bca --- /dev/null +++ b/app/src/main/res/values-ca/strings.xml @@ -0,0 +1,9 @@ + + + Notificacions (prioritat min) + Notificacions (prioritat min) + Notificacions (prioritat defecte) + Notificacions (alta prioritat) + Notificacions (prioritat màx) + Servei Subscripció + \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index dc99d16..646024f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -213,7 +213,7 @@ Odstranit dříve zaznamenané protokoly a začít znovu Protokoly odstraněny Protokol připojení - Pro připojení k serveru použít WebSockets. Toto nastavení se stane výchozím v červnu 2022. + Pro připojení k serveru použít WebSockets. Jedná se o doporučenou metodu, která však může vyžadovat další konfiguraci v proxy serveru. WebSockets O programu Verze @@ -299,7 +299,7 @@ Kopírovat do schránky Kopírovat do schránky (cenzurované) OK - Pro připojení k serveru použít JSON přes protokol HTTP. Tato metoda je zastaralá a bude odstraněna v červnu 2022. + Pro připojení k serveru použít JSON přes protokol HTTP. Tato metoda je ověřená v praxi, ale může spotřebovávat více baterie. Zde můžete přidat uživatele. Tento uživatel bude používán ve všech tématech pro daný server. JSON přes HTTP Přihlášeno k odběru pěti témat okamžitého doručení @@ -317,4 +317,14 @@ Přihlášeno k odběru šesti témat okamžitého doručení Oznámení jsou doručena pomocí služby Firebase. Doručování může být zpožděné, ale spotřebovává méně baterie. Okamžité doručení - + Zobrazit název + Nastavit vlastní zobrazovaný název pro tento odběr. Pro výchozí hodnotu (%1$s) ponechte prázdné. + %1$s (výchozí) + O aplikaci + URL tématu + Zkopírováno do schránky + Vymazat URL služby + Povolit nyní + WebSockets jsou doporučenou metodou připojení k vašemu serveru, která může zlepšit zvýšit výdrž baterie, ale může vyžadovat další konfiguraci v proxy serveru. Metodu připojení lze přepnout v Nastavení. + Zvolit URL služby + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ed58df7..029f961 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -69,7 +69,7 @@ Endgültig löschen Abbrechen Test: Du kannst einen Titel festlegen. - Dies ist eine Test-Benachrichtigung aus der ntfy Android-App. Sie hat die Priorität %1$d. Wenn Du eine neue Test-Benachrichtigung sendest, siehst diese vielleicht anders aus. + Dies ist eine Test-Benachrichtigung aus der ntfy Android-App. Sie hat die Priorität %1$d. Wenn Du eine neue Test-Benachrichtigung sendest, sieht diese vielleicht anders aus. Nachricht kann nicht gesendet werden: %1$s Nachricht kann nicht gesendet werden: Benutzer \"%1$s\" hat keine Berechtigung. Nachricht kann nicht gesendet werden: Anhang zu groß. diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml new file mode 100644 index 0000000..15b0eec --- /dev/null +++ b/app/src/main/res/values-hr/strings.xml @@ -0,0 +1,8 @@ + + + Obavijesti (minimalni prioritet) + Obavijesti (niski prioritet) + Obavijesti (standardni prioritet) + Obavijesti (visoki prioritet) + Obavijesti (maksimalni prioritet) + \ No newline at end of file diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml new file mode 100644 index 0000000..6ea71ad --- /dev/null +++ b/app/src/main/res/values-hu/strings.xml @@ -0,0 +1,52 @@ + + + Végleges törlés + Feliratkozva egy azonnal kézbesített témára + Feliratkozva öt azonnal kézbesített témára + Feliratkozva hat azonnal kézbesített témára + Feliratkozva %1$d azonnal kézbesített témára + Feliratkozott témák + Feliratkozva egy témára + Értesítések némítva + Értesítések némítva %1$s-ig + Beállítások + %1$d értesítés + Újra-csatlakozás … + %1$s (ÖsszesítettKüldés) + Feliratkozás hozzáadása + Úgy néz ki hogy még nincsen egy feliratkozás sem. + Kattintson a + ra hogy létrehozzon vagy feliratkozzon egy témára. Aztán mikor PUT vagy POST-al küld üzeneteket, értesítéseket kap a készülékén. + Értesítések (minimum prioritás) + Értesítések (alacsony prioritás) + Értesítések (alap prioritás) + Értesítések (maximum prioritás) + Értesítések (magas prioritás) + Feliratkozó Szolgálat + Bejövő üzenetek fogadása + Feliratkozva azonnal kézbesített témákra + Feliratkozva két azonnal kézbesített témára + Feliratkozva három azonnal kézbesített témára + Feliratkozva négy azonnal kézbesített témára + Feliratkozva hat témára + Feliratkozva öt témára + Feliratkozva négy témára + Feliratkozva három témára + Feliratkozva %1$d témára + Feliratkozva két témára + Dokumentáció olvasása + Leiratkozás + %1$d üzenet érkezett + Minden a legfrissebb verzió + Nem lehetett %1$d feliratkozást frissíteni +\n +\n%2$s + Feliratkozást frissítése nem lehetséges: %1$s + Értesítések bekapcsolva + Feliratkozott témák + Hiba jelentése + tegnap + Applikáció értékelése ⭐ + Leiratkozás a kiválasztott témá(k)-ról és végleges törlése minden üzenetnek\? + %1$d értesítés + Mégse + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index cb36163..6071f12 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -166,7 +166,7 @@ \nLe password sono state ripulite, ma non sono elencate qui. Ok Cancella i log - Usa stream JSON over HTTP per collegarti al server. Questo metodo è deprecato e sarà rimosso a giugno 2022. + Usa stream JSON over HTTP per collegarti al server. Questo metodo è collaudato, ma può consumare più batteria. Stream JSON over HTTP Puoi aggiungere un utente qui. Tutti i topic per il dato server utilizzeranno questo utente. Puoi modificare username/password per l\'utente selezionato, oppure eliminarlo. @@ -285,7 +285,7 @@ Log in upload … Elimina i log precedentemente salvati, e ricomincia Protocollo di connessione - Usa WebSockets per collegarti al server. Questo metodo diventerà il default a giugno 2022. + Usa WebSockets per collegarti al server. Questo è il metodo consigliato, ma potrebbe richiedere una configurazione aggiuntiva del proxy. WebSockets Aggiungi utente Copiato negli appunti @@ -317,4 +317,14 @@ Icona visualizzata nelle notifiche di questo topic Impossibile salvare l\'icona: %1$s utilizzando l\'impostazione globale - + Nome visualizzato + E\' consigliato il passaggio a WebSockets per connettersi al server e potrebbe migliorare la durata della batteria, ma potrebbe richiedere un\'ulteriore configurazione del proxy. Questa opzione può essere selezionata nelle Impostazioni. + %1$s (predefinito) + Impostare un nome di visualizzazione personalizzato per questa iscrizione. Lasciare vuoto per il nome predefinito (%1$s). + Informazioni + URL argomento + Copiato negli appunti + Scegli il servizio URL + Pulisci il servizio URL + Attiva ora + \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index a6b3dae..e9b45a2 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1,2 +1,330 @@ - \ No newline at end of file + + 자세한 설명은 ntfy.sh와 docs 페이지에서 찾으실 수 있습니다. + 알림 (우선순위 높음) + 알림 음소거됨 + 즉시 전달 주제 3개 구독중 + 다른 서버 사용 + 알림 켜짐 + 알림 (우선순위 기본) + 알림 (우선순위 최상) + 구독 서비스 + 알림 수신중 + 즉시 전달 주제를 구독함 + 즉시 전달 주제 1개 구독중 + 즉시 전달 주제 6개 구독중 + 즉시 전달 주제 %1$d개 구독중 + 주제 구독중 + 주제 1개 구독 중 + 주제 2개 구독 중 + 주제 3개 구독 중 + 주제 %1$d개 구독 중 + 알림 %1$d개를 받았습니다 + 모든 알림이 최신입니다 + %1$d개의 구독을 새로고침할 수 없었습니다 +\n +\n%2$s + 구독 새로고침 실패: %1$s + 구독한 주제 + 구독 해제 + 선택한 주제를 구독 해제하고 모든 알림을 영원히 삭제하시겠습니까\? + 영구 삭제 + 취소 + 알림 %1$d개 + 알림 %1$d개 + 재연결중 … + 아직 아무런 구독을 추가하지 않으신 것 같습니다. + 자세한 설명은 ntfy.sh와 docs 페이지에서 찾으실 수 있습니다. + 이 구독은 UnifiedPush를 통해 %1$s에서 관리됩니다 + 알림 문제를 최소화하기 위해서는 앱의 배터리 최적화를 비활성화해야 합니다. + 나중에 물어보기 + 무시하기 + 지금 수정하기 + 나중에 물어보기 + 무시하기 + 지금 활성화 + 주제 구독하기 + 주제는 비밀번호로 보호되지 않을 수 있으니 추측하기 어려운 이름을 사용하십시오. 구독한 뒤 PUT/POST 알림을 보낼 수 있습니다. + %1$s 이외 서버에서는 즉시 알림을 끌 수 없습니다. + 취소 + 구독하기 + 뒤로가기 + 로그인 + 연결 실패: %1$s + 로그인 필요함 + 이 주제는 로그인이 필요합니다. 사용자 이름과 비밀번호를 입력해 주세요. + 사용자 이름 + 비밀번호 + 로그인 실패. 사용자 %1$s은(는) 인증되지 않았습니다. + 사용자 추가 + 아직 이 주제 관련 알림을 받지 않았습니다. + 영구 삭제 + 취소 + 이 주제를 구독 해제하고 모든 알림을 삭제하시겠습니까\? + 메세지를 보낼 수 없습니다: %1$s + 메세지를 보낼 수 없습니다: 익명 발송이 허용되지 않습니다. + 메세지를 보낼 수 없습니다: 사용자 \"%1$s\"은(는) 인증되지 않았습니다. + 메세지를 보낼 수 없습니다: 첨부 파일이 너무 큽니다. + 태그: %1$s + 알림 삭제됨 + URL 복사 + 첨부 파일을 열 수 없습니다: %1$s + 첨부 파일을 열 수 없습니다: 파일이 삭제되었거나 파일을 열 수 있는 앱이 없습니다. + 즉시 전달 켜기 + 즉시 전달 끄기 + 모든 알림 초기화 + 공유 + 여기에 공유할 내용 추가 + 이미지가 공유됨 + 메세지 발송됨 + 알림 음소거 + 취소 + 열기 + 탐색 + 다운로드 + 취소 + %1$s +\n파일: %2$s + %1$s 다운로드중, %2$d%% +\n%3$s + %1$s +\n파일: %2$s, 다운로드됨 + %1$s +\n파일: %2$s, 다운로드 실패 + %1$s 실패: %2$s + 설정 + 알림 + 알림 음소거 + 모든 알림 표시 + 해제시까지 알림 음소거 + %1$s까지 알림 음소거 + 최소 우선순위 + 모든 알림 보기 + 우선순위가 %1$d (%2$s) 보다 높은 알림만 보기 + 우선순위가 5 (최상) 인 알림만 보기 + 아무 우선순위 + 낮음 이상 + 기본 이상 + 높음 이상 + 최상 + 최하 + 낮음 + 기본 + 높음 + 최상 + 채널 설정 + 방해 금지 모드 무시하기, 소리, 기타 설정. + 모든 첨부 파일을 자동 다운로드 + 첨부 파일 다운로드 + 첨부 파일을 자동으로 다운로드하지 않음 + 첨부 파일 크기가 %1$s보다 작다면 자동 다운로드 + 어떤 파일도 자동으로 다운로드하지 않음 + 모든 파일을 자동으로 다운로드 + 100kB보다 작다면 + 500kB보다 작다면 + 1MB보다 작다면 + 5MB보다 작다면 + 10MB보다 작다면 + 알림 삭제 + 알림을 1일 뒤 자동으로 삭제함 + 알림을 3일 뒤 자동으로 삭제함 + 알림을 1주 뒤 자동으로 삭제함 + 알림을 3달 뒤 자동으로 삭제함 + 자동 삭제 안함 + 1일 뒤 + 3일 뒤 + 1주 뒤 + 1달 뒤 + 3달 뒤 + 일반 + 기본 서버 + %1$s (기본) + 다크 모드 + 시스템 설정 사용중 + 라이트 모드 사용중 + 다크 모드 사용중. 혹시 뱀파이어신가요\? + 시스템 설정 사용 + 라이트 모드 + 다크 모드 + 백업 및 복원 + 파일에 백업 + 설정, 알림, 사용자 내보내기 + 모두 + 설정, 알림, 사용자 가져오기 + 복원 성공 + 복원 실패: %1$s + 고급 설정 + 앱이 들어오는 알림을 브로드캐스트할 수 없습니다 + 로그 기록 + 로그를 클립보드에 복사하거나 nopaste.net(ntfy 소유주가 운영하는)에 업로드합니다. 서버 주소나 주제는 가려지지만 알림은 가려지지 않습니다. + 클립보드에 복사 + 클립보드에 복사 (검열본) + 로그가 업로드되고 링크를 복사했습니다 + 어떠한 주제/서버 이름도 검열되지 않았습니다. 구독이 없던 것은 아닌가요\? + 로그 삭제됨 + 연결 프로토콜 + JSON stream over HTTP + 표시 설정 + 알림 (우선순위 낮음) + 저장 + 알림 (우선순위 최하) + 즉시 전달 주제 2개 구독중 + 즉시 전달 주제 5개 구독중 + 즉시 전달 주제 4개 구독중 + 주제 4개 구독 중 + 버그 제보 + 주제 이름, 예를 들어 phils_alerts + 알림을 받을 서버의 주소를 아래에 입력해주세요. + 대기 상태에서 즉시 알림 받기 + 이 주제의 모든 알림을 삭제하시겠습니까\? + 주제 5개 구독 중 + 주제 6개 구독 중 + 알림 %1$s까지 음소거됨 + 설정 + 문서 보기 + 앱 평가하기 ⭐ + + 버튼을 눌러 주제를 구독할 수 있습니다. 이후 장치에서 PUT이나 POST를 통해 보내진 알림을 받을 수 있습니다. + %1$s (UnifiedPush) + 어제 + 구독 추가 + 웹소켓으로 연결하는 방법이 권장하는 방법이며 배터리 수명을 증가시킬수 있지만, 서버에 따라 추가 설정이 필요할 수 있습니다. 이것은 설정에서 변경 가능합니다. + 장치가 활성화되지 않은 상태에서도 알림을 즉시 받을수 있도록 합니다. + 영구 삭제 + 취소 + 즉시 전달 켜짐 + 서비스 URL 초기화 + 알림을 받으려면 아래 주소로 PUT이나 POST 요청을 보내세요. + 주제 %1$s 를 구독했습니다 + 다운로드 취소 + 알림이 클립보드로 복사됨 + 첨부 파일을 저장할 수 없습니다: %1$s + 첨부 파일을 삭제할 수 없습니다: %1$s + 메세지 미리보기 + 알림 음소거됨 + 모든 알림 보기 + 이것은 ntfy 안드로이드 앱에서 보낸 시험용 알림입니다. 우선순위는 %1$d입니다. 다시 알림을 보낸다면 다르게 보일 수 있습니다. + 실행 취소 + 파일 삭제 + 파일 다운로드 + 첨부 파일을 열거나 다운로드할 수 없습니다. 링크가 만료되었으며 로컬 사본을 찾을 수 없습니다. + 주제 %1$s에서 사용됨 + 클립보드에 복사됨 + 전역 설정 사용하기 + 클립보드에 복사됨 + 파일 열기 + URL이 클립보드에 복사됨 + 서비스 URL 선택 + 예제 (curl 사용):
$ curl -d \\\"Hi\\\" %1$s
+ 파일 정보를 읽을 수 없습니다: %1$s + 테스트: 원한다면 제목을 설정할 수 있습니다. + 즉시 전달 꺼짐 + 파일 저장 + 첨부 파일을 다운로드할 수 없습니다: %1$s + 다운로드되지 않음 + 다운로드되지 않음, 링크 만료됨 + 다운로드되지 않음, %1$s에 만료됨 + 삭제됨 + 다운로드 실패 + 알림 켜짐 + 시험용 알림 발송 + 구독 설정 + 알림 복사 + \"Downloads\" 폴더에 \"%1$s\"로 저장됨 + URL을 열 수 없습니다: %1$s + %1$d%% 다운로드됨 + 복사 + 삭제 + 영구 삭제 + 공유하기 + 알림을 1달 뒤 자동으로 삭제함 + 보호된 주제를 위한 사용자 추가/삭제 + 다운로드 실패, 링크 만료됨 + 삭제됨, 링크 만료됨 + 삭제됨, 링크 %1$s에 만료됨 + 다운로드 실패, 링크 %1$s에 만료됨 + 알림 음소거됨 + %1$s까지 알림 음소거됨 + 주제 주소 복사 + 구독 해제 + 선택한 알림을 영원히 삭제하시겠습니까\? + 취소 + 구독 설정 + 공유 + 이미지를 읽을 수 없습니다: %1$s + 파일이 공유됨 + 주제 추천 + 1시간 후 + 2시간 후 + 8시간 후 + 해제시 + 저장 + 알림 음소거 해제됨 + 내일 + 주제 %1$s에서 사용됨 + 설정만 + 앱이 들어오는 알림을 브로드캐스트할 수 있습니다 + 로그 복사/업로드 + 알림 %1$s까지 음소거됨 + 30분 후 + 50MB보다 작다면 + 알림을 자동으로 삭제하지 않음 + 어떤 주제에서도 사용되지 않음 + 새 사용자 추가 + 사용자 제외 모두 + 새 주제를 구독하거나 공유할 때 사용할 서버의 루트 URL을 입력하십시오. + 사용자 관리 + 사용자 추가 + 새 서버를 위한 사용자 추가 + 사용자 + 백업 생성됨 + 메세지 브로드캐스트 + 장치에 로그(최대 1000줄) 기록 … + 나중에 문제 보고를 위해 로그를 기록합니다. + 업로드 후 링크 복사 (검열본) + 백업 실패: %1$s + 파일에서 복원 + 업로드 후 링크 복사 + 로그가 클립보드에 복사됨 + 로그 업로드중 … + 로그를 업로드할 수 없음: %1$s + 여기 적힌 주제/서버 이름은 과일 이름으로 변경되었으므로 로그를 안전하게 공유할 수 있습니다: +\n +\n%1$s +\n +\n비밀번호도 가려졌지만 이곳에 표시되지 않았습니다. + 확인 + 로그 초기화 + JSON stream over HTTP로 연결합니다. 이 방식은 안정적이지만 배터리를 더 많이 사용합니다. + 웹소켓 + 정보 + 즉시 전달 + 웹소켓을 사용해 서버에 연결합니다. 권장되는 방식이지만 서버 프록시에 추가 설정이 필요할 수 있습니다. + 기존 로그를 모두 지우고 새로 시작 + 버전 + ntfy %1$s (%2$s) + 알림이 즉시 전달됩니다. 서비스가 항시 실행되어야 하며 배터리 소모가 많습니다. + 알림이 Firebase를 통해 전달됩니다. 약간의 지연이 발생할 수 있으나 배터리 소모가 적습니다. + 구독 아이콘 + 구독 아이콘 (터치해서 제거) + 이 주제의 알림에 표시될 아이콘 + 이 구독을 표시할 이름을 지정합니다. 빈 값을 지정하면 기본 이름(%1$s)이 사용됩니다. + %1$s (기본) + 정보 + 알림에 표시될 아이콘을 지정합니다 + 아이콘을 저장할 수 없습니다: %1$s + 전역 설정 사용중 + 여기에서 사용자를 추가할 수 있습니다. 지정한 서버의 모든 주제는 이 로그인 정보를 사용합니다. + 사용자 이름 + 취소 + 표시 이름 + 주제 URL + 사용자 편집 + 서비스 URL + 비밀번호 (변경시에만 입력) + 클립보드에 복사됨 + 사용자 추가 + 선택한 사용자의 아이디나 비밀번호를 변경하거나 삭제할 수 있습니다. + 비밀번호 + 사용자 추가 + 사용자 삭제 +
\ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6a5dbcf..e610fc0 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -10,8 +10,8 @@ Notificações (prioridade mínima) Notificações ativadas Configurações - Inscrito em temas - Inscrito em três temas + Inscrito em tópicos + Inscrito em três tópicos Relatar um problema Reconectando … Notificações (prioridade alta) @@ -21,10 +21,10 @@ Inscrito em temas de entrega instantânea Inscrito em um tema de entrega instantânea Inscrito em %1$d temas de entrega instantânea - Inscrito em dois temas + Inscrito em dois tópicos Inscrito em quatro temas Inscrito em %1$d temas - %1$d notificações recebidas + %1$d notificação(ões) recebida(s) Tudo está atualizado Não foi possível atualizar %1$d inscrições \n @@ -32,15 +32,15 @@ Temas inscritos Notificações silenciadas até %1$s Avalie o aplicativo ⭐ - Cancelar inscrição dos temas selecionados e remover permanentemente todas notificações\? + Cancelar inscrição dos tópicos selecionados e remover permanentemente todas notificações\? Remover permanentemente Cancelar ontem Inscrever-se Parece que você não tem nenhuma inscrição ainda. Instruções detalhadas disponíveis em ntfy.sh, e na documentação. - Otimização de bateria deve estar desligada para evitar problemas de entrega de notificação no aplicativo. - %1$s (UnifiedPush) + O modo Economia de Energia deve estar desligado para evitar problemas de entrega de notificação no aplicativo. + %1$s(UnifiedPush) Perguntar depois Dispensar Inscrever-se no tema @@ -184,9 +184,9 @@ Limpar logs Apagar logs registrados anteriormente e recomeçar Protocolo de conexão - Usar WebSockets para conectar ao servidor. Isso irá se tornar o padrão em Junho de 2022. + Usar WebSockets para se conectar ao servidor. Este é o método recomendado, mas pode exigir configurações adicionais no seu proxy. Stream JSON sobre HTTP - WebSockets + Web Sockets Sobre Versão ntfy %1$s (%2$s) @@ -202,14 +202,14 @@ Inscrito em dois temas de entrega instantânea Salvar %1$d notificação - Inscrito em um tema + Inscrito em um tópico Notificações silenciadas Não foi possível atualizar a inscrição: %1$s Leia a documentação Cancelar inscrição Essa inscrição é gerenciada por %1$s via UnifiedPush %1$d notificações - Clique no + para criar ou inscrever-se em um tema. Você receberá notificações no seu dispositivo ao enviar mensagens via PUT ou POST. + Clique no + para criar ou inscrever-se em um tópico. Em seguida você receberá notificações no seu dispositivo ao enviar mensagens via PUT ou POST. Perguntar depois Dispensar Inscrever-se @@ -246,7 +246,7 @@ Nenhum tema/hostname foram censurados. Talvez você não tenha inscrições\? Logs apagados Copiar para área de transferência - Usar uma stream JSON sobre HTTP para conectar ao servidor. Esse método foi descontinuado e será removido em Junho de 2022. + Usar um stream JSON via HTTP para conectar ao servidor. Esse método já funciona bem mas pode consumir mais bateria. Você pode adicionar um usuário aqui. Todos os temas para esse servidor usarão esse usuário. Nome de usuário Senha (não será modificado se deixado em branco) @@ -317,4 +317,14 @@ Inscrito em seis tópicos de entrega instantânea Inscrito em cinco tópicos usando configurações globais - + Nome de exibição + %1$s (padrão) + Defina um nome personalizado para esta inscrição. Deixe em branco para padrão (%1$s). + Mudar para WebSockets é o modo recomendado de conectar ao seu servidor, e pode melhorar a vida da bateria, mas pode necessitar de configurações adicionais no seu proxy. Isso pode ser habilitado nas Configurações. + Sobre + URL do tópico + Copiado para área de transferência + Escolha o URL do serviço + Limpar o URL do serviço + Habilitar agora + \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml new file mode 100644 index 0000000..bc95a63 --- /dev/null +++ b/app/src/main/res/values-pt/strings.xml @@ -0,0 +1,261 @@ + + + Inscrito em três tópicos de entrega instantânea + Inscrito em quatro tópicos de entrega instantânea + Inscrito em cinco tópicos de entrega instantânea + Inscrito em seis tópicos de entrega instantânea + Inscrito em %1$d tópico(s) de entrega instantânea + Inscrito em tópicos + Inscrito em um tópico + Inscrito em dois tópicos + Inscrito em três tópicos + Inscrito em seis tópicos + Inscrito em %1$d tópico(s) + %1$d notificação(ões) recebida(s) + Tudo está atualizado + Não foi possível atualizar %1$d inscrição(ões) +\n +\n%2$s + Não foi possível atualizar a inscrição: %1$s + Tópicos inscritos + Notificações ligadas + Notificações silenciadas + Notificações (prioridade mínima) + Notificações (baixa prioridade) + Serviço de Assinatura + Escutando recebimento de notificações + Inscrito em tópicos de entrega instantânea + Notificações silenciadas até %1$s + Configurações + Reportar um problema + Leia os documentos + Avalie o aplicativo⭐ + Cancelar inscrição + Cancelar a inscrição do(s) tópico(s) selecionado(s) e excluir permanentemente todas as notificações\? + Excluir permanentemente + Cancelar + %1$d notificação + %1$d notificações + reconectando… + ontem + Adicionar inscrição + Parece que você não possui inscrições ainda. + Instruções detalhadas disponíveis em ntfy.sh, e nos documentos. + Esta inscrição é controlada por %1$s via UnifiedPush + Economia de Energia deve estar desligada para que o aplicativo evite problemas no envio de notificações. + Perguntar depois + Dispensar + Corrigir agora + Perguntar depois + Inscrever-se para o tópico + Nome do tópico, ex: alertas_do_jose + Inscrito em quatro tópicos + Inscrito em cinco tópicos + Clique em + para criar uma inscrição em um tópico. Em seguida você receberá notificações no seu dispositivo quando enviar mensagens via PUT ou POST. + Notificações (prioridade máxima) + Alternar para WebSockets é o jeito recomendado de conectar no seu servidor, podendo melhorar a vida da bateria, mas requer configurações adicionais no seu proxy. Isto pode ser alterado nas Configurações. + Dispensar + Notificações (prioridade padrão) + Notificações (alta prioridade) + Inscrito em um tópico de entrega instantânea + Habilitar agora + Inscrito em dois tópicos de entrega instantânea + Tópicos podem não ser protegidos por senha, portanto escolha um nome que seja difícil de adivinhar. Uma vez inscrito, você pode enviar notificações PUT/POST. + %1$s (Push Unificado) + Utilize outro servidor + Log in + É necesário fazer login + Deseja deletar todas as notificações nesse tópico\? + Deletar permanentemente + Deletar permanentemente + Cancelar + Teste: Você pode definir um título se quiser. + Não foi possível enviar a mensagem: %1$s + Não foi possível enviar a mensagem: Publicações anônimas não são permitidas. + Copiado para a área de transferência + Inscrito no tópico %1$s + Tags: %1$s + Notificação deletada + Desfazer + Fazer download do arquivo + Cancelar o download + Não foi possível abrir o anexo: %1$s + Não foi possível abrir o anexo: O arquivo pode ter sido deletado, ou não existe app instalado que consiga abrir o arquivo. + Não foi possível abrir a URL: %1$s + Não foi possível salvar o anexo: %1$s + Não foi possível deletar o anexo: %1$s + Não foi possível baixar o anexo: %1$s + não foi baixado, expira em %1$s + %1$d%% baixado + apagado + apagado, link expirou + apagado, link expira em %1$s + download falhou + download falhou, link expirou + download falhou, link expira em %1$s + Notificações ligadas + Notificações silenciadas + Ligar a entrega instantânea + Desligar a entrega instantânea + Enviar uma notificação de teste + Copiar o endereço do tópico + Limpar todas as notificações + Configurações das inscrições + Desinscrever + Apagar + Deseja apagar a(s) notificação(ões) selecionada(s) permanentemente\? + Apagar permanentemente + Cancelar + Configurações das inscrições + Compartilhar + Compartilhar + Prévia da mensagem + Uma imagem foi compartilhada com você + Compartilhar para + Tópicos sugeridos + Mensagem publicada + Cancelar + Salvar + Notificações retomadas + Notificações silenciadas até %1$s + Mostrar todas as notificações + 2 horas + 8 horas + Até amanhã + Até serem retomadas + Navegar + Baixar + Cancelar + %1$s +\nArquivo: %2$s + Baixando %1$s, %2$d%% +\n%3$s + %1$s +\nArquivo: %2$s, baixado + %1$s +\nArquivo: %2$s, download falhou + %1$s falhou: %2$s + Configurações + Notificações + Silenciar as notificações + Mostrando todas as notificações + Notificações silenciadas até serem retomadas + Notificações silenciadas até %1$s + Prioridade mínima + Mostrando todas as notificações + Mostrar as notificações se a prioridade é %1$d (%2$s) ou superior + Mostrar as notificações se a prioridade for 5 (máxima)P + Qualquer prioridade + Prioridade baixa e superior + Prioridade pradão ou superior + Altra prioridade ou superior + Apenas a prioridade máxima + mínima + baixa + padrão + alta + máxima + Configuraçoes do canal + Sobrescrever modo Não Perturbe (NP), sons, etc. + Baixar os anexos + Baixar todos os anexos automaticamente + Nunca baixar todos os anexos automaticamente + Baixar os anexos automaticamente até %1$s + Nunca baixar nada automaticamente + Baixar tudo automaticamente + Se abaixo de 100kB + Se abaixo de 500 kB + Se abaixo de 1 MB + Apagar as notificações + Nunca apagar as notificações automaticamente + Apagar as notificações automaticamente depois de um dia + Apagar as notificações automaticamente depois de 3 dias + Apagar as notificações automaticamente depois de uma semana + Apagar as notificações automaticamente depois de um mês + Apagar as notificações automaticamente depois de 3 meses + Nunca + Depois de um dia + Depois de 3 dias + Depois de uma semana + Depois de um mês + Depois de 3 meses + Geral + Servidor padrão + Insira a URL raíz do servidor para utilizar seu próprio servidor como padrão ao se inscrever em novos tópicos e/ou compartilhar para tópicos. + %1$s (padrão) + Gerenciar usuários + Adicionar/remover usuários em tópicos protegidos + Usuários + Não utilizado por nenhum tópico + Utilizado pelo tópico %1$s + Utilizado pelos tópicos %1$s + Adicionar usuários + Adicionar novo usuário + Crie um novo usuário para um novo servidor + Modo escuro ligado. Você por acaso é um vampiro\? + Usar o padrão do sistema + Modo claro + Modo escuro + Fazer backup e Restaurar + Fazer backup para um arquivo + Exportar as configurações, notificações e usuários + Tudo + Tudo, exceto os usuários + Apenas as configurações + Backup criado + Backup falhou: %1$s + Salvo como \"%1$s\" na pasta \"Downloads\" + Notificação copiada para a área de transferência + Não foi possível abrir ou baixar o anexo. O link expirou e nenhum arquivo local foi encontrado. + não foi baixado, link expirou + Notificações silenciadas até %1$s + Não foi possível ler a imagem: %1$s + Se abaixo de 10 MB + A entrega instantânea está sempre ligada para os hosts que não sejam %1$s. + Insira as URLs de serviço abaixo para se inscrever em tópicos de outros servidores. + Cancelar + Se inscrever + A conexão falhou: %1$s + Esse tópico neccessita que você faça login. Por favor, insira um nome de usuário e senha. + Novo usuário + Escolha a URL do serviço + Exemplo (utilizando curl):
$ curl -d \"Olá\"%1$s
+ Deseja se desinscrever deste tópico e deletar todas as notificações recebidas\? + Essa é uma notificação de teste do aplicativo Android do ntfy. Ela tem prioridade nível %1$d. Se você enviar outra notificação, ela pode ser diferente. + Não foi possível enviar a mensagem: O anexo é grande demais. + Entrega instantânea ativada + Abrir arquivo + Salvar o arquivo + Copiar a URL + não foi baixado + Entrega instantânea em modo soneca + Garante que as mensagens sejam entregues imediatamente, mesmo que o dispositivo esteja inativo. + Voltar + Nome de usuário + Senha + O login falhou. O usuário %1$s não foi autorizado. + Limpar a URL do serviço + Você ainda não recebeu nenhuma notificação neste tópico. + Para enviar notificações para esse tópico, simplesmente faça um PUT ou POST para a URL do tópico. + Instruções detalhadas disponíveis em ntfy.sh, e nas documentações. + Cancelar + Não foi possível enviar a mensagem: O usuário \"%1$s\" não está autorizado. + Entrega instantânea desativada + Deletar arquivo + URL copiada para a área de transferência + Copiar notificação + 30 minutos + Abrir + Copiar + Adicone conteúdo a ser compartilhado aqui + Não foi possível ler as informações do arquivo: %1$s + Notificações silenciadas + Se abaixo de 5 MB + Um arquivo foi compartilhado com você + 1 hora + Se abaixo de 50 MB + Silenciar notificações + Modo claro + Modo escuro + Usar o padrão do sistema +
\ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index a6b3dae..c9e4078 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1,2 +1,102 @@ - \ No newline at end of file + + Prenumerationstjänst + Lyssna på inkommande meddelanden + Prenumererar på ämnen med omedelbar leverans + Prenumererar på ett ämne för omedelbar leverans + Prenumererar på två ämnen med omedelbar leverans + Prenumererar på tre ämnen med omedelbar leverans + Prenumererar på fyra ämnen med omedelbar leverans + Prenumererar på fem ämnen med omedelbar leverans + Prenumererar på sex ämnen med omedelbar leverans + Prenumererar på ämnen + Prenumererar på ett ämne + Prenumererad på två ämnen + Prenumererar på tre ämnen + Prenumererar på fyra ämnen + Prenumererar på fem ämnen + Prenumererar på sex ämnen + Prenumererar på %1$d ämnen + %1$d meddelande(n) har tagits emot + Allt är uppdaterat + Kunde inte uppdatera %1$d prenumerationer +\n +\n%2$s + Kunde inte uppdatera prenumerationen: %1$s + Prenumererade kategorier + Aviseringar på + Notiser tystade + Aviseringar tystade till %1$s + Inställningar + Läs dokumentationen + Betygsätt appen ⭐ + Avprenumerera + Ta bort permanent + Avbryt + %1$d meddelande + %1$d meddelanden + återansluter… + %1$s (UnifiedPush) + igår + Lägg till prenumeration + Det verkar som att du inte har några prenumerationer än. + Klicka på + för att skapa eller prenumerera på ett ämne. Därefter får du meddelanden på din enhet när du skickar meddelanden via PUT eller POST. + Detaljerade instruktioner finns på ntfy.sh och i dokumentationen. + Denna prenumeration hanteras av %1$s via UnifiedPush + Batterioptimering bör vara avstängd för appen för att undvika problem med leverans av meddelanden. + Fråga senare + Avvisa + Fixa nu + Fråga senare + Avvisa + Aktivera nu + Prenumerera på ämnet + Ämnena kanske inte är lösenordsskyddade, så välj ett namn som är svårt att gissa. När du har prenumererat kan du PUT/POST-meddelanden. + Använd en annan server + Ange tjänstens webbadresser nedan för att prenumerera på ämnen från andra servrar. + Säkerställer att meddelanden levereras omedelbart, även om enheten är inaktiv. + Omedelbar leverans är alltid på för andra värdar än %1$s. + Avbryt + Prenumerera + Tillbaka + Logga in + Anslutningen misslyckades: %1$s + Inloggning krävs + Du måste logga in för att kunna ta del av det här ämnet. Ange ett användarnamn och lösenord. + Omedelbar leverans i dvala + Inloggningen misslyckades. Användaren %1$s är inte auktoriserad. + Ny användare + Välj tjänstens URL + Rensa tjänstens URL + Du har inte fått några meddelanden för detta ämne ännu. + För att skicka meddelanden till det här ämnet, PUT eller POST till ämnesadressen. + Exempel (med curl):
$ curl -d \"Hej\" %1$s
+ Detaljerade instruktioner finns på ntfy.sh och i dokumentationen. + Ta bort alla meddelanden i det här ämnet\? + Ta bort permanent + Avbryt + Vill du avsluta prenumerationen på det här ämnet och ta bort alla mottagna aviseringar\? + Ta bort permanent + Avbryt + Test: Du kan ange en titel om du vill. + Detta är ett testmeddelande från ntfy Android-appen. Den har prioritetsnivån %1$d. Om du skickar en annan kan den se annorlunda ut. + Kan inte skicka meddelande: %1$s + Kan inte skicka meddelande: Användaren \"%1$s\" är inte auktoriserad. + Kan inte skicka meddelande: Bilagan är för stor. + Kopierat till urklipp + Omedelbar leverans på + Omedelbar leverans av + Prenumererar på ämne %1$s + Meddelanden (lägsta prioritet) + Meddelanden (låg prioritet) + Meddelanden (hög prioritet) + Meddelanden (standardprioritet) + Meddelanden (högsta prioritet) + Prenumererar på %1$d ämnen med omedelbar leverans + Rapportera ett fel + Avregistrera mig från de valda ämnena och radera alla meddelanden permanent\? + Att byta till WebSockets är det rekommenderade sättet att ansluta till servern och kan förbättra batteritiden, men kan kräva ytterligare konfigurationer i din proxy. Detta kan ställas in i Inställningarna. + Användarnamn + Lösenord + Kan inte skicka meddelande: Anonym publicering är inte tillåten. +
\ No newline at end of file diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml new file mode 100644 index 0000000..6804ab3 --- /dev/null +++ b/app/src/main/res/values-ta/strings.xml @@ -0,0 +1,20 @@ + + + அறிவிப்புகள் (குறைந்த முன்னுரிமை) + அறிவிப்புகள் (உயர் முன்னுரிமை) + அறிவிப்புகள் (அதிகபட்ச முன்னுரிமை) + நீக்கு + ரத்துசெய் + பகிர் + பகிர் + நீக்கப்பட்டது + சந்தா சேவை + அறிவிப்புகள் (குறைந்தபட்ச முன்னுரிமை) + பிரதி + அறிவிப்புகள் (இயல்புநிலை முன்னுரிமை) + நிரந்தரமாக நீக்கு + சேமிக்க + ரத்து செய் + ரத்து செய் + பதிவிறக்கத்தை ரத்து செய் + \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a6b3dae..d8cfb92 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1,2 +1,4 @@ - \ No newline at end of file + + Thông báo (ưu tiên thấp) + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 482aab8..da86ce1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -64,4 +64,18 @@ 重新連線中 … 通知靜音到%1$s 主題名稱(例如:phils_alerts) + 取消 + 訂閱 + 退回 + 連接失敗: %1$s + 需要登入 + 使用者名字 + 密碼 + 登入失敗. 使用者%1$s 未獲得授權. + 新使用者 + 選擇服務網址 + 清除服務網址 + 複製到剪貼簿 + 登入 + 這篇主題要求登入. 請輸入帳號密碼. \ No newline at end of file diff --git a/build.gradle b/build.gradle index 40c4925..3b8b15e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.6.21' repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.3' + classpath 'com.android.tools.build:gradle:7.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.10' // This is removed in the "fdroid" flavor + classpath 'com.google.gms:google-services:4.3.14' // This is removed in the "fdroid" flavor // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -17,7 +17,7 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() maven { url "https://jitpack.io" } // For StfalconImageViewer } } diff --git a/fastlane/metadata/android/en-US/changelog/29.txt b/fastlane/metadata/android/en-US/changelog/29.txt new file mode 100644 index 0000000..a1b0c38 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelog/29.txt @@ -0,0 +1,9 @@ +Bug fixes + maintenance: +* Upgrade Android dependencies and build toolchain to SDK 33 (no ticket) +* Android 13: Ask for permission to post notifications (#508) +* Remove timestamp when copying message text (#471, thanks to @wunter8) +* Fix auto-delete if some icons do not exist anymore (#506) + +Additional translations: +* Korean (thanks to @YJSofta0f97461d82447ac) +* Portuguese (thanks to @victormagalhaess) diff --git a/fastlane/metadata/android/it/full_description.txt b/fastlane/metadata/android/it/full_description.txt new file mode 100644 index 0000000..e0dc31a --- /dev/null +++ b/fastlane/metadata/android/it/full_description.txt @@ -0,0 +1,17 @@ +Inviate notifiche al vostro telefono da qualsiasi script Bash o PowerShell, o dalla vostra applicazione utilizzando richieste PUT/POST, ad esempio tramite curl su Linux o Invoke-WebRequest. + +ntfy è un client Android per https://ntfy.sh, un servizio pub-sub gratuito e open source basato su HTTP. In questa applicazione è possibile sottoscrivere argomenti e pubblicare messaggi tramite una semplice API HTTP. + +Utilizzi: +* Notificare quando un processo in corso è terminato. +* Ping al telefono quando un backup è fallito +* Avvisare quando qualcuno accede al server. + +Esempio: + +$ curl -d "Il tuo backup è terminato" ntfy.sh/mytopic + +Trovate altri esempi e istruzioni d'uso qui: +* Sito web: https://ntfy.sh +* GitHub (server): https://github.com/binwiederhier/ntfy +* GitHub (applicazione Android): https://github.com/binwiederhier/ntfy-android diff --git a/fastlane/metadata/android/it/short_description.txt b/fastlane/metadata/android/it/short_description.txt new file mode 100644 index 0000000..53e3774 --- /dev/null +++ b/fastlane/metadata/android/it/short_description.txt @@ -0,0 +1 @@ +Inviare notifiche al telefono da qualunqu script usando le richieste PUT/POST diff --git a/fastlane/metadata/android/it/title.txt b/fastlane/metadata/android/it/title.txt new file mode 100644 index 0000000..ca07b85 --- /dev/null +++ b/fastlane/metadata/android/it/title.txt @@ -0,0 +1 @@ +ntfy -PUT/POST al tuo telefono diff --git a/fastlane/metadata/android/ko/full_description.txt b/fastlane/metadata/android/ko/full_description.txt new file mode 100644 index 0000000..3d956ab --- /dev/null +++ b/fastlane/metadata/android/ko/full_description.txt @@ -0,0 +1,17 @@ +핸드폰에 PUT/POST 요청을 보내서 알림을 보내세요. Bash 스크립트나 파워쉘 스크립트(예를 들면 curl이나 Invoke-WebRequest)를 이용하실수 있으며 당신의 앱에서 직접 알림을 보내실수도 있습니다. + +ntfy는 https://ntfy.sh의 안드로이드 클라이언트입니다. https://ntfy.sh는 무료이며 오픈 소스인 HTTP 기반 pub-sub 서비스입니다. 이 앱을 통해 주제를 구독하실수 있으며 간단한 HTTP API를 이용해 메세지를 보내실수도 있습니다. + +사용 예시: +* 긴 작업이 완료되었을때 알림 보내기 +* 백업이 완료되었을때 핸드폰에 알리기 +* 누군가 당신의 서버에 침입했을때 경고하기 + +사용법: + +$ curl -d "백업이 완료되었습니다" ntfy.sh/mytopic + +더 많은 예제와 사용 방법을 여기에서 확인하세요: +* 웹 사이트: https://ntfy.sh +* Github (서버): https://github.com/binwiederhier/ntfy +* Github (안드로이드 앱): https://github.com/binwiederhier/ntfy-android diff --git a/fastlane/metadata/android/ko/short_description.txt b/fastlane/metadata/android/ko/short_description.txt new file mode 100644 index 0000000..1a71dcd --- /dev/null +++ b/fastlane/metadata/android/ko/short_description.txt @@ -0,0 +1 @@ +다양한 스크립트를 이용해 핸드폰에 PUT/POST 요청을 보내서 알림을 보내세요 diff --git a/fastlane/metadata/android/ko/title.txt b/fastlane/metadata/android/ko/title.txt new file mode 100644 index 0000000..52ed6be --- /dev/null +++ b/fastlane/metadata/android/ko/title.txt @@ -0,0 +1 @@ +ntfy - 당신의 핸드폰에 PUT/POST 하세요 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 94dca12..1dbd5f6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip