diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8897347..85a2e95 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,7 +5,7 @@ - + @@ -98,7 +98,11 @@ + android:foregroundServiceType="specialUse"> + + = Build.VERSION_CODES.M) { - Settings.canDrawOverlays(context) - } else true - - if (!hasOverlayPermission) { - Log.i(TAG, "No overlay permission, not starting service") - return - } - - // Use goAsync() to extend receiver lifetime beyond 10s limit val pendingResult = goAsync() CoroutineScope(Dispatchers.IO).launch { try { - val wasEnabled = TranslanderApp.instance.settingsRepository.serviceEnabled.first() + val app = TranslanderApp.instance + val floatingMicEnabled = app.settingsRepository.serviceEnabled.first() + val audioMonitorEnabled = app.settingsRepository.audioMonitorEnabled.first() + + // Check overlay permission for floating mic + val hasOverlayPermission = Settings.canDrawOverlays(context) + + val canStartFloatingMic = floatingMicEnabled && hasOverlayPermission + val canStartAudioMonitor = audioMonitorEnabled - if (wasEnabled) { - Log.i(TAG, "Service was enabled, starting FloatingMicService") - val serviceIntent = Intent(context, FloatingMicService::class.java) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Log.i(TAG, "floatingMicEnabled=$floatingMicEnabled, audioMonitorEnabled=$audioMonitorEnabled, hasOverlay=$hasOverlayPermission") + + if (!canStartFloatingMic && !canStartAudioMonitor) { + Log.i(TAG, "No services enabled, nothing to start") + return@launch + } + + if (BootCompatHelper.canStartFgsFromBoot) { + // Pre-Android 14: can start FGS directly + if (canStartFloatingMic) { + Log.i(TAG, "Starting FloatingMicService") + val serviceIntent = Intent(context, FloatingMicService::class.java) + context.startForegroundService(serviceIntent) + } + if (canStartAudioMonitor) { + Log.i(TAG, "Starting AudioMonitorService") + val serviceIntent = Intent(context, AudioMonitorService::class.java) context.startForegroundService(serviceIntent) - } else { - context.startService(serviceIntent) } } else { - Log.i(TAG, "Service was not enabled, not starting") + // Android 14+: show single unified notification + Log.i(TAG, "Android 14+: showing notification instead of starting services") + app.serviceAlertNotification.show(R.string.service_start_services) } } catch (e: Exception) { Log.e(TAG, "Failed to check service enabled state", e) diff --git a/app/src/main/java/com/translander/service/FloatingMicService.kt b/app/src/main/java/com/translander/service/FloatingMicService.kt index eef0f01..35db86c 100644 --- a/app/src/main/java/com/translander/service/FloatingMicService.kt +++ b/app/src/main/java/com/translander/service/FloatingMicService.kt @@ -346,7 +346,7 @@ class FloatingMicService : Service() { } private fun showFailureNotification() { - TranslanderApp.instance.showServiceStartNotification(R.string.service_start_floating_mic) + TranslanderApp.instance.serviceAlertNotification.show(R.string.service_start_floating_mic) } private fun createNotification(): Notification { diff --git a/app/src/main/java/com/translander/settings/SettingsActivity.kt b/app/src/main/java/com/translander/settings/SettingsActivity.kt index 5df64ab..fe0856a 100644 --- a/app/src/main/java/com/translander/settings/SettingsActivity.kt +++ b/app/src/main/java/com/translander/settings/SettingsActivity.kt @@ -168,7 +168,7 @@ class SettingsActivity : ComponentActivity() { // Revalidate model files on disk TranslanderApp.instance.modelManager.checkModelStatus() - // Sync floating service state + // Sync floating service state and restart services if needed (Android 14+ boot workaround) val app = TranslanderApp.instance app.applicationScope.launch { val serviceEnabled = app.settingsRepository.serviceEnabled.first() @@ -186,6 +186,15 @@ class SettingsActivity : ComponentActivity() { startFloatingService() } } + + // Restart audio monitor if enabled (needed on Android 14+ where boot start is blocked) + val audioMonitorEnabled = app.settingsRepository.audioMonitorEnabled.first() + if (audioMonitorEnabled) { + app.transcribeManager.setAudioMonitorEnabled(true) + } + + // Dismiss the boot notification now that services are started + app.serviceAlertNotification.dismiss() } } diff --git a/app/src/main/java/com/translander/transcribe/AudioMonitorService.kt b/app/src/main/java/com/translander/transcribe/AudioMonitorService.kt index 77d117c..69c0f06 100644 --- a/app/src/main/java/com/translander/transcribe/AudioMonitorService.kt +++ b/app/src/main/java/com/translander/transcribe/AudioMonitorService.kt @@ -6,6 +6,7 @@ import android.app.NotificationManager import android.app.PendingIntent import android.app.Service import android.content.Intent +import android.content.pm.ServiceInfo import android.os.Build import android.os.Environment import android.os.FileObserver @@ -63,7 +64,13 @@ class AudioMonitorService : Service() { } try { - startForeground(SERVICE_NOTIFICATION_ID, createServiceNotification()) + val notification = createServiceNotification() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + startForeground(SERVICE_NOTIFICATION_ID, notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE) + } else { + startForeground(SERVICE_NOTIFICATION_ID, notification) + } // Dismiss any failure notification from previous boot attempt getSystemService(android.app.NotificationManager::class.java) ?.cancel(TranslanderApp.SERVICE_ALERT_NOTIFICATION_ID) @@ -127,7 +134,7 @@ class AudioMonitorService : Service() { } private fun showFailureNotification() { - TranslanderApp.instance.showServiceStartNotification(R.string.service_start_folder_monitor) + TranslanderApp.instance.serviceAlertNotification.show(R.string.service_start_folder_monitor) } private fun createServiceNotification(): Notification { diff --git a/app/src/main/java/com/translander/transcribe/TranscribeManager.kt b/app/src/main/java/com/translander/transcribe/TranscribeManager.kt index bbb7ec1..575a3e6 100644 --- a/app/src/main/java/com/translander/transcribe/TranscribeManager.kt +++ b/app/src/main/java/com/translander/transcribe/TranscribeManager.kt @@ -2,9 +2,9 @@ package com.translander.transcribe import android.content.Context import android.content.Intent -import android.os.Build import android.util.Log import com.translander.TranslanderApp +import com.translander.util.BootCompatHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -48,11 +48,7 @@ class TranscribeManager(private val context: Context) { if (active) return try { val intent = Intent(context, AudioMonitorService::class.java) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(intent) - } else { - context.startService(intent) - } + context.startForegroundService(intent) active = true } catch (e: Exception) { Log.e(TAG, "Failed to start AudioMonitorService", e) @@ -88,6 +84,9 @@ class TranscribeManager(private val context: Context) { /** * Start all enabled triggers based on settings. + * On Android 14+, skips auto-start at boot since dataSync FGS is blocked. + * BootReceiver handles showing the notification, so we just skip here. + * User must open app to start services (handled in SettingsActivity.onResume). */ fun startEnabledTriggers() { scope.launch { @@ -95,7 +94,14 @@ class TranscribeManager(private val context: Context) { val monitorEnabled = settings.audioMonitorEnabled.first() if (monitorEnabled) { - audioMonitorTrigger.start() + if (BootCompatHelper.canStartFgsFromBoot) { + audioMonitorTrigger.start() + } else { + // Android 14+: BootReceiver shows the notification, + // so we just skip starting here. Services will be started + // when user opens the app (SettingsActivity.onResume). + Log.i(TAG, "Android 14+: skipping audio monitor start at boot") + } } } } diff --git a/app/src/main/java/com/translander/util/BootCompatHelper.kt b/app/src/main/java/com/translander/util/BootCompatHelper.kt new file mode 100644 index 0000000..f15609a --- /dev/null +++ b/app/src/main/java/com/translander/util/BootCompatHelper.kt @@ -0,0 +1,47 @@ +package com.translander.util + +import android.os.Build + +/** + * Helper for Android 14+ boot compatibility. + * Centralizes API level checks for foreground service (FGS) restrictions. + * + * ## Android Version Restrictions Matrix + * + * | Android | API | FGS Restrictions at Boot | + * |---------|-----|--------------------------| + * | 8.0-13 | 26-33 | None - FGS starts directly from BOOT_COMPLETED | + * | 14 | 34 | `microphone` FGS type blocked from boot/background | + * | 15 | 35 | Same as 14, plus `dataSync` has 6-hour timeout | + * | 16 | 36 | Same restrictions as Android 15 | + * + * ## Why Check for API 34? + * + * Android 14 (API 34, UPSIDE_DOWN_CAKE) was the first version to restrict + * starting certain FGS types from background contexts like BOOT_COMPLETED. + * This restriction applies to: + * - `microphone` (used by FloatingMicService) + * - `camera` + * - `mediaProjection` + * + * Android 15 (API 35) added the 6-hour timeout for `dataSync` FGS type, + * which is why AudioMonitorService uses `specialUse` instead. + * + * The check for API < 34 covers all Android versions from 14 onwards, + * including 15 and 16. + * + * @see FGS Background Start Restrictions + * @see Android 15 FGS Changes + */ +object BootCompatHelper { + /** + * Whether the app can start foreground services with restricted types + * (microphone, dataSync) from BOOT_COMPLETED receiver. + * + * Returns `true` for Android 8.0-13 (API 26-33) where FGS can start directly. + * Returns `false` for Android 14+ (API 34+) where a notification must be + * shown and the user must tap to start services. + */ + val canStartFgsFromBoot: Boolean + get() = Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE +} diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 8e7b418..f2d7b8e 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -9,6 +9,7 @@ Известия при неуспешно стартиране на услуги Натиснете, за да стартирате плаващия микрофон Натиснете, за да стартирате наблюдението на папки + Докоснете, за да стартирате услугите на TranSlander TranSlander Текстов вход Позволява на TranSlander да вмъква транскрибиран текст директно в текстови полета. Активирайте за безпроблемно гласово въвеждане на текст. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 161e94f..a91e634 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -9,6 +9,7 @@ Oznámení při selhání spuštění služeb Klepněte pro spuštění plovoucího mikrofonu Klepněte pro spuštění monitoru složek + Klepnutím spustíte služby TranSlander TranSlander Textový vstup Umožňuje TranSlander vkládat přepsaný text přímo do textových polí. Povolte pro plynulý hlasový vstup. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c904621..f4a9f07 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -7,6 +7,7 @@ Notifikationer når tjenester ikke kan starte Tryk for at starte flydende mikrofon Tryk for at starte mappeovervågning + Tryk for at starte TranSlander-tjenester TranSlander tekstinput Giver TranSlander mulighed for at indsætte transskriberet tekst direkte i tekstfelter. Aktivér dette for problemfri tale-til-tekst-input. Talemodel diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2cccf4e..fad0cc9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -9,6 +9,7 @@ Benachrichtigungen, wenn Dienste nicht starten können Tippen, um schwebendes Mikrofon zu starten Tippen, um Ordnerüberwachung zu starten + Tippen, um TranSlander-Dienste zu starten TranSlander Texteingabe Ermöglicht TranSlander, transkribierten Text direkt in Textfelder einzufügen. Für nahtlose Spracheingabe aktivieren. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 64873b5..82201e4 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -7,6 +7,7 @@ Ειδοποιήσεις όταν οι υπηρεσίες αποτυγχάνουν να ξεκινήσουν Πατήστε για εκκίνηση αιωρούμενου μικροφώνου Πατήστε για εκκίνηση παρακολούθησης φακέλων + Πατήστε για να ξεκινήσετε τις υπηρεσίες TranSlander Εισαγωγή κειμένου TranSlander Επιτρέπει στο TranSlander να εισάγει μεταγεγραμμένο κείμενο απευθείας σε πεδία κειμένου. Ενεργοποιήστε το για απρόσκοπτη εισαγωγή ομιλίας-σε-κείμενο. Μοντέλο ομιλίας diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 01615e9..c9b8fcc 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -9,6 +9,7 @@ Notificaciones cuando los servicios no pueden iniciarse Toca para iniciar el micrófono flotante Toca para iniciar el monitor de carpetas + Toca para iniciar los servicios de TranSlander Entrada de texto TranSlander Permite a TranSlander insertar texto transcrito directamente en campos de texto. Actívalo para una entrada de voz fluida. diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index fa4f232..602450e 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -7,6 +7,7 @@ Teavitused, kui teenused ei käivitu Puuduta hõljuva mikrofoni käivitamiseks Puuduta kaustaseire käivitamiseks + Puudutage TranSlanderi teenuste käivitamiseks TranSlander tekstisisestus Lubab TranSlander\'il sisestada transkribeeritud teksti otse tekstiväljadele. Luba see sujuvaks kõnest tekstiks sisestuseks. Kõnemudel diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b397a3e..c5e153d 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -7,6 +7,7 @@ Ilmoitukset kun palvelut eivät käynnisty Napauta käynnistääksesi kelluvan mikrofonin Napauta käynnistääksesi kansioseurannan + Napauta käynnistääksesi TranSlander-palvelut TranSlander-tekstinsyöttö Sallii TranSlanderin lisätä tunnistetun tekstin suoraan tekstikenttiin. Ota käyttöön saumattomaan puheesta tekstiksi -syöttöön. Puhemalli diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 365b5e8..a848624 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -9,6 +9,7 @@ Notifications lorsque les services ne démarrent pas Touche pour démarrer le micro flottant Touche pour démarrer la surveillance des dossiers + Appuyez pour démarrer les services TranSlander Saisie de texte TranSlander Permet à TranSlander d\'insérer du texte transcrit directement dans les champs de saisie. Active cette option pour une saisie vocale fluide. diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index e3b0efb..6dd226a 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -9,6 +9,7 @@ Obavijesti kada se usluge ne mogu pokrenuti Dodirnite za pokretanje plutajućeg mikrofona Dodirnite za pokretanje praćenja mapa + Dodirnite za pokretanje TranSlander usluga TranSlander Unos teksta Omogućuje TranSlander umetanje transkribiranog teksta izravno u tekstualna polja. Omogućite za besprijekoran glasovni unos teksta. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 3c7be4d..475a4b0 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -9,6 +9,7 @@ Értesítések, ha a szolgáltatások nem indulnak el Koppintson a lebegő mikrofon indításához Koppintson a mappafigyelő indításához + Érintse meg a TranSlander szolgáltatások indításához TranSlander szövegbevitel Lehetővé teszi a TranSlander számára, hogy az átírt szöveget közvetlenül a szövegmezőkbe illessze be. Engedélyezze a zökkenőmentes hangalapú szövegbevitelhez. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index afdcd9b..37bc825 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -9,6 +9,7 @@ Notifiche quando i servizi non riescono ad avviarsi Tocca per avviare il microfono flottante Tocca per avviare il monitoraggio cartelle + Tocca per avviare i servizi TranSlander Immissione testo TranSlander Consente a TranSlander di inserire testo trascritto direttamente nei campi di testo. Attivalo per un\'immissione vocale fluida. diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index b73c81b..e9872dd 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -7,6 +7,7 @@ Pranešimai, kai paslaugos nepavyksta paleisti Bakstelėkite, kad paleistumėte slankųjį mikrofoną Bakstelėkite, kad paleistumėte aplankų stebėjimą + Palieskite, kad paleistumėte TranSlander paslaugas TranSlander teksto įvestis Leidžia TranSlander įterpti transkribuotą tekstą tiesiai į teksto laukus. Įjunkite tai sklandžiai balso-į-tekstą įvesčiai. Kalbos modelis diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index a8b00ca..125eb3e 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -7,6 +7,7 @@ Paziņojumi, kad pakalpojumi neizdodas startēt Pieskarieties, lai palaistu peldošo mikrofonu Pieskarieties, lai palaistu mapju uzraudzību + Pieskarieties, lai palaistu TranSlander pakalpojumus TranSlander teksta ievade Ļauj TranSlander ievietot transkribētu tekstu tieši teksta laukos. Iespējojiet šo vienmērīgai runas-teksta ievadei. Runas modelis diff --git a/app/src/main/res/values-mt/strings.xml b/app/src/main/res/values-mt/strings.xml index 5632f71..b1ec1d2 100644 --- a/app/src/main/res/values-mt/strings.xml +++ b/app/src/main/res/values-mt/strings.xml @@ -7,6 +7,7 @@ Notifiki meta s-servizzi ma jirnexxilhomx jibdew Tektek biex tibda l-mikrofonu li jżomm Tektek biex tibda l-monitoraġġ tal-folders + Tektek biex tibda s-servizzi TranSlander Dħul ta\' test TranSlander Jippermetti lil TranSlander idaħħal test ittraskkritt direttament f\'oqsma tat-test. Attiva dan għal dħul bla xkiel ta\' vuċi-għal-test. Mudell tad-Diskors diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e9ad1a6..1845969 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -7,6 +7,7 @@ Meldingen wanneer services niet kunnen starten Tik om zwevende microfoon te starten Tik om mapbewaking te starten + Tik om TranSlander-services te starten TranSlander tekstinvoer Hiermee kan TranSlander getranscribeerde tekst rechtstreeks in tekstvelden invoegen. Schakel dit in voor naadloze spraak-naar-tekst invoer. Spraakmodel diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e5bc5e8..9dca430 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -7,6 +7,7 @@ Powiadomienia, gdy usługi nie mogą się uruchomić Dotknij, aby uruchomić pływający mikrofon Dotknij, aby uruchomić monitor folderów + Dotknij, aby uruchomić usługi TranSlander TranSlander wprowadzanie tekstu Umożliwia TranSlander wstawianie transkrybowanego tekstu bezpośrednio do pól tekstowych. Włącz tę opcję, aby płynnie zamieniać mowę na tekst. Model mowy diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 45a420e..f6d631d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -7,6 +7,7 @@ Notificações quando os serviços não conseguem iniciar Toque para iniciar o microfone flutuante Toque para iniciar o monitor de pastas + Toque para iniciar os serviços TranSlander TranSlander introdução de texto Permite que o TranSlander insira texto transcrito diretamente em campos de texto. Ative esta opção para uma introdução de voz para texto sem interrupções. Modelo de voz diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index bf0486e..bf65134 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -7,6 +7,7 @@ Notificări când serviciile nu reușesc să pornească Atinge pentru a porni microfonul plutitor Atinge pentru a porni monitorizarea dosarelor + Atingeți pentru a porni serviciile TranSlander TranSlander introducere text Permite TranSlander să insereze textul transcris direct în câmpurile de text. Activează această opțiune pentru introducere vocală fără întreruperi. Model de vorbire diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index a770199..de971db 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -9,6 +9,7 @@ Oznámenia pri zlyhaní spustenia služieb Klepnite pre spustenie plávajúceho mikrofónu Klepnite pre spustenie monitorovania priečinkov + Klepnutím spustíte služby TranSlander TranSlander Textový vstup Umožňuje TranSlander vkladať prepísaný text priamo do textových polí. Povoľte pre plynulý hlasový vstup. diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 2f7d163..9678ab0 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -9,6 +9,7 @@ Obvestila, ko se storitve ne zaženejo Tapnite za zagon plavajočega mikrofona Tapnite za zagon nadzora map + Tapnite za zagon storitev TranSlander TranSlander Vnos besedila Omogoča TranSlander vstavljanje prepisanega besedila neposredno v besedilna polja. Omogočite za nemoten glasovni vnos besedila. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 4ad3f33..64fc29c 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -7,6 +7,7 @@ Aviseringar när tjänster inte kan starta Tryck för att starta flytande mikrofon Tryck för att starta mappövervakning + Tryck för att starta TranSlander-tjänster TranSlander textinmatning Låter TranSlander infoga transkriberad text direkt i textfält. Aktivera detta för sömlös röst-till-text-inmatning. Talmodell diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6e5f264..a398870 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -7,6 +7,7 @@ Сповіщення, коли служби не можуть запуститися Натисніть, щоб запустити плаваючий мікрофон Натисніть, щоб запустити моніторинг тек + Торкніться, щоб запустити служби TranSlander Введення тексту TranSlander Дозволяє TranSlander вставляти транскрибований текст безпосередньо в текстові поля. Увімкніть для безперебійного введення мовлення-в-текст. Модель мовлення diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d866c9d..3c95189 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,6 +10,7 @@ Notifications when services need to be started Tap to start floating mic Tap to start folder monitor + Tap to start TranSlander services TranSlander Text Input Allows TranSlander to insert transcribed text directly into text fields. Enable this for seamless voice-to-text input.