Compare commits

..

No commits in common. "master" and "v3.1" have entirely different histories.
master ... v3.1

174 changed files with 684 additions and 3475 deletions

View File

@ -56,7 +56,7 @@ jobs:
cat "__changelog_file__" >> "$GITHUB_STEP_SUMMARY"
- name: Build release APK
run: ./gradlew assembleRelease --stacktrace
run: ./gradlew assembleRelease
- name: Move APK to folder for upload
env:

View File

@ -13,15 +13,6 @@ jobs:
- name: Check out repository
uses: actions/checkout@v4
- name: Delete incomplete metadata folder
run: |
for dir in fastlane/metadata/android/*/; do
if [ ! -f "$dir/title.txt" ] || [ ! -f "$dir/short_description.txt" ] || [ ! -f "$dir/full_description.txt" ]; then
echo "Deleting incomplete fastlane metadata folder: $dir" >> "$GITHUB_STEP_SUMMARY"
rm -rf "$dir"
fi
done
- name: Set up Java JDK
uses: actions/setup-java@v4
with:

1
.gitignore vendored
View File

@ -9,7 +9,6 @@
/models
/aars/build
/checkouts
.kotlin
# Fastlane
fastlane/report.xml

View File

@ -179,7 +179,7 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.4.2)
rexml (3.4.1)
rouge (3.28.0)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
@ -210,7 +210,7 @@ GEM
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.4.0)
rexml (>= 3.4.2, < 4.0)
rexml (>= 3.3.6, < 4.0)
xcpretty (0.4.1)
rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)

View File

@ -1,18 +1,18 @@
# Dicio assistant
Dicio is a *free and open source* **voice assistant** running on Android. It supports many different **skills** and input/output methods, and it provides both **speech** and **graphical** feedback to a question. It interprets user input and (when possible) generates user output entirely **on-device**, providing privacy by design. It has **multilanguage** support, and is currently available in these languages: Czech, Dutch, English, French, German, Greek, Italian, Polish, Russian, Slovenian, Spanish, Swedish and Ukrainian. Open to contributions :-D
Dicio is a *free and open source* **voice assistant** running on Android. It supports many different **skills** and input/output methods, and it provides both **speech** and **graphical** feedback to a question. It interprets user input and (when possible) generates user output entirely **on-device**, providing privacy by design. It has **multilanguage** support, and is currently available in these languages: Czech, English, French, German, Greek, Italian, Polish, Russian, Slovenian, Spanish and Ukrainian. Open to contributions :-D
<p align="center">
<img width="80" alt="Dicio logo" src="./app/src/main/res/mipmap-xxxhdpi/ic_launcher.png">
<img height="80" alt="Dicio logo" src="./app/src/main/res/mipmap-xxxhdpi/ic_launcher.png">
&emsp;
<a href="https://f-droid.org/packages/org.stypox.dicio">
<img width="206" alt="Get it on F-Droid" src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png">
<img height="80" alt="Get it on F-Droid" src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png">
</a>
<a href="https://github.com/Stypox/dicio-android/releases">
<img width="206" alt="Get it on GitHub" src="./meta/get-it-on-github.png">
<img height="80" alt="Get it on GitHub" src="./meta/get-it-on-github.png">
</a>
<a href="https://play.google.com/store/apps/details?id=org.stypox.dicio">
<img width="206" alt="Get it on Play Store" src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png">
<img height="80" alt="Get it on Play Store" src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png">
</a>
</p>
@ -23,7 +23,6 @@ Dicio is a *free and open source* **voice assistant** running on Android. It sup
[<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/2.png" width=200>](./fastlane/metadata/android/en-US/images/phoneScreenshots/2.png)
[<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/3.png" width=200>](./fastlane/metadata/android/en-US/images/phoneScreenshots/3.png)
[<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/4.png" width=200>](./fastlane/metadata/android/en-US/images/phoneScreenshots/4.png)
[<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/5.png" width=200>](./fastlane/metadata/android/en-US/images/phoneScreenshots/4.png)
## Skills
@ -37,10 +36,7 @@ Currently Dicio answers questions about:
- **timer**: set, query and cancel timers - _Set a timer for five minutes_
- **current time**: query current time - _What time is it?_
- **navigation**: opens the navigation app at the requested position - _Take me to New York, fifteenth avenue_
- **jokes**: tells you a joke - _Tell me a joke_
- **media**: play, pause, previous, next song
- **translation**: translate from/to any language with **Lingva** - _How do I say Football in German?_
- **wake word control**: turn on/off the wakeword - _Stop listening_
## Speech to text
@ -70,7 +66,7 @@ If you want to translate Dicio to a new language you have to follow these **step
- Translate the **sentences** used by Dicio to identify a user's request and to feed it to the correct skill. To do this open the repository root and navigate to `app/src/main/sentences/`. Copy-paste the `en` folder (i.e. the one containing English translations) and call the new folder with the 2- or 3-letter name of your language (in particular, any `ISO-639`-compliant language ID is supported). Then open the newly created folder: inside there will be some YAML files in English language. Open each one of them and translate the English content; feel free to add/remove sentences if their translation does not fit into your language and remember those sentences need to identify as better as possible what the user said. Do **NOT** change the name of the copied files, the IDs of the sentences (i.e. the `sentence_id:` before each list of sentences) or the IDs of the capturing groups (i.e. the `.ID.` construct). To learn about the Dicio sentences language syntax, please refer to the documentation and the [example](https://github.com/Stypox/dicio-sentences-compiler#example) in [`dicio-sentences-compiler`](https://github.com/Stypox/dicio-sentences-compiler#dicio-sentences-language). Hopefully in the future a custom translation system will be used for sentences.
- Once both the Weblate and the sentences translations are ready, add the new language to the app's language selector. This requires modifying two files. In the following instructions `$iso-language-id$`, `$ISO_LANGUAGE_ID$` and `$Language name$` are placeholders you should fill in, e.g. `en-in`, `EN_IN` and `English (India)`.
1. in [app/src/main/proto/language.proto](./app/src/main/proto/language.proto#L8) add a new entry to the `Language` enum like so: `LANGUAGE_$ISO_LANGUAGE_ID$ = $increasing number$; // $Language name$`. Use the previous highest number in the enum incremented by 1 as `$increasing number$`. The position of the newly added item should make it so that the items are sorted by their language name.
1. in [app/src/main/proto/language.proto](./app/src/main/proto/language.proto#L8) add a new entry at the **bottom** of the `Language` enum like so: `LANGUAGE_$ISO_LANGUAGE_ID$ = $increasing number$; // $Language name$`. Use the last number incremented by 1 as `$increasing number$`.
2. in [app/src/main/kotlin/org/stypox/dicio/settings/Definitions.kt](./app/src/main/kotlin/org/stypox/dicio/settings/Definitions.kt#L33) add a new item to `languageSetting.possibleValues` like so: `ListSetting.Value(Language.LANGUAGE_$ISO_LANGUAGE_ID$, "$Language name$"),`. The position of the newly added item should make it so that the items are sorted by their language name.
- Then update the app descriptions so that people know that the language you are adding is supported. The files you should edit are [README.md](./README.md) (i.e. the file you are currently viewing) and [fastlane/metadata/android/en-US/full_description.txt](./fastlane/metadata/android/en-US/full_description.txt) (the English description for F-Droid).

View File

@ -1,6 +1,5 @@
import org.eclipse.jgit.api.Git
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.stypox.dicio.unicodeCldrPlugin.UnicodeCldrLanguagesTask
import org.gradle.configurationcache.extensions.capitalized
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
buildscript {
repositories {
@ -8,7 +7,6 @@ buildscript {
}
dependencies {
classpath(libs.dicio.sentences.compiler.plugin)
classpath(libs.dicio.unicode.cldr.plugin)
}
}
@ -22,23 +20,27 @@ plugins {
alias(libs.plugins.com.google.dagger.hilt.android)
alias(libs.plugins.com.google.protobuf)
alias(libs.plugins.dicio.sentences.compiler.plugin)
alias(libs.plugins.dicio.unicode.cldr.plugin)
}
android {
namespace = "org.stypox.dicio"
compileSdk = libs.versions.compileSdk.get().toInt()
compileSdk = 36
defaultConfig {
applicationId = "org.stypox.dicio"
minSdk = libs.versions.minSdk.get().toInt()
targetSdk = libs.versions.targetSdk.get().toInt()
versionCode = 17
versionName = "4.0"
minSdk = 21
targetSdk = 36
versionCode = 15
versionName = "3.1"
testInstrumentationRunner = "org.stypox.dicio.CustomTestRunner"
vectorDrawables.useSupportLibrary = true
// add folders generated by sentencesCompiler task
sourceSets["main"].java {
srcDir("build/generated/source/sentences/main")
}
ndk {
abiFilters += arrayOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
}
@ -46,16 +48,7 @@ android {
buildTypes {
debug {
var normalizedGitBranch = gitBranch().replaceFirst("^[^A-Za-z]+", "").replace(Regex("[^0-9A-Za-z]+"), "")
applicationIdSuffix = ".$normalizedGitBranch"
versionNameSuffix = "-$normalizedGitBranch"
val isScreenshotTest = (project.findProperty("android.testInstrumentationRunnerArguments.class") as? String)
?.contains("creenshot") == true
if (!isScreenshotTest) {
// only change the app name if we are not taking screenshots
resValue("string", "app_name", "Dicio-${gitBranch()}")
}
applicationIdSuffix = ".debug"
}
release {
isMinifyEnabled = false
@ -71,11 +64,8 @@ android {
targetCompatibility = JavaVersion.toVersion(libs.versions.java.get())
}
kotlin {
compilerOptions {
jvmTarget = JvmTarget.fromTarget(libs.versions.java.get())
freeCompilerArgs = listOf("-XXLanguage:+PropertyParamAnnotationDefaultTargetMode")
}
kotlinOptions {
jvmTarget = libs.versions.java.get()
}
buildFeatures {
@ -111,24 +101,17 @@ protobuf {
// workaround for https://github.com/google/ksp/issues/1590
// remove when not needed anymore
val kspKotlinRegex = "^ksp(.*)Kotlin$".toRegex()
androidComponents {
onVariants(selector().all()) { variant ->
afterEvaluate {
tasks.named(kspKotlinRegex::matches).configureEach {
val capName = kspKotlinRegex.find(name)!!.groupValues[1]
dependsOn(tasks.named("generate${capName}Proto"))
val capName = variant.name.capitalized()
tasks.getByName<KotlinCompile>("ksp${capName}Kotlin") {
setSource(tasks.getByName("generate${capName}Proto").outputs)
}
}
}
}
tasks.withType(UnicodeCldrLanguagesTask::class) {
// tell the UnicodeCldrLanguagesTask plugin which git commit of the
// https://github.com/unicode-org/cldr repo to use as a source of data
unicodeCldrGitCommit = libs.versions.unicodeCldrGitCommit
}
dependencies {
// Desugaring
coreLibraryDesugaring(libs.desugar.jdk.libs)
@ -213,7 +196,3 @@ configurations.configureEach {
force(libs.test.core)
}
}
fun gitBranch(): String {
return Git.open(rootDir).use { it.repository.branch }
}

View File

@ -3,17 +3,11 @@ package org.stypox.dicio.screenshot
import android.Manifest
import android.view.WindowInsets
import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.test.ComposeTimeoutException
import androidx.compose.ui.test.click
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onAllNodesWithTag
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.onRoot
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollToIndex
import androidx.compose.ui.test.performTouchInput
import androidx.datastore.core.DataStore
import androidx.test.rule.GrantPermissionRule
import dagger.Module
@ -23,34 +17,24 @@ import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.stypox.dicio.MainActivity
import org.stypox.dicio.cldr.CldrLanguages.LocaleAndTranslation
import org.stypox.dicio.di.SttInputDeviceWrapper
import org.stypox.dicio.di.SttInputDeviceWrapperModule
import org.stypox.dicio.di.WakeDeviceWrapper
import org.stypox.dicio.di.WakeDeviceWrapperModule
import org.stypox.dicio.eval.SkillEvaluator
import org.stypox.dicio.eval.SkillEvaluatorModule
import org.stypox.dicio.io.input.SttState
import org.stypox.dicio.sentences.Sentences
import org.stypox.dicio.settings.datastore.Theme
import org.stypox.dicio.settings.datastore.UserSettings
import org.stypox.dicio.settings.datastore.copy
import org.stypox.dicio.skills.calculator.CalculatorInfo
import org.stypox.dicio.skills.calculator.CalculatorOutput
import org.stypox.dicio.skills.current_time.CurrentTimeInfo
import org.stypox.dicio.skills.current_time.CurrentTimeOutput
import org.stypox.dicio.skills.joke.JokeInfo
import org.stypox.dicio.skills.joke.JokeOutput
import org.stypox.dicio.skills.lyrics.LyricsInfo
import org.stypox.dicio.skills.lyrics.LyricsOutput
import org.stypox.dicio.skills.media.MediaInfo
import org.stypox.dicio.skills.media.MediaOutput
import org.stypox.dicio.skills.search.SearchInfo
import org.stypox.dicio.skills.search.SearchOutput
import org.stypox.dicio.skills.telephone.ConfirmCallOutput
@ -58,15 +42,12 @@ import org.stypox.dicio.skills.telephone.ConfirmedCallOutput
import org.stypox.dicio.skills.telephone.TelephoneInfo
import org.stypox.dicio.skills.timer.TimerInfo
import org.stypox.dicio.skills.timer.TimerOutput
import org.stypox.dicio.skills.translation.TranslationInfo
import org.stypox.dicio.skills.translation.TranslationOutput
import org.stypox.dicio.skills.weather.ResolvedLengthUnit
import org.stypox.dicio.skills.weather.ResolvedTemperatureUnit
import org.stypox.dicio.skills.weather.WeatherInfo
import org.stypox.dicio.skills.weather.WeatherOutput
import org.stypox.dicio.ui.home.Interaction
import org.stypox.dicio.ui.home.InteractionLog
import org.stypox.dicio.ui.home.QuestionAnswer
import org.stypox.dicio.io.input.SttState
import javax.inject.Inject
import javax.inject.Singleton
@ -148,7 +129,6 @@ class ScreenshotTakerTest {
hiltRule.inject()
}
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun takeScreenshots() = runTest {
composeRule.activity.runOnUiThread {
@ -157,14 +137,6 @@ class ScreenshotTakerTest {
}
coilEventListener.setup(composeRule.activity)
// ensure the drawer/back button is out of focus by clicking in a random place,
// otherwise there is darkened indication around it
composeRule.onRoot().performTouchInput { click(center) }
// make sure the app bar shows "Dicio" and not "Dicio-master" or other branch names
composeRule.onNodeWithText("Dicio").assertExists()
composeRule.onNodeWithText("Dicio-master").assertDoesNotExist()
// screenshot 0: home screen with "Here is what I can do" and STT listening
dataStore.updateData { it.copy { theme = Theme.THEME_DARK } }
@ -175,50 +147,42 @@ class ScreenshotTakerTest {
dataStore.updateData { it.copy { theme = Theme.THEME_LIGHT } }
fakeSttInputDeviceWrapper.uiState.emit(SttState.Loaded)
coilEventListener.resetStartedImages()
fakeSkillEvaluator.state.value = screenshot1InteractionLog
fakeSkillEvaluator.state.value = screenshot2InteractionLog
composeRule.onNodeWithTag("interaction_list")
.performScrollToIndex(3) // scroll to the first interaction
runCatching { composeRule.waitUntil { coilEventListener.isIdle(startedAtLeast = 1) } }
.performScrollToIndex(2) // scroll to the first interaction
composeRule.waitUntil { coilEventListener.isIdle(startedAtLeast = 1) }
composeRule.takeScreenshot("en-US", "1")
// screenshot 2: home screen with interactions with calculator, telephone and search skills
dataStore.updateData { it.copy { theme = Theme.THEME_BLACK } }
fakeSttInputDeviceWrapper.uiState.emit(SttState.Loaded)
coilEventListener.resetStartedImages()
fakeSkillEvaluator.state.value = screenshot2InteractionLog
composeRule.onNodeWithTag("interaction_list")
.performScrollToIndex(3) // scroll to the first interaction
runCatching { composeRule.waitUntil { coilEventListener.isIdle(startedAtLeast = 2) } }
composeRule.takeScreenshot("en-US", "2")
// screenshot 3: home screen with interactions with translation, joke and media skills
dataStore.updateData { it.copy { theme = Theme.THEME_LIGHT } }
fakeSttInputDeviceWrapper.uiState.emit(SttState.Loaded)
fakeSkillEvaluator.state.value = screenshot3InteractionLog
composeRule.onNodeWithTag("interaction_list")
.performScrollToIndex(3) // scroll to the second interaction
composeRule.takeScreenshot("en-US", "3")
.performScrollToIndex(2) // scroll to the first interaction
composeRule.waitUntil { coilEventListener.isIdle(startedAtLeast = 2) }
composeRule.takeScreenshot("en-US", "2")
// screenshot 5: settings screen
dataStore.updateData { it.copy { theme = Theme.THEME_LIGHT } }
// screenshot 4: settings screen
dataStore.updateData { it.copy { theme = Theme.THEME_DARK } }
composeRule.onNodeWithTag("drawer_handle")
.performClick() // open the drawer
composeRule.onNodeWithTag("settings_drawer_item")
.performClick() // open the settings screen
composeRule.takeScreenshot("en-US", "5")
composeRule.takeScreenshot("en-US", "4")
// screenshot 4: skill settings screen
dataStore.updateData { it.copy { theme = Theme.THEME_DARK } }
// screenshot 3: skill settings screen
dataStore.updateData { it.copy { theme = Theme.THEME_LIGHT } }
composeRule.onNodeWithTag("skill_settings_item")
.performClick() // open the skill settings screen
composeRule.onAllNodesWithTag("expand_skill_settings_handle").apply {
get(0).performClick()
fetchSemanticsNodes().forEachIndexed { i, _ -> get(i).performClick() }
} // expand all skill settings
composeRule.takeScreenshot("en-US", "4")
composeRule.takeScreenshot("en-US", "3")
}
companion object {
private val screenshot1InteractionLog = InteractionLog(listOf(
private val screenshot2InteractionLog = InteractionLog(listOf(
Interaction(WeatherInfo, listOf(
QuestionAnswer(
question = "what's the weather in milan",
@ -231,8 +195,8 @@ class ScreenshotTakerTest {
tempMax = 10.2,
tempString = "nine",
windSpeed = 1.8,
temperatureUnit = ResolvedTemperatureUnit.CELSIUS,
lengthUnit = ResolvedLengthUnit.METRIC,
temperatureUnit = ResolvedTemperatureUnit.from(prefs),
lengthUnit = ResolvedLengthUnit.from(prefs),
)
)
)),
@ -273,7 +237,7 @@ class ScreenshotTakerTest {
)),
), null)
private val screenshot2InteractionLog = InteractionLog(listOf(
private val screenshot3InteractionLog = InteractionLog(listOf(
Interaction(CalculatorInfo, listOf(
QuestionAnswer(
question = "what is twelve plus three fifths minus two to the power of three",
@ -302,7 +266,7 @@ class ScreenshotTakerTest {
Interaction(SearchInfo, listOf(
QuestionAnswer(
question = "search newpipe",
answer = SearchOutput.Results(listOf(
answer = SearchOutput(listOf(
SearchOutput.Data(
title = "NewPipe - a free YouTube client",
description = "NewPipe is an Android app that lets you watch videos " +
@ -324,43 +288,9 @@ class ScreenshotTakerTest {
url = "https://github.com/TeamNewPipe/NewPipe",
thumbnailUrl = "https://external-content.duckduckgo.com/ip3/github.com.ico"
),
))
), askAgain = false)
),
)),
), null)
private val screenshot3InteractionLog = InteractionLog(listOf(
Interaction(MediaInfo, listOf(
QuestionAnswer(
question = "pause the song",
answer = MediaOutput(Sentences.Media.Pause)
)
)),
Interaction(TranslationInfo, listOf(
QuestionAnswer(
question = "translate hola from spanish to italian",
answer = TranslationOutput.Success(
translation = "Ciao",
sourceLanguage = LocaleAndTranslation("es", "Spanish", ""),
targetLanguage = LocaleAndTranslation("it", "Italian", ""),
)
)
)),
Interaction(JokeInfo, listOf(
QuestionAnswer(
question = "tell me a joke",
answer = JokeOutput.Success(
setup = "What is the tallest building in the world?",
delivery = "The library, it's got the most stories!",
)
)
)),
Interaction(CurrentTimeInfo, listOf(
QuestionAnswer(
question = "what time is it",
answer = CurrentTimeOutput("13:37"),
)
)),
), null)
}
}

View File

@ -32,7 +32,7 @@ import javax.inject.Singleton
*/
@Singleton
class LocaleManager @Inject constructor(
@param:ApplicationContext private val appContext: Context,
@ApplicationContext private val appContext: Context,
dataStore: DataStore<UserSettings>,
) {
// We obtain the system locale list when the app starts (which is also when `LocaleManager` is
@ -71,7 +71,7 @@ class LocaleManager @Inject constructor(
private fun getSentencesLocale(language: Language): LocaleUtils.LocaleResolutionResult {
return try {
LocaleUtils.resolveSupportedLocaleOrThrow(
LocaleUtils.resolveSupportedLocale(
getAvailableLocalesFromLanguage(language),
Sentences.languages
)
@ -93,8 +93,7 @@ class LocaleManager @Inject constructor(
}
else -> {
// exploit the fact that each `Language` is of the form LANGUAGE or LANGUAGE_COUNTRY
LocaleListCompat.create(LocaleUtils.parseLanguageCountry(
language.toString().removePrefix("LANGUAGE_")))
LocaleListCompat.create(LocaleUtils.parseLanguageCountry(language.toString()))
}
}
}

View File

@ -26,7 +26,7 @@ import javax.inject.Singleton
@Singleton
class SpeechOutputDeviceWrapper @Inject constructor(
@param:ApplicationContext private val context: Context,
@ApplicationContext private val context: Context,
private val dataStore: DataStore<UserSettings>,
private val localeManager: LocaleManager,
// this is always instantiated, but will do nothing if

View File

@ -48,7 +48,7 @@ interface SttInputDeviceWrapper {
}
class SttInputDeviceWrapperImpl(
@param:ApplicationContext private val appContext: Context,
@ApplicationContext private val appContext: Context,
dataStore: DataStore<UserSettings>,
private val localeManager: LocaleManager,
private val okHttpClient: OkHttpClient,

View File

@ -40,7 +40,7 @@ interface WakeDeviceWrapper {
typealias DataStoreWakeDevice = org.stypox.dicio.settings.datastore.WakeDevice
class WakeDeviceWrapperImpl(
@param:ApplicationContext private val appContext: Context,
@ApplicationContext private val appContext: Context,
dataStore: DataStore<UserSettings>,
private val okHttpClient: OkHttpClient,
) : WakeDeviceWrapper {

View File

@ -53,7 +53,7 @@ class ErrorActivity : BaseActivity() {
ShareUtils.shareText(this, getString(R.string.error_title), buildMarkdown())
},
onReport = {
ShareUtils.openUrlInBrowser(this, ERROR_GITHUB_ISSUE_URL)
ShareUtils.openUrlInBrowser(this, ERROR_GITHUB_ISSUE_URL, false)
},
onBack = {
finish()

View File

@ -1,26 +1,17 @@
package org.stypox.dicio.error
import java.io.IOException
import java.io.InterruptedIOException
import java.io.PrintWriter
import java.io.StringWriter
import java.net.ConnectException
import java.net.SocketException
import java.net.UnknownHostException
import javax.net.ssl.SSLException
object ExceptionUtils {
fun isNetworkError(throwable: Throwable?): Boolean {
return hasAssignableCause(
throwable,
UnknownHostException::class.java,
SSLException::class.java,
ConnectException::class.java,
SocketException::class.java,
// blocking code disposed
InterruptedException::class.java,
InterruptedIOException::class.java,
throwable, // network api cancellation
IOException::class.java, SocketException::class.java, // blocking code disposed
InterruptedException::class.java, InterruptedIOException::class.java
)
}

View File

@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.Skill
import org.dicio.skill.skill.SkillInfo
import org.stypox.dicio.di.LocaleManager
@ -20,7 +21,6 @@ import org.stypox.dicio.settings.datastore.UserSettingsModule
import org.stypox.dicio.skills.calculator.CalculatorInfo
import org.stypox.dicio.skills.current_time.CurrentTimeInfo
import org.stypox.dicio.skills.fallback.text.TextFallbackInfo
import org.stypox.dicio.skills.listening.ListeningInfo
import org.stypox.dicio.skills.lyrics.LyricsInfo
import org.stypox.dicio.skills.media.MediaInfo
import org.stypox.dicio.skills.navigation.NavigationInfo
@ -28,9 +28,7 @@ import org.stypox.dicio.skills.open.OpenInfo
import org.stypox.dicio.skills.search.SearchInfo
import org.stypox.dicio.skills.telephone.TelephoneInfo
import org.stypox.dicio.skills.timer.TimerInfo
import org.stypox.dicio.skills.translation.TranslationInfo
import org.stypox.dicio.skills.weather.WeatherInfo
import org.stypox.dicio.skills.joke.JokeInfo
import javax.inject.Inject
import javax.inject.Singleton
@ -52,11 +50,9 @@ class SkillHandler @Inject constructor(
TimerInfo,
CurrentTimeInfo,
MediaInfo,
JokeInfo,
ListeningInfo(dataStore),
TranslationInfo,
)
// TODO add more fallback skills (e.g. search)
private val fallbackSkillInfoList = listOf(
TextFallbackInfo,
)

View File

@ -25,7 +25,7 @@ import java.util.Locale
class ExternalPopupInputDevice(
@param:ApplicationContext val context: Context,
@ApplicationContext val context: Context,
private val activityForResultManager: ActivityForResultManager,
localeManager: LocaleManager,
) : SttInputDevice {

View File

@ -254,7 +254,6 @@ private fun SttPopupButton(
@Preview
@Composable
private fun SttPopupBottomSheetPreview() {
val density = LocalDensity.current
var textFieldValue by rememberSaveable { mutableStateOf("") }
AppTheme {
@ -275,11 +274,8 @@ private fun SttPopupBottomSheetPreview() {
scaffoldState = BottomSheetScaffoldState(
SheetState(
skipPartiallyExpanded = true,
confirmValueChange = { true },
density = Density(LocalContext.current),
initialValue = SheetValue.Expanded,
skipHiddenState = false,
positionalThreshold = { with(density) { 56.dp.toPx() } } ,
velocityThreshold = { with(density) { 125.dp.toPx() } },
),
SnackbarHostState(),
)

View File

@ -96,7 +96,6 @@ class SttPopupActivity : BaseActivity() {
speechExtras.getBundle(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT_BUNDLE)
?.let { intent.putExtras(it) }
}
@Suppress("DEPRECATION") // improved API requires Android T
val resultIntent = speechExtras.getParcelable<PendingIntent>(
RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT
)

View File

@ -21,6 +21,7 @@ package org.stypox.dicio.io.input.vosk
import android.content.Context
import android.util.Log
import androidx.core.os.LocaleListCompat
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -31,7 +32,6 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.getAndUpdate
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
import org.stypox.dicio.BuildConfig
import org.stypox.dicio.di.LocaleManager
import org.stypox.dicio.io.input.InputEvent
import org.stypox.dicio.io.input.SttInputDevice
@ -55,6 +55,7 @@ import org.stypox.dicio.util.LocaleUtils
import org.stypox.dicio.util.distinctUntilChangedBlockingFirst
import org.stypox.dicio.util.downloadBinaryFilesWithPartial
import org.stypox.dicio.util.extractZip
import org.vosk.BuildConfig
import org.vosk.LibVosk
import org.vosk.LogLevel
import org.vosk.Model
@ -109,12 +110,20 @@ class VoskInputDevice(
private fun init(locale: Locale): VoskState {
// choose the model url based on the locale
val modelUrl = LocaleUtils.resolveValueForSupportedLocale(locale, MODEL_URLS)
val modelUrl = try {
val localeResolutionResult = LocaleUtils.resolveSupportedLocale(
LocaleListCompat.create(locale),
MODEL_URLS.keys
)
MODEL_URLS[localeResolutionResult.supportedLocaleString]
} catch (e: LocaleUtils.UnsupportedLocaleException) {
null
}
// the model url may change if the user changes app language, or in case of model updates
val modelUrlChanged = try {
sameModelUrlCheck.readText() != modelUrl
} catch (_: IOException) {
} catch (e: IOException) {
// modelUrlCheck file does not exist
true
}
@ -463,17 +472,14 @@ class VoskInputDevice(
"es" to "https://alphacephei.com/vosk/models/vosk-model-small-es-0.42.zip",
"pt" to "https://alphacephei.com/vosk/models/vosk-model-small-pt-0.3.zip",
"tr" to "https://alphacephei.com/vosk/models/vosk-model-small-tr-0.3.zip",
"vn" to "https://alphacephei.com/vosk/models/vosk-model-small-vn-0.4.zip",
"vn" to "https://alphacephei.com/vosk/models/vosk-model-small-vn-0.3.zip",
"it" to "https://alphacephei.com/vosk/models/vosk-model-small-it-0.22.zip",
"nl" to "https://alphacephei.com/vosk/models/vosk-model-small-nl-0.22.zip",
"ca" to "https://alphacephei.com/vosk/models/vosk-model-small-ca-0.4.zip",
"ar" to "https://alphacephei.com/vosk/models/vosk-model-ar-mgb2-0.4.zip",
"ar-tn" to "https://alphacephei.com/vosk/models/vosk-model-small-ar-tn-0.1-linto.zip",
"fa" to "https://alphacephei.com/vosk/models/vosk-model-small-fa-0.42.zip",
"fa" to "https://alphacephei.com/vosk/models/vosk-model-small-fa-0.4.zip",
"ph" to "https://alphacephei.com/vosk/models/vosk-model-tl-ph-generic-0.6.zip",
"uk" to "https://alphacephei.com/vosk/models/vosk-model-small-uk-v3-nano.zip",
"kz" to "https://alphacephei.com/vosk/models/vosk-model-small-kz-0.15.zip",
"sv" to "https://alphacephei.com/vosk/models/vosk-model-small-sv-rhasspy-0.15.zip",
"ja" to "https://alphacephei.com/vosk/models/vosk-model-small-ja-0.22.zip",
"eo" to "https://alphacephei.com/vosk/models/vosk-model-small-eo-0.42.zip",
"hi" to "https://alphacephei.com/vosk/models/vosk-model-small-hi-0.22.zip",
@ -481,10 +487,6 @@ class VoskInputDevice(
"pl" to "https://alphacephei.com/vosk/models/vosk-model-small-pl-0.22.zip",
"uz" to "https://alphacephei.com/vosk/models/vosk-model-small-uz-0.22.zip",
"ko" to "https://alphacephei.com/vosk/models/vosk-model-small-ko-0.22.zip",
"br" to "https://alphacephei.com/vosk/models/vosk-model-br-0.8.zip",
"gu" to "https://alphacephei.com/vosk/models/vosk-model-small-gu-0.42.zip",
"tg" to "https://alphacephei.com/vosk/models/vosk-model-small-tg-0.22.zip",
"te" to "https://alphacephei.com/vosk/models/vosk-model-small-te-0.42.zip",
)
}
}

View File

@ -36,7 +36,6 @@ class AndroidTtsSpeechDevice(private var context: Context, locale: Locale) : Spe
}
}
@Suppress("OVERRIDE_DEPRECATION")
@Deprecated("")
override fun onError(utteranceId: String) {
}

View File

@ -37,7 +37,6 @@ import org.stypox.dicio.di.WakeDeviceWrapper
import org.stypox.dicio.eval.SkillEvaluator
import java.time.Instant
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicReference
import javax.inject.Inject
@AndroidEntryPoint
@ -46,7 +45,7 @@ class WakeService : Service() {
private val job = SupervisorJob()
private val scope = CoroutineScope(Dispatchers.Default + job)
private val listening = AtomicBoolean(false)
private var listening = AtomicBoolean(false)
@Inject
lateinit var skillEvaluator: SkillEvaluator
@ -212,8 +211,6 @@ class WakeService : Service() {
nextWakeWordAllowed = Instant.now().plusMillis(WAKE_WORD_BACKOFF_MILLIS)
onWakeWordDetected()
}
lastHeard.set(Instant.now())
}
} finally {
ar.stop()
@ -327,18 +324,6 @@ class WakeService : Service() {
ContextCompat.startForegroundService(context, intent)
}
fun stop(context: Context) {
try {
context.startService(Intent(context, WakeService::class.java)
.apply { action = ACTION_STOP_WAKE_SERVICE })
} catch (_: IllegalStateException) {
// Must not have been running. No problem with that.
}
}
// Consider the service running if it processed any audio data within the past half second.
fun isRunning(): Boolean = lastHeard.get()?.isAfter(Instant.now().minusMillis(500)) == true
/**
* On Android 10+ cancels any notification telling the user that the Dicio wake word was
* triggered, which is not needed anymore after the main activity starts.
@ -350,8 +335,6 @@ class WakeService : Service() {
}
}
private val lastHeard = AtomicReference<Instant>()
private val TAG = WakeService::class.simpleName
private const val FOREGROUND_NOTIFICATION_CHANNEL_ID =
"org.stypox.dicio.io.wake.WakeService.FOREGROUND"

View File

@ -21,7 +21,7 @@ import java.io.File
import java.io.IOException
class OpenWakeWordDevice(
@param:ApplicationContext private val appContext: Context,
@ApplicationContext private val appContext: Context,
private val okHttpClient: OkHttpClient,
) : WakeDevice {
private val _state: MutableStateFlow<WakeState>

View File

@ -48,11 +48,9 @@ fun languageSetting() = ListSetting(
ListSetting.Value(Language.LANGUAGE_EL, "Ελληνικά"),
ListSetting.Value(Language.LANGUAGE_FR, "Français"),
ListSetting.Value(Language.LANGUAGE_IT, "Italiano"),
ListSetting.Value(Language.LANGUAGE_NL, "Nederlands"),
ListSetting.Value(Language.LANGUAGE_PL, "Polski"),
ListSetting.Value(Language.LANGUAGE_RU, "Русский"),
ListSetting.Value(Language.LANGUAGE_SL, "Slovenščina"),
ListSetting.Value(Language.LANGUAGE_SV, "Svenska"),
ListSetting.Value(Language.LANGUAGE_UK, "Українська"),
),
)

View File

@ -39,7 +39,6 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
@ -210,13 +209,7 @@ private fun SkillSettingsItemHeader(
Row(
modifier = Modifier
.let { it ->
if (toggleExpanded != null)
it.clickable(onClick = toggleExpanded)
else
// still group items together for better accessibility
it.semantics(mergeDescendants = true) {}
}
.let { if (toggleExpanded != null) it.clickable(onClick = toggleExpanded) else it }
.padding(4.dp),
verticalAlignment = Alignment.CenterVertically,
) {
@ -227,8 +220,7 @@ private fun SkillSettingsItemHeader(
}
Icon(
painter = skill.icon(),
// no content description here as it would be duplicate with the text below
contentDescription = null,
contentDescription = skill.name(LocalContext.current),
modifier = Modifier
.padding(start = 12.dp)
.size(24.dp),

View File

@ -24,7 +24,6 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.datasource.LoremIpsum
@ -41,14 +40,12 @@ fun SettingsItem(
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = modifier
.padding(horizontal = 16.dp, vertical = 12.dp)
.semantics(mergeDescendants = true) {},
.padding(horizontal = 16.dp, vertical = 12.dp),
) {
if (icon != null) {
Icon(
imageVector = icon,
// no content description here as it would be duplicate with the text below
contentDescription = null,
contentDescription = title,
)
Spacer(modifier = Modifier.width(24.dp))
}

View File

@ -1,34 +0,0 @@
package org.stypox.dicio.skills.joke
import android.content.Context
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.EmojiEmotions
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.Skill
import org.dicio.skill.skill.SkillInfo
import org.stypox.dicio.R
import org.stypox.dicio.sentences.Sentences
import org.stypox.dicio.util.LocaleUtils
object JokeInfo : SkillInfo("Joke") {
override fun name(context: Context) =
context.getString(R.string.skill_name_joke)
override fun sentenceExample(context: Context) =
context.getString(R.string.skill_sentence_example_joke)
@Composable
override fun icon() =
rememberVectorPainter(Icons.Default.EmojiEmotions)
override fun isAvailable(ctx: SkillContext): Boolean {
return (Sentences.Joke[ctx.sentencesLanguage] != null) &&
LocaleUtils.isLocaleSupported(ctx.locale, JokeSkill.JOKE_SUPPORTED_LOCALES)
}
override fun build(ctx: SkillContext): Skill<*> {
return JokeSkill(JokeInfo, Sentences.Joke[ctx.sentencesLanguage]!!)
}
}

View File

@ -1,41 +0,0 @@
package org.stypox.dicio.skills.joke
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.SkillOutput
import org.stypox.dicio.R
import org.stypox.dicio.io.graphical.Body
import org.stypox.dicio.io.graphical.Subtitle
import org.stypox.dicio.util.getString
sealed interface JokeOutput : SkillOutput {
data class Success(
val setup: String,
val delivery: String,
) : JokeOutput {
override fun getSpeechOutput(ctx: SkillContext): String =
// ensure there is a point between the sentences, so that the TTS makes a pause
if (setup.matches(ENDS_WITH_PUNCTUATION_REGEX))
"$setup $delivery"
else
"$setup. $delivery"
@Composable
override fun GraphicalOutput(ctx: SkillContext) {
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
Subtitle(text = setup)
Body(text = delivery)
}
}
companion object {
val ENDS_WITH_PUNCTUATION_REGEX = ".*\\p{Punct}$".toRegex()
}
}
}

View File

@ -1,44 +0,0 @@
package org.stypox.dicio.skills.joke
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.SkillInfo
import org.dicio.skill.skill.SkillOutput
import org.dicio.skill.standard.StandardRecognizerData
import org.dicio.skill.standard.StandardRecognizerSkill
import org.json.JSONObject
import org.stypox.dicio.sentences.Sentences.Joke
import org.stypox.dicio.util.ConnectionUtils
import org.stypox.dicio.util.LocaleUtils
class JokeSkill(correspondingSkillInfo: SkillInfo, data: StandardRecognizerData<Joke>)
: StandardRecognizerSkill<Joke>(correspondingSkillInfo, data) {
override suspend fun generateOutput(ctx: SkillContext, inputData: Joke): SkillOutput {
// we can use !! because the JokeInfo would have declared this skill unavailable
// if the current locale was not among the supported ones
val locale = LocaleUtils.resolveSupportedLocale(ctx.locale, JOKE_SUPPORTED_LOCALES)!!
if (locale == "en") {
val joke: JSONObject = ConnectionUtils.getPageJson(RANDOM_JOKE_URL_EN)
return JokeOutput.Success(
setup = joke.getString("setup"),
delivery = joke.getString("punchline")
)
} else {
val joke: JSONObject = ConnectionUtils.getPageJson(
"$RANDOM_JOKE_URL?lang=$locale&safe-mode&type=twopart"
)
return JokeOutput.Success(
setup = joke.getString("setup"),
delivery = joke.getString("delivery")
)
}
}
companion object {
private const val RANDOM_JOKE_URL = "https://v2.jokeapi.dev/joke/Any"
private const val RANDOM_JOKE_URL_EN = "https://official-joke-api.appspot.com/random_joke"
val JOKE_SUPPORTED_LOCALES = listOf(
"cs", "de", "en", "es", "fr", "pt"
)
}
}

View File

@ -1,36 +0,0 @@
package org.stypox.dicio.skills.listening
import android.content.Context
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Hearing
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.datastore.core.DataStore
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.Skill
import org.dicio.skill.skill.SkillInfo
import org.stypox.dicio.R
import org.stypox.dicio.sentences.Sentences
import org.stypox.dicio.settings.datastore.UserSettings
class ListeningInfo(
val dataStore: DataStore<UserSettings>,
) : SkillInfo("listening") {
override fun name(context: Context) =
context.getString(R.string.skill_name_listening)
override fun sentenceExample(context: Context) =
context.getString(R.string.skill_sentence_example_listening)
@Composable
override fun icon() =
rememberVectorPainter(Icons.Default.Hearing)
override fun isAvailable(ctx: SkillContext): Boolean {
return Sentences.Listening[ctx.sentencesLanguage] != null
}
override fun build(ctx: SkillContext): Skill<*> {
return ListeningSkill(this, Sentences.Listening[ctx.sentencesLanguage]!!)
}
}

View File

@ -1,28 +0,0 @@
package org.stypox.dicio.skills.listening
import org.dicio.skill.context.SkillContext
import org.stypox.dicio.R
import org.stypox.dicio.io.graphical.HeadlineSpeechSkillOutput
import org.stypox.dicio.util.getString
class ListeningOutput(
private val isWakeWordEnabled: Boolean,
private val previouslyRunning: Boolean,
private val shouldBeRunning: Boolean,
) : HeadlineSpeechSkillOutput {
override fun getSpeechOutput(ctx: SkillContext): String = if (!isWakeWordEnabled) {
ctx.getString(R.string.skill_listening_disabled)
} else if (previouslyRunning) {
if (shouldBeRunning) {
ctx.getString(R.string.skill_listening_already_listening)
} else {
ctx.getString(R.string.skill_listening_stop_listening)
}
} else {
if (shouldBeRunning) {
ctx.getString(R.string.skill_listening_started_listening)
} else {
ctx.getString(R.string.skill_listening_not_listening)
}
}
}

View File

@ -1,32 +0,0 @@
package org.stypox.dicio.skills.listening
import kotlinx.coroutines.flow.first
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.SkillOutput
import org.dicio.skill.standard.StandardRecognizerData
import org.dicio.skill.standard.StandardRecognizerSkill
import org.stypox.dicio.io.wake.WakeService
import org.stypox.dicio.sentences.Sentences.Listening
import org.stypox.dicio.settings.datastore.WakeDevice
class ListeningSkill(val listeningInfo: ListeningInfo, data: StandardRecognizerData<Listening>) :
StandardRecognizerSkill<Listening>(listeningInfo, data) {
override suspend fun generateOutput(ctx: SkillContext, inputData: Listening): SkillOutput {
if (listeningInfo.dataStore.data.first().wakeDevice == WakeDevice.WAKE_DEVICE_NOTHING) {
return ListeningOutput(false, false, false)
}
val previouslyRunning = WakeService.isRunning()
val shouldBeRunning = when (inputData) {
is Listening.Start -> true
is Listening.Stop -> false
}
if (shouldBeRunning) {
WakeService.start(ctx.android)
} else {
WakeService.stop(ctx.android)
}
return ListeningOutput(true, previouslyRunning, shouldBeRunning)
}
}

View File

@ -20,23 +20,66 @@ import coil.compose.AsyncImage
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.InteractionPlan
import org.dicio.skill.skill.SkillOutput
import org.dicio.skill.skill.Specificity
import org.stypox.dicio.R
import org.stypox.dicio.io.graphical.HeadlineSpeechSkillOutput
import org.stypox.dicio.io.graphical.Headline
import org.stypox.dicio.sentences.Sentences
import org.stypox.dicio.skills.search.SearchOutput.Data
import org.stypox.dicio.util.RecognizeEverythingSkill
import org.stypox.dicio.util.ShareUtils
import org.stypox.dicio.util.getString
sealed interface SearchOutput : SkillOutput {
class SearchOutput(
private val results: List<Data>?,
private val askAgain: Boolean,
) : SkillOutput {
class Data (
val title: String,
val thumbnailUrl: String,
val url: String,
val description: String,
)
data class Results(private val results: List<Data>) : SearchOutput {
override fun getSpeechOutput(ctx: SkillContext): String =
ctx.getString(R.string.skill_search_here_is_what_i_found)
override fun getSpeechOutput(ctx: SkillContext): String = ctx.getString(
if (results == null)
R.string.skill_search_what_question
else if (results.isNotEmpty())
R.string.skill_search_here_is_what_i_found
else if (askAgain)
R.string.skill_search_no_results
else
// if the search continues to return 0 results, don't keep asking
R.string.skill_search_no_results_stop
)
@Composable
override fun GraphicalOutput(ctx: SkillContext) {
override fun getInteractionPlan(ctx: SkillContext): InteractionPlan {
if (!results.isNullOrEmpty() || !askAgain) {
return InteractionPlan.FinishInteraction
}
val searchAnythingSkill = object : RecognizeEverythingSkill(SearchInfo) {
override suspend fun generateOutput(
ctx: SkillContext,
inputData: String
): SkillOutput {
// ask again only if this is the first time we ask the user to provide what
// to search for, otherwise we could continue asking indefinitely
return SearchOutput(searchOnDuckDuckGo(ctx, inputData), results == null)
}
}
return InteractionPlan.StartSubInteraction(
reopenMicrophone = true,
nextSkills = listOf(
SearchSkill(SearchInfo, Sentences.Search[ctx.sentencesLanguage]!!),
searchAnythingSkill,
),
)
}
@Composable
override fun GraphicalOutput(ctx: SkillContext) {
if (results.isNullOrEmpty()) {
Headline(text = getSpeechOutput(ctx))
} else {
Column(
verticalArrangement = Arrangement.spacedBy(12.dp),
) {
@ -46,79 +89,15 @@ sealed interface SearchOutput : SkillOutput {
}
}
}
object NoSearchTerm : SearchOutput, HeadlineSpeechSkillOutput {
override fun getSpeechOutput(ctx: SkillContext): String =
ctx.getString(R.string.skill_search_what_question)
override fun getInteractionPlan(ctx: SkillContext): InteractionPlan =
getRetryInteractionPlan(ctx)
}
object NoResultAskAgain : SearchOutput, HeadlineSpeechSkillOutput {
override fun getSpeechOutput(ctx: SkillContext): String =
ctx.getString(R.string.skill_search_no_results)
override fun getInteractionPlan(ctx: SkillContext): InteractionPlan =
getRetryInteractionPlan(ctx)
}
object NoResultStop : SearchOutput, HeadlineSpeechSkillOutput {
override fun getSpeechOutput(ctx: SkillContext): String =
ctx.getString(R.string.skill_search_no_results_stop)
}
object RecaptchaRequested : SearchOutput, HeadlineSpeechSkillOutput {
override fun getSpeechOutput(ctx: SkillContext): String =
ctx.getString(R.string.skill_search_duckduckgo_recaptcha)
}
class Data (
val title: String,
val thumbnailUrl: String,
val url: String,
val description: String,
)
companion object {
private fun getRetryInteractionPlan(ctx: SkillContext): InteractionPlan {
val searchAnythingSkill = object : RecognizeEverythingSkill(SearchInfo) {
override suspend fun generateOutput(
ctx: SkillContext,
inputData: String
): SkillOutput {
// if the search fails again, do not ask the user to retry, to avoid going
// on indefinitely
return searchOnDuckDuckGo(ctx, inputData, askAgainIfNoResult = false)
}
}
return InteractionPlan.StartSubInteraction(
reopenMicrophone = true,
nextSkills = listOf(
SearchSkill(
correspondingSkillInfo = SearchInfo,
data = Sentences.Search[ctx.sentencesLanguage]!!,
// increase the specificity from LOW to MEDIUM on purpose, so that this has
// priority over searchAnythingSkill
specificity = Specificity.MEDIUM,
// if the search fails again, do not ask the user to retry, to avoid going
// on indefinitely
askAgainIfNoResult = false,
),
searchAnythingSkill,
),
)
}
}
}
@Composable
private fun SearchResult(data: Data) {
private fun SearchResult(data: SearchOutput.Data) {
val context = LocalContext.current
Column(
modifier = Modifier.clickable { ShareUtils.openUrlInBrowser(context, data.url) }
modifier = Modifier.clickable {
ShareUtils.openUrlInBrowser(context, data.url)
}
) {
Row(
verticalAlignment = Alignment.CenterVertically

View File

@ -1,10 +1,9 @@
package org.stypox.dicio.skills.search
import androidx.core.net.toUri
import androidx.core.os.LocaleListCompat
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.SkillInfo
import org.dicio.skill.skill.SkillOutput
import org.dicio.skill.skill.Specificity
import org.dicio.skill.standard.StandardRecognizerData
import org.dicio.skill.standard.StandardRecognizerSkill
import org.jsoup.Jsoup
@ -13,16 +12,13 @@ import org.stypox.dicio.sentences.Sentences.Search
import org.stypox.dicio.util.ConnectionUtils
import org.stypox.dicio.util.LocaleUtils
class SearchSkill(
correspondingSkillInfo: SkillInfo,
data: StandardRecognizerData<Search>,
// the following two params are exposed because they are used in SearchOutput
specificity: Specificity = data.specificity,
private val askAgainIfNoResult: Boolean = true,
) : StandardRecognizerSkill<Search>(correspondingSkillInfo, data, specificity) {
class SearchSkill(correspondingSkillInfo: SkillInfo, data: StandardRecognizerData<Search>)
: StandardRecognizerSkill<Search>(correspondingSkillInfo, data) {
override suspend fun generateOutput(ctx: SkillContext, inputData: Search): SkillOutput {
val query = when (inputData) { is Search.Query -> inputData.what }
return searchOnDuckDuckGo(ctx, query, askAgainIfNoResult)
val query = when (inputData) {
is Search.Query -> inputData.what ?: return SearchOutput(null, true)
}
return SearchOutput(searchOnDuckDuckGo(ctx, query), true)
}
}
@ -38,71 +34,58 @@ private val DUCK_DUCK_GO_SUPPORTED_LOCALES = listOf(
"tw-tz", "th-en", "tr-tr", "us-en", "us-es", "ua-uk", "uk-en", "vn-en"
)
internal fun searchOnDuckDuckGo(
ctx: SkillContext,
query: String?,
askAgainIfNoResult: Boolean,
): SearchOutput {
if (query.isNullOrBlank()) {
return SearchOutput.NoSearchTerm
}
internal fun searchOnDuckDuckGo(ctx: SkillContext, query: String): List<SearchOutput.Data> {
// find the locale supported by DuckDuckGo that matches the user locale the most
val locale = LocaleUtils.resolveValueForSupportedLocale(
ctx.locale,
DUCK_DUCK_GO_SUPPORTED_LOCALES.associateBy {
// DuckDuckGo locale names have first the country and then the language, but the locale
// selection function assumes the opposite
it.split("-").reversed().joinToString(separator = "-")
}
// default to English when no locale is supported
) ?: "us-en"
var resolvedLocale: LocaleUtils.LocaleResolutionResult? = null
try {
resolvedLocale = LocaleUtils.resolveSupportedLocale(
LocaleListCompat.create(ctx.locale), DUCK_DUCK_GO_SUPPORTED_LOCALES
)
} catch (ignored: LocaleUtils.UnsupportedLocaleException) {
}
val locale = resolvedLocale?.supportedLocaleString ?: ""
// make request using headers
val html: String = ConnectionUtils.getPage(
DUCK_DUCK_GO_SEARCH_URL + ConnectionUtils.urlEncode(query),
mapOf(
"User-Agent" to "Mozilla/5.0 (X11; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0",
"Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Host" to "html.duckduckgo.com",
"Cookie" to "kl=$locale",
)
object : HashMap<String?, String?>() {
init {
put(
"User-Agent",
"Mozilla/5.0 (X11; Linux x86_64; rv:135.0) Gecko/20100101 Firefox/135.0"
)
put(
"Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
)
put(
"Host",
"html.duckduckgo.com"
)
put("Cookie", "kl=$locale")
}
}
)
// Sometimes DuckDuckGo replies with a recaptcha request, and no results are provided then
if (html.contains("anomaly-modal__title")) {
return SearchOutput.RecaptchaRequested
}
val document: Document = Jsoup.parse(html)
val elements = document.select("div[class=links_main links_deep result__body]")
val results: MutableList<SearchOutput.Data> = ArrayList()
val result: MutableList<SearchOutput.Data> = ArrayList()
for (element in elements) {
try {
// the url is under the "uddg" query parameter
val ddgUrl = element.select("a[class=result__a]").first()!!.attr("href")
val url = ddgUrl.toUri().getQueryParameter("uddg")!!
results.add(
result.add(
SearchOutput.Data(
title = element.select("a[class=result__a]").first()!!.text(),
thumbnailUrl = "https:" + element.select("img[class=result__icon__img]")
.first()!!.attr("src"),
url = url,
url = ConnectionUtils.urlDecode(
element.select("a[class=result__a]").first()!!.attr("href")
),
description = element.select("a[class=result__snippet]").first()!!.text(),
)
)
} catch (_: NullPointerException) {
} catch (ignored: NullPointerException) {
}
}
return if (results.isEmpty()) {
if (askAgainIfNoResult) {
SearchOutput.NoResultAskAgain
} else {
SearchOutput.NoResultStop
}
} else {
SearchOutput.Results(results)
}
return result
}

View File

@ -1,34 +0,0 @@
package org.stypox.dicio.skills.translation
import android.content.Context
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Language
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.Skill
import org.dicio.skill.skill.SkillInfo
import org.stypox.dicio.R
import org.stypox.dicio.sentences.Sentences
import org.stypox.dicio.util.LocaleUtils
object TranslationInfo : SkillInfo("translation") {
override fun name(context: Context) =
context.getString(R.string.skill_name_translation)
override fun sentenceExample(context: Context) =
context.getString(R.string.skill_sentence_example_translation)
@Composable
override fun icon() =
rememberVectorPainter(Icons.Default.Language)
override fun isAvailable(ctx: SkillContext): Boolean {
return (Sentences.Translation[ctx.sentencesLanguage] != null) &&
LocaleUtils.isLocaleSupported(ctx.locale, TranslationSkill.TRANSLATE_SUPPORTED_LOCALES)
}
override fun build(ctx: SkillContext): Skill<*> {
return TranslationSkill(TranslationInfo, Sentences.Translation[ctx.sentencesLanguage]!!)
}
}

View File

@ -1,271 +0,0 @@
package org.stypox.dicio.skills.translation
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
import androidx.compose.material.icons.filled.ContentCopy
import androidx.compose.material.icons.filled.Share
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
import androidx.compose.ui.tooling.preview.datasource.LoremIpsum
import androidx.compose.ui.unit.dp
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.SkillOutput
import org.stypox.dicio.R
import org.stypox.dicio.cldr.CldrLanguages.LocaleAndTranslation
import org.stypox.dicio.di.SkillContextImpl
import org.stypox.dicio.io.graphical.Headline
import org.stypox.dicio.io.graphical.HeadlineSpeechSkillOutput
import org.stypox.dicio.io.graphical.Subtitle
import org.stypox.dicio.ui.home.SkillAnswerCard
import org.stypox.dicio.ui.theme.AppTheme
import org.stypox.dicio.util.ShareUtils
import org.stypox.dicio.util.getString
sealed interface TranslationOutput : SkillOutput {
object EmptyQuery: HeadlineSpeechSkillOutput, TranslationOutput {
override fun getSpeechOutput(ctx: SkillContext): String = ctx.getString(
R.string.skill_translation_failed_no_query
)
}
data class UnknownLanguage(val query: String) : TranslationOutput, HeadlineSpeechSkillOutput {
override fun getSpeechOutput(ctx: SkillContext): String =
ctx.getString(R.string.skill_translation_unknown_language, query)
}
data class UnsupportedLanguage(val language: LocaleAndTranslation) : TranslationOutput, HeadlineSpeechSkillOutput {
override fun getSpeechOutput(ctx: SkillContext): String = ctx.getString(
R.string.skill_translation_unsupported_language,
language.translation,
language.locale
)
}
data class ApiError(
val error: String,
val sourceLanguage: LocaleAndTranslation?,
val targetLanguage: LocaleAndTranslation,
): TranslationOutput {
override fun getSpeechOutput(ctx: SkillContext): String = ctx.getString(
R.string.skill_translation_failed, targetLanguage.translation
)
@Composable
override fun GraphicalOutput(ctx: SkillContext) {
Column(
verticalArrangement = Arrangement.spacedBy(8.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Headline(text = getSpeechOutput(ctx))
Subtitle(text = error)
TranslationHeader(sourceLanguage, targetLanguage)
}
}
}
data class Success(
val translation: String,
val sourceLanguage: LocaleAndTranslation?,
val targetLanguage: LocaleAndTranslation,
): TranslationOutput {
override fun getSpeechOutput(ctx: SkillContext): String = ctx.getString(
R.string.skill_translation_success, targetLanguage.translation
)
@Composable
override fun GraphicalOutput(ctx: SkillContext) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Spacer(modifier = Modifier.height(4.dp))
SelectionContainer {
Text(
text = translation,
textAlign = if (translation.length < 100) {
TextAlign.Center
} else {
TextAlign.Justify
},
style = if (translation.length < 100) {
MaterialTheme.typography.headlineSmall
} else {
MaterialTheme.typography.bodyLarge
},
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 4.dp),
)
}
Spacer(modifier = Modifier.height(8.dp))
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
) {
IconButton(
onClick = { ShareUtils.copyToClipboard(ctx.android, translation) },
modifier = Modifier.padding(end = 4.dp),
) {
Icon(
imageVector = Icons.Default.ContentCopy,
contentDescription = stringResource(R.string.copy_to_clipboard),
)
}
TranslationHeader(
sourceLanguage = sourceLanguage,
targetLanguage = targetLanguage,
modifier = Modifier.weight(1.0f, fill = false),
)
IconButton(
onClick = { ShareUtils.shareText(ctx.android, "", translation) },
modifier = Modifier.padding(start = 4.dp),
) {
Icon(
imageVector = Icons.Default.Share,
contentDescription = stringResource(R.string.share),
)
}
}
}
}
}
}
@Composable
fun TranslationHeader(
sourceLanguage: LocaleAndTranslation?,
targetLanguage: LocaleAndTranslation,
modifier: Modifier = Modifier,
) {
Surface(
shape = RoundedCornerShape(8.dp),
modifier = modifier,
) {
Row(
modifier = Modifier
.padding(horizontal = 10.dp, vertical = 5.dp)
.wrapContentWidth(),
verticalAlignment = Alignment.CenterVertically
) {
TranslationLanguage(
languageName = sourceLanguage?.translation
?: stringResource(R.string.skill_translation_auto),
locale = sourceLanguage?.locale,
alignment = Alignment.End,
modifier = Modifier.weight(1f, fill = false),
)
Icon(
imageVector = Icons.AutoMirrored.Default.KeyboardArrowRight,
contentDescription = stringResource(R.string.skill_translation_to),
modifier = Modifier
.padding(horizontal = 4.dp)
.size(20.dp)
)
TranslationLanguage(
languageName = targetLanguage.translation,
locale = targetLanguage.locale,
alignment = Alignment.Start,
modifier = Modifier.weight(1f, fill = false),
)
}
}
}
@Preview
@Composable
private fun TranslationHeaderPreview() {
Column {
TranslationHeader(
LocaleAndTranslation("it", "Italian", ""),
LocaleAndTranslation("en", "English", ""),
)
TranslationHeader(
null,
LocaleAndTranslation("long ".repeat(20), "Long ".repeat(20), ""),
)
}
}
@Composable
fun TranslationLanguage(
languageName: String,
locale: String?,
alignment: Alignment.Horizontal,
modifier: Modifier = Modifier,
) {
Text(
text = buildAnnotatedString {
withStyle(SpanStyle(fontWeight = FontWeight.Medium)) {
append(languageName)
}
if (locale != null) {
append(" (")
append(locale)
append(")")
}
},
style = MaterialTheme.typography.bodyLarge,
textAlign = if (alignment == Alignment.Start) TextAlign.Start else TextAlign.End,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
modifier = modifier,
)
}
@Preview
@Composable
private fun TranslationLanguagePreview() {
TranslationLanguage(
languageName = "Italian",
locale = "it",
Alignment.End
)
}
class TranslationOutputPrevParams : CollectionPreviewParameterProvider<TranslationOutput>(listOf(
TranslationOutput.EmptyQuery,
TranslationOutput.UnknownLanguage("languagewhichdoesntmakesense"),
TranslationOutput.UnsupportedLanguage(LocaleAndTranslation("ace", "Acehnese", "")),
TranslationOutput.ApiError("Invalid source language", null, LocaleAndTranslation("en", "English", "")),
TranslationOutput.ApiError("Another long error ".repeat(10), LocaleAndTranslation("long long long", "Veeeery long language name", ""), LocaleAndTranslation("en", "English", "")),
TranslationOutput.Success("Good translation", null, LocaleAndTranslation("en", "English", "")),
TranslationOutput.Success(LoremIpsum(50).values.first().replace("\n", " "), LocaleAndTranslation("long long long", "Veeeery long language name", ""), LocaleAndTranslation("en", "English", "")),
))
@Preview(showSystemUi = false, showBackground = true)
@Composable
private fun TranslationOutputPreview(
@PreviewParameter(TranslationOutputPrevParams::class) translationOutput: TranslationOutput
) {
AppTheme {
SkillAnswerCard {
translationOutput.GraphicalOutput(SkillContextImpl.newForPreviews(LocalContext.current))
}
}
}

View File

@ -1,105 +0,0 @@
package org.stypox.dicio.skills.translation
import org.dicio.skill.context.SkillContext
import org.dicio.skill.skill.SkillInfo
import org.dicio.skill.skill.SkillOutput
import org.dicio.skill.standard.StandardRecognizerData
import org.dicio.skill.standard.StandardRecognizerSkill
import org.stypox.dicio.cldr.CldrLanguages
import org.stypox.dicio.cldr.CldrLanguages.LocaleAndTranslation
import org.stypox.dicio.sentences.Sentences.Translation
import org.stypox.dicio.sentences.Sentences.Translation.Translate
import org.stypox.dicio.util.ConnectionUtils
import org.stypox.dicio.util.LocaleUtils
import org.stypox.dicio.util.codeToLanguageOrDefault
import org.stypox.dicio.util.getLocaleByLanguageName
class TranslationSkill(correspondingSkillInfo: SkillInfo, data: StandardRecognizerData<Translation>)
: StandardRecognizerSkill<Translation>(correspondingSkillInfo, data) {
private fun findCodeInSupportedLocales(language: LocaleAndTranslation): String? {
return TRANSLATE_SUPPORTED_LOCALES.firstOrNull { it.lowercase() == language.locale }
?: TRANSLATE_SUPPORTED_LOCALES.firstOrNull { language.locale.startsWith(it.lowercase()) }
}
// This connects to lingva.ml which runs the Lingva Translate frontend to Google Translate
// TODO: Add more servers in like Libre Translate or DeepL
override suspend fun generateOutput(ctx: SkillContext, inputData: Translation): SkillOutput {
val input = when (inputData) { is Translate -> inputData }
// we can use !! because the TranslationInfo would have declared this skill unavailable
// if the current locale was not among the supported ones
val currentLocale = LocaleUtils.resolveSupportedLocale(
ctx.locale, TRANSLATE_SUPPORTED_LOCALES)!!
// we can use !! here because `CldrLanguages` is generated by the `unicode-cldr-plugin`
// based on the locales supported by the app, and `ctx.locale` is surely such a locale
val cldr = CldrLanguages[ctx.locale.language]!!
// extract the query from the input
val query = ConnectionUtils.percentEncode(
input.query ?: return TranslationOutput.EmptyQuery
)
// Extract language data from input, then convert the language's to language codes.
// Unfortunately we have to use duplicate code here, since it contains returns.
val sourceCode = input.source?.let { query: String ->
val language = cldr.getLocaleByLanguageName(query)
?: return@generateOutput TranslationOutput.UnknownLanguage(query)
findCodeInSupportedLocales(language)
?: return@generateOutput TranslationOutput.UnsupportedLanguage(language)
}
val targetCode = input.target?.let { query: String ->
val language = cldr.getLocaleByLanguageName(query)
?: return@generateOutput TranslationOutput.UnknownLanguage(query)
findCodeInSupportedLocales(language)
?: return@generateOutput TranslationOutput.UnsupportedLanguage(language)
}
val (source, target) = if (sourceCode != null && targetCode != null) {
Pair(sourceCode, targetCode)
} else if (sourceCode != null) {
Pair(sourceCode, currentLocale)
} else if (targetCode != null) {
Pair("auto", targetCode)
} else {
Pair("auto", currentLocale)
}
// these are just used to show the correct language name in the
val sourceLanguage = if (source == "auto") null else cldr.codeToLanguageOrDefault(source)
val targetLanguage = cldr.codeToLanguageOrDefault(target)
// make the API call
val translation = ConnectionUtils.getPageJson("$TRANSLATE_URL/$source/$target/$query")
if (!translation.has("translation")) {
return TranslationOutput.ApiError(
error = translation.optString("error"),
sourceLanguage = sourceLanguage,
targetLanguage = targetLanguage,
)
}
return TranslationOutput.Success(
translation = translation.getString("translation"),
sourceLanguage = sourceLanguage,
targetLanguage = targetLanguage,
)
}
companion object {
private const val TRANSLATE_URL = "https://lingva.ml/api/v1"
val TRANSLATE_SUPPORTED_LOCALES = listOf(
"af", "sq", "am", "ar", "hy", "as", "ay", "az", "bm", "eu",
"be", "bn", "bho", "bs", "bg", "ca", "ceb", "ny", "zh", "zh_HANT",
"co", "hr", "cs", "da", "dv", "doi", "nl", "en", "eo", "et", "ee",
"tl", "fi", "fr", "fy", "gl", "ka", "de", "el", "gn", "gu", "ht",
"ha", "haw", "iw", "hi", "hmn", "hu", "is", "ig", "ilo", "id", "ga",
"it", "ja", "jw", "kn", "kk", "km", "rw", "gom", "ko", "kri", "ku",
"ckb", "ky", "lo", "la", "lv", "ln", "lt", "lg", "lb", "mk", "mai",
"mg", "ms", "ml", "mt", "mi", "mr", "mni-Mtei", "lus", "mn", "my",
"ne", "no", "or", "om", "ps", "fa", "pl", "pt", "pa", "qu", "ro",
"ru", "sm", "sa", "gd", "nso", "sr", "st", "sn", "sd", "si", "sk",
"sl", "so", "es", "su", "sw", "sv", "tg", "ta", "tt", "te", "th",
"ti", "ts", "tr", "tk", "ak", "uk", "ur", "ug", "uz", "vi", "cy",
"xh", "yi", "yo", "zu"
)
}
}

View File

@ -146,7 +146,7 @@ fun HomeScreen(
searchIcon = {
Icon(
imageVector = Icons.Default.QuestionAnswer,
contentDescription = stringResource(R.string.text_input_hint),
contentDescription = null,
)
},
navigationIcon = navigationIcon,

View File

@ -179,20 +179,6 @@ private fun SttFabPreview(@PreviewParameter(SttStatesPreviews::class) state: Stt
}
}
// just another preview to take screenshots for presentations
@Preview
@Composable
private fun SttFabPreview2(@PreviewParameter(SttStatesPreviews::class) state: SttState) {
AppTheme {
Column(modifier = Modifier.padding(16.dp)) {
SttFabImpl(
state = state,
onClick = {},
)
}
}
}
// this preview is useful to take screenshots
@Preview(device = "spec:width=2500px,height=2340px,dpi=440")
@Composable

View File

@ -1,9 +1,7 @@
package org.stypox.dicio.ui.home
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
@ -13,15 +11,12 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
@ -29,7 +24,6 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import org.dicio.skill.skill.SkillInfo
import org.stypox.dicio.R
import org.stypox.dicio.eval.SkillHandler
import org.stypox.dicio.ui.theme.AppTheme
import org.stypox.dicio.ui.util.SkillInfoPreviews
@ -67,12 +61,12 @@ private fun SkillRow(
modifier: Modifier = Modifier,
) {
Row(
modifier = modifier.semantics(mergeDescendants = true) {},
modifier = modifier,
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = skill.icon(),
contentDescription = null,
contentDescription = skill.name(LocalContext.current),
modifier = Modifier.size(36.dp)
)
Spacer(modifier = Modifier.width(12.dp))
@ -121,15 +115,6 @@ private fun WhatICanDoPreview() {
}
}
// this preview is useful to take screenshots for presentations
@Preview
@Composable
private fun WhatICanDoAllPreview() {
AppTheme {
WhatICanDo(skills = SkillHandler.newForPreviews(LocalContext.current).allSkillInfoList)
}
}
@Preview
@Composable
private fun NoEnabledSkillsPreview() {
@ -137,62 +122,3 @@ private fun NoEnabledSkillsPreview() {
WhatICanDo(skills = listOf())
}
}
// this preview is useful to take screenshots for presentations
@Preview(device = "spec:width=2400px,height=2340px,dpi=440")
@Composable
private fun SkillChipsPreview() {
AppTheme {
@OptIn(ExperimentalLayoutApi::class)
FlowRow(
horizontalArrangement = Arrangement.SpaceEvenly
) {
val skills = SkillHandler.newForPreviews(LocalContext.current).allSkillInfoList
for (skill in skills) {
Surface(
color = MaterialTheme.colorScheme.secondaryContainer,
shape = MaterialTheme.shapes.large,
modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp),
) {
Row(
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = skill.icon(),
contentDescription = null,
modifier = Modifier.size(36.dp)
)
Spacer(modifier = Modifier.width(12.dp))
Text(
text = skill.name(LocalContext.current),
style = MaterialTheme.typography.titleMedium,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
}
}
}
}
}
// this preview is useful to take screenshots for presentations
@Preview(device = "spec:width=500px,height=2340px,dpi=440")
@Composable
private fun SkillIconsPreview() {
@OptIn(ExperimentalLayoutApi::class)
FlowRow(
horizontalArrangement = Arrangement.Center
) {
val skills = SkillHandler.newForPreviews(LocalContext.current).allSkillInfoList
for (skill in skills) {
Icon(
painter = skill.icon(),
contentDescription = null,
tint = Color(0xFF6D9861),
modifier = Modifier.size(36.dp)
)
}
}
}

View File

@ -25,7 +25,6 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@ -82,7 +81,7 @@ private fun DrawerHeader(modifier: Modifier = Modifier) {
Surface(
shape = MaterialTheme.shapes.extraLarge,
color = MaterialTheme.colorScheme.primary,
modifier = modifier.clearAndSetSemantics {}
modifier = modifier
) {
Row(
verticalAlignment = Alignment.CenterVertically,
@ -96,7 +95,6 @@ private fun DrawerHeader(modifier: Modifier = Modifier) {
text = stringResource(R.string.app_name),
style = MaterialTheme.typography.headlineMedium,
color = MaterialTheme.colorScheme.onPrimary,
maxLines = 1,
)
Text(
text = stringResource(R.string.drawer_header_subtitle),

View File

@ -11,12 +11,10 @@ import androidx.compose.material3.rememberDrawerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import kotlinx.coroutines.launch
import org.stypox.dicio.R
import org.stypox.dicio.io.input.stt_popup.SttPopupActivity
import org.stypox.dicio.settings.MainSettingsScreen
import org.stypox.dicio.settings.SkillSettingsScreen
@ -31,11 +29,20 @@ fun Navigation() {
) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = stringResource(R.string.back),
contentDescription = null,
)
}
}
// TODO this causes a crash when resuming a process from disk, the stacktrace is:
//
// java.lang.IllegalStateException: Restoring the Navigation back stack failed: destination
// 186859275 cannot be found from the current destination ComposeNavGraph(0x0)
// startDestination={Destination(0x19acea6) route=org.stypox.dicio.ui.nav.Home}
// at androidx.navigation.NavController.onGraphCreated(NavController.kt:1365)
//
// this is caused by a bug in the type-safe Compose Navigation library:
// https://issuetracker.google.com/issues/341801005
NavHost(navController = navController, startDestination = Home) {
composable<Home> {
val context = LocalContext.current

View File

@ -1,30 +0,0 @@
package org.stypox.dicio.util
import org.dicio.skill.standard.util.nfkdNormalizeWord
import org.stypox.dicio.cldr.CldrLanguages.LocaleAndTranslation
import org.stypox.dicio.util.StringUtils.customStringDistanceCleaned
/**
* Returns the [LocaleAndTranslation] whose name best matches [query], or `null` if none match well
* enough.
*/
fun List<LocaleAndTranslation>.getLocaleByLanguageName(query: String): LocaleAndTranslation? {
val normalizedQuery = nfkdNormalizeWord(query.trim())
return this.minBy { item ->
customStringDistanceCleaned(item.translationNormalized, normalizedQuery)
}.takeIf { item ->
customStringDistanceCleaned(item.translationNormalized, normalizedQuery) <= 0
}
}
/**
* Returns the [LocaleAndTranslation] corresponding to the provided [code], or `null` if there is no
* translation available for [code]. In [org.stypox.dicio.cldr.CldrLanguages]'s list the more
* relevant translations for the same language come before the alternative ones, and this function
* will choose the more relevant one. E.g. "Central Kurdish" could alternatively be written as
* "Kurdish, Central".
*/
fun List<LocaleAndTranslation>.codeToLanguageOrDefault(code: String): LocaleAndTranslation {
return this.firstOrNull { lang -> lang.locale == code }
?: LocaleAndTranslation(code, code, code)
}

View File

@ -1,10 +1,9 @@
package org.stypox.dicio.util
import android.net.Uri
import org.json.JSONException
import org.json.JSONObject
import org.stypox.dicio.util.ConnectionUtils.percentEncode
import java.io.IOException
import java.io.UnsupportedEncodingException
import java.net.URL
import java.net.URLDecoder
import java.net.URLEncoder
@ -13,8 +12,8 @@ import java.util.Scanner
object ConnectionUtils {
@Throws(IOException::class)
fun getPage(
url: String,
headers: Map<String, String?>
url: String?,
headers: Map<String?, String?>
): String {
val connection = URL(url).openConnection()
for ((key, value) in headers) {
@ -25,43 +24,22 @@ object ConnectionUtils {
}
@Throws(IOException::class)
fun getPage(url: String): String {
return getPage(url, emptyMap())
fun getPage(url: String?): String {
return getPage(url, emptyMap<String?, String>())
}
@Throws(IOException::class, JSONException::class)
fun getPageJson(url: String): JSONObject {
fun getPageJson(url: String?): JSONObject {
return JSONObject(getPage(url))
}
/**
* Encodes [s] as `application/x-www-form-urlencoded` so that it can be used as a parameter in
* URL query strings. Note: space will be encoded as `+` which makes sense for URL query strings
* but not for the URL path, in that case use [percentEncode] instead.
*/
fun urlEncode(s: String): String {
@Throws(UnsupportedEncodingException::class)
fun urlEncode(s: String?): String {
return URLEncoder.encode(s, "utf8")
}
/**
* Decodes [s] from `application/x-www-form-urlencoded`.
*/
fun urlDecode(s: String): String {
@Throws(UnsupportedEncodingException::class)
fun urlDecode(s: String?): String {
return URLDecoder.decode(s, "utf8")
}
/**
* Percent-encodes [s] so that it can be used in a URL path. Note: space will be encoded as
* `%20`.
*/
fun percentEncode(s: String): String {
return Uri.encode(s)
}
/**
* Percent-decodes [s].
*/
fun percentDecode(s: String): String {
return Uri.decode(s)
}
}

View File

@ -4,7 +4,6 @@ import androidx.core.os.LocaleListCompat
import java.util.Locale
object LocaleUtils {
/**
* Basically implements Android locale resolution (not sure if exactly the same, probably,
* though), so it tries, in this order:<br></br>
@ -24,7 +23,7 @@ object LocaleUtils {
* @throws UnsupportedLocaleException if the locale resolution failed.
*/
@Throws(UnsupportedLocaleException::class)
fun resolveSupportedLocaleOrThrow(
fun resolveSupportedLocale(
availableLocales: LocaleListCompat,
supportedLocales: Collection<String>
): LocaleResolutionResult {
@ -49,36 +48,37 @@ object LocaleUtils {
}
/**
* @see resolveSupportedLocaleOrThrow
* @see resolveSupportedLocale
*/
@Throws(UnsupportedLocaleException::class)
fun resolveLocaleString(
locale: Locale,
supportedLocales: Collection<String>
): String {
// normalize the locales so that they are lowercase and use a dash as a separator
val normalizedLocales = supportedLocales.associateBy {
it.lowercase().replace('_', '-')
// first try with full locale name (e.g. en-US)
var localeString = (locale.language + "-" + locale.country).lowercase(Locale.getDefault())
if (supportedLocales.contains(localeString)) {
return localeString
}
// first try with full locale name (e.g. en-US)
val full = (locale.language + "-" + locale.country).lowercase()
println(full + " " + (full == "it-it") + " " + normalizedLocales["it-it"] + " " + normalizedLocales[full] + " " + normalizedLocales)
normalizedLocales[full]?.let { return it }
// then try with only base language (e.g. en)
val onlyLanguage = locale.language.lowercase()
normalizedLocales[onlyLanguage]?.let { return it }
localeString = locale.language.lowercase(Locale.getDefault())
if (supportedLocales.contains(localeString)) {
return localeString
}
// then try with children languages of locale base language (e.g. en-US, en-GB, b+en+001, …)
for ((supportedLocalePlus, originalSupportedLocale) in normalizedLocales) {
for (supportedLocale in supportedLocalePlus.split("[+#]".toRegex())) {
if (supportedLocale.split("-".toRegex(), limit = 2)[0] == onlyLanguage) {
return originalSupportedLocale
// then try with children languages of locale base language (e.g. en-US, en-GB, en-UK, ...)
for (supportedLocalePlus in supportedLocales) {
for (supportedLocale in supportedLocalePlus.split("\\+".toRegex())
.dropLastWhile { it.isEmpty() }
.toTypedArray()) {
if (supportedLocale.split("-".toRegex(), limit = 2)
.toTypedArray()[0] == localeString
) {
return supportedLocalePlus
}
}
}
throw UnsupportedLocaleException(locale)
}
@ -89,77 +89,18 @@ object LocaleUtils {
fun parseLanguageCountry(languageCountry: String): Locale {
val languageCountryArr = languageCountry
.lowercase()
.split("[_-]".toRegex())
.split("_".toRegex())
.drop(1)
.dropLastWhile { it.isEmpty() }
.toTypedArray()
return if (languageCountryArr.size == 1) {
Locale.Builder()
.setLanguage(languageCountryArr[0])
.build()
Locale(languageCountryArr[0])
} else {
Locale.Builder()
.setLanguage(languageCountryArr[0])
.setRegion(languageCountryArr[1])
.build()
Locale(languageCountryArr[0], languageCountryArr[1])
}
}
/**
* Like [resolveSupportedLocaleOrThrow], but returns null instead of throwing an exception.
*/
fun resolveSupportedLocale(
availableLocales: LocaleListCompat,
supportedLocales: Collection<String>
): LocaleResolutionResult? {
return try {
resolveSupportedLocaleOrThrow(availableLocales, supportedLocales)
} catch (_: UnsupportedLocaleException) {
null
}
}
/**
* Uses [resolveSupportedLocaleOrThrow] to find a supported locale string in [supportedLocales]
* matching [currentLocale], and returns it. This is NOT meant to be used for locale resolution
* when the app starts, but only to select the correct item from a list using the app's current
* locale (that has already been determined, hence the parameter name [currentLocale]).
*/
fun resolveSupportedLocale(
currentLocale: Locale,
supportedLocales: Collection<String>
): String? {
return resolveSupportedLocale(
availableLocales = LocaleListCompat.create(currentLocale),
supportedLocales = supportedLocales
)?.supportedLocaleString
}
/**
* Uses [resolveSupportedLocale] to find a supported locale string matching [currentLocale] in
* the keys of [supportedLocalesAndValues], and returns the corresponding value.
*/
fun <T> resolveValueForSupportedLocale(
currentLocale: Locale,
supportedLocalesAndValues: Map<String, T>
): T? {
return resolveSupportedLocale(
availableLocales = LocaleListCompat.create(currentLocale),
supportedLocales = supportedLocalesAndValues.keys
)?.let {
supportedLocalesAndValues[it.supportedLocaleString]
}
}
/**
* Returns whether the [currentLocale] matches with any of the [supportedLocales] using
* [resolveSupportedLocale].
*/
fun isLocaleSupported(currentLocale: Locale, supportedLocales: List<String>): Boolean {
return resolveSupportedLocale(
LocaleListCompat.create(currentLocale),
supportedLocales
) != null
}
class UnsupportedLocaleException : Exception {
constructor(locale: Locale) : super("Unsupported locale: $locale")
constructor() : super("No locales provided")

View File

@ -3,122 +3,105 @@ package org.stypox.dicio.util
import android.content.ActivityNotFoundException
import android.content.ClipData
import android.content.ClipboardManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Build
import android.content.pm.PackageManager
import android.net.Uri
import android.text.TextUtils
import android.util.Log
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import org.stypox.dicio.MainActivity
import org.stypox.dicio.R
import org.stypox.dicio.io.input.stt_popup.SttPopupActivity
import org.stypox.dicio.util.ShareUtils.openAppChooser
import org.stypox.dicio.util.ShareUtils.openUrlInApp
/**
* @author Most, if not all, of this class was taken from NewPipe,
* file `util/external_communication/ShareUtils.java`
* @implNote Most, if not all, of this class was taken from NewPipe, file util/ShareUtils.java
*/
object ShareUtils {
val TAG = ShareUtils::class.simpleName
/**
* Open the url with the system default browser. If no browser is installed, falls back to
* [openAppChooser] (for displaying that no apps are available to handle the action, or possible
* OEM-related edge cases).
* <p>
* This function selects the package to open based on which apps respond to the {@code http://}
* schema alone, which should exclude special non-browser apps that are can handle the url (e.g.
* the official YouTube app).
* <p>
* Therefore <b>please prefer [openUrlInApp], that handles package
* resolution in a standard way, unless this is the action of an explicit "Open in browser"
* button.
* Open the url with the system default browser. If no browser is set as default, fallbacks to
* [openAppChooser].
*
* @param context the context to use
* @param url the url to browse
* @author Taken from NewPipe, file `util/external_communication/ShareUtils.java`
**/
fun openUrlInBrowser(context: Context, url: String) {
// Target a generic http://, so we are sure to get a browser and not e.g. the yt app.
// Note that this requires the `http` schema to be added to `<queries>` in the manifest.
val browserIntent = Intent(Intent.ACTION_VIEW, "http://".toUri())
val intent = Intent(Intent.ACTION_VIEW, url.toUri())
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
// See https://stackoverflow.com/a/58801285 and `setSelector` documentation
intent.setSelector(browserIntent)
try {
context.startActivity(intent)
} catch (_: ActivityNotFoundException) {
// No browser is available. This should, in the end, yield a nice AOSP error message
// indicating that no app is available to handle this action.
//
// Note: there are some situations where modified OEM ROMs have apps that appear
// to be browsers but are actually app choosers. If starting the Activity fails
// related to this, opening the system app chooser is still the correct behavior.
intent.setSelector(null)
openAppChooser(context, intent, true)
}
}
/**
* Open a url with the system default app using [Intent.ACTION_VIEW], showing a toast in
* case of failure.
*
* @param context the context to use
* @param url the url to open
* @author Taken from NewPipe, file `util/external_communication/ShareUtils.java`
* @param context the context to use
* @param url the url to browse
* @param httpDefaultBrowserTest the boolean to set if the test for the default browser will be
* for HTTP protocol or for the created intent
* @return true if the URL can be opened or false if it cannot
* @implNote Taken from NewPipe, file util/ShareUtils.java
*/
fun openUrlInApp(context: Context, url: String) {
openIntentInApp(
context,
Intent(Intent.ACTION_VIEW, url.toUri()).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
fun openUrlInBrowser(
context: Context,
url: String,
httpDefaultBrowserTest: Boolean = true
): Boolean {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
val defaultPackageName = if (httpDefaultBrowserTest) {
getDefaultAppPackageName(
context, Intent(
Intent.ACTION_VIEW,
Uri.parse("http://")
).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
} else {
getDefaultAppPackageName(context, intent)
}
if (defaultPackageName == "android") {
// No browser set as default (doesn't work on some devices)
openAppChooser(context, intent, true)
} else if (defaultPackageName.isEmpty()) {
// No app installed to open a web url
Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show()
return false
} else {
try {
intent.setPackage(defaultPackageName)
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
// Not a browser but an app chooser because of OEMs changes
intent.setPackage(null)
openAppChooser(context, intent, true)
}
}
return true
}
/**
* Open an intent with the system default app.
*
*
* Use [.openIntentInApp] to show a toast in case of failure.
* The intent can be of every type, excepted a web intent for which
* [openUrlInBrowser] should be used.
*
* @param context the context to use
* @param intent the intent to open
* @return true if the intent could be opened successfully, false otherwise
* @author Taken from NewPipe, file `util/external_communication/ShareUtils.java`
*
* If no app can open the intent, a toast with the message `No app on your device can
* open this` is shown.
*
* @param context the context to use
* @param intent the intent to open
* @param showToast a boolean to set if a toast is displayed to user when no app is installed
* to open the intent (true) or not (false)
* @return true if the intent can be opened or false if it cannot be
* @implNote Taken from NewPipe, file util/ShareUtils.java
*/
fun tryOpenIntentInApp(context: Context, intent: Intent): Boolean {
try {
context.startActivity(intent)
} catch (_: ActivityNotFoundException) {
fun openIntentInApp(
context: Context,
intent: Intent,
showToast: Boolean
): Boolean {
val defaultPackageName = getDefaultAppPackageName(context, intent)
if (defaultPackageName.isEmpty()) {
// No app installed to open the intent
if (showToast) {
Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG)
.show()
}
return false
} else {
context.startActivity(intent)
}
return true
}
/**
* Open an intent with the system default app, showing a toast in case of failure.
*
*
* Use [.tryOpenIntentInApp] if you don't want the toast. Use [ ][.openUrlInApp] as a shorthand for [Intent.ACTION_VIEW] with urls.
*
* @param context the context to use
* @param intent the intent to
* @author Taken from NewPipe, file `util/external_communication/ShareUtils.java`
*/
fun openIntentInApp(context: Context, intent: Intent) {
if (!tryOpenIntentInApp(context, intent)) {
Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG)
.show()
}
}
/**
* Open the system chooser to launch an intent.
*
@ -133,7 +116,7 @@ object ShareUtils {
* @param context the context to use
* @param intent the intent to open
* @param setTitleChooser set the title "Open with" to the chooser if true, else not
* @author Taken from NewPipe, file `util/external_communication/ShareUtils.java`
* @implNote Taken from NewPipe, file util/ShareUtils.java
*/
private fun openAppChooser(
context: Context,
@ -147,23 +130,6 @@ object ShareUtils {
chooserIntent.putExtra(Intent.EXTRA_TITLE, context.getString(R.string.open_with))
}
// Avoid opening in Dicio
// (Implementation note: if the URL is one for which Dicio itself
// is set as handler on Android >= 12, we actually remove the only eligible app
// for this link, and browsers will not be offered to the user. For that, use
// `openUrlInBrowser`.)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
chooserIntent.putExtra(
Intent.EXTRA_EXCLUDE_COMPONENTS,
arrayOf(
// the two activities which have exported=true in the manifest
ComponentName(context, MainActivity::class.java),
ComponentName(context, SttPopupActivity ::class.java),
)
)
}
// Migrate any clip data and flags from the original intent.
val permFlags: Int = intent.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
@ -181,27 +147,51 @@ object ShareUtils {
chooserIntent.addFlags(permFlags)
}
}
try {
context.startActivity(chooserIntent)
} catch (_: ActivityNotFoundException) {
Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG)
.show()
}
context.startActivity(chooserIntent)
}
/**
* Get the default app package name.
*
*
* If no app is set as default, it will return "android" (not on some devices because some
* OEMs changed the app chooser).
*
*
* If no app is installed on user's device to handle the intent, it will return an empty string.
*
* @param context the context to use
* @param intent the intent to get default app
* @return the package name of the default app, an empty string if there's no app installed to
* handle the intent or the app chooser if there's no default
* @implNote Taken from NewPipe, file util/ShareUtils.java
*/
private fun getDefaultAppPackageName(
context: Context,
intent: Intent
): String {
val resolveInfo = context.packageManager.resolveActivity(
intent,
PackageManager.MATCH_DEFAULT_ONLY
)
return if (resolveInfo == null) {
""
} else {
resolveInfo.activityInfo.packageName
}
}
/**
* Open the android share sheet to share a content.
*
* For Android 10+ users, a content preview is shown, which includes the title of the shared
* content. TODO This method does not yet support sharing the image of the content, as Android
* needs a local Uri to an already loaded image.
* content.
* Support sharing the image of the content needs to done, if possible.
*
* @param context the context to use
* @param title the title of the content
* @param content the content to share
* @param imagePreviewUrl the image of the subject
* @author Taken from NewPipe, file `util/external_communication/ShareUtils.java`
* @implNote Taken from NewPipe, file util/ShareUtils.java
*/
fun shareText(
context: Context,
@ -223,9 +213,7 @@ object ShareUtils {
shareIntent.setClipData(generated ClipData).
if (!imagePreviewUrl.isEmpty()) {
//shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}*/
openAppChooser(context, shareIntent, false)
}*/openAppChooser(context, shareIntent, false)
}
/**
@ -234,7 +222,7 @@ object ShareUtils {
*
* @param context the context to use
* @param text the text to copy
* @author Taken from NewPipe, file `util/external_communication/ShareUtils.java`
* @implNote Taken from NewPipe, file util/ShareUtils.java
*/
fun copyToClipboard(context: Context, text: String) {
val clipboardManager = ContextCompat.getSystemService(context, ClipboardManager::class.java)
@ -242,16 +230,7 @@ object ShareUtils {
Toast.makeText(context, R.string.permission_denied, Toast.LENGTH_LONG).show()
return
}
try {
clipboardManager.setPrimaryClip(ClipData.newPlainText(null, text))
if (Build.VERSION.SDK_INT < 33) {
// Android 13 has its own "copied to clipboard" dialog
Toast.makeText(context, R.string.copied_to_clipboard, Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
Log.e(TAG, "Error when trying to copy text to clipboard", e)
Toast.makeText(context, R.string.failed_to_copy, Toast.LENGTH_SHORT).show()
}
clipboardManager.setPrimaryClip(ClipData.newPlainText(null, text))
Toast.makeText(context, R.string.copied_to_clipboard, Toast.LENGTH_SHORT).show()
}
}

View File

@ -167,14 +167,7 @@ object StringUtils {
fun customStringDistance(aNotCleaned: String, bNotCleaned: String): Int {
val a = cleanStringForDistance(aNotCleaned)
val b = cleanStringForDistance(bNotCleaned)
return customStringDistanceCleaned(a, b)
}
/**
* See [customStringDistance]; this one assumes already clean strings.
*/
fun customStringDistanceCleaned(aCleaned: String, bCleaned: String): Int {
val stats = stringDistanceStats(aCleaned, bCleaned)
val stats = stringDistanceStats(a, b)
return stats.levenshteinDistance - stats.maxSubsequentChars - stats.matchingCharCount
}

View File

@ -18,10 +18,8 @@ enum Language {
LANGUAGE_EL = 6; // Greek
LANGUAGE_FR = 7; // French
LANGUAGE_IT = 8; // Italian
LANGUAGE_NL = 14; // Nederlands
LANGUAGE_PL = 12; // Polish
LANGUAGE_RU = 9; // Russian
LANGUAGE_SL = 10; // Slovene
LANGUAGE_SV = 13; // Swedish
LANGUAGE_UK = 11; // Ukrainian
LANGUAGE_UK = 11; // Ukrainian
}

View File

@ -15,7 +15,7 @@
<string name="pref_language_system">استخدم لغة النظام</string>
<string name="pref_search_engine">محرك البحث</string>
<string name="pref_weather_default_city">المدينة الافتراضية</string>
<string name="eval_no_match">لم أفهم</string>
<string name="eval_no_match">لم أفهمك، هلا كررت؟</string>
<string name="skill_name_search">البحث</string>
<string name="skill_name_weather">الطقس</string>
<string name="skill_sentence_example_weather">كيف الطقس في روما؟</string>
@ -23,7 +23,7 @@
<string name="skill_name_calculator">الآلة الحاسبة</string>
<string name="skill_sentence_example_calculator">ما خمسة ضرب أربعة ناقص مليون؟</string>
<string name="skill_search_here_is_what_i_found">هذا ما وجدته</string>
<string name="skill_weather_min_max_wind">أدنى درجة حرارة: %1$.1f%4$s\nأقصى درجة حرارة: %2$.1f%4$s\nسرعة الرياح: %3$.1f%5$s</string>
<string name="skill_weather_min_max_wind">الحرارة الأدنى: %1$.1f درجة مئوية \nالحرارة القصوى: %2$.1f درجة مئوية \nسرعة الرياح: %3$.1f م/س</string>
<string name="skill_weather_in_city_there_is_description">هناك %2$s و %3$s درجات في %1$s الآن</string>
<string name="eval_network_error_description">لم يستطع Dicio الاتصال بالانترنت. رجاءً تأكّد من اتّصالك ثم حاول مجددًا.</string>
<string name="eval_fatal_error">تعذر تقييم طلبك</string>
@ -200,36 +200,6 @@
<string name="skill_media_previous">الوسائط السابقة…</string>
<string name="skill_media_next">الوسائط التالية…</string>
<string name="skill_media_no_media_session">لاتوجد جلسة وسائط نشطة</string>
<string name="notification_listener_label">مستمع لحدث الإخطارات المتعلق بديسيو</string>
<string name="skill_search_no_results_stop">البحث لم يُرد أي نتائج</string>
<string name="pref_weather_temperature_unit">وحدة درجة الحرارة</string>
<string name="eval_no_match_repeat">هلا أعدت ما قلته؟</string>
<string name="wake_custom_service_foreground_notification">الاستماع إلى كلمة إيقاظ مخصصة</string>
<string name="use_system_default">استخدام النظام الافتراضي</string>
<string name="pref_weather_unit_system_instructions">يستخدم الوحدة التي تم تكوينها في ”إعدادات النظام &gt; النظام &gt; اللغات والإدخال &gt; التفضيلات الإقليمية“</string>
<string name="pref_weather_temperature_unit_celsius">درجة مئوية (°م)</string>
<string name="pref_weather_temperature_unit_fahrenheit">فهرنهايت ( ° ف)</string>
<string name="pref_weather_temperature_unit_kelvin">كلفن (ك)</string>
<string name="pref_weather_length_unit">وحدة الطول</string>
<string name="pref_weather_length_unit_metric">متري</string>
<string name="pref_weather_length_unit_imperial">إمبريالي</string>
<string name="skill_weather_celsius">°م</string>
<string name="skill_weather_fahrenheit">°ف</string>
<string name="skill_weather_kelvin">ك</string>
<string name="skill_weather_meters_per_second">م/ث</string>
<string name="skill_weather_miles_per_hour">ميل في الساعة</string>
<string name="waiting">انتظار…</string>
<string name="pref_input_method_vosk_summary">تنزيل وتشغيل نموذج Vosk لتحويل الكلام إلى نص دون اتصال بالإنترنت داخل Dicio</string>
<string name="pref_input_method_external_popup">نافذة منبثقة خارجية لتحويل الكلام إلى نص</string>
<string name="pref_input_method_external_popup_summary">يفتح واجهة المستخدم لتطبيق آخر من خلال ACTION_RECOGNIZE_SPEECH، على سبيل المثال whisperIME، Kõnele، Futo Voice Input</string>
<string name="pref_wake_custom_delete">حذف كلمة الإيقاظ المخصصة</string>
<string name="pref_wake_custom_delete_summary">العودة إلى كلمة الإيقاظ الافتراضية مرحبا ديسيو \"Hey Dicio\"</string>
<string name="pref_wake_custom_import">استيراد كلمة إيقاظ مخصصة</string>
<string name="pref_wake_custom_import_summary_oww">استبدل كلمة الإيقاظ الافتراضية \"Hey Dicio\" بنموذج TFLite مخصص؛ يمكنك تنزيل بعض النماذج المخصصة من github.com/dscripka/openWakeWord/releases</string>
<string name="skill_listening_already_listening">أنا بالفعل أستمع لكلمة الإيقاظ</string>
<string name="skill_listening_started_listening">حسناً، سأستمع لكلمة الإيقاظ</string>
<string name="skill_listening_not_listening">لم أكن أستمع</string>
<string name="skill_listening_stop_listening">حسناً</string>
<string name="skill_listening_disabled">خدمة كلمة الإيقاظ معوقة في الإعدادات</string>
<string name="skill_name_listening">التحكم في الاستماع إلى كلمة الاستماع</string>
<string name="skill_sentence_example_listening">توقف عن الاستماع</string>
</resources>

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="drawer_open">Bn</string>
</resources>

View File

@ -137,27 +137,4 @@
<string name="skill_sentence_example_navigation">Navegar a l\'aeroport del Prat</string>
<string name="skill_navigation_specify_where">Especifiqueu on voleu anar</string>
<string name="skill_navigation_navigating_to">Navegant cap a %1$s</string>
<string name="all_skills_disabled_title">Totes les funcions estan deshabilitades</string>
<string name="waiting">Esperant…</string>
<string name="pref_general">General</string>
<string name="expand">Ampliar</string>
<string name="reduce">Reduir</string>
<string name="pref_theme_system">Utilitzar el mateix tema que el sistema</string>
<string name="back">Retrocedir</string>
<string name="clear">Netejar</string>
<string name="copy_to_clipboard">Copiar al porta-retalls</string>
<string name="done">Finalitzar</string>
<string name="grant_microphone_permission">Permetre acces al micrófon</string>
<string name="error_loading">Error al carregar</string>
<string name="error_unzipping">Error durant la descompressió</string>
<string name="error_downloading">Error durant la descarrega</string>
<string name="unzipping">Descomprimint…</string>
<string name="download">Descarregar</string>
<string name="stt_not_available">Reconeixement de veu no disponible</string>
<string name="stt_download">Descarregar reconeixement de veu</string>
<string name="stt_unzip">Extreure reconeixedor de veu</string>
<string name="start_listening">Començar a escoltar</string>
<string name="downloaded">Descarregant</string>
<string name="loaded">Carregant</string>
<string name="all_skills_disabled_description">Siusplau activi algunes funcions dels ajustaments, d\'altra banda, Dicio no sera capaç de realizar ninguna acció</string>
</resources>

View File

@ -195,6 +195,7 @@
<string name="retry">Zkusit znovu</string>
<string name="skill_media_pausing">Pozastavování médií…</string>
<string name="skill_media_no_media_session">Není aktivní žádná multimediální relace</string>
<string name="notification_listener_label">Posluchač oznámení Dicio</string>
<string name="skill_media_playing">Přehrávání médií…</string>
<string name="perm_read_contacts">číst vaše kontakty</string>
<string name="skill_sentence_example_media">Další skladba</string>
@ -227,23 +228,4 @@
<string name="skill_weather_miles_per_hour">mph</string>
<string name="pref_weather_temperature_unit">Jednotka teploty</string>
<string name="pref_weather_length_unit_metric">Metrické</string>
<string name="skill_listening_already_listening">Již poslouchám na probouzecí slovo</string>
<string name="skill_listening_started_listening">OK, budu poslouchat na probouzecí slovo</string>
<string name="skill_listening_not_listening">Neposlouchal jsem</string>
<string name="skill_listening_stop_listening">OK</string>
<string name="skill_listening_disabled">Služba probouzecího slova je zakázána v nastavení</string>
<string name="skill_name_listening">Ovládání poslechu na probouzecí slovo</string>
<string name="skill_sentence_example_listening">Přestat poslouchat</string>
<string name="failed_to_copy">Nepodařilo se zkopírovat do schránky</string>
<string name="skill_name_joke">Vtip</string>
<string name="skill_sentence_example_joke">Řekni mi vtip</string>
<string name="skill_translation_success">Přeloženo do jazyka %1$s</string>
<string name="skill_translation_unknown_language">Nerozpoznal jsem jazyk %1$s</string>
<string name="skill_translation_unsupported_language">Jazyk %1$s (%2$s) není podporován</string>
<string name="skill_translation_failed">Nepodařilo se přeložit váš dotaz do jazyka %1$s</string>
<string name="skill_translation_failed_no_query">Přeslechl jsem, co jste chtěli přeložit. Zopakovali byste to prosím?</string>
<string name="skill_translation_to">do jazyka</string>
<string name="skill_name_translation">Překlad</string>
<string name="skill_sentence_example_translation">Přelož Hola z jazyka španělština do jazyka angličtina</string>
<string name="skill_translation_auto">Automaticky</string>
</resources>

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pref_weather_default_city">Stadtauswahl</string>
<string name="pref_weather_default_city">Voreinstellung Stadt</string>
<string name="pref_input_method_summary">Wähle den Dienst, der verwendet werden soll um mit Dicio zu kommunizieren</string>
<string name="vosk_model_extraction_error">Vosk-Modell konnte nicht aus dem Zip-Archiv entpackt werden</string>
<string name="vosk_model_extraction_error">Vosk-Modell konnte aus dem Zip-Archiv nicht entpackt werden</string>
<string name="vosk_model_downloading">Lade Vosk-Modell herunter…</string>
<string name="text_input_hint">Frag mich irgendetwas…</string>
<string name="eval_no_match">Ich habe nicht verstanden</string>
<string name="eval_no_match">Ich habe nicht verstanden, kannst du wiederholen?</string>
<string name="skill_calculator_could_not_calculate">Die gewünschte Berechnung konnte nicht durchgeführt werden</string>
<string name="skill_open_opening">Öffne %1$s…</string>
<string name="skill_open_unknown_app">Unbekannte Anwendung %1$s</string>
@ -15,7 +15,7 @@
\nHöchste Temperatur: %2$.1f%4$s
\nWindgeschwindigkeit: %3$.1f%5$s</string>
<string name="skill_weather_description_temperature">%1$s · %2$.1f%3$s</string>
<string name="skill_weather_in_city_there_is_description">"Es ist %2$s und %3$s Grad in %1$s"</string>
<string name="skill_weather_in_city_there_is_description">Zurzeit haben wir %2$s und %3$s Grad in %1$s</string>
<string name="skill_weather_could_not_find_city">Ich konnte die Stadt %1$s nicht finden</string>
<string name="skill_search_here_is_what_i_found">Das habe ich gefunden</string>
<string name="skill_fallback_name_text">Textnachricht</string>
@ -23,13 +23,13 @@
<string name="skill_name_calculator">Taschenrechner</string>
<string name="skill_sentence_example_open">Öffne \'NewPipe\'</string>
<string name="skill_name_open">App starten</string>
<string name="skill_sentence_example_lyrics">Wie heisst das Lied, dass so geht: \"we will we will rock you\"?</string>
<string name="skill_name_lyrics">Liedtexte</string>
<string name="skill_sentence_example_lyrics">Wie heißt das Lied, das so geht: \'we will we will rock you\'\?</string>
<string name="skill_name_lyrics">Liedertexte</string>
<string name="skill_sentence_example_weather">Wie ist das Wetter in Rom\?</string>
<string name="skill_name_weather">Wetter</string>
<string name="skill_sentence_example_search">Suche nach: Wie füttert man eine Katze?</string>
<string name="skill_name_search">Suche</string>
<string name="eval_network_error_description">Dicio konnte nicht auf das Internet zugreifen. Bitte überprüfe die Internetverbindung und versuche es erneut.</string>
<string name="eval_network_error_description">Dicio kann nicht auf das Internet zugreifen. Bitte überprüfe deine Verbindung und versuche es erneut.</string>
<string name="eval_network_error">Netzwerkfehler</string>
<string name="eval_fatal_error">Deine Anfrage konnte nicht verarbeitet werden</string>
<string name="pref_weather_default_city_using_ip_info">Stelle ein, welche Stadt für die Wettervorhersage verwendet werden soll, sofern keine Vorauswahl getroffen wurde. Derzeit wird der Standort durch die IP-Adresse ermittelt.</string>
@ -44,12 +44,12 @@
<string name="pref_input_method_text">Nur Textfeld</string>
<string name="pref_input_method">Eingabemethode</string>
<string name="pref_language_system">Verwende Sprache des Systems</string>
<string name="pref_language_summary">Auf welcher Sprache soll Dicio lauschen und antworten?</string>
<string name="pref_language_summary">Auf welcher Sprache sollte Dicio lauschen und antworten\?</string>
<string name="pref_language">Sprache</string>
<string name="pref_theme_dark">Dunkel</string>
<string name="pref_theme_light">Hell</string>
<string name="pref_theme_summary">Wähle das Farbthema</string>
<string name="microphone_error">Keinen Zugriff auf das Mikrofon, entweder wird es bereits verwendet oder der entsprechende Zugriff wurde verweigert.</string>
<string name="microphone_error">Bekomme keinen Zugriff auf das Mikrofon, entweder wird es bereits verwendet oder der entsprechende Zugriff wurde verweigert.</string>
<string name="pref_theme">Thema</string>
<string name="pref_appearance">Darstellung</string>
<string name="pref_io">Ein- und Ausgabemethoden</string>
@ -60,12 +60,12 @@
<string name="vosk_model_unsupported_language">Für die ausgewählte Sprache steht kein Vosk-Modell zur Verfügung</string>
<string name="vosk_model_notification_description">Sprache: %1$s</string>
<string name="vosk_model_notification_title">Vosk-Modell</string>
<string name="listening">Höre zu</string>
<string name="listening">lausche</string>
<string name="action_voice_input">Spracheingabe</string>
<string name="action_text_input">Texteingabe</string>
<string name="here_is_what_i_can_do">Folgendes kann ich schon für Dich machen!</string>
<string name="here_is_what_i_can_do">Folgendes kann ich für Dich machen!</string>
<string name="copied_to_clipboard">In die Zwischenablage kopiert</string>
<string name="share">Teilen</string>
<string name="share">Teile</string>
<string name="drawer_header_subtitle">Kann ich dir helfen\?</string>
<string name="drawer_close">Schließe die Navigationsleiste</string>
<string name="drawer_open">Öffne die Navigationsleiste</string>
@ -73,31 +73,31 @@
<string name="no_app_to_open_intent">Keine Anwendung auf Deinem Gerät kann das öffnen</string>
<string name="permission_denied">Berechtigung verweigert</string>
<string name="pref_skill_not_available">Diese Fähigkeit ist noch nicht in deiner Sprache verfügbar. Mitarbeit ist Willkommen!</string>
<string name="skill_search_no_results">Die Suche hat nichts gefunden, versuche, mich noch einmal nach dem zu fragen, was du suchst</string>
<string name="skill_search_no_results">Die Suche hat nichts gefunden, versuche mich noch einmal nach dem zu fragen, was du suchst</string>
<string name="skill_search_what_question">Wonach willst du suchen\?</string>
<string name="vosk_model_download_error">Herunterladen vom Vosk-Modell fehlgeschlagen</string>
<string name="vosk_model_download_error">Herunterladen von Vosk-Modell fehlgeschlagen</string>
<string name="skill_name_telephone">Anrufen</string>
<string name="skill_sentence_example_telephone">Tom anrufen</string>
<string name="skill_telephone_unknown_contact">Es wurde kein passender Kontakt gefunden</string>
<string name="skill_telephone_found_contacts">Ich habe %1$d Kontakte gefunden, welchen davon soll ich anrufen\?</string>
<string name="eval_missing_permissions">Die Fähigkeit \"%1$s\" benötigt zum Funktionieren diese Genehmigungen: %2$s</string>
<string name="android_tts_error">Während des Starts der Android-TTS-Engine ist ein Fehler aufgetreten</string>
<string name="android_tts_error">Während des Starts des Android-TTS-Engine ist ein Fehler aufgetreten</string>
<string name="pref_skill_missing_permissions">Folgende Genehmigungen werden benötigt: %1$s</string>
<string name="pref_skill_grant_permissions">Zulassen</string>
<string name="skill_timer_query">Der Timer läuft ab in %1$s</string>
<string name="error_crash_log_headline">Absturzbericht:</string>
<string name="skill_timer_set_name">Okay, Timer %1$s wird in %2$s ablaufen</string>
<string name="skill_timer_set_name">OK, Timer %1$s wird in %2$s ablaufen</string>
<string name="skill_timer_query_last">Der letzte Timer läuft ab in %1$s</string>
<string name="error_report_channel_description">Benachrichtigungen zur Meldung von Fehlern</string>
<string name="skill_sentence_example_timer">Stelle einen Timer für fünf Minuten ein</string>
<string name="skill_timer_set">Okay, der Timer wird in %1$s ablaufen</string>
<string name="skill_timer_set">OK, der Timer wird in %1$s ablaufen</string>
<string name="skill_timer_canceled">Der Timer wurde gestoppt</string>
<string name="skill_timer_canceled_name">Timer %1$s wurde gestoppt</string>
<string name="skill_timer_no_active">Es gibt keinen aktiven Timer</string>
<string name="skill_timer_none_canceled">Okay, kein Timer wurde gestoppt</string>
<string name="skill_timer_none_canceled">OK, kein Timer wurde gestoppt</string>
<string name="error_title">Fehlerbericht</string>
<string name="error_details_headline">Details:</string>
<string name="error_report_github">Berichte auf GitHub</string>
<string name="error_report_github">Bericht auf GitHub</string>
<string name="error_details_labels">Aktion:
\nLokalisierung:
\nGMT Zeit:
@ -105,18 +105,18 @@
\nVersion:
\nOS Version:</string>
<string name="skill_name_timer">Timer</string>
<string name="skill_telephone_calling">Rufe %1$s an</string>
<string name="skill_telephone_calling">Anrufen %1$s</string>
<string name="skill_timer_how_much_time">Wie lange soll der Timer laufen\?</string>
<string name="skill_timer_no_active_name">Es gibt keinen aktiven Timer mit dem Namen %1$s</string>
<string name="skill_timer_query_name">Timer %1$s läuft ab in %2$s</string>
<string name="skill_telephone_confirm_call">Soll ich %1$s anrufen?</string>
<string name="skill_telephone_not_calling">Okay, ich rufe niemanden an</string>
<string name="skill_telephone_confirm_call">Sollte ich %1$s anrufen\?</string>
<string name="skill_telephone_not_calling">OK, ich rufe niemanden mehr an</string>
<string name="skill_timer_confirm_cancel">Bist du sicher das alle Timer gelöscht werden sollen\?</string>
<string name="skill_timer_all_canceled">Alle Timer wurden gestoppt</string>
<string name="skill_timer_expired">Der Timer ist abgelaufen!</string>
<string name="skill_timer_expired_name">Timer %1$s ist abgelaufen!</string>
<string name="error_github_notice">Bitte prüfe ob nicht bereits ein Ticket existiert, das deinen Absturz behandelt. Wenn du doppelte Tickets erstellst, kostet uns das Zeit, die wir mit der Behebung des eigentlichen Fehlers verbringen könnten.</string>
<string name="error_report_notification_toast">Es ist ein Fehler aufgetreten, siehe Benachrichtigung</string>
<string name="error_report_notification_toast">Es ist ein Fehler aufgetreten, siehe Meldung</string>
<string name="error_report_channel_name">Benachrichtigung über Fehlerbericht</string>
<string name="pref_skill_number_library_not_available">Die Bibliothek <i>dicio-numbers</i> zum Formatieren und Umwandeln von Zahlen ist bisher noch nicht in deiner Sprache verfügbar. Dies bedeutet, dass alle Fähigkeiten in Verbindung mit Zahlen, Zeitspannen und Datumsangaben nicht verfügbar sind. Wenn du kannst, <b>bitte beteilige dich</b> indem du hier tippst!</string>
<string name="error_copy_formatted">Kopiere formatierten Bericht</string>
@ -124,10 +124,10 @@
<string name="error_report">Melden</string>
<string name="error_sorry">Entschuldigung, ein Fehler ist aufgetreten</string>
<string name="skill_name_current_time">Aktuelle Zeit</string>
<string name="skill_sentence_example_current_time">Wie spät ist es?</string>
<string name="skill_sentence_example_current_time">Wie viel Uhr ist es\?</string>
<string name="skill_time_current_time">Es ist %1$s</string>
<string name="pref_stt_auto_finish_title">Senden Sie das Ergebnis der Sprachausgabe direkt an das Text-Popup</string>
<string name="stt_say_something">Sag etwas…</string>
<string name="stt_say_something">Sage etwas…</string>
<string name="stt_did_not_understand">Ich konnte es nicht verstehen, versuche es erneut</string>
<string name="pref_stt_auto_finish_summary_on">Sprachergebnis automatisch an die anfordernde App senden, wenn das Zuhören beendet ist</string>
<string name="pref_stt_auto_finish_summary_off">Auf manuelle Bestätigung warten, bevor das Sprachergebnis an die anfordernde App gesendet wird</string>
@ -141,10 +141,10 @@
<string name="stt_download">Lade Sprache-zu-Text herunter</string>
<string name="download">Download</string>
<string name="stt_not_available">Sprache-zu-Text nicht verfügbar</string>
<string name="start_listening">Starte das Zuhören</string>
<string name="start_listening">Höre zu</string>
<string name="all_skills_disabled_title">Alle Fähigkeiten sind deaktiviert</string>
<string name="pref_general">Allgemein</string>
<string name="pref_skills_summary">Fähigkeiten (de)aktivieren und Verhalten anpassen</string>
<string name="pref_skills_summary">Fähigkeiten (de)aktivieren und Verhalten justieren</string>
<string name="expand">Erweitern</string>
<string name="pref_theme_system">System-Thema benutzen</string>
<string name="pref_theme_system_dark_black">System-Thema benutzen (Schwarz für dunkles Thema)</string>
@ -156,15 +156,15 @@
<string name="copy_to_clipboard">In Zwischenablage kopieren</string>
<string name="done">Fertig</string>
<string name="grant_microphone_permission">Mikrofon-Berechtigung erteilen</string>
<string name="error_loading">Fehler beim Laden</string>
<string name="error_unzipping">Fehler beim Entpacken</string>
<string name="error_downloading">Fehler beim Download</string>
<string name="error_loading">Fehler beim Laden von</string>
<string name="error_unzipping">Fehler beim Entpacken von</string>
<string name="error_downloading">Fehler beim Download von</string>
<string name="stt_unzip">Entpacke Sprache-zu-Text</string>
<string name="downloaded">Heruntergeladen</string>
<string name="loaded">Geladen</string>
<string name="all_skills_disabled_description">Bitte eine oder mehrere Fähigkeiten in den Einstellungen aktivieren, sonst kann Dicio nichts tun</string>
<string name="pref_theme_black">Schwarz</string>
<string name="pref_dynamic_colors_summary">Benutze \"Material You\" für dynamische Farben vom System</string>
<string name="pref_dynamic_colors_summary">Benutze \"Material You\" dynamische Farben vom System</string>
<string name="settings_description_with_value">%1$s — %2$s</string>
<string name="stt_service_label">Dicio Offline-Spracherkennung</string>
<string name="pref_stt_play_sound_notification">Benachrichtigungskanal</string>
@ -172,7 +172,7 @@
<string name="pref_stt_play_sound_media">Standard-/Medienkanal</string>
<string name="pref_stt_play_sound_none">Keinen Ton abspielen</string>
<string name="wake_service_foreground_notification_summary">Diese Benachrichtigung ermöglicht es dem Dicio Aktivierungswortdienst, im Hintergrund das Mikrofon zu hören</string>
<string name="wake_service_foreground_notification">Höre auf das Aktivierungswort \"Hey Dicio\"</string>
<string name="wake_service_foreground_notification">Hören auf das Aktivierungswort \"Hey Dicio\"</string>
<string name="wake_service_triggered_notification_summary">In Android 10+ kann Dicio nicht starten, wenn ein Aktivierungswort erkannt wird, ohne eine Benachrichtigung anzuzeigen.</string>
<string name="wake_word_setup_title">Aktivierungswort einrichten</string>
<string name="wake_word_error_downloading">Ein unerwarteter Fehler ist beim Herunterladen aufgetreten</string>
@ -187,63 +187,21 @@
<string name="wake_service_triggered_notification">Dicio Aktivierungswort ausgelöst, tippe, um zu öffnen</string>
<string name="grant_permissions">Berechtigungen gewähren</string>
<string name="stop">Stoppen</string>
<string name="pref_stt_play_sound_title">Ton abspielen, wenn mit das Zuhören beginnt</string>
<string name="pref_stt_play_sound_summary">Wählen Sie aus, ob ein Ton abgespielt werden soll, wenn sie sprechen können und wählen Sie den Audiokanal aus, auf dem der Ton abgespielt werden soll</string>
<string name="pref_stt_play_sound_title">Ton abspielen, wenn mit dem Zuhören begonnen wird</string>
<string name="pref_stt_play_sound_summary">Wählen Sie aus, ob ein Ton abgespielt werden soll, wenn Ihre Stimme erkannt wird, und wählen Sie den Audiokanal aus, auf dem der Ton abgespielt werden soll</string>
<string name="wake_service_label">Dicio Aktivierungswortdienst</string>
<string name="wake_service_start_notification_summary">In Android 11+ kann Dicio den Dienst nicht ohne manuelle Interaktion des Benutzers starten.</string>
<string name="wake_word_setup_description">Dicio wird automatisch aktiv, wann immer du \"Hey Dicio\" sagst. Dies funktioniert, indem ein Dienst gestartet wird, der immer im Hintergrund zuhört. Alle Sprachverarbeitung erfolgt auf diesem Gerät, deshalb musst du das KI-Modell im Voraus herunterladen.</string>
<string name="wake_word_setup_description">Dicio wird automatisch aktiv, wann immer du \"Hey Dicio\" sagst. Dies funktioniert, indem ein Dienst gestartet wird, der immer im Hintergrund zuhört. Alle Sprachverarbeitung erfolgt lokal, deshalb musst du das KI-Modell im Voraus herunterladen.</string>
<string name="retry">Erneut versuchen</string>
<string name="skill_name_media">Mediensteuerung</string>
<string name="skill_sentence_example_media">Nächstes Lied</string>
<string name="skill_media_playing">Spiele Medien…</string>
<string name="skill_media_pausing">Pausiere Medien…</string>
<string name="skill_media_previous">Vorheriges Medium…</string>
<string name="notification_listener_label">Dicio Benachrichtigungs-Event-Listener</string>
<string name="perm_call_phone">Telefonnummern direkt anrufen</string>
<string name="perm_read_contacts">Kontakte lesen</string>
<string name="skill_media_next">Nächstes Medium…</string>
<string name="skill_media_no_media_session">Kein Mediaplayer ist aktiv</string>
<string name="skill_search_no_results_stop">Die Suche ergab kein Ergebnis</string>
<string name="eval_no_match_repeat">Wiederhole bitte</string>
<string name="pref_weather_temperature_unit_celsius">Celsius (°C)</string>
<string name="pref_weather_temperature_unit_kelvin">Kelvin (K)</string>
<string name="pref_weather_length_unit">Längeneinheit</string>
<string name="pref_weather_length_unit_metric">Messwert</string>
<string name="pref_weather_length_unit_imperial">britisch</string>
<string name="pref_weather_unit_system_instructions">Verwendet die unter „Systemeinstellungen &gt; System &gt; Sprachen &amp; Eingabe &gt; Regionale Einstellungen“ konfigurierte Gradeinheit</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="pref_input_method_vosk_summary">Lädt ein Vosk Sprache-zu-Text-Modell herunter und führt es offline in Dicio aus</string>
<string name="use_system_default">Systemstandard verwenden</string>
<string name="pref_weather_temperature_unit">Temperatureinheit</string>
<string name="pref_weather_temperature_unit_fahrenheit">Fahrenheit (°F)</string>
<string name="skill_weather_kelvin">K</string>
<string name="pref_input_method_external_popup_summary">Öffnet die Eingabemethode einer anderen App durch ACTION_RECOGNIZE_SPEECH, z.B. whisperIME, Kõnele, Futo Voice Input</string>
<string name="pref_wake_custom_import">Benutzerdefiniertes Weckwort importieren</string>
<string name="pref_wake_custom_import_summary_oww">Ersetze das Standard-Weckwort „Hey Dicio“ durch ein benutzerdefiniertes TFLite-Modell; Du kannst einige benutzerdefinierte Modelle von github.com/dscripka/openWakeWord/releases herunterladen</string>
<string name="waiting">Warten…</string>
<string name="pref_input_method_external_popup">Externes Sprache-zu-Text-Popup</string>
<string name="pref_wake_custom_delete">Benutzerdefiniertes Weckwort löschen</string>
<string name="pref_wake_custom_delete_summary">Rückkehr zum Standard-Weckwort „Hey Dicio“</string>
<string name="wake_custom_service_foreground_notification">Lauschen auf benutzerdefiniertes Weckwort</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
<string name="skill_listening_started_listening">OK, Ich warte auf das Aktivierungswort</string>
<string name="skill_listening_not_listening">Ich habe nicht zugehört</string>
<string name="skill_listening_stop_listening">OK</string>
<string name="skill_listening_disabled">Der Aktivierungswortservice ist in den Einstellungen deaktiviert</string>
<string name="skill_listening_already_listening">Ich lausche bereits auf das Aktivierungswort</string>
<string name="skill_name_listening">Steuerung des Aktivierungswortes</string>
<string name="skill_sentence_example_listening">Zuhören stoppen</string>
<string name="skill_name_joke">Witze</string>
<string name="skill_sentence_example_joke">Erzähle mir einen Witz</string>
<string name="skill_translation_success">Übersetzt in %1$s</string>
<string name="skill_translation_unknown_language">Ich kenne die Sprache %1$s nicht</string>
<string name="skill_translation_unsupported_language">Sprache %1$s (%2$s) wird nicht unterstützt</string>
<string name="skill_translation_failed">Anfrage kann nicht in %1$s übersetzt werden</string>
<string name="skill_translation_failed_no_query">Ich habe nicht verstanden, was du übersetzen willst. Kannst du es wiederholen?</string>
<string name="skill_translation_to">nach</string>
<string name="skill_name_translation">Übersetzen</string>
<string name="skill_sentence_example_translation">Übersetze Hola aus dem Spanischen ins Englische</string>
<string name="failed_to_copy">Kopieren fehlgeschlagen</string>
<string name="skill_translation_auto">Automatisch</string>
</resources>

View File

@ -4,12 +4,12 @@
<string name="skill_weather_min_max_wind">Temperatura mínima: %1$.1f%4$s
\nTemperatura máxima: %2$.1f%4$s
\nVelocidad del viento: %3$.1f%5$s</string>
<string name="drawer_header_subtitle">¿En qué puedo ayudarlo?</string>
<string name="drawer_header_subtitle">¿En que puedo ayudarlo\?</string>
<string name="drawer_open">Abrir caja de navegación</string>
<string name="vosk_model_ready">Está listo el modelo Vosk</string>
<string name="vosk_model_ready">Esta listo el modelo Vosk</string>
<string name="share">Compartir</string>
<string name="copied_to_clipboard">Copiado al portapapeles</string>
<string name="text_input_hint">Pregúntame algo…</string>
<string name="text_input_hint">Preguntame algo…</string>
<string name="here_is_what_i_can_do">¡Esto es lo que puedo hacer!</string>
<string name="action_text_input">Entrada de texto</string>
<string name="action_voice_input">Entrada de voz</string>
@ -19,7 +19,7 @@
<string name="vosk_model_unsupported_language">No esta disponible el modelo Vosk para el idioma actual</string>
<string name="vosk_model_extraction_error">Error en extraer el modelo Vosk del zip</string>
<string name="android_tts_unsupported_language">El motor de texto a voz de Android no admite el idioma actual</string>
<string name="settings">Ajustes</string>
<string name="settings">Configuración</string>
<string name="pref_io">Métodos de entrada y salida</string>
<string name="pref_appearance">Apariencia</string>
<string name="pref_theme">Tema</string>
@ -29,7 +29,7 @@
<string name="pref_language">Idioma</string>
<string name="pref_language_system">Usar el idioma del sistema</string>
<string name="pref_input_method">Método de entrada</string>
<string name="pref_input_method_summary">Elige el servicio que usará para hablar con Dicio</string>
<string name="pref_input_method_summary">Elija el servicio que usará para hablar con Dicio</string>
<string name="pref_input_method_text">Solo campo de texto</string>
<string name="pref_input_method_vosk">Reconocimiento de voz Vosk offline</string>
<string name="pref_speech_output_method">Método de salida de voz</string>
@ -42,40 +42,40 @@
<string name="pref_weather_default_city">Ciudad por defecto</string>
<string name="eval_fatal_error">No se pudo evaluar su solicitud</string>
<string name="eval_network_error_description">Dicio no pudo acceder a Internet. Comprueba tu conexión y vuelve a intentarlo.</string>
<string name="eval_no_match">No entendí</string>
<string name="eval_no_match">No entendí, ¿podrías repetirlo?</string>
<string name="skill_name_search">Buscar</string>
<string name="skill_sentence_example_search">Buscar cómo alimentar a un gato</string>
<string name="skill_sentence_example_search">Buscar como alimentar a un gato</string>
<string name="skill_name_weather">Clima</string>
<string name="skill_sentence_example_weather">¿Cuál es el clima en Roma\?</string>
<string name="skill_name_lyrics">Letras de canciones</string>
<string name="skill_sentence_example_lyrics">¿Cuál es la canción que dice we will we will rock you\?</string>
<string name="skill_name_open">Abrir aplicaciones</string>
<string name="skill_sentence_example_open">Abrir NewPipe</string>
<string name="skill_sentence_example_open">Abrir newpipe</string>
<string name="skill_sentence_example_calculator">¿Cuánto es cinco por cuatro menos un millón\?</string>
<string name="skill_fallback_name_text">Mensaje de texto</string>
<string name="skill_search_here_is_what_i_found">Esto es lo que he encontrado</string>
<string name="skill_weather_could_not_find_city">No pudo encontrar la ciudad %1$s</string>
<string name="skill_weather_in_city_there_is_description">Hay %2$s y %3$s grados en %1$s ahora mismo</string>
<string name="skill_weather_in_city_there_is_description">Actualmente en %1$s esta %2$s</string>
<string name="skill_weather_description_temperature">%1$s - %2$.1f%3$s</string>
<string name="skill_lyrics_song_not_found">No se ha encontrado la canción %1$s</string>
<string name="skill_lyrics_found_song_by_artist">Se ha encontrado la canción %1$s de %2$s</string>
<string name="skill_open_unknown_app">Aplicación desconocida %1$s</string>
<string name="skill_open_opening">Abriendo %1$s…</string>
<string name="skill_calculator_could_not_calculate">No pude calcular su solicitud</string>
<string name="skill_calculator_could_not_calculate">No pude calcular tu solicitud</string>
<string name="eval_network_error">Error de la red</string>
<string name="drawer_close">Cerrar la caja de navegación</string>
<string name="microphone_error">No se puede acceder al micrófono, quizás ya esté en uso o se denegó el permiso correspondiente.</string>
<string name="vosk_model_downloading">Descargando el modelo Vosk…</string>
<string name="vosk_model_extracting">Extrayendo el modelo Vosk…</string>
<string name="pref_language_summary">¿Qué lenguaje debería usar Dicio para escucharle y ofrecer respuestas?</string>
<string name="pref_weather_default_city_using_ip_info">Configure la ciudad que se usará para el clima cuando no se especifica. El comportamiento actual es obtener la ubicación desde su IP.</string>
<string name="pref_language_summary">¿Qué lenguaje debería usar Dicio para escucharte y darte respuestas\?</string>
<string name="pref_weather_default_city_using_ip_info">Configure la ciudad que se usará para el clima cuando no diga específicamente una. El comportamiento actual es obtener la ubicación de tú IP.</string>
<string name="open_with">Abrir con</string>
<string name="vosk_model_download_error">Error en descargar el modelo Vosk</string>
<string name="vosk_model_download_error">Fallo en la descarga del modelo Vosk</string>
<string name="pref_skill_not_available">Esta habilidad aún no está disponible para su idioma. ¡Las contribuciones son bienvenidas!</string>
<string name="skill_search_what_question">¿Qué quieres buscar\?</string>
<string name="no_app_to_open_intent">Ninguna aplicación de su dispositivo puede abrir esto</string>
<string name="permission_denied">Permiso denegado</string>
<string name="skill_search_no_results">La búsqueda no arrojó resultados, intente decirme de nuevo lo que quiere buscar</string>
<string name="skill_search_no_results">La búsqueda no arrojó resultados, intenta decirme de nuevo lo que quieres buscar</string>
<string name="skill_telephone_found_contacts">He encontrado %1$d contactos, ¿a cuál llamo\?</string>
<string name="skill_name_telephone">Teléfono</string>
<string name="skill_sentence_example_telephone">Llamar a Tom</string>
@ -108,13 +108,18 @@
<string name="error_crash_log_headline">Registro de fallos:</string>
<string name="error_details_headline">Detalles:</string>
<string name="error_title">Informe de errores</string>
<string name="error_details_labels">Acción: \nUbicación: \nHora GMT: \nPaquete: \nVersión: \nVersión OS:</string>
<string name="error_github_notice">Compruebe si ya existe un problema relacionado con su bloqueo. Al crear tickets duplicados, nos toma tiempo que podríamos dedicar a corregir el error real.</string>
<string name="error_details_labels">Ación:
\nUbicación:
\nHora GMT:
\nPaquete:
\nVersión:
\nOS versión:</string>
<string name="error_github_notice">Compruebe si ya existe un problema relacionado con su crasheo. Al crear tickets duplicados, nos toma tiempo que podríamos dedicar a corregir el error real.</string>
<string name="error_copy_formatted">Copiar informe con formato</string>
<string name="error_report_github">Reportar en Github</string>
<string name="error_report_notification_toast">Se ha producido un error, consulte la notificación</string>
<string name="error_report_channel_name">Notificar los errores</string>
<string name="error_report_channel_description">Notificaciones para informar errores</string>
<string name="error_report_channel_description">Notificaciones para informar de errores</string>
<string name="error_report_notification_title">Dicio encontró un error, toque para informar</string>
<string name="error_report">Informar</string>
<string name="error_sorry">Lo sentimos, se ha producido un error</string>
@ -122,18 +127,18 @@
<string name="skill_sentence_example_current_time">¿Qué hora es\?</string>
<string name="skill_time_current_time">En este momento, es %1$s</string>
<string name="pref_stt_auto_finish_title">Enviar directamente el resultado de la ventana de reconocimiento de voz</string>
<string name="pref_stt_auto_finish_summary_on">Envía automáticamente el resultado del habla a la aplicación solicitante cuando finalice la escucha</string>
<string name="pref_stt_auto_finish_summary_on">Envíe automáticamente el resultado del habla a la aplicación solicitante cuando finalice la escucha</string>
<string name="stt_say_something">Diga algo…</string>
<string name="stt_did_not_understand">No lo he entendido, inténtalo de nuevo</string>
<string name="stt_popup">Servicio de voz a texto</string>
<string name="pref_stt_auto_finish_summary_off">Espera la confirmación manual antes de enviar el resultado del habla a la aplicación solicitante</string>
<string name="pref_stt_auto_finish_summary_off">Esperar la confirmación manual antes de enviar el resultado del habla a la aplicación solicitante</string>
<string name="skill_navigation_specify_where">Especifique hacia dónde desea ir</string>
<string name="skill_navigation_navigating_to">Navegando a %1$s</string>
<string name="skill_name_navigation">Navegación</string>
<string name="skill_sentence_example_navigation">Ir hasta el aeropuerto internacional de Vancouver</string>
<string name="start_listening">Empieza a escuchar</string>
<string name="skill_open_could_not_understand">No entiendo qué aplicación</string>
<string name="all_skills_disabled_description">Por favor, active algunas funciones desde la configuración; de lo contrario, Dicio no podrá hacer nada</string>
<string name="skill_open_could_not_understand">No entiendo la aplicación</string>
<string name="all_skills_disabled_description">Por favor, activa algunas funciones desde la configuración; de lo contrario, Dicio no podrá hacer nada</string>
<string name="pref_theme_black">Negro</string>
<string name="pref_dynamic_colors_summary">Utiliza los colores dinámicos de Material You proporcionados por el sistema</string>
<string name="back">Atrás</string>
@ -154,7 +159,7 @@
<string name="all_skills_disabled_title">Todas las funciones están deshabilitadas</string>
<string name="pref_general">General</string>
<string name="pref_skills_title">Habilidades</string>
<string name="pref_skills_summary">Activa/desactiva funciones y ajusta su comportamiento</string>
<string name="pref_skills_summary">Activar/desactivar funciones y ajustar su comportamiento</string>
<string name="expand">Expandir</string>
<string name="reduce">Reducir</string>
<string name="pref_theme_system">Usar tema del sistema</string>
@ -174,52 +179,18 @@
<string name="retry">Reintentar</string>
<string name="stop">Detener</string>
<string name="grant_permissions">Conceder permisos</string>
<string name="pref_wake_method">Método de reconocimiento de palabra de activación</string>
<string name="pref_wake_method_summary">Elige qué servicio usar para escuchar la palabra de activación \"Hey Dicio\" en segundo plano</string>
<string name="pref_wake_method">Método de reconocimiento de palabras en reposo</string>
<string name="pref_wake_method_summary">Elija el servicio que desea utilizar para escuchar la palabra de activación \"Hey Dicio\" en segundo plano</string>
<string name="pref_wake_method_disabled">Desactivado</string>
<string name="pref_wake_method_openwakeword">Procesamiento de audio sin conexión OpenWakeWord</string>
<string name="wake_service_foreground_notification_summary">Esta notificación permite que las palabras para activar Dicio escuche el micrófono en segundo plano</string>
<string name="wake_service_label">Servicio de activación para Dicio</string>
<string name="wake_service_label">Palabras para activar Dicio</string>
<string name="wake_word_error_downloading">Se produjo un error inesperado durante la descarga</string>
<string name="wake_service_triggered_notification_summary">En Android 10+ Dicio no puede iniciarse cuando se detecta una palabra de despertador sin mostrar una notificación.</string>
<string name="wake_word_setup_title">Configurar palabra de activación</string>
<string name="wake_word_setup_description">Dicio se activará automáticamente cada vez que diga \"Hey Dicio\". Esto funciona iniciando un servicio que siempre escucha en segundo plano. Todo el procesamiento de voz se realiza de forma local, por eso es necesario descargar el modelo de IA con antelación.</string>
<string name="wake_word_setup_description">Dicio se activará automáticamente cada vez que digas \"Hey Dicio\". Esto funciona iniciando un servicio que siempre escucha en segundo plano. Todo el procesamiento de voz se realiza de forma local, por eso es necesario descargar el modelo de IA con antelación.</string>
<string name="pref_stt_play_sound_summary">Elija si desea reproducir un sonido cuando su voz empiece a ser reconocida y seleccione el canal de audio en el que se reproducirá el sonido</string>
<string name="pref_stt_play_sound_title">Reproducir sonido al empezar a escuchar</string>
<string name="wake_service_triggered_notification">Palabra de activación de Dicio activada, toque para abrir</string>
<string name="wake_service_start_notification_summary">En Android 11+ Dicio no puede iniciar el servicio sin una interacción manual del usuario.</string>
<string name="waiting">Esperando…</string>
<string name="skill_sentence_example_media">Sig. canción</string>
<string name="eval_no_match_repeat">¿Podría repetirlo?</string>
<string name="skill_search_no_results_stop">La búsqueda no arrojó resultados</string>
<string name="wake_custom_service_foreground_notification">Escuchando la palabra de activación personalizada</string>
<string name="pref_weather_temperature_unit">Unidad de temperatura</string>
<string name="pref_weather_temperature_unit_celsius">Celsius (°C)</string>
<string name="use_system_default">Usar por defecto del sistema</string>
<string name="pref_weather_unit_system_instructions">Utiliza la unidad configurada en \"Ajustes del sistema &gt; Sistema &gt; Idiomas y entradas &gt; Preferencias regionales\"</string>
<string name="pref_weather_temperature_unit_fahrenheit">Fahrenheit (°F)</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_kelvin">K</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
<string name="pref_input_method_vosk_summary">Descarga y ejecuta un modelo Vosk SpeechToText sin conexión dentro de Dicio</string>
<string name="pref_input_method_external_popup">Popup externa SpeechToText</string>
<string name="skill_media_playing">Reproduciendo medio…</string>
<string name="skill_media_pausing">Pausando medio…</string>
<string name="skill_media_previous">Medio anterior…</string>
<string name="skill_media_next">Medio siguiente…</string>
<string name="pref_wake_custom_delete">Borrar palabra de activación personalizada</string>
<string name="pref_wake_custom_import">Importar palabra de activación personalizada</string>
<string name="perm_call_phone">llamar directamente a los números de teléfono</string>
<string name="skill_name_media">Control de medios</string>
<string name="skill_media_no_media_session">No está activada la sesión de medios</string>
<string name="pref_input_method_external_popup_summary">Abre la interfaz de usuario de otra aplicación por medio de ACTION_RECOGNIZE_SPEECH; por ejemplo, whisperIME, Kõnele y Futo Voice Input</string>
<string name="pref_wake_custom_delete_summary">Regresa a la palabra de activación predeterminada \"Hey Dicio\"</string>
<string name="pref_weather_temperature_unit_kelvin">Kelvin (K)</string>
<string name="pref_wake_custom_import_summary_oww">Sustituye la palabra de activación predeterminada «Hey Dicio» por un modelo TFLite personalizado; puedes descargar algunos modelos personalizados desde github.com/dscripka/openWakeWord/releases</string>
<string name="pref_weather_length_unit_metric">Métrica</string>
<string name="perm_read_contacts">leer sus contactos</string>
<string name="pref_weather_length_unit">Unidad de medida</string>
<string name="pref_weather_length_unit_imperial">Imperial</string>
<string name="skill_weather_celsius">°C</string>
</resources>

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="drawer_open">Ava menüü</string>
<string name="drawer_close">Sulge menüü</string>
<string name="drawer_header_subtitle">Kuidas saan sind aidata?</string>
<string name="back">Tagasi</string>
<string name="clear">Tühjenda</string>
<string name="share">Jaga</string>
<string name="open_with">Ava rakendusega</string>
<string name="no_app_to_open_intent">Sinu nutiseadmes pole ühtegi rakendust, mis oskaks seda faili avada</string>
<string name="copy_to_clipboard">Kopeeri lõikelauale</string>
<string name="copied_to_clipboard">Kopeerisin lõikelauale</string>
<string name="done">Valmis</string>
<string name="permission_denied">Õigused puuduvad</string>
<string name="text_input_hint">Küsi minult mida iganes…</string>
<string name="grant_microphone_permission">Luba mikrofoni kasutamine</string>
<string name="error_loading">Viga laadimisel</string>
<string name="error_unzipping">Viga lahtipakkimisel</string>
<string name="error_downloading">Viga allalaadimisel</string>
<string name="unzipping">Lahtipakkimisel…</string>
<string name="download">Laadi alla</string>
<string name="settings">Seadistused</string>
<string name="pref_theme_system">Kasuta süsteemi kujundust</string>
<string name="pref_theme_system_dark_black">Kasuta süsteemi kujundust (tumeda kujunduse süsimust variant)</string>
<string name="pref_theme_light">Hele kujundus</string>
<string name="pref_theme_dark">Tume kujundus</string>
<string name="pref_theme_black">Süsimust kujundus</string>
<string name="pref_language">Keel</string>
<string name="pref_language_summary">Mis keeles peaks Dicio sind kuulama ja sulle vastama?</string>
<string name="pref_language_system">Kasuta süsteemi keelt</string>
<string name="pref_input_method">Sisendmeetod</string>
<string name="start_listening">Alusta kuulamist</string>
<string name="downloaded">Allalaaditud</string>
<string name="loaded">Laaditud</string>
<string name="here_is_what_i_can_do">Vaat, mida ma võin teha!</string>
<string name="stt_not_available">Kõnetuvastus pole saadaval</string>
<string name="stt_download">Laadi alla kõnetuvastuse tarvikud</string>
<string name="stt_unzip">Paki lahti kõnetuvastuse tarvikud</string>
<string name="listening">Kuulan sinu juttu…</string>
<string name="waiting">Ootan…</string>
<string name="all_skills_disabled_title">Ükski oskus pole kasutusel</string>
<string name="all_skills_disabled_description">Palun lülita seadistustest mõni oskus sisse. Vastasel juhul Dicio ei oska mitte midagi ette võtta</string>
<string name="action_text_input">Tekstisisend</string>
<string name="action_voice_input">Häälsisend</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_kelvin">K</string>
<string name="skill_weather_meters_per_second">m/sek</string>
<string name="skill_weather_miles_per_hour">ml/t</string>
</resources>

View File

@ -15,7 +15,7 @@
<string name="error_unzipping">Onglema zip-paketin purkamisessa</string>
<string name="stt_not_available">Puhe tekstiksi ei ole saatavilla</string>
<string name="stt_unzip">Pura puhe tekstiksi</string>
<string name="downloaded">Ladattu</string>
<string name="downloaded">Lataa</string>
<string name="loaded">Ladattu</string>
<string name="all_skills_disabled_title">Kaikki taidot ovat pois käytöstä</string>
<string name="all_skills_disabled_description">Ole hyvä ja ota joitain taitoja käyttöön sovelluksen aseutksista. Dicio ei voi muuten tehdä mitään</string>
@ -109,7 +109,7 @@
<string name="error_report_channel_name">Virheraportin ilmoitus</string>
<string name="pref_general">Yleinen</string>
<string name="pref_stt_auto_finish_title">Lähetä puheen tulos suoraan tekstiponnahdusikkunaan</string>
<string name="eval_no_match">En ymmärtänyt</string>
<string name="eval_no_match">En ymmärtänyt, voitko toistaa?</string>
<string name="skill_name_navigation">Navigointi</string>
<string name="skill_sentence_example_navigation">Navigoi Vancouverin kansainväliselle lentokentälle</string>
<string name="skill_name_timer">Ajastin</string>
@ -118,7 +118,7 @@
<string name="skill_name_telephone">Puhelin</string>
<string name="skill_sentence_example_telephone">Soita Tomille</string>
<string name="skill_weather_could_not_find_city">Kaupunkia %1$s ei löytynyt</string>
<string name="skill_weather_description_temperature">%1$s · %2$.1f%3$s</string>
<string name="skill_weather_description_temperature">%1$s · %2$.1f °C</string>
<string name="skill_lyrics_found_song_by_artist">Löytyi %1$s tekijältä %2$s</string>
<string name="skill_open_could_not_understand">Ei voinut ymmärtää sovellusta</string>
<string name="skill_calculator_could_not_calculate">En voinut laskea pyyntöäsi</string>
@ -144,7 +144,7 @@
<string name="skill_name_lyrics">Laulujen sanoitukset</string>
<string name="skill_name_open">Sovelluksen avaaja</string>
<string name="skill_sentence_example_open">Avaa NewPipe</string>
<string name="skill_weather_min_max_wind">Vähimmäislämpötila: %1$.1f%4$s\nEnimmäislämpötila: %2$.1f%4$s\nTuulen nopeus: %3$.1f%5$s</string>
<string name="skill_weather_min_max_wind">Vähimmäislämpötila: %1$.1f °C\nEnimmäislämpötila: %2$.1f °C\nTuulen nopeus: %3$.1f m/s</string>
<string name="skill_lyrics_song_not_found">Kappaletta %1$s ei löytynyt</string>
<string name="skill_name_media">Median ohjaus</string>
<string name="skill_sentence_example_media">Seuraava kappale</string>
@ -162,6 +162,7 @@
<string name="skill_media_no_media_session">Mikään mediaistunto ei ole aktiivinen</string>
<string name="skill_telephone_confirm_call">Pitäisikö minun soittaa %1$s:lle?</string>
<string name="skill_timer_no_active_name">Ei ole aktiivista ajastinta nimeltä %1$s</string>
<string name="notification_listener_label">Dicio-ilmoitustapahtumien kuuntelija</string>
<string name="wake_service_foreground_notification_summary">Tämän ilmoituksen avulla Dicio-herätyssanapalvelu voi kuunnella mikrofonia taustalla</string>
<string name="wake_service_start_notification">Napauta käynnistääksesi Dicio-herätyssanapalvelun</string>
<string name="wake_word_setup_title">Aseta herätyssana</string>
@ -196,28 +197,4 @@
<string name="grant_permissions">Myönnä luvat</string>
<string name="stt_popup">Puhe tekstiponnahdusikkunaksi</string>
<string name="skill_search_no_results_stop">Haku ei tuottanut tulosta</string>
<string name="pref_weather_temperature_unit">Lämpötilayksikkö</string>
<string name="skill_weather_kelvin">K</string>
<string name="pref_weather_temperature_unit_celsius">Celsius (°C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">Fahrenheit (°F)</string>
<string name="pref_weather_temperature_unit_kelvin">Kelvin (K)</string>
<string name="pref_weather_length_unit">Pituusyksikkö</string>
<string name="pref_weather_length_unit_imperial">Keisarillinen</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mt</string>
<string name="pref_wake_custom_import_summary_oww">Korvaa oletusarvoinen \"Hei Dicio\" -herätyssana mukautetulla TFLite-mallilla; voit ladata joitain mukautettuja malleja github.com/dscripka/openWakeWord/releases :sta</string>
<string name="pref_input_method_vosk_summary">Lataa ja käyttää Vosk SpeechToText -mallia ei-verkkotilassa Dicion sisällä</string>
<string name="eval_no_match_repeat">Voisitko toistaa?</string>
<string name="pref_input_method_external_popup_summary">Avaa toisen sovelluksen käyttöliittymän ACTION_RECOGNIZE_SPEECH:n kautta, esimerkiksi whisperIME, Kõnele, Futo Voice Input</string>
<string name="pref_weather_length_unit_metric">Metrinen</string>
<string name="use_system_default">Käytä järjestelmän oletusarvoa</string>
<string name="pref_weather_unit_system_instructions">Käyttää kohdassa \"Järjestelmäasetukset &gt; Järjestelmä &gt; Kielet ja syöttö &gt; Alueelliset asetukset\" määritettyä yksikköä</string>
<string name="waiting">Odotetaan…</string>
<string name="pref_input_method_external_popup">Ulkoinen SpeechToText-ponnahdusikkuna</string>
<string name="pref_wake_custom_delete">Poista mukautettu herätyssana</string>
<string name="pref_wake_custom_delete_summary">Palaa oletusarvoiseen \"Hei Dicio\" -herätyssanaan</string>
<string name="pref_wake_custom_import">Tuo mukautettu herätyssana</string>
<string name="wake_custom_service_foreground_notification">Kuunnellaan mukautettua herätyssanaa</string>
</resources>

View File

@ -197,6 +197,7 @@
<string name="skill_media_previous">Média précédent…</string>
<string name="skill_media_next">Média suivant…</string>
<string name="skill_media_no_media_session">Aucune session média active</string>
<string name="notification_listener_label">Gestionnaire d\' événement de notifications Dicio</string>
<string name="skill_search_no_results_stop">La recherche n\'a donné aucun résultat</string>
<string name="wake_custom_service_foreground_notification">A l\'écoute du mot de réveil personnalisé</string>
<string name="pref_input_method_external_popup_summary">Ouvre l\'interface d\'une autre appli via ACTION_RECOGNIZE_SPEECH, comme par exemple whisperIME, Kõnele, Futo Voice Input</string>
@ -208,37 +209,4 @@
<string name="pref_wake_custom_delete_summary">Rétablir le mot de réveil par défaut \"Hey Dicio\"</string>
<string name="pref_wake_custom_import">Importer un mot de réveil personnalisé</string>
<string name="eval_no_match_repeat">Pouvez-vous répéter?</string>
<string name="pref_weather_temperature_unit">Unité de température</string>
<string name="skill_weather_kelvin">K</string>
<string name="pref_weather_temperature_unit_fahrenheit">Fahrenheit (°F)</string>
<string name="pref_weather_temperature_unit_kelvin">Kelvin (K)</string>
<string name="pref_weather_length_unit">Unité de longueur</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
<string name="skill_weather_celsius">°C</string>
<string name="pref_weather_unit_system_instructions">Applique les unités configurées dans \"Paramètres &gt; Système &gt; Langues &amp; saisies &gt; Préférences régionales\"</string>
<string name="pref_weather_length_unit_metric">Métrique</string>
<string name="use_system_default">Utiliser valeurs du système</string>
<string name="pref_weather_temperature_unit_celsius">Celsius (°C)</string>
<string name="pref_weather_length_unit_imperial">Impérial</string>
<string name="skill_listening_already_listening">Je suis déjà à l\'écoute du mot d\'activation</string>
<string name="skill_listening_started_listening">Ok, je me mets à l\'écoute du mot d\'activation</string>
<string name="skill_listening_not_listening">Je n\'écoutais pas</string>
<string name="skill_listening_stop_listening">OK</string>
<string name="skill_listening_disabled">Le service d\'écoute du mot d\'activation est désactivé dans les paramètres</string>
<string name="skill_name_listening">Contrôler l\'écoute du mot d\'activation</string>
<string name="skill_sentence_example_listening">Arrêter l\'écoute</string>
<string name="skill_name_joke">Blague</string>
<string name="skill_sentence_example_joke">Fais moi une blague</string>
<string name="skill_translation_success">Traduit en %1$s</string>
<string name="skill_translation_unknown_language">Je ne reconnais pas la langue %1$s</string>
<string name="skill_translation_unsupported_language">La langue de %1$s (%2$s) n\'est pas supportée</string>
<string name="skill_translation_failed">Impossible de traduire votre requête en %1$s</string>
<string name="skill_translation_failed_no_query">Je n\'ai pas compris ce que vous voulez traduire. Pouvez-vous répéter?</string>
<string name="skill_translation_to">en</string>
<string name="skill_name_translation">Traduire</string>
<string name="skill_sentence_example_translation">Traduis Hola d\'espagnol en anglais</string>
<string name="failed_to_copy">Échec de la copie au presse-papier</string>
<string name="skill_translation_auto">Auto</string>
</resources>

View File

@ -129,16 +129,4 @@
<string name="skill_weather_in_city_there_is_description">Saat ini di %1$s ada %2$s</string>
<string name="pref_stt_auto_finish_title">Kirim langsung hasil ucapan ke layanan teks</string>
<string name="pref_stt_auto_finish_summary_on">Secara otomatis mengirim hasil ucapan ke aplikasi yang meminta ketika mendengarkan selesai</string>
<string name="back">Kembali</string>
<string name="clear">Bersihkan</string>
<string name="copy_to_clipboard">Salin ke papanklip</string>
<string name="done">Selesai</string>
<string name="grant_microphone_permission">Berikan izin mikrofon</string>
<string name="error_loading">Loading bermasalah</string>
<string name="error_unzipping">Kesalahan saat membuka zip</string>
<string name="error_downloading">Kesalahan saat mendownload</string>
<string name="unzipping">Membongkar file zip…</string>
<string name="download">Unduhan</string>
<string name="stt_not_available">Ucapan ke Teks tidak tersedia</string>
<string name="stt_download">Unduh Ucapan ke Teks</string>
</resources>

View File

@ -17,7 +17,6 @@
<string name="pref_theme_summary">Cambia i colori dell\'app</string>
<string name="pref_input_method">Modalità di input</string>
<string name="pref_input_method_summary">Scegli il servizio da usare per parlare a Dicio</string>
<string name="pref_input_method_external_popup_summary">Apre l\'interfaccia di un\'app esterna tramite ACTION\u200B_\u200BRECOGNIZE\u200B_\u200BSPEECH, ad esempio whisperIME, Kõnele, Futo Voice Input</string>
<string name="pref_speech_output_method">Modalità di output vocale</string>
<string name="pref_speech_output_method_summary">Scegli il servizio che Dicio userà per parlarti</string>
<string name="eval_fatal_error">Errore nell\'esaminare la richiesta</string>
@ -70,30 +69,24 @@
<string name="pref_weather_default_city">Città predefinita</string>
<string name="pref_weather_default_city_using_ip_info">Imposta la città da usare per il meteo quando non ne espliciti una a voce. Il comportamento corrente è di estrarre la posizione dalle informazioni sull\'IP.</string>
<string name="pref_speech_output_method_android">Motore di sintesi vocale di Android</string>
<string name="android_tts_unsupported_language">Il linguaggio corrente non è supportato dal motore di sintesi vocale di Android</string>
<string name="android_tts_unsupported_language" translatable="false">Il linguaggio corrente non è supportato dal motore di sintesi vocale di Android</string>
<string name="microphone_error">Impossibile accedere al microfono, probabilmente è già in uso o non è stato concesso il permesso di accedervi.</string>
<string name="skill_sentence_example_search">Cerca come dar da mangiare ad un gatto</string>
<string name="skill_sentence_example_weather">Che tempo fa a Roma?</string>
<string name="skill_sentence_example_lyrics">Qual è la canzone che fa il cielo è sempre più blu\?</string>
<string name="skill_sentence_example_open">Apri NewPipe</string>
<string name="waiting">Attendo…</string>
<string name="start_listening">Ascolta</string>
<string name="downloaded">Scaricato</string>
<string name="loaded">Caricato</string>
<string name="here_is_what_i_can_do">Ecco cosa posso fare!</string>
<string name="skill_sentence_example_media">Metti in pausa</string>
<string name="skill_sentence_example_joke">Dimmi uno scherzo</string>
<string name="skill_name_calculator">Calcolatrice</string>
<string name="skill_sentence_example_calculator">Quanto fa cinque per quattro meno un milione?</string>
<string name="skill_media_no_media_session">Nessuna sessione di riproduzione è attiva</string>
<string name="skill_calculator_could_not_calculate">Non sono riuscito a calcolare ciò che mi hai chiesto</string>
<string name="pref_wake_custom_import_summary_oww">Sostituisce la parola di attivazione predefinita \"Hey Dicio\" con un modello TFLite personalizzato; è possibile scaricarne alcuni da github.com/dscripka/openWakeWord/releases</string>
<string name="pref_skill_not_available">Questa abilità non è ancora disponibile nella tua lingua. Se vuoi contribuire sarai ben accetto!</string>
<string name="vosk_model_download_error">Non è stato possibile scaricare il modello di Vosk</string>
<string name="open_with">Apri con</string>
<string name="no_app_to_open_intent">Nessuna app sul tuo dispositivo può aprire questo contenuto</string>
<string name="permission_denied">Permesso negato</string>
<string name="skill_search_no_results_stop">Non ho trovato nessun risultato</string>
<string name="skill_search_what_question">Cosa vuoi cercare\?</string>
<string name="skill_search_no_results">La ricerca non ha prodotto risultati, prova a dirmi di nuovo cosa vuoi cercare</string>
<string name="pref_skill_missing_permissions">Richiede questi permessi: %1$s</string>
@ -146,7 +139,6 @@
<string name="pref_stt_auto_finish_title">Invia direttamente il risultato della finestra di riconoscimento vocale</string>
<string name="pref_stt_auto_finish_summary_on">Quando finisci di parlare il testo riconosciuto sarà inviato automaticamente all\'app richiedente</string>
<string name="pref_stt_auto_finish_summary_off">Verrà attesa la conferma manuale prima di inviare il testo riconosciuto all\'app richiedente</string>
<string name="eval_no_match_repeat">Puoi ripetere?</string>
<string name="stt_say_something">Dì qualcosa…</string>
<string name="stt_did_not_understand">Non ho capito, riprova</string>
<string name="stt_popup">Finestra di riconoscimento vocale</string>
@ -174,7 +166,6 @@
<string name="pref_wake_method_openwakeword">Elaborazione audio offline di OpenWakeWord</string>
<string name="wake_service_foreground_notification_summary">Questa notifica permette al servizio che riconosce la parola di attivazione di Dicio di ascoltare in background</string>
<string name="wake_service_foreground_notification">Ascolto della parola di attivazione \"Hey Dicio\"</string>
<string name="wake_custom_service_foreground_notification">Ascolto della parola di attivazione personalizzata</string>
<string name="wake_service_start_notification">Tocca per avviare il servizio della parola di attivazione di Dicio</string>
<string name="wake_service_triggered_notification">Parola di attivazione di Dicio riconosciuta, clicca per aprire</string>
<string name="wake_word_error_downloading_network">Dicio non è riuscito a connettersi a Internet. Controlla la tua connessione e riprova.</string>
@ -196,50 +187,5 @@
<string name="pref_theme_black">Nero</string>
<string name="pref_dynamic_colors_title">Colori dinamici</string>
<string name="pref_dynamic_colors_summary">Usa i colori dinamici di Material You forniti dal sistema</string>
<string name="perm_call_phone">chiamare numeri di telefono direttamente</string>
<string name="settings_description_with_value">%1$s — %2$s</string>
<string name="perm_read_contacts">leggere i tuoi contatti</string>
<string name="skill_name_media">Gestione della riproduzione</string>
<string name="skill_media_playing">Riproduco…</string>
<string name="skill_media_pausing">Metto in pausa…</string>
<string name="skill_media_previous">Passo alla precedente…</string>
<string name="skill_media_next">Passo alla successiva…</string>
<string name="skill_sentence_example_listening">Smetti di ascoltarmi</string>
<string name="skill_sentence_example_translation">Traduci cetriolo in tedesco</string>
<string name="pref_weather_temperature_unit">Unità della temperatura</string>
<string name="pref_input_method_vosk_summary">Scarica ed esegue un modello di riconoscimento vocale offline Vosk</string>
<string name="pref_input_method_external_popup">Riconoscimento vocale tramite popup esterno</string>
<string name="pref_wake_custom_delete">Elimina parola di attivazione personalizzata</string>
<string name="pref_wake_custom_delete_summary">Ripristina la parola di attivazione \"Hey Dicio\"</string>
<string name="pref_wake_custom_import">Importa una parola di attivazione personalizzata</string>
<string name="pref_weather_temperature_unit_kelvin">Kelvin (K)</string>
<string name="pref_weather_length_unit">Unità di lunghezza</string>
<string name="pref_weather_length_unit_metric">Metriche</string>
<string name="pref_weather_length_unit_imperial">Imperiali</string>
<string name="use_system_default">Usa la predefinita del sistema</string>
<string name="pref_weather_unit_system_instructions">Utilizza l\'unità configurata in \"Impostazioni di sistema > Sistema > Lingue > Preferenze locali\"</string>
<string name="pref_weather_temperature_unit_celsius">Celsius (°C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">Fahrenheit (°F)</string>
<string name="skill_listening_already_listening">Sto già ascoltando la parola di attivazione</string>
<string name="skill_listening_stop_listening">Ok</string>
<string name="skill_listening_disabled">La parola di attivazione è disattivata</string>
<string name="skill_listening_started_listening">Ok, ascolterò la parola di attivazione</string>
<string name="skill_listening_not_listening">Non stavo ascoltando</string>
<string name="skill_name_listening">Attiva/disattiva la parola di attivazione</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_kelvin">K</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
<string name="skill_name_joke">Barzellette</string>
<string name="skill_translation_success">Tradotto in %1$s</string>
<string name="skill_translation_unknown_language">Non riconosco la lingua %1$s</string>
<string name="skill_translation_unsupported_language">La lingua %1$s (%2$s) non è supportata</string>
<string name="skill_translation_failed">Non son riuscito a tradurre in %1$s</string>
<string name="skill_translation_failed_no_query">Non ho capito cosa vuoi tradurre, potresti ripetere?</string>
<string name="skill_translation_to">in</string>
<string name="skill_name_translation">Traduttore</string>
<string name="failed_to_copy">Impossibile copiare negli appunti</string>
<string name="skill_translation_auto">Auto</string>
<string name="skill_search_duckduckgo_recaptcha">DuckDuckGo non ha fornito risultati: richiede la risoluzione di un Captcha</string>
</resources>

View File

@ -41,7 +41,7 @@
<string name="vosk_model_extraction_error">חילוץ מודל Vosk מ־Zip נכשל</string>
<string name="vosk_model_ready">מודל Vosk מוכן</string>
<string name="android_tts_unsupported_language">השפה הנוכחית לא נתמכת על ידי מנגנון ההקראה של Android</string>
<string name="android_tts_error">אירעה שגיאה בהתחלת מנגנון ההקראה של Android</string>
<string name="android_tts_error">אירעה שגיאה בהזנקת מנגנון ההקראה של Android</string>
<string name="settings">הגדרות</string>
<string name="error_report">דיווח</string>
<string name="error_title">דוח שגיאה</string>
@ -65,7 +65,7 @@
<string name="pref_theme_black">שחורה</string>
<string name="pref_language">שפה</string>
<string name="pref_language_summary">באיזו שפה ישתמש Dicio כדי להאזין לך ולספק לך תשובות?</string>
<string name="pref_language_system">שימוש בשפת המערכת</string>
<string name="pref_language_system">להשתמש בשפת המערכת</string>
<string name="pref_input_method">שיטת קלט</string>
<string name="pref_input_method_summary">נא לבחור באיזה שירות להשתמש כדי לדבר עם Dicio</string>
<string name="error_github_notice">נא לבדוק אם כבר קיים דיווח שדן בקריסה שלך. יצירת דיווחים כפולים גוזלת מאתנו זמן שיכולנו להשקיע בתיקון התקלה בפועל.</string>
@ -210,40 +210,8 @@
<string name="skill_sentence_example_media">השיר הבא</string>
<string name="skill_name_media">בקרת מדיה</string>
<string name="skill_media_pausing">המדיה מושהית…</string>
<string name="notification_listener_label">מאזין אירועי התראות Dicio</string>
<string name="perm_call_phone">חיוג ישיר למספרי טלפון</string>
<string name="perm_read_contacts">קריאת אנשי הקשר שלך</string>
<string name="skill_media_next">המדיה הבאה…</string>
<string name="pref_weather_temperature_unit">יחידת טמפרטורה</string>
<string name="pref_weather_unit_system_instructions">שימוש ביחידות המוגדרות ב„הגדרות מערכת &gt; מערכת &gt; שפות וקלט &gt; העדפות מחוזיות”</string>
<string name="pref_weather_temperature_unit_celsius">צלזיוס (°C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">פרנהייט (°F)</string>
<string name="pref_weather_temperature_unit_kelvin">קלווין (K)</string>
<string name="pref_weather_length_unit">יחידת אורך</string>
<string name="use_system_default">שימוש בברירת המחדל של המערכת</string>
<string name="pref_weather_length_unit_metric">מטרית</string>
<string name="pref_weather_length_unit_imperial">אימפריאלית</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_kelvin">K</string>
<string name="skill_weather_meters_per_second">מ׳/שנ׳</string>
<string name="skill_weather_miles_per_hour">מייל לשעה</string>
<string name="skill_listening_already_listening">אני כבר מאזין למילת השכמה</string>
<string name="skill_listening_started_listening">בסדר, אאזין למילת ההשכמה</string>
<string name="skill_listening_not_listening">לא האזנתי</string>
<string name="skill_listening_stop_listening">בסדר</string>
<string name="skill_listening_disabled">שירות מילת ההשכמה מושבת בהגדרות</string>
<string name="skill_name_listening">שליטה בהאזנה למילת השכמה</string>
<string name="skill_sentence_example_listening">עצירת האזנה</string>
<string name="failed_to_copy">ההעתקה ללוח הגזירים נכשלה</string>
<string name="skill_translation_auto">אוטו׳</string>
<string name="skill_name_joke">בדיחה</string>
<string name="skill_sentence_example_joke">אשמח לשמוע בדיחה</string>
<string name="skill_translation_success">מתורגם ל%1$s</string>
<string name="skill_translation_unknown_language">לא הצלחתי לזהות את השפה %1$s</string>
<string name="skill_translation_unsupported_language">השפה %1$s (%2$s) לא נתמכת</string>
<string name="skill_translation_failed">לא ניתן לתרגם את השאילתה שלך ל%1$s</string>
<string name="skill_translation_failed_no_query">לא הבנתי מה מיועד לתרגם. אפשר לשמוע את זה שוב?</string>
<string name="skill_translation_to">ל</string>
<string name="skill_name_translation">תרגום</string>
<string name="skill_sentence_example_translation">נא לתרגם את Hola מספרדית לאנגלית</string>
</resources>

View File

@ -27,7 +27,7 @@
<string name="skill_name_current_time">Ssaɛa tura</string>
<string name="share">Bḍu</string>
<string name="done">Immed</string>
<string name="settings">Iɣewwaren</string>
<string name="settings">Iɣewwaen</string>
<string name="pref_theme_light">Aceɛlal</string>
<string name="error_report">Aneqqis</string>
<string name="pref_speech_output_method_nothing">Ulac</string>
@ -37,4 +37,4 @@
<string name="eval_network_error">Tuccḍa deg uẓeṭṭa</string>
<string name="skill_telephone_calling">Yessawal-as I %1$s…</string>
<string name="copied_to_clipboard">Yettwanɣel ɣef afus</string>
</resources>
</resources>

View File

@ -4,13 +4,13 @@
<string name="error_title">Foutenrapport</string>
<string name="pref_theme">Thema</string>
<string name="pref_weather_default_city_using_ip_info">Stel de te gebruiken stad in voor weerinfo wanneer je geen expliciete locatie meegeeft. Momenteel wordt de locatie op basis van IP-info gebruikt.</string>
<string name="pref_stt_auto_finish_title">Stuur direct het resultaat van de spraak-naar-tekst</string>
<string name="pref_stt_auto_finish_title">Stuur het resultaat van de spraak-naar-tekst service rechtstreeks</string>
<string name="pref_stt_auto_finish_summary_on">Stuur het spraakresultaat automatisch naar de vragende app als het luisteren eindigt</string>
<string name="eval_missing_permissions">De vaardigheid \"%1$s\" heeft deze toelatingen nodig om te werken: %2$s</string>
<string name="eval_fatal_error">Je verzoek kon niet worden verwerkt</string>
<string name="eval_network_error">Netwerkfout</string>
<string name="eval_network_error_description">Dicio kan niet verbinden met het internet. Controleer je netwerkverbinding en probeer opnieuw.</string>
<string name="eval_no_match">Ik heb je niet begrepen</string>
<string name="eval_no_match">Ik heb je niet verstaan, kan je dat herhalen?</string>
<string name="stt_say_something">Zeg iets…</string>
<string name="stt_did_not_understand">Ik heb je niet begrepen, probeer opnieuw</string>
<string name="stt_popup">Spraak-naar-tekst service</string>
@ -106,7 +106,7 @@
<string name="skill_search_no_results">Het opzoeken heeft geen resultaten opgeleverd, probeer mij nog eens te zeggen waar je naar op zoek bent</string>
<string name="skill_search_what_question">Waar ben je naar op zoek\?</string>
<string name="skill_weather_could_not_find_city">Ik heb de stad %1$s niet kunnen terugvinden</string>
<string name="skill_weather_in_city_there_is_description">Het is momenteel %2$s en %3$s graden In %1$s</string>
<string name="skill_weather_in_city_there_is_description">In %1$s is er momenteel %2$s</string>
<string name="skill_weather_description_temperature">%1$s · %2$.1f %3$s</string>
<string name="skill_weather_min_max_wind">Minimumtemperatuur: %1$.1f%4$s
\nMaximumtemperatuur: %2$.1f%4$s
@ -137,101 +137,4 @@
<string name="skill_timer_query_name">De timer %1$s loopt af in %2$s</string>
<string name="skill_timer_query_last">De laatste timer loopt af in %1$s</string>
<string name="skill_timer_none_canceled">OK, er werd geen timer geannuleerd</string>
<string name="clear">WIssen</string>
<string name="grant_microphone_permission">Geef toestemming tot microfoon</string>
<string name="error_loading">Fout bij laden</string>
<string name="loaded">Geladen</string>
<string name="downloaded">Gedownload</string>
<string name="pref_general">Algemeen</string>
<string name="back">Terug</string>
<string name="copy_to_clipboard">Kopieer naar klembord</string>
<string name="done">Klaar</string>
<string name="error_unzipping">Fout bij het uitpakken</string>
<string name="error_downloading">Fout bij het downloaden</string>
<string name="unzipping">Uitpakken…</string>
<string name="download">Download</string>
<string name="stt_not_available">Spraak naar Tekst niet beschikbaar</string>
<string name="stt_download">Download Spraak naar Tekst</string>
<string name="stt_unzip">Pak Spraak naar Tekst uit</string>
<string name="waiting">Wachten…</string>
<string name="start_listening">Begin met luisteren</string>
<string name="all_skills_disabled_title">Alle vaardigheden zijn uitgeschakeld</string>
<string name="all_skills_disabled_description">Zet enkele vaardiheden aan in de instellingen, anders kan Dicio niets doen</string>
<string name="pref_theme_black">Zwart</string>
<string name="pref_input_method_vosk_summary">Downloadt en draait een Vosk SpraakNaarTekst model offline binnen Dicio</string>
<string name="pref_input_method_external_popup">Externe SpraakNaarTekst pop-up</string>
<string name="pref_stt_play_sound_none">Speel geen geluid af</string>
<string name="perm_read_contacts">lees je contacten</string>
<string name="perm_call_phone">bel direct telefoonnummers</string>
<string name="settings_description_with_value">%1$s — %2$s</string>
<string name="eval_no_match_repeat">Kun je dat herhalen?</string>
<string name="skill_name_media">Mediabeheer</string>
<string name="wake_word_setup_description">Dicio ontwaakt automatisch wanneer je \"Hé Dicio\" zegt. Dit werkt middels een service die in de achtergrond meeluistert. Alle spraakverwerking gebeurt lokaal, daarom moet je van tevoren het AI model downloaden.</string>
<string name="wake_word_error_downloading">Er is een onverwachte fout opgetreden bij het downloaden</string>
<string name="wake_word_error_downloading_network">Dicio kon het internet niet bereiken. Controleer je verbinding en probeer het opnieuw.</string>
<string name="wake_word_error_loading">Er is een onverwachte fout opgetreden bij het laden</string>
<string name="retry">Probeer opnieuw</string>
<string name="stop">Stop</string>
<string name="skill_listening_already_listening">Ik luister al naar het waakwoord</string>
<string name="skill_listening_started_listening">Oké, ik luister naar het waakwoord</string>
<string name="skill_listening_not_listening">Ik was niet aan het luisteren</string>
<string name="skill_listening_stop_listening">Oké</string>
<string name="skill_listening_disabled">De waakwoord-service is uitgeschakeld in de instellingen</string>
<string name="skill_name_listening">Beheer waakwoord instellingen</string>
<string name="skill_sentence_example_listening">Stop met luisteren</string>
<string name="pref_weather_temperature_unit">Temperatuureenheid</string>
<string name="use_system_default">Gebruik systeemstandaard</string>
<string name="pref_weather_unit_system_instructions">Gebruikt de eenheid geconfigureerd in \"Systeeminstellingen &gt; Systeem &gt; Taal en invoer &gt; Regionale voorkeuren\"</string>
<string name="pref_weather_temperature_unit_celsius">Celsius (°C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">Fahrenheit (°F)</string>
<string name="pref_weather_temperature_unit_kelvin">Kelvin (K)</string>
<string name="pref_weather_length_unit">Lengte-eenheid</string>
<string name="pref_weather_length_unit_metric">Metrisch</string>
<string name="pref_weather_length_unit_imperial">Imperiaal</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_kelvin">K</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
<string name="wake_word_setup_title">Stel waakwoord in</string>
<string name="disable">Uitschakelen</string>
<string name="grant_permissions">Toestemming verlenen</string>
<string name="pref_skills_summary">Zet vaardigheden aan/uit en pas hun werking aan</string>
<string name="pref_theme_system">Gebruik het systeemthema</string>
<string name="pref_theme_system_dark_black">Gebruik het systeemthema (gebruik de Zwarte variant voor dark theme)</string>
<string name="pref_input_method_external_popup_summary">Open de UI van een andere applicatie middels ACTION_RECOGNIZE_SPEECH, zoals whisperIME, Kõnele, Futo Voice Input</string>
<string name="expand">Vergroot</string>
<string name="reduce">Verklein</string>
<string name="pref_wake_method">Herkenningsmethode voor waakwoord</string>
<string name="pref_wake_method_summary">Kies de service die in de achtergrond wacht tot het \"Hé Dicio\" waakwoord gezegd wordt</string>
<string name="pref_wake_method_disabled">Uitgeschakeld</string>
<string name="pref_wake_method_openwakeword">OpenWakeWord offline audioverwerking</string>
<string name="pref_wake_custom_delete">Verwijder het aangepaste waakwoord</string>
<string name="pref_wake_custom_delete_summary">Zet het waakwoord weer terug naar de standaard \"Hé Dicio\"</string>
<string name="pref_wake_custom_import">Importeer een aangepast waakwoord</string>
<string name="pref_wake_custom_import_summary_oww">Vervang het standaard waakwoord \"Hé Dicio\" met een aangepast TFLite model. Je kunt aangepaste modellen downloaden van github.com/dscripka/openWakeWord/releases</string>
<string name="pref_dynamic_colors_title">Dynamische kleuren</string>
<string name="pref_dynamic_colors_summary">Gebruik de \"Material You\" dynamische kleuren van het systeem</string>
<string name="pref_stt_play_sound_title">Speel een geluid af wanneer het luisteren begint</string>
<string name="pref_stt_play_sound_summary">Kies of er een geluid wordt afgespeelds als je stem herkent begint te worden, en selecteer het audiokanaal om het geluid af te spelen</string>
<string name="pref_stt_play_sound_notification">Notificatiekanaal</string>
<string name="pref_stt_play_sound_alarm">Alarmkanaal</string>
<string name="pref_stt_play_sound_media">Standaard-/mediakanaal</string>
<string name="skill_sentence_example_media">Volgende nummer</string>
<string name="skill_search_no_results_stop">De zoekopdracht heeft niets gevonden</string>
<string name="skill_open_could_not_understand">Ik kon de app niet verstaan</string>
<string name="skill_media_playing">Media aan het afspelen…</string>
<string name="skill_media_pausing">Media aan het pauzeren…</string>
<string name="skill_media_previous">Vorige media…</string>
<string name="skill_media_next">Volgende media…</string>
<string name="skill_media_no_media_session">Er is geen mediasessie actief</string>
<string name="stt_service_label">Dicio offline spraakherkernning</string>
<string name="wake_service_label">Dicio waakwoordservice</string>
<string name="wake_service_foreground_notification_summary">Deze notificatie staat de Dicio waakwoordservice toe om in de achtergrond naar de microfoon te luisteren</string>
<string name="wake_service_foreground_notification">Aan het luistern naar het \"Hé Diciot\" waakwoord</string>
<string name="wake_custom_service_foreground_notification">Aan het luisteren naar aangepast waakwoord</string>
<string name="wake_service_start_notification">Tik om de Dicio waakwoordservice te starten</string>
<string name="wake_service_start_notification_summary">Dicio kan de service niet starten op Android 11+ zonder handmatige interactie van de gebruiker.</string>
<string name="wake_service_triggered_notification_summary">Dicio kan niet starten zonder notificatie te geven bij herkenning van het waakwoord op Android 10+.</string>
<string name="wake_service_triggered_notification">Dicio waakwoord geactiveerd, tik om te openen</string>
</resources>

View File

@ -20,12 +20,12 @@
<string name="pref_language_system">Używaj języka systemowego</string>
<string name="pref_input_method">Metoda wejścia</string>
<string name="pref_input_method_vosk">Rozpoznanie mowy Vosk offline</string>
<string name="pref_speech_output_method">Metoda wyjścia głosu</string>
<string name="pref_speech_output_method">Metoda wyjścia</string>
<string name="pref_speech_output_method_summary">Wybierz usługę, z której będzie korzystał Dicio, by z tobą rozmawiać</string>
<string name="pref_speech_output_method_android">STT Android\'a</string>
<string name="pref_speech_output_method_toast">Wyskakujące okienko</string>
<string name="pref_speech_output_method_snackbar">Wiadomość na dole</string>
<string name="pref_speech_output_method_nothing">NIe korzystaj</string>
<string name="pref_speech_output_method_android">Syntetyzator mowy Android</string>
<string name="pref_speech_output_method_toast">Toast (wyskakujące okienko)</string>
<string name="pref_speech_output_method_snackbar">Snackbar (wiadomość na dole)</string>
<string name="pref_speech_output_method_nothing">Nic</string>
<string name="action_voice_input">Wejście głosowe</string>
<string name="action_text_input">Wejście tekstowe</string>
<string name="drawer_open">Otwórz panel nawigacji</string>
@ -34,10 +34,10 @@
<string name="share">Udostępnij</string>
<string name="no_app_to_open_intent">Na twoim urządzeniu nie ma aplikacji, która mogłaby to otworzyć</string>
<string name="vosk_model_notification_title">Model Vosk</string>
<string name="pref_search_engine">Wyszukiwarka internetowa</string>
<string name="pref_weather_default_city">Domyślne miasto pogody</string>
<string name="pref_search_engine">Wyszukiwarka</string>
<string name="pref_weather_default_city">Domyślne miasto</string>
<string name="eval_fatal_error">Żądanie odrzucone</string>
<string name="eval_network_error">Błąd połączenia internetowego</string>
<string name="eval_network_error">Błąd połączenia</string>
<string name="eval_network_error_description">Dicio nie może nawiązać połączenia z Internetem. Sprawdź dostęp do sieci i spróbuj ponownie.</string>
<string name="eval_no_match">Nie rozumiem, możesz powtórzyć?</string>
<string name="skill_name_search">Szukaj</string>
@ -45,16 +45,16 @@
<string name="skill_name_weather">Pogoda</string>
<string name="skill_sentence_example_weather">Jaka jest pogoda w Rzymie\?</string>
<string name="skill_name_lyrics">Tekst piosenki</string>
<string name="skill_sentence_example_lyrics">Z jakiej piosenki jest \'we will we will rock you\'?</string>
<string name="skill_sentence_example_lyrics">Z jakiej piosenki jest \'we will rock you\'\?</string>
<string name="skill_sentence_example_open">Otwórz NewPipe</string>
<string name="skill_name_open">Otwórz aplikację</string>
<string name="skill_sentence_example_calculator">Ile to pięć razy cztery odjąć milion\?</string>
<string name="here_is_what_i_can_do">Oto co potrafię!</string>
<string name="android_tts_unsupported_language">Wybrany język nie jest wspierany przez syntetyzator mowy Android</string>
<string name="pref_skill_not_available">Ta umiejętność nie jest jeszcze dostępna dla twojego języka. Wsparcie jest mile widziane!</string>
<string name="skill_fallback_name_text">Wiadomość SMS</string>
<string name="skill_fallback_name_text">Wiadomość tekstowa</string>
<string name="skill_search_here_is_what_i_found">Oto co znalazłem</string>
<string name="skill_search_no_results">Wyszukiwarka internetowa znalazła nic, czy możesz powtórzyć co chcesz poszukać</string>
<string name="skill_search_no_results">Nic nie znalazłem, spróbuj powiedzieć mi jeszcze raz</string>
<string name="skill_search_what_question">Czego mam poszukać\?</string>
<string name="skill_weather_could_not_find_city">Nie znaleziono miasta %1$s</string>
<string name="skill_weather_in_city_there_is_description">Obecnie w %1$s jest %2$s</string>
@ -63,7 +63,7 @@
\nMaksymalna temperatura: %2$.1f%4$s
\nPrędkość wiatru: %3$.1f%5$s</string>
<string name="skill_lyrics_song_not_found">Nie znalazłem piosenki %1$s</string>
<string name="skill_lyrics_found_song_by_artist">Znalazłem %1$s przez %2$s</string>
<string name="skill_lyrics_found_song_by_artist">Znalazłem %1$s autorstwa %2$s</string>
<string name="skill_open_unknown_app">Nieznana aplikacja %1$s</string>
<string name="skill_open_opening">Otwieranie %1$s…</string>
<string name="skill_calculator_could_not_calculate">Nie potrafię przetworzyć twojego żądania</string>
@ -86,11 +86,11 @@
<string name="skill_name_current_time">Aktualny czas</string>
<string name="skill_sentence_example_current_time">Która jest godzina\?</string>
<string name="skill_telephone_unknown_contact">Nie znaleziono kontaktu, spróbuj ponownie</string>
<string name="skill_telephone_found_contacts">Znalazłem %1$d kontakty/ów, do którego mam zadzwonić?</string>
<string name="skill_telephone_confirm_call">Czy mam zadzwonić do %1$s?</string>
<string name="skill_telephone_found_contacts">Znalazłem kontakty %1$d, do którego mam zadzwonić\?</string>
<string name="skill_telephone_confirm_call">Czy zadzwonić do %1$s\?</string>
<string name="skill_telephone_calling">Dzwonienie do %1$s…</string>
<string name="skill_telephone_not_calling">W porządku, nie dzwonię do nikogo</string>
<string name="skill_time_current_time">Godzina to %1$s</string>
<string name="skill_time_current_time">Aktualnie jest %1$s</string>
<string name="error_copy_formatted">Skopiuj sformatowany raport</string>
<string name="pref_skill_grant_permissions">Zezwól</string>
<string name="error_details_labels">Akcja:
@ -101,46 +101,46 @@
\nWersja OS:</string>
<string name="skill_name_telephone">Telefon</string>
<string name="eval_missing_permissions">Umiejętność „%1$s” wymaga następujących uprawnień: %2$s</string>
<string name="pref_skill_missing_permissions">Wymaga te uprawnienia: %1$s</string>
<string name="pref_skill_missing_permissions">Wymaga następujących uprawnień: %1$s</string>
<string name="skill_sentence_example_telephone">Zadzwoń do Tomasza</string>
<string name="android_tts_error">Wystąpił błąd przy inicjalizacii silnika zamiany tekstu na mowę Androida</string>
<string name="skill_timer_confirm_cancel">Czy na pewno chcesz anulować wszystkie minutniki?</string>
<string name="skill_timer_confirm_cancel">Czy na pewno chcesz anulować wszystkie liczniki czasu\?</string>
<string name="error_crash_log_headline">Dziennik awarii:</string>
<string name="skill_navigation_specify_where">Określ miejsce, do którego ma prowadzić nawigacja</string>
<string name="pref_stt_auto_finish_title">Prosto wyślij wynik pop-upu STT</string>
<string name="pref_stt_auto_finish_summary_on">Automatycznie wyślij wynik STT do aplikacji która oczekuję kiedy słuchanie się zakończy</string>
<string name="pref_stt_auto_finish_summary_off">Poczekaj na potwierdzenie przed wysłaniem wyniku STT to żądającej aplikacji</string>
<string name="pref_stt_auto_finish_title">Bezpośrednie przesłanie wyniku rozpoznawania mowy do powiadomienia</string>
<string name="pref_stt_auto_finish_summary_on">Automatyczne wysyłanie wyników mowy do aplikacji żądającej po zakończeniu odsłuchu</string>
<string name="pref_stt_auto_finish_summary_off">Poczekaj na ręczne potwierdzenie przed wysłaniem wyniku mowy do żądającej aplikacji</string>
<string name="stt_say_something">Powiedz coś…</string>
<string name="stt_did_not_understand">Nie mogłem zrozumieć, spróbuj ponownie</string>
<string name="stt_popup">Usługa STT</string>
<string name="stt_popup">Usługa zamiany mowy na tekst</string>
<string name="skill_name_navigation">Nawigacja</string>
<string name="skill_sentence_example_navigation">Nawiguj do międzynarodowego lotniska w Vancouver</string>
<string name="skill_navigation_navigating_to">Nawigacja do %1$s</string>
<string name="skill_timer_canceled">Minutnik został anulowany</string>
<string name="skill_timer_all_canceled">Wszystkie minutniki zostały anulowane</string>
<string name="skill_timer_canceled">Licznik czasu został anulowany</string>
<string name="skill_timer_all_canceled">Wszystkie liczniki czasu zostały anulowane</string>
<string name="error_github_notice">Sprawdź, czy problem dotyczący Twojej awarii już istnieje. Tworząc zduplikowane zgłoszenia, zajmujesz nam czas, który możemy poświęcić na naprawienie istniejącego błędu.</string>
<string name="error_report_channel_name">Powiadomienie o błędzie</string>
<string name="error_report_channel_description">Powiadomienia o zgłaszaniu błędów</string>
<string name="pref_skill_number_library_not_available">Biblioteka analizowania i formatowania liczb <i>dicio-numbers</i> nie jest jeszcze przetłumaczona na Twój język, co oznacza, że wszystkie umiejętności związane z liczbami, czasem trwania i datami nie są dostępne. <b>Prosimy o wsparcie</b>, jeśli możesz, stuknij tutaj!</string>
<string name="skill_name_timer">Czasomierz</string>
<string name="skill_sentence_example_timer">Ustaw czasomierz na pięć minut</string>
<string name="skill_timer_how_much_time">Ile powinien liczyć minutnik?</string>
<string name="skill_timer_no_active">Nie ma żadnego aktywnego minutnika</string>
<string name="skill_timer_no_active_name">Nie ma żadnego aktywnego minutnika o nazwie %1$s</string>
<string name="skill_timer_query">Minutnik wygasa za %1$s</string>
<string name="skill_timer_query_name">Minutnik %1$s wygasa za %2$s</string>
<string name="skill_timer_query_last">Ostatni minutnik wygasa za %1$s</string>
<string name="skill_timer_none_canceled">OK, żaden minutnik nie został anulowany</string>
<string name="skill_name_timer">Zegar</string>
<string name="skill_sentence_example_timer">Ustaw zegar na pięć minut</string>
<string name="skill_timer_how_much_time">Ile czasu powinno trwać odliczanie\?</string>
<string name="skill_timer_no_active">Nie ma żadnego aktywnego czasomierza</string>
<string name="skill_timer_no_active_name">Nie ma żadnego aktywnego czasomierza o nazwie %1$s</string>
<string name="skill_timer_query">Czasomierz wygasa za %1$s</string>
<string name="skill_timer_query_name">Czasomierz %1$s wygasa za %2$s</string>
<string name="skill_timer_query_last">Ostatni czasomierz wygasa za %1$s</string>
<string name="skill_timer_none_canceled">OK, żaden timer nie został anulowany</string>
<string name="skill_timer_expired">Czas się skończył!</string>
<string name="skill_timer_expired_name">Minutnik %1$s wygasł!</string>
<string name="skill_timer_set">OK, minutnik wygaśnie za %1$s</string>
<string name="skill_timer_set_name">OK, minutnik %1$s wygaśnie za %2$s</string>
<string name="skill_timer_canceled_name">MInutnik %1$s został anulowany</string>
<string name="skill_timer_expired_name">Czasomierz %1$s wygasł!</string>
<string name="skill_timer_set">OK, czasomierz wygaśnie za %1$s</string>
<string name="skill_timer_set_name">OK, czasomierz %1$s wygaśnie za %2$s</string>
<string name="skill_timer_canceled_name">Czasomierz %1$s został anulowany</string>
<string name="pref_skills_title">Umiejętności</string>
<string name="pref_theme_system">Użyj motywu systemowego</string>
<string name="pref_theme_system_dark_black">Użyj motywu systemowego (użyj wariantu Black dla ciemnego motywu)</string>
<string name="pref_skills_summary">Włączanie/wyłączanie umiejętności i dostosowywanie ich zachowania</string>
<string name="pref_dynamic_colors_summary">Użyj dynamicznych kolorów Material You dostarczonych przez Android</string>
<string name="pref_dynamic_colors_summary">Użyj dynamicznych kolorów Material You dostarczonych przez system</string>
<string name="settings_description_with_value">%1$s — %2$s</string>
<string name="copy_to_clipboard">Kopiuj do schowka</string>
<string name="done">Gotowe</string>
@ -153,7 +153,7 @@
<string name="downloaded">Pobrano</string>
<string name="loaded">Załadowane</string>
<string name="pref_general">Ogólne</string>
<string name="pref_dynamic_colors_title">Dynamiczne kolory(Android 12)</string>
<string name="pref_dynamic_colors_title">Dynamiczne kolory</string>
<string name="back">Wstecz</string>
<string name="error_loading">Błąd ładowania</string>
<string name="stt_download">Pobierz funkcję zamiany mowy na tekst</string>
@ -165,19 +165,19 @@
<string name="expand">Rozwiń</string>
<string name="reduce">Zmniejsz</string>
<string name="pref_theme_black">Czarny</string>
<string name="skill_open_could_not_understand">Nie można znaleść aplikacji</string>
<string name="pref_stt_play_sound_title">Odtwórz dźwięk gdy rozpoczyna się słuchanie STT</string>
<string name="pref_stt_play_sound_summary">Wybierz czy chcesz włączyć dźwięk gdy twój głos zostanie rozpoznany, i wybierz kanał dzwiękowy na którym dźwięk będzie grany</string>
<string name="skill_open_could_not_understand">Nie można zrozumieć aplikacji</string>
<string name="pref_stt_play_sound_title">Odtwórz dźwięk gdy rozpoczyna się słuchanie</string>
<string name="pref_stt_play_sound_summary">Zdecyduj czy ma zostać odtworzony dźwięk, gdy rozpoczyna się rozpoznawanie Twojego głosu i wybierz kanał dźwięku, w którym zostanie on odtworzony</string>
<string name="pref_stt_play_sound_notification">Kanał powiadomień</string>
<string name="pref_stt_play_sound_alarm">Kanał alarmów</string>
<string name="pref_stt_play_sound_media">Domyślny kanał mediów</string>
<string name="pref_stt_play_sound_none">Nie graj dźwięku</string>
<string name="pref_stt_play_sound_media">Domyślny/kanał mediów</string>
<string name="pref_stt_play_sound_none">Nie odtwarzaj dźwięku</string>
<string name="wake_service_start_notification">Naciśnij aby uruchomić usługę frazy budzącej Dicio</string>
<string name="wake_service_foreground_notification">Nasłuchuję frazy budzącej \"Hey Dicio\"</string>
<string name="wake_service_triggered_notification">Wyzwolono frazę budzącą Dicio, naciśnij aby otworzyć</string>
<string name="wake_word_setup_title">Ustaw frazę budzącą</string>
<string name="pref_wake_method">Metoda rozpoznawania słowa budzenia asystenta Dicio</string>
<string name="pref_wake_method_summary">Wybierz usługę do słuchania w tle słowa budzącego \"Hey Dicio\"</string>
<string name="pref_wake_method">Metoda rozpoznawania frazy budzącej</string>
<string name="pref_wake_method_summary">Wybierz usługę do nasłuchiwania w tle frazy budzącej \"Hey Dicio\"</string>
<string name="pref_wake_method_disabled">Wyłączone</string>
<string name="pref_wake_method_openwakeword">Lokalne przetwarzanie dźwięku OpenWakeWord</string>
<string name="wake_service_foreground_notification_summary">Powiadomienie pozwala usłudze rozpoznawania frazy budzącej Dicio na korzystanie z mikrofonu w tle</string>
@ -193,35 +193,4 @@
<string name="disable">Wyłącz</string>
<string name="stop">Zatrzymaj</string>
<string name="wake_word_error_loading">Wystąpił nieoczekiwany błąd podczas wczytywania</string>
<string name="pref_weather_length_unit">Jednostka długości</string>
<string name="skill_weather_kelvin">K</string>
<string name="pref_weather_length_unit_metric">Metryczne</string>
<string name="pref_weather_length_unit_imperial">Imperialne</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
<string name="pref_weather_temperature_unit">Jednostka temperatury</string>
<string name="pref_weather_temperature_unit_celsius">Stopnie Celsjusza (°C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">Stopnie Fahrenheita (°F)</string>
<string name="pref_weather_temperature_unit_kelvin">Stopnie Kelvina (K)</string>
<string name="waiting">Oczekiwanie…</string>
<string name="skill_name_media">Kontrola multimediów</string>
<string name="skill_sentence_example_media">Następna piosenka</string>
<string name="pref_input_method_vosk_summary">Pobiera i używa model STT Vosk\'a w Dicio</string>
<string name="pref_input_method_external_popup">Zewnętrzny pop-up STT</string>
<string name="pref_input_method_external_popup_summary">Otwiera interfejs inniej aplikacji przez ACTION_RECOGNIZE_SPEECH, na przykład whisperIME, Kõnele, Futo Voice Input</string>
<string name="pref_wake_custom_delete">Usuń własne słowo budzące</string>
<string name="pref_wake_custom_delete_summary">Wróć do orginalnego słowa budządzego \"ey DIcio\"</string>
<string name="pref_wake_custom_import">Importuj własne słowo budzące</string>
<string name="pref_wake_custom_import_summary_oww">Zastąp domyślne słowo budzące \"Hey Dicio\" z własnym modelem TFLite; możesz pobrać modely z github.com/dscrika/openWakeWOrd/releases</string>
<string name="perm_read_contacts">czytać kontakty</string>
<string name="perm_call_phone">dzwonić numery telefoniczne</string>
<string name="eval_no_match_repeat">Możesz powtórzyć?</string>
<string name="skill_search_no_results_stop">Wyszukiwarka znalazła nic</string>
<string name="skill_media_playing">Otwarzanie…</string>
<string name="skill_media_pausing">Pauza…</string>
<string name="skill_media_previous">Poprzednie…</string>
<string name="skill_media_next">Następne…</string>
<string name="skill_media_no_media_session">Żadna sesja mediów nie jest aktywna</string>
</resources>

View File

@ -198,11 +198,4 @@
<string name="perm_call_phone">ligar diretamente para números de telefone</string>
<string name="skill_name_media">Controle de mídia</string>
<string name="skill_sentence_example_media">Próxima canção</string>
<string name="pref_input_method_vosk_summary">Baixa e executa o modelo de entrada por voz off-line pelo Dicio</string>
<string name="pref_input_method_external_popup">Pop-up externo de entrada por voz</string>
<string name="pref_input_method_external_popup_summary">Abre a interface de outro APP pelo ACTION_RECOGNIZE_SPEECH, por exemplo whisperIME, Kõnele, Entrada por Voz do FUTO</string>
<string name="pref_wake_custom_delete">Apagar palavra ativadora customizada</string>
<string name="pref_wake_custom_delete_summary">Retorna à palavra ativadora \"Hey Dicio\" padrão</string>
<string name="pref_wake_custom_import">Importar palavra ativadora customizada</string>
<string name="waiting">Aguardando…</string>
</resources>

View File

@ -193,14 +193,4 @@
<string name="stop">Parar</string>
<string name="grant_permissions">Conceder permissões</string>
<string name="disable">Desativar</string>
<string name="waiting">Esperando…</string>
<string name="pref_input_method_vosk_summary">Baixa e executa um modelo Vosk SpeechToText offline no Dicio</string>
<string name="pref_input_method_external_popup">Pop-up SpeechToText externo</string>
<string name="pref_input_method_external_popup_summary">Abre a interface do usuário de outro aplicativo por meio de ACTION_RECOGNIZE_SPEECH, por exemplo whisperIME, Kõnele, Futo Voice Input</string>
<string name="skill_media_pausing">Pausando a mídia…</string>
<string name="skill_media_previous">Mídia anterior…</string>
<string name="skill_media_next">Próxima mídia…</string>
<string name="skill_media_no_media_session">Nenhuma sessão de mídia está ativa</string>
<string name="wake_custom_service_foreground_notification">Ouvindo uma palavra de ativação personalizada</string>
<string name="skill_listening_already_listening">Já estou ouvindo a palavra de despertar</string>
</resources>

View File

@ -4,7 +4,7 @@
<string name="drawer_header_subtitle">Pot sa te ajut\?</string>
<string name="share">Imparte</string>
<string name="open_with">Deschide cu</string>
<string name="no_app_to_open_intent">Nicio aplicatie pe dispozitivul tau poate deschide asta</string>
<string name="no_app_to_open_intent">Nici o aplicatie pe dispozitivul tau poate deschide asta</string>
<string name="copied_to_clipboard">Copiat in clipboard</string>
<string name="permission_denied">Acces refuzat</string>
<string name="text_input_hint">Intreaba-ma orice…</string>
@ -37,7 +37,7 @@
<string name="pref_skill_grant_permissions">Autorizează</string>
<string name="pref_weather_default_city">Oras natal</string>
<string name="eval_network_error">Eroare de rețea</string>
<string name="eval_no_match">Nu am înțeles</string>
<string name="eval_no_match">Nu am înțeles, puteți repeta?</string>
<string name="skill_name_search">Caută</string>
<string name="skill_sentence_example_weather">Cum este vremea la Roma?</string>
<string name="skill_sentence_example_lyrics">Care este cântecul care sună ca we will we will rock you?</string>
@ -51,7 +51,7 @@
<string name="skill_search_no_results">Căutarea nu a dat nici un rezultat, încearcă să îmi spui din nou ce dorești să cauți</string>
<string name="skill_search_what_question">Ce dorești să cauți?</string>
<string name="skill_weather_could_not_find_city">Orașul nu a putut fi găsit %1$s</string>
<string name="skill_weather_in_city_there_is_description">Sunt %2$s și %3$s grade în %1$s la acest moment</string>
<string name="skill_weather_in_city_there_is_description">Acum în %1$s este %2$s</string>
<string name="skill_weather_description_temperature">%1$s · %2$.1f%3$s</string>
<string name="skill_lyrics_song_not_found">Cântecul nu a putut fi găsit %1$s</string>
<string name="skill_lyrics_found_song_by_artist">Găsit %1$s de %2$s</string>
@ -191,45 +191,4 @@
<string name="skill_navigation_navigating_to">Navigăm către %1$s</string>
<string name="skill_open_could_not_understand">Nu am putut identifica aplicația</string>
<string name="settings_description_with_value">%1$s — %2$s</string>
<string name="waiting">Așteptând…</string>
<string name="pref_input_method_vosk_summary">Descarcă și rulează un model SpeechToText Vosk offline în Dicio</string>
<string name="pref_input_method_external_popup">popup SpeechToText Extern</string>
<string name="pref_input_method_external_popup_summary">Deschide IU-ul altei aplicații prin ACTION_RECOGNIZE_SPEECH, ca exemplu whisperIME, Konele, Futo Voice Input</string>
<string name="pref_wake_custom_delete">Sterge cuvantul de trezire custom</string>
<string name="pref_wake_custom_delete_summary">Returnează la prestabilitul cuvânt de trezire \"Bună Dicio\"</string>
<string name="pref_wake_custom_import">Importează cuvânt de trezire custom</string>
<string name="pref_wake_custom_import_summary_oww">Schimbă prestabilitul cuvânt de trezire \"Bună Dicio\" cu un model modificat TFLite; poți descărca câteva modele modificate de la github.com/dscripka/openWakeWord/releases</string>
<string name="perm_read_contacts">citește contactele</string>
<string name="perm_call_phone">sună numere de telefon direct</string>
<string name="eval_no_match_repeat">Poți repeta?</string>
<string name="skill_name_media">Control Media</string>
<string name="skill_sentence_example_media">Următoarea piesă</string>
<string name="skill_search_no_results_stop">Căutarea nu a returnat niciun rezultat</string>
<string name="skill_media_playing">Rulează media…</string>
<string name="skill_media_pausing">Pauză media…</string>
<string name="skill_media_previous">Media anterior…</string>
<string name="skill_media_next">Următorul media…</string>
<string name="skill_media_no_media_session">Nu este activă nicio sesiune media</string>
<string name="wake_custom_service_foreground_notification">Ascult pentru cuvânt de trezire modificat</string>
<string name="skill_listening_already_listening">Deja ascult pentru cuvântul de trezire</string>
<string name="skill_listening_started_listening">OK, O să ascult pentru cuvântul de trezire</string>
<string name="skill_listening_not_listening">Nu ascultam</string>
<string name="skill_listening_stop_listening">OK</string>
<string name="skill_listening_disabled">Serviciul de cuvânt de trezire este dezactivat în setări</string>
<string name="skill_name_listening">Controlează ascultarea pentru cuvântul de trezire</string>
<string name="skill_sentence_example_listening">Nu mai asculta</string>
<string name="pref_weather_temperature_unit">Unitate de temperatură</string>
<string name="use_system_default">Folosește prestabilit din sistem</string>
<string name="pref_weather_unit_system_instructions">Folosește unitatea configurată în \"Setări sistem &gt; Sistem &gt; Limbi și Introducere &gt; Preferințe regionale\"</string>
<string name="pref_weather_temperature_unit_celsius">Celsius (°C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">Fahrenheit (°F)</string>
<string name="pref_weather_temperature_unit_kelvin">Kelvin (K)</string>
<string name="pref_weather_length_unit">Unitate de lungime</string>
<string name="pref_weather_length_unit_metric">Metric</string>
<string name="pref_weather_length_unit_imperial">Imperial</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_kelvin">K</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
</resources>

View File

@ -16,14 +16,14 @@
<string name="pref_theme_summary">Выберите цветовой набор</string>
<string name="pref_theme_light">Светлая</string>
<string name="pref_theme_dark">Тёмная</string>
<string name="pref_language_summary">На каком языке Дисио будет слушать и давать ответы?</string>
<string name="pref_language_summary">На каком языке Dicio будет слушать и давать ответы\?</string>
<string name="pref_language_system">Использовать системный язык</string>
<string name="pref_input_method">Метод ввода</string>
<string name="pref_input_method_summary">Выберите сервис для разговора с Дисио</string>
<string name="pref_input_method_summary">Выберите сервис для разговора с Dicio</string>
<string name="pref_input_method_text">Только текст</string>
<string name="pref_input_method_vosk">автономное распознавание речи Vosk</string>
<string name="pref_speech_output_method">Метод вывода речи</string>
<string name="pref_speech_output_method_summary">Выберите сервис, используемый Дисио для разговора с вами</string>
<string name="pref_speech_output_method_summary">Выберите сервис, используемый Dicio для разговора с вами</string>
<string name="pref_speech_output_method_toast">Toast (всплывающие сообщения)</string>
<string name="pref_speech_output_method_snackbar">Сообщения внизу экрана</string>
<string name="pref_speech_output_method_nothing">Ничего</string>
@ -36,14 +36,14 @@
<string name="copied_to_clipboard">Скопировано в буфер</string>
<string name="skill_name_search">Поиск</string>
<string name="skill_sentence_example_search">Найди чем накормить кота</string>
<string name="skill_sentence_example_weather">Какая погода?</string>
<string name="skill_sentence_example_weather">Какая сейчас погода в Москве?</string>
<string name="skill_name_lyrics">Тексты песен</string>
<string name="skill_sentence_example_lyrics">Слова песни Моё сердце</string>
<string name="skill_sentence_example_lyrics">Что за песня содержит белый снег, серый лёд\?</string>
<string name="skill_name_open">Запуск приложений</string>
<string name="skill_sentence_example_open">Открой Галерею</string>
<string name="skill_sentence_example_open">Открой NewPipe</string>
<string name="skill_sentence_example_calculator">Сколько будет пять умножить на четыре минус миллион\?</string>
<string name="skill_search_here_is_what_i_found">Вот что я нашёл</string>
<string name="skill_weather_in_city_there_is_description">В %1$s сейчас %2$s и %3$s градусов</string>
<string name="skill_weather_in_city_there_is_description">Сейчас в городе %1$s %2$s</string>
<string name="skill_weather_description_temperature">%1$s · %2$.1f%3$s</string>
<string name="skill_weather_min_max_wind">Минимальная температура: %1$.1f%4$s
\nМаксимальная температура: %2$.1f%4$s
@ -51,7 +51,7 @@
<string name="skill_lyrics_song_not_found">Не могу найти песню %1$s</string>
<string name="skill_lyrics_found_song_by_artist">Нашёл %1$s исполнителя %2$s</string>
<string name="skill_open_opening">Открываю %1$s…</string>
<string name="eval_no_match">Я не поняла</string>
<string name="eval_no_match">Не понимаю, не могли бы вы повторить?</string>
<string name="vosk_model_notification_description">Язык: %1$s</string>
<string name="vosk_model_notification_title">модель Vosk</string>
<string name="pref_skills_title">Умения</string>
@ -59,7 +59,7 @@
<string name="vosk_model_ready">Модель Vosk готова</string>
<string name="pref_appearance">Внешний вид</string>
<string name="pref_language">Язык</string>
<string name="pref_speech_output_method_android">Системный синтез речи Андроида</string>
<string name="pref_speech_output_method_android">Android TTS</string>
<string name="pref_weather_default_city_using_ip_info">Укажите город, который будет использоваться для показаний погоды по умолчанию. Если вы не называете город, то текущая настройка пытается определить город автоматически на основании вашего IP адреса.</string>
<string name="skill_name_weather">Погода</string>
<string name="pref_weather_default_city">Город по умолчанию</string>
@ -78,7 +78,7 @@
<string name="skill_search_no_results">Поиск не дал результата, скажите ещё раз что вы хотите найти</string>
<string name="skill_search_what_question">Что вы хотите найти\?</string>
<string name="skill_name_telephone">Телефон</string>
<string name="skill_sentence_example_telephone">Позвони маме</string>
<string name="skill_sentence_example_telephone">Позвони Ивану</string>
<string name="skill_sentence_example_timer">Поставь секундомер на пять минут</string>
<string name="skill_name_timer">Секундомер</string>
<string name="skill_telephone_unknown_contact">Контакт не найдем, попробуйте ещё раз</string>
@ -98,14 +98,14 @@
<string name="skill_timer_query_last">Последний секундомер завершит настроенное время через %1$s</string>
<string name="skill_timer_none_canceled">ОК, ни один секундомер не сброшен</string>
<string name="pref_skill_grant_permissions">Разрешить</string>
<string name="eval_missing_permissions">Умению «%1$s» требуются следующие разрешения, что работать: %2$s</string>
<string name="eval_missing_permissions">Умению \"%1$s\" требуются следующие разрешения, что работать: %2$s</string>
<string name="android_tts_error">Произошла ошибка при запуске движка Android TTS</string>
<string name="pref_skill_missing_permissions">Требуются следующие разрешения%1$s</string>
<string name="skill_timer_confirm_cancel">Вы уверены, что вы хотите остановить все секундомеры\?</string>
<string name="skill_timer_expired_name">Секундомер %1$s завершил настроенное время!</string>
<string name="skill_timer_set_name">ОК, секундомер %1$s завершит настроенное время через %2$s</string>
<string name="skill_timer_set">ОК, секундомер завершит настроенное время через %1$s</string>
<string name="pref_skill_number_library_not_available">Библиотека анализирующая и форматирующая числа <i>dicio-numbers</i> пока не переведена на Ваш язык, что значит, все умения связанные с числами, длительностью и датами не доступны. Помогите, если можете, нажав сюда <b>Please contribute</b>!</string>
<string name="pref_skill_number_library_not_available">Библиотека анализирующая и форматирующая числа <i>dicio-numbers</i> пока не переведенна на Ваш язык, что значит, все умения связанные с числами, длительностью и датами не доступны. Помогите, если можете, нажав сюда <b>Please contribute</b>!</string>
<string name="error_report">Сообщить</string>
<string name="error_sorry">К сожалению, произошла ошибка</string>
<string name="error_title">Сообщение об ошибке</string>
@ -122,10 +122,10 @@
\nВерсия:
\nВерсия ОС:</string>
<string name="error_report_channel_description">Уведомления для сообщений об ошибках</string>
<string name="error_crash_log_headline">Журнал ошибок:</string>
<string name="error_crash_log_headline">Лог ошибки:</string>
<string name="error_github_notice">Пожалуйста проверьте, существует ли уже ветка с обсуждением вашей ошибки. При создании повторных веток, вы отнимаете наше время, которое мы могли бы потратить на исправление причины возникновения ошибки.</string>
<string name="error_copy_formatted">Скопировать отформатированный отчет</string>
<string name="error_report_notification_title">Дисио столкнулся с ошибкой, нажмите чтобы сообщить о ней</string>
<string name="error_report_notification_title">Dicio столкнулся с ошибкой, нажмите чтобы сообщить о ней</string>
<string name="error_report_github">Сообщить на GitHub</string>
<string name="error_report_notification_toast">Произошла ошибка, смотрите уведомление</string>
<string name="pref_stt_auto_finish_summary_off">Ожидать ручного подтверждения перед отправкой результат распознавания речи в запрашиваемое приложение</string>
@ -133,7 +133,7 @@
<string name="stt_did_not_understand">Я Вас не понял, повторите пожалуйста</string>
<string name="stt_popup">Сервис преобразования речи в текст</string>
<string name="skill_navigation_specify_where">Уточните, куда вы хотите построить маршрут</string>
<string name="skill_sentence_example_navigation">Проложи путь в аэропорт</string>
<string name="skill_sentence_example_navigation">Построй маршрут до Шереметьево</string>
<string name="skill_navigation_navigating_to">Построение маршрута к %1$s</string>
<string name="skill_name_current_time">Текущее время</string>
<string name="skill_sentence_example_current_time">Который час?</string>
@ -144,27 +144,27 @@
<string name="pref_stt_play_sound_notification">Канал уведомлений</string>
<string name="pref_stt_play_sound_alarm">Канал будильника</string>
<string name="pref_stt_play_sound_media">По умолчанию/Медиа канал</string>
<string name="wake_service_foreground_notification_summary">Это уведомление позволяет службе слова пробуждения Дисио слушать микрофон в фоновом режиме</string>
<string name="wake_service_foreground_notification">Прослушивание фразы «Хей Дисио»</string>
<string name="wake_service_start_notification_summary">В Android 11+ служба Дисио не может запуститься без ручного взаимодействия пользователя.</string>
<string name="wake_service_triggered_notification_summary">В Android 10+ служба Дисио не может запуститься при обнаружении слова пробуждения без показа уведомления.</string>
<string name="wake_word_error_downloading_network">Дисио не смог установить подключение к интернету. Пожалуйста, проверьте подключение и попробуйте снова.</string>
<string name="wake_service_foreground_notification_summary">Это уведомление позволяет сервису фразы пробуждения Dicio слушать микрофон в фоновом режиме</string>
<string name="wake_service_foreground_notification">Прослушивание фразы \"Хэй, Dicio\"</string>
<string name="wake_service_start_notification_summary">В Android 11+ сервис Dicio не может запуститься без ручного взаимодействия пользователя.</string>
<string name="wake_service_triggered_notification_summary">В Android 10+ сервис Dicio не может запуститься при обнаружении фразы пробуждения без отображения уведомления.</string>
<string name="wake_word_error_downloading_network">Dicio не смог установить подключение к интернету. Пожалуйста, проверьте подключение и попробуйте снова.</string>
<string name="retry">Повторить</string>
<string name="stop">Остановить</string>
<string name="grant_permissions">Выдать разрешения</string>
<string name="pref_wake_method">Способ распознавания слова пробуждения</string>
<string name="pref_wake_method_summary">Выберите сервис для прослушивания фразы «Хей Дисио» в фоновом режиме</string>
<string name="pref_wake_method">Метод распознавания пробуждаемого слова</string>
<string name="pref_wake_method_summary">Выберите сервис для прослушивания фразы \"Хэй, Dicio\" в фоновом режиме</string>
<string name="pref_wake_method_disabled">Выключено</string>
<string name="pref_wake_method_openwakeword">OpenWakeWord офлайн обработка аудио</string>
<string name="wake_service_label">Служба слова пробуждения Дисио</string>
<string name="wake_service_triggered_notification">Было произнесено слово пробуждения Дисио. Прикоснитесь, чтобы открыть</string>
<string name="wake_word_error_downloading">Произошла ошибка при скачивании</string>
<string name="wake_word_setup_title">Настройка слова пробуждения</string>
<string name="pref_wake_method_openwakeword">OpenWakeWord офлайн аудиообработка</string>
<string name="wake_service_label">Сервис фразы пробуждения Dicio</string>
<string name="wake_service_triggered_notification">Была произнесена фраза пробуждения Dicio. Прикоснитесь, чтобы открыть</string>
<string name="wake_word_error_downloading">Произошла ошибка при загрузке</string>
<string name="wake_word_setup_title">Настройка фразы пробуждения</string>
<string name="pref_stt_play_sound_title">Играть звук при начале слушания</string>
<string name="pref_stt_play_sound_none">Не воспроизводить звук</string>
<string name="stt_service_label">Офлайн распознавание речи Дисио</string>
<string name="wake_service_start_notification">Прикоснитесь, чтобы запустить службу слова пробуждения Дисио</string>
<string name="wake_word_setup_description">Дисио включается автоматически, когда вы произносите «Хей Дисио». Это работает за счёт запуска службы, которая всегда слушает в фоновом режиме. Вся обработка речи происходит локально, поэтому вам нужно заранее скачать модель ИИ.</string>
<string name="stt_service_label">Офлайн распознавание речи Dicio</string>
<string name="wake_service_start_notification">Прикоснитесь, чтобы запустить cервис фразы пробуждения Dicio</string>
<string name="wake_word_setup_description">Dicio включается автоматически, когда вы произносите \"Хэй, Dicio\". Это работает за счёт запуска сервиса, который всегда слушает в фоновом режиме. Вся обработка речи происходит локально, поэтому вам нужно заранее загрузить модель нейронной сети.</string>
<string name="wake_word_error_loading">Произошла ошибка при запуске</string>
<string name="disable">Выключить</string>
<string name="done">Выполнено</string>
@ -173,15 +173,15 @@
<string name="error_unzipping">Ошибка распаковки</string>
<string name="error_downloading">Ошибка скачивания</string>
<string name="unzipping">Распаковка…</string>
<string name="download">Скачать</string>
<string name="download">Загрузить</string>
<string name="stt_not_available">Распознавание речи не доступно</string>
<string name="stt_download">Скачать распознавание речи</string>
<string name="stt_download">Загрузить распознавание речи</string>
<string name="stt_unzip">Распаковать распознавание речи</string>
<string name="start_listening">Запустить слушание</string>
<string name="downloaded">Скачано</string>
<string name="downloaded">Загружено</string>
<string name="loaded">Загружен</string>
<string name="all_skills_disabled_title">Все умения выключены</string>
<string name="all_skills_disabled_description">Пожалуйста, включите любые умения в настройках, иначе Дисио не будет функционировать</string>
<string name="all_skills_disabled_description">Пожалуйста, включите любые умения в настройках, иначе Dicio не будет функционировать</string>
<string name="pref_general">Общие</string>
<string name="pref_skills_summary">Включить/Отключить умения и настроить их поведение</string>
<string name="expand">Расширить</string>
@ -194,44 +194,13 @@
<string name="pref_dynamic_colors_summary">Использовать динамические цвета Material You предоставляемые системой</string>
<string name="skill_open_could_not_understand">Не удалось найти приложение</string>
<string name="perm_read_contacts">чтение контактов</string>
<string name="perm_call_phone">совершать звонки</string>
<string name="perm_call_phone">совершать звоки</string>
<string name="skill_name_media">Управление мультимедиа</string>
<string name="skill_media_playing">Воспроизведение мультимедиа</string>
<string name="skill_media_playing">Воспроизведение мультимедии</string>
<string name="skill_sentence_example_media">Следующая песня</string>
<string name="skill_media_pausing">Приостановка мультимедиа…</string>
<string name="skill_media_no_media_session">Нет активного сеанса мультимедиа</string>
<string name="skill_media_previous">Предыдущий медиафайл…</string>
<string name="skill_media_next">Следующий медиафайл…</string>
<string name="skill_search_no_results_stop">Поиск не вернул результатов</string>
<string name="use_system_default">Как в системе</string>
<string name="pref_weather_temperature_unit_celsius">Цельсий (°C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">Фаренгейт (°F)</string>
<string name="pref_weather_temperature_unit_kelvin">Кельвин (K)</string>
<string name="pref_weather_length_unit">Единицы длины</string>
<string name="pref_weather_length_unit_metric">Метрическая</string>
<string name="pref_weather_length_unit_imperial">Имперская (Великобритания)</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_miles_per_hour">миль/час</string>
<string name="skill_weather_meters_per_second">м/с</string>
<string name="waiting">Ожидание…</string>
<string name="pref_input_method_vosk_summary">Скачивает и запускает модель распознавания речи Vosk внутри Дисио</string>
<string name="pref_input_method_external_popup">Внешнее всплывающие окно распознавания текста</string>
<string name="pref_input_method_external_popup_summary">Открывает интерфейс другого приложения через ACTION _ RECOGNIZE _ SPEECH, например, шепчет whisperIME, Kõnele, Futo Voice Input</string>
<string name="pref_wake_custom_delete">Удалить специальное слово пробуждения</string>
<string name="pref_wake_custom_import">Импортировать своё слово пробуждения</string>
<string name="wake_custom_service_foreground_notification">Слушаю специальное слово для пробуждения</string>
<string name="pref_wake_custom_delete_summary">Вернуться на стандартное слово пробуждения «Хей Дисио»</string>
<string name="pref_weather_temperature_unit">Единицы температуры</string>
<string name="pref_wake_custom_import_summary_oww">Смените стандартное слово пробуждения «Хей Дисио» на свою модель TFLite; некоторые свои модели вы можете скачать с github.com/dscripka/openWakeWord/releases</string>
<string name="pref_weather_unit_system_instructions">Использует единицы настроенные в «Настройки &gt; Система &gt; Языки и вход &gt; Региональные предпочтения»</string>
<string name="eval_no_match_repeat">Можете повторить?</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_kelvin">K</string>
<string name="skill_listening_already_listening">Я уже слушаю слово пробуждения</string>
<string name="skill_listening_started_listening">Хорошо, я буду прослушивать слово пробуждения</string>
<string name="skill_listening_disabled">Служба слова пробуждения отключена в настройках</string>
<string name="skill_name_listening">Настройка прослушивания слова пробуждения</string>
<string name="skill_listening_not_listening">Я не слушал</string>
<string name="skill_listening_stop_listening">Хорошо</string>
<string name="skill_sentence_example_listening">Перестать прослушивать</string>
</resources>

View File

@ -20,7 +20,7 @@
<string name="skill_telephone_calling">Ringer %1$s…</string>
<string name="skill_telephone_not_calling">OK, då ringer jag ingen</string>
<string name="skill_time_current_time">Just nu är klockan %1$s</string>
<string name="eval_no_match">Jag förstod inte</string>
<string name="eval_no_match">Jag förstod inte, kan du upprepa?</string>
<string name="skill_name_search">Sök</string>
<string name="skill_name_lyrics">Sångtexter</string>
<string name="skill_search_here_is_what_i_found">Det här hittade jag</string>
@ -47,7 +47,7 @@
<string name="skill_sentence_example_calculator">Vad är fem gånger fyra minus en miljon?</string>
<string name="skill_sentence_example_telephone">Ring Tom</string>
<string name="skill_search_no_results">Jag hittade inga resultat, försök berätta igen vad du söker efter</string>
<string name="skill_weather_description_temperature">%1$s · %2$.1f%3$s</string>
<string name="skill_weather_description_temperature">%1$s · %2$.1f°C</string>
<string name="skill_lyrics_song_not_found">Kan inte hitta låten %1$s</string>
<string name="skill_lyrics_found_song_by_artist">Hittade %1$s av %2$s</string>
<string name="skill_timer_confirm_cancel">Är du säker på att du vill avbryta alla timerar?</string>
@ -81,7 +81,7 @@
<string name="skill_sentence_example_weather">Hur är vädret i Rom?</string>
<string name="skill_sentence_example_lyrics">Vilken sång har texten \"We will we will rock you\"?</string>
<string name="skill_name_telephone">Telefon</string>
<string name="skill_weather_min_max_wind">Lägsta temperatur: %1$.1f%4$s\nHögsta temperatur: %2$.1f%4$s\nVindhastighet: %3$.1f%5$s</string>
<string name="skill_weather_min_max_wind">Minimitemperatur: %1$.1f° C\nMaximal temperatur: %2$.1f ° C\nVindhastighet: %3$.1fm/s</string>
<string name="skill_telephone_found_contacts">Jag hittade %1$d kontakter, vem vill du ringa?</string>
<string name="stt_service_label">Dicio lokal taligenkänning</string>
<string name="wake_service_label">Dicios väckningsordtjänst</string>
@ -130,7 +130,7 @@
<string name="stt_download">Ladda ner talsyntes</string>
<string name="stt_unzip">Packa upp talsyntes</string>
<string name="start_listening">Börja lyssna</string>
<string name="downloaded">Nedladdad</string>
<string name="downloaded">Nadladdad</string>
<string name="loaded">Laddad</string>
<string name="all_skills_disabled_title">Alla färdigheter är avstängda</string>
<string name="all_skills_disabled_description">Vänligen aktivera några färdigheter under inställningar, annars kommer Dicio inte att kunna göra något</string>
@ -184,40 +184,6 @@
<string name="pref_weather_default_city_using_ip_info">Välj den stad du vill ha väderleksrapporter för om du inte anger en annan. Det nuvarande beteendet är att få platsen från din IP info.</string>
<string name="skill_name_timer">Timer</string>
<string name="skill_weather_could_not_find_city">Kunde inte hitta staden %1$s</string>
<string name="skill_weather_in_city_there_is_description">Just nu är det %2$s och %3$s grader i / på %1$s</string>
<string name="skill_weather_in_city_there_is_description">Just nu är det %2$s i / på %1$s</string>
<string name="pref_stt_auto_finish_title">Skicka taligenkänningsresultat direkt till popup-meddelandet</string>
<string name="wake_custom_service_foreground_notification">Lyssnar efter anpassat väckningsord</string>
<string name="pref_weather_temperature_unit">Temperaturenhet</string>
<string name="pref_weather_temperature_unit_celsius">Celsius (°C)</string>
<string name="pref_weather_temperature_unit_kelvin">Kelvin (K)</string>
<string name="pref_weather_length_unit">Längdenhet</string>
<string name="pref_weather_length_unit_metric">Metrisk</string>
<string name="pref_weather_length_unit_imperial">Imperialistisk</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
<string name="pref_wake_custom_import_summary_oww">Ersätt standardväckningsordet \"Hey Dicio\" med en anpassad TFLite-modell; du kan ladda ner anpassade modeller från github.com/dscripka/openWakeWord/releases</string>
<string name="skill_media_no_media_session">Ingen mediasession är aktiv</string>
<string name="skill_search_no_results_stop">Sökningen gav inga resultat</string>
<string name="pref_weather_unit_system_instructions">Använder enheten inställd i \"System setting &gt; System &gt; Languages &amp; input &gt; Regional preferences\"</string>
<string name="use_system_default">Använd systemets standard</string>
<string name="skill_weather_kelvin">K</string>
<string name="pref_weather_temperature_unit_fahrenheit">Fahrenheit (°F)</string>
<string name="waiting">Väntar…</string>
<string name="pref_input_method_vosk_summary">Laddar ner och kör en Vosk tal-till-text-modell offline i Dicio</string>
<string name="pref_input_method_external_popup">Extern tal-till-text popup</string>
<string name="pref_input_method_external_popup_summary">Öppnar UI:t för en annan app genom ACTION_RECOGNIZE_SPEECH, till exempel whisperIME, Kõnele, Futo Voice Input</string>
<string name="skill_media_previous">Föregående media…</string>
<string name="pref_wake_custom_delete">Radera anpassat väckningsord</string>
<string name="pref_wake_custom_delete_summary">Återgå till ursprungligt \"Hey Dicio\" väckningsord</string>
<string name="pref_wake_custom_import">Importera anpassat väckningsord</string>
<string name="eval_no_match_repeat">Kan du upprepa?</string>
<string name="skill_media_next">Nästa media…</string>
<string name="perm_read_contacts">läsa dina kontakter</string>
<string name="perm_call_phone">direkt ringa telefonsamtal</string>
<string name="skill_name_media">Mediakontroll</string>
<string name="skill_sentence_example_media">Nästa låt</string>
<string name="skill_media_playing">Spelar media…</string>
<string name="skill_media_pausing">Pausar media…</string>
</resources>

View File

@ -7,7 +7,7 @@
<string name="pref_weather_default_city">இயல்புநிலை நகரம்</string>
<string name="pref_stt_auto_finish_summary_on">கேட்கும் போது பயன்பாட்டைக் கோருவதற்கு தானாக பேச்சு முடிவை அனுப்பவும்</string>
<string name="skill_search_no_results">தேடல் எந்த முடிவுகளையும் திருப்பித் தரவில்லை, நீங்கள் தேட விரும்புவதை மீண்டும் என்னிடம் சொல்ல முயற்சிக்கவும்</string>
<string name="skill_weather_description_temperature">%1$s · %2$.1f%3$s</string>
<string name="skill_weather_description_temperature">%1$s · %2 $ .1f ° C.</string>
<string name="skill_lyrics_song_not_found">%1$s பாடல் கண்டுபிடிக்க முடியவில்லை</string>
<string name="skill_telephone_confirm_call">நான் %1$s ஐ அழைக்க வேண்டுமா?</string>
<string name="skill_timer_canceled">நேரங்குறிகருவி ரத்து செய்யப்பட்டது</string>
@ -37,7 +37,7 @@
<string name="stt_unzip">உரைக்கு அனுப்பும் பேச்சு</string>
<string name="listening">கேட்பது…</string>
<string name="start_listening">கேட்கத் தொடங்குங்கள்</string>
<string name="downloaded">பதிவிறக்கபட்டது</string>
<string name="downloaded">பதிவிறக்கம்</string>
<string name="loaded">ஏற்றப்பட்டது</string>
<string name="here_is_what_i_can_do">இங்கே நான் என்ன செய்ய முடியும்!</string>
<string name="all_skills_disabled_title">அனைத்து திறன்களும் முடக்கப்பட்டுள்ளன</string>
@ -96,7 +96,7 @@
<string name="pref_speech_output_method_snackbar">ச்நாக்பார் (கீழே செய்தி)</string>
<string name="pref_speech_output_method_nothing">எதுவும்</string>
<string name="pref_wake_method">வேர் வேர்ட் அங்கீகார முறை</string>
<string name="pref_wake_method_summary">பின்னணியில் \"வணக்கம் அகராதி\" விழித்தெழு சொல்லைக் கேட்கப் பயன்படுத்தச் சேவையைத் தேர்வுசெய்க</string>
<string name="pref_wake_method_summary">பின்னணியில் EY DICIO விழித்தெழு வார்த்தையைக் கேட்க பயன்படுத்த சேவையைத் தேர்வுசெய்க</string>
<string name="pref_wake_method_openwakeword">OpenWakeWord இணைப்பில்லாத ஆடியோ செயலாக்கம்</string>
<string name="pref_skill_not_available">இந்த திறன் உங்கள் மொழிக்கு இன்னும் கிடைக்கவில்லை. பங்களிப்புகள் வரவேற்கப்படுகின்றன!</string>
<string name="pref_skill_grant_permissions">மானியம்</string>
@ -113,11 +113,11 @@
<string name="pref_stt_play_sound_media">இயல்புநிலை/மீடியா சேனல்</string>
<string name="pref_stt_play_sound_none">ஒலி விளையாட வேண்டாம்</string>
<string name="settings_description_with_value">%1$s - %2$s</string>
<string name="eval_missing_permissions">திறமை \"%1$s\" வேலை செய்ய இந்த அனுமதிகள் தேவை: %2$s</string>
<string name="eval_missing_permissions">திறமை 1 $ s வேலை செய்ய இந்த அனுமதிகள் தேவை: %2$s</string>
<string name="eval_fatal_error">உங்கள் கோரிக்கையை மதிப்பீடு செய்ய முடியவில்லை</string>
<string name="eval_network_error">பிணைய பிழை</string>
<string name="eval_network_error_description">டிசியோவால் இணையத்தை அடைய முடியவில்லை. உங்கள் இணைப்பைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்.</string>
<string name="eval_no_match">எனக்குப் புரியவில்லை</string>
<string name="eval_no_match">எனக்கு புரியவில்லை, நீங்கள் மீண்டும் செய்ய முடியுமா?</string>
<string name="stt_say_something">ஏதாவது சொல்லுங்கள்…</string>
<string name="stt_did_not_understand">என்னால் புரிந்து கொள்ள முடியவில்லை, மீண்டும் முயற்சிக்கவும்</string>
<string name="stt_popup">உரை பாப்அப்பிற்கு பேச்சு</string>
@ -145,8 +145,8 @@
<string name="skill_search_here_is_what_i_found">இங்கே நான் கண்டது</string>
<string name="skill_search_what_question">நீங்கள் எதைத் தேட விரும்புகிறீர்கள்?</string>
<string name="skill_weather_could_not_find_city">நகர %1$s கண்டுபிடிக்க முடியவில்லை</string>
<string name="skill_weather_in_city_there_is_description">தற்போது %2$s மற்றும் %3$s டிகிரி %1$s இல் உள்ளது</string>
<string name="skill_weather_min_max_wind">குறைந்தபட்ச வெப்பநிலை: %1$.1f%4$s\nஅதிகபட்ச வெப்பநிலை: %2$.1f%4$s\nகாற்றின் வேகம்: %3$.1f%5$s</string>
<string name="skill_weather_in_city_there_is_description">தற்போது %1$s இல் %2$s உள்ளது</string>
<string name="skill_weather_min_max_wind">குறைந்தபட்ச வெப்பநிலை: %1 $ .1f ° C.\n அதிகபட்ச வெப்பநிலை: %2 $ .1f ° C.\n காற்றின் வேகம்: %3 $ .1fm/s</string>
<string name="skill_lyrics_found_song_by_artist">%1$s %2$s உடன் காணப்பட்டது</string>
<string name="skill_open_could_not_understand">பயன்பாட்டை புரிந்து கொள்ள முடியவில்லை</string>
<string name="skill_open_unknown_app">தெரியாத பயன்பாடு %1$s</string>
@ -174,50 +174,16 @@
<string name="stt_service_label">இணைப்பில்லாத பாப் அங்கீகாரத்தைத் தேர்ந்தெடுங்கள்</string>
<string name="wake_service_label">டிசியோ வேக் வேர்ட் பணி</string>
<string name="wake_service_foreground_notification_summary">இந்த அறிவிப்பு டிசியோ வேக் வேர்ட் சேவையை பின்னணியில் உள்ள மைக்ரோஃபோனைக் கேட்க அனுமதிக்கிறது</string>
<string name="wake_service_foreground_notification">\"வணக்கம் அகராதி\" விழித்தெழு சொல்லைக் கேட்பது</string>
<string name="wake_service_foreground_notification">EY DICIO விழித்தெழுந்த வார்த்தையை கேட்பது</string>
<string name="wake_service_start_notification">டிசியோ வேக் வேர்ட் சேவையைத் தொடங்க தட்டவும்</string>
<string name="wake_service_triggered_notification">டிசியோ வேக் வேர்ட் தூண்டப்பட்டது, திறக்க தட்டவும்</string>
<string name="wake_service_start_notification_summary">ஆண்ட்ராய்டு 11+ இல் DICIO பயனரிடமிருந்து ஒரு கையேடு தொடர்பு இல்லாமல் சேவையைத் தொடங்க முடியாது.</string>
<string name="wake_service_triggered_notification_summary">ஆண்ட்ராய்டு 10+ இல் ஒரு அறிவிப்பைக் காட்டாமல் ஒரு விழிப்புணர்வு சொல் கண்டறியப்படும்போது டிசியோ தொடங்க முடியாது.</string>
<string name="wake_word_setup_title">விழித்தெழு வார்த்தையை அமைக்கவும்</string>
<string name="wake_word_setup_description">நீங்கள் \"வணக்கம் அகராதி\" என்று சொல்லும்போதெல்லாம் அகராதி தானாகவே எழுந்திருக்கும், இது பின்னணியில் எப்போதும் கேட்கும் ஒரு சேவையைத் தொடங்குவதன் மூலம் இது செயல்படும். அனைத்து பேச்சு செயலாக்கமும் உள்நாட்டில் நடக்கிறது, அதனால்தான் நீங்கள் செநு மாதிரியை முன்கூட்டியே பதிவிறக்கம் செய்ய வேண்டும்.</string>
<string name="wake_word_setup_description">நீங்கள் EY DICIO என்று சொல்லும்போதெல்லாம் டிசியோ தானாகவே எழுந்திருக்கும், இது பின்னணியில் எப்போதும் கேட்கும் ஒரு சேவையைத் தொடங்குவதன் மூலம் இது செயல்படும். அனைத்து பேச்சு செயலாக்கமும் உள்நாட்டில் நடக்கிறது, அதனால்தான் நீங்கள் AI மாதிரியை முன்கூட்டியே பதிவிறக்கம் செய்ய வேண்டும்.</string>
<string name="wake_word_error_downloading_network">டிசியோவால் இணையத்தை அடைய முடியவில்லை. உங்கள் இணைப்பைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்.</string>
<string name="wake_word_error_loading">ஏற்றும்போது எதிர்பாராத பிழை ஏற்பட்டது</string>
<string name="disable">முடக்கு</string>
<string name="retry">மீண்டும் முயற்சிக்கவும்</string>
<string name="stop">நிறுத்து</string>
<string name="pref_wake_custom_delete">தனிப்பயன் விழித்தெழு வார்த்தையை நீக்கு</string>
<string name="wake_custom_service_foreground_notification">தனிப்பயன் விழித்தெழுந்த வார்த்தையைக் கேட்பது</string>
<string name="pref_weather_temperature_unit">வெப்பநிலை அலகு</string>
<string name="use_system_default">கணினி இயல்புநிலையைப் பயன்படுத்தவும்</string>
<string name="pref_weather_unit_system_instructions">\"கணினி அமைப்புகள்&gt; கணினி&gt; மொழிகள் மற்றும் உள்ளீடு&gt; பிராந்திய விருப்பத்தேர்வுகள்\" இல் கட்டமைக்கப்பட்ட அலகு பயன்படுத்துகிறது</string>
<string name="pref_weather_temperature_unit_celsius">செல்சியச் (° C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">பாரன்ஈட் (° F)</string>
<string name="pref_weather_temperature_unit_kelvin">கெல்வின் (கே)</string>
<string name="pref_weather_length_unit">நீள அலகு</string>
<string name="pref_weather_length_unit_metric">மெட்ரிக்</string>
<string name="pref_weather_length_unit_imperial">ஏகாதிபத்திய</string>
<string name="skill_weather_celsius">. C.</string>
<string name="skill_weather_kelvin">கே</string>
<string name="skill_weather_meters_per_second">எம்/கள்</string>
<string name="skill_weather_miles_per_hour">எம்.பி.எச்</string>
<string name="waiting">காத்திருக்கிறது…</string>
<string name="pref_input_method_vosk_summary">டிசியோவுக்குள் ஆஃப்லைனில் ஒரு வோச்க் ச்பீச் டோடெக்ச்ட் மாதிரி பதிவிறக்கம் செய்து இயக்குகிறது</string>
<string name="pref_input_method_external_popup">வெளிப்புற ச்பீச் டோடெக்ச்ட் மேல்தோன்றல்</string>
<string name="skill_sentence_example_media">அடுத்த பாடல்</string>
<string name="skill_search_no_results_stop">தேடல் எந்த முடிவுகளையும் அளிக்கவில்லை</string>
<string name="perm_read_contacts">உங்கள் தொடர்புகளைப் படியுங்கள்</string>
<string name="perm_call_phone">தொலைபேசி எண்களை நேரடியாக அழைக்கவும்</string>
<string name="skill_name_media">ஊடக கட்டுப்பாடு</string>
<string name="skill_media_playing">மீடியா விளையாடுவது…</string>
<string name="skill_media_next">அடுத்த மீடியா…</string>
<string name="pref_input_method_external_popup_summary">செயலின் மூலம் மற்றொரு பயன்பாட்டின் இடைமுகம் ஐத் திறக்கிறது _ அங்கீகரிக்க _ பேச்சை, எடுத்துக்காட்டாக விச்பரைம், கோனேல், புட்டோ குரல் உள்ளீடு</string>
<string name="pref_wake_custom_delete_summary">இயல்புநிலைக்குத் திரும்பு \"ஏ டிசியோ\" வேக் வேர்ட்</string>
<string name="pref_wake_custom_import">தனிப்பயன் விழிப்புணர்வு வார்த்தையை இறக்குமதி செய்க</string>
<string name="pref_wake_custom_import_summary_oww">தனிப்பயன் டிஃப்ளைட் மாதிரியுடன் இயல்புநிலை \"ஏ டிசியோ\" விழித்தெழு வார்த்தையை மாற்றவும்; Github.com/dscripka/openwakeword/relaess இலிருந்து சில தனிப்பயன் மாதிரிகளை நீங்கள் பதிவிறக்கம் செய்யலாம்</string>
<string name="eval_no_match_repeat">நீங்கள் மீண்டும் செய்ய முடியுமா?</string>
<string name="skill_media_pausing">இடைநிறுத்தப்பட்ட ஊடகங்கள்…</string>
<string name="skill_media_previous">முந்தைய ஊடகங்கள்…</string>
<string name="skill_media_no_media_session">எந்த ஊடக அமர்வும் செயலில் இல்லை</string>
<string name="skill_weather_fahrenheit">° f</string>
</resources>

View File

@ -45,7 +45,7 @@
<string name="pref_weather_default_city_using_ip_info">ıkça söylemediğinizde hava durumu için kullanılacak şehri ayarlayın. Geçerli davranış, konumu IP bilgisinden almaktır.</string>
<string name="eval_network_error">Ağ hatası</string>
<string name="eval_network_error_description">Dicio internete bağlanamadı. Lütfen bağlantınızı gözden geçirin ve yeniden deneyin.</string>
<string name="eval_no_match">Anlamadım</string>
<string name="eval_no_match">Anlamadım, tekrar eder misin?</string>
<string name="skill_name_search">Ara</string>
<string name="skill_sentence_example_search">Bir kediyi nasıl besleyeceğinizi arayın</string>
<string name="skill_sentence_example_weather">Roma\'da hava nasıl\?</string>
@ -194,6 +194,7 @@
<string name="skill_media_previous">Önceki medya…</string>
<string name="skill_media_next">Sıradaki medya…</string>
<string name="skill_media_no_media_session">Hiçbir medya oturumu etkin değil</string>
<string name="notification_listener_label">Dicio bildirim olay dinleyicisi</string>
<string name="wake_service_foreground_notification_summary">Bu bildirim, Dicio kelime uyanma hizmetinin arka planda mikrofonu dinlemesini sağlar</string>
<string name="wake_service_foreground_notification">\"Hey Dicio\" uyandırma kelimesi dinleniyor</string>
<string name="wake_service_start_notification">Dicio kelime uyandırma hizmetini başlatmak için dokunun</string>
@ -202,36 +203,4 @@
<string name="wake_word_error_downloading_network">Dicio internete ulaşamadı. Lütfen bağlantınızı kontrol edin ve yeniden deneyin.</string>
<string name="wake_word_error_loading">Yükleme sırasında beklenmeyen bir hata oluştu</string>
<string name="skill_media_playing">Medya oynatılıyor…</string>
<string name="pref_wake_custom_delete">Özel uyandırma sözcüğünü sil</string>
<string name="pref_wake_custom_delete_summary">Varsayılan \"Hey Dicio\" uyandırma sözcüğüne geri dön</string>
<string name="pref_wake_custom_import">Özel uyandırma sözcüğünü içe aktar</string>
<string name="eval_no_match_repeat">Tekrar edebilir misin?</string>
<string name="skill_search_no_results_stop">Arama hiçbir sonuç vermedi</string>
<string name="wake_custom_service_foreground_notification">Özel uyandırma sözcüğü dinleniyor</string>
<string name="pref_weather_temperature_unit">Sıcaklık birimi</string>
<string name="use_system_default">Sistem varsayılanını kullan</string>
<string name="pref_weather_unit_system_instructions">\"Sistem ayarları &gt; Sistem &gt; Diller ve giriş &gt; Bölgesel tercihler\" içinde yapılandırılan birimi kullanır</string>
<string name="pref_weather_temperature_unit_celsius">Celsius (°C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">Fahrenhayt (°F)</string>
<string name="pref_weather_temperature_unit_kelvin">Kelvin (K)</string>
<string name="pref_weather_length_unit">Uzunluk birimi</string>
<string name="pref_weather_length_unit_metric">Metrik</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_kelvin">K</string>
<string name="pref_weather_length_unit_imperial">İngiliz</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
<string name="pref_input_method_external_popup_summary">ACTION_RECOGNIZE_SPEECH aracılığıyla başka bir uygulamanın kullanıcı arayüzünü açar, örneğin whisperIME, Kõnele, Futo Voice Input</string>
<string name="pref_wake_custom_import_summary_oww">Varsayılan \"Hey Dicio\" uyandırma sözcüğünü özel bir TFLite modeliyle değiştir; bazı özel modelleri github.com/dscripka/openWakeWord/releases adresinden indirebilirsiniz</string>
<string name="waiting">Bekleniyor…</string>
<string name="pref_input_method_vosk_summary">Dicio içinde bir Vosk SpeechToText modelini çevrimdışı olarak indirir ve çalıştırır</string>
<string name="pref_input_method_external_popup">Harici SpeechToText açılır penceresi</string>
<string name="skill_listening_already_listening">Zaten uyandırma sözcüğünü bekliyorum</string>
<string name="skill_listening_started_listening">Tamam, uyandırma sözcüğünü bekleyeceğim</string>
<string name="skill_listening_not_listening">Dinlemiyordum</string>
<string name="skill_listening_stop_listening">TAMAM</string>
<string name="skill_listening_disabled">Uyandırma sözcüğü hizmeti ayarlardan devre dışı bırakılmış</string>
<string name="skill_name_listening">Uyandırma sözcüğü dinlemeyi düzenle</string>
<string name="skill_sentence_example_listening">Dinlemeyi bırak</string>
</resources>

View File

@ -103,7 +103,7 @@
<string name="eval_fatal_error">Не вдалося обробити ваш запит</string>
<string name="eval_network_error">Помилка мережі</string>
<string name="eval_network_error_description">Dicio не може підключитися до мережі. Будь ласка, перевірте ваше підключення й спробуйте ще раз.</string>
<string name="eval_no_match">Я не зрозуміла</string>
<string name="eval_no_match">Я не зрозумів, чи можете ви повторити?</string>
<string name="pref_stt_auto_finish_summary_on">Автоматично надсилати результат мовлення до запитуючого застосунку після завершення прослуховування</string>
<string name="eval_missing_permissions">Для роботи навички \"%1$s\" потрібні наступні дозволи: %2$s</string>
<string name="stt_popup">Сервіс Speech to Text</string>
@ -203,47 +203,9 @@
<string name="skill_media_previous">Попередні медіа…</string>
<string name="skill_media_next">Наступний медіа…</string>
<string name="skill_media_no_media_session">Жоден медіа-сеанс не активний</string>
<string name="notification_listener_label">Я викликаю слухач подій сповіщень</string>
<string name="pref_input_method_external_popup_summary">Відкриває інтерфейс іншої програми за допомогою ACTION_RECOGNIZE_SPEECH, наприклад whisperIME, Kõnele, Futo Voice Input</string>
<string name="waiting">Очікування…</string>
<string name="pref_input_method_external_popup">Зовнішнє спливаюче вікно SpeechToText</string>
<string name="pref_input_method_vosk_summary">Завантажує та запускає модель Vosk SpeechToText офлайн у Dicio</string>
<string name="pref_wake_custom_delete">Видалити спеціальне слово пробудження</string>
<string name="skill_weather_miles_per_hour">миль/год</string>
<string name="wake_custom_service_foreground_notification">Прослуховування спеціального слова для пробудження</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="pref_wake_custom_delete_summary">Повернутися до стандартного слова пробудження \"Hey Dicio\"</string>
<string name="pref_wake_custom_import">Імпорт спеціального слова пробудження</string>
<string name="pref_wake_custom_import_summary_oww">Замініть стандартне слово пробудження \"Hey Dicio\" на спеціальну модель TFLite; ви можете завантажити деякі власні моделі з github.com/dscripka/openWakeWord/releases</string>
<string name="eval_no_match_repeat">Чи не могли б ви повторити?</string>
<string name="pref_weather_temperature_unit">Одиниця вимірювання температури</string>
<string name="use_system_default">Використовувати систему за умовчанням</string>
<string name="pref_weather_unit_system_instructions">Використовує одиницю, налаштовану в «Параметри системи &gt; Система &gt; Мови та введення &gt; Регіональні налаштування»</string>
<string name="pref_weather_temperature_unit_celsius">Цельсій (°C)</string>
<string name="pref_weather_temperature_unit_fahrenheit">Фаренгейт (°F)</string>
<string name="pref_weather_length_unit">Одиниця вимірювання довжини</string>
<string name="pref_weather_temperature_unit_kelvin">Кельвін (K)</string>
<string name="pref_weather_length_unit_metric">Метрика</string>
<string name="pref_weather_length_unit_imperial">Імператорський</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_kelvin">K</string>
<string name="skill_weather_meters_per_second">м/с</string>
<string name="skill_listening_already_listening">Я вже слухаю слово пробудження</string>
<string name="skill_listening_started_listening">Гаразд, я послухаю слово пробудження</string>
<string name="skill_listening_not_listening">Я не слухав</string>
<string name="skill_listening_stop_listening">Добре</string>
<string name="skill_listening_disabled">Служба Wake Word відключена в налаштуваннях</string>
<string name="skill_name_listening">Контроль прослуховування Wake Word</string>
<string name="skill_sentence_example_listening">Перестань слухати</string>
<string name="failed_to_copy">Не вдалося скопіювати в буфер обміну</string>
<string name="skill_name_joke">Жарт</string>
<string name="skill_sentence_example_joke">Розкажи мені анекдот</string>
<string name="skill_translation_success">Перекладено мовою %1$s</string>
<string name="skill_translation_unknown_language">Я не розпізнаю мову %1$s</string>
<string name="skill_translation_unsupported_language">Мова %1$s (%2$s) не підтримується</string>
<string name="skill_translation_failed">Не вдалося перекласти ваш запит мовою %1$s</string>
<string name="skill_translation_failed_no_query">Я не зрозумів, що ви хотіли перекласти. Чи не могли б ви повторити?</string>
<string name="skill_translation_to">до</string>
<string name="skill_name_translation">Перекласти</string>
<string name="skill_sentence_example_translation">Перекладіть Hola з іспанської на англійську</string>
<string name="skill_translation_auto">Авто</string>
</resources>

View File

@ -67,7 +67,7 @@
<string name="eval_fatal_error">未能评估您的请求</string>
<string name="eval_network_error">网络错误</string>
<string name="eval_network_error_description">Dicio未能连接网络。请检查您的网络连接并重试。</string>
<string name="eval_no_match">没听懂</string>
<string name="eval_no_match">没听懂,请重复?</string>
<string name="stt_say_something">随便说些什么…</string>
<string name="stt_did_not_understand">不明白,请重试</string>
<string name="stt_popup">语音识别服务</string>
@ -201,49 +201,11 @@
<string name="skill_media_pausing">媒体播放暂停中…</string>
<string name="skill_media_next">下个媒体…</string>
<string name="skill_media_no_media_session">没有媒体会话处于活跃状态</string>
<string name="notification_listener_label">Dicio 通知事件侦听器</string>
<string name="skill_media_previous">上个媒体…</string>
<string name="skill_search_no_results_stop">搜索未返回结果</string>
<string name="pref_input_method_vosk_summary">在 Dicio 内下载并离线运行 Vosk 语音转文本模型</string>
<string name="pref_input_method_external_popup">外部语音转文本弹窗</string>
<string name="waiting">等待中…</string>
<string name="pref_input_method_external_popup_summary">通过 ACTION_RECOGNIZE_SPEECH 打开另一个应用的用户界面,比如 whisperIME、Kõnele、Futo Voice Input</string>
<string name="eval_no_match_repeat">可以重复一下吗?</string>
<string name="wake_custom_service_foreground_notification">正在聆听自定义唤醒词</string>
<string name="use_system_default">使用系统默认</string>
<string name="pref_weather_temperature_unit_fahrenheit">华氏度 (°F)</string>
<string name="pref_weather_temperature_unit_kelvin">开尔文 (K)</string>
<string name="skill_weather_celsius">°C</string>
<string name="skill_weather_fahrenheit">°F</string>
<string name="skill_weather_miles_per_hour">英里/小时</string>
<string name="pref_weather_temperature_unit">温度单位</string>
<string name="pref_wake_custom_delete">删除自定义唤醒词</string>
<string name="pref_wake_custom_delete_summary">回到默认唤醒词“Hey Dicio”</string>
<string name="pref_wake_custom_import_summary_oww">用自定义 TFLite 模型替换默认唤醒词“Hey Dicio\";你可以从 github.com/dscripka/openWakeWord/releases 下载一些自定义模型</string>
<string name="pref_weather_temperature_unit_celsius">摄氏度 (°C)</string>
<string name="pref_weather_unit_system_instructions">使用”系统设置 &gt; 系统 &gt; 语言 &amp; 输入 &gt; 区域选项”中配置的单位</string>
<string name="pref_weather_length_unit">长度单位</string>
<string name="skill_weather_kelvin">K</string>
<string name="skill_weather_meters_per_second">米/秒</string>
<string name="pref_weather_length_unit_imperial">英制</string>
<string name="pref_weather_length_unit_metric">公制</string>
<string name="pref_wake_custom_import">导入自定义唤醒词</string>
<string name="skill_listening_already_listening">我已经在聆听唤醒词</string>
<string name="skill_listening_started_listening">好,我会聆听唤醒词</string>
<string name="skill_listening_not_listening">我没有在聆听</string>
<string name="skill_listening_stop_listening"></string>
<string name="skill_listening_disabled">唤醒词服务在设置中被停用</string>
<string name="skill_name_listening">控制唤醒词聆听</string>
<string name="skill_sentence_example_listening">停止聆听</string>
<string name="failed_to_copy">复制到剪贴板失败</string>
<string name="skill_name_joke">笑话</string>
<string name="skill_sentence_example_joke">讲个笑话</string>
<string name="skill_translation_success">已翻译为 %1$s</string>
<string name="skill_translation_unknown_language">我不认识 %1$s 语言</string>
<string name="skill_translation_unsupported_language">不支持 %1$s 语言(%2$s</string>
<string name="skill_translation_failed">无法将你的查询翻译为 %1$s</string>
<string name="skill_translation_failed_no_query">没听清你想翻译什么。可以再说一次吗?</string>
<string name="skill_translation_to"></string>
<string name="skill_name_translation">翻译</string>
<string name="skill_sentence_example_translation">把西班牙语单词 Hola 翻译成英语</string>
<string name="skill_translation_auto">自动</string>
</resources>

View File

@ -19,83 +19,4 @@
<string name="grant_microphone_permission">授予麥克風權限</string>
<string name="download">下載</string>
<string name="stt_not_available">語音轉文字不可用</string>
<string name="error_loading">載入錯誤</string>
<string name="error_unzipping">解壓縮錯誤</string>
<string name="error_downloading">下載錯誤</string>
<string name="unzipping">解壓縮…</string>
<string name="stt_unzip">解壓縮語音轉文字</string>
<string name="listening">正在聆聽…</string>
<string name="waiting">等待中…</string>
<string name="start_listening">開始聆聽</string>
<string name="here_is_what_i_can_do">這些是我可以做的!</string>
<string name="all_skills_disabled_title">所有功能均已被停用</string>
<string name="all_skills_disabled_description">請從設定中啟用一些功能否則Dicio不能做任何事情</string>
<string name="action_text_input">文字輸入</string>
<string name="action_voice_input">語音輸入</string>
<string name="microphone_error">無法存取麥克風,它可能正在使用或權限被拒絕。</string>
<string name="vosk_model_notification_title">Vosk 模型</string>
<string name="vosk_model_notification_description">語言:%1$s</string>
<string name="vosk_model_unsupported_language">目前語言沒有可用的 Vosk 模型</string>
<string name="vosk_model_downloading">下載 Vosk 模型…</string>
<string name="vosk_model_extracting">解析Vosk模型…</string>
<string name="vosk_model_download_error">下載 Vosk 模型失敗</string>
<string name="vosk_model_extraction_error">從壓縮包解析 Vosk 模型失敗</string>
<string name="vosk_model_ready">Vosk 模型已就緒</string>
<string name="android_tts_unsupported_language">Android文字轉語音引擎不支持當前語言</string>
<string name="android_tts_error">初始化Android文字轉語音引擎發生錯誤</string>
<string name="settings">設定</string>
<string name="error_report">報告</string>
<string name="error_title">錯誤報告</string>
<string name="error_sorry">抱歉,發生錯誤</string>
<string name="error_details_headline">詳情:</string>
<string name="error_details_labels">操作:\n區域:\nGMT 時間:\n包:\n版本:\n系統版本:</string>
<string name="error_crash_log_headline">崩潰日誌:</string>
<string name="error_github_notice">請先檢查是否已有您的崩潰問題討論。建立重複的問題會浪費我們修復真正問題的時間。</string>
<string name="error_copy_formatted">複製格式化的報告</string>
<string name="error_report_github">在Github報告</string>
<string name="error_report_notification_title">Dicio 發生錯誤,點擊以回報</string>
<string name="error_report_notification_toast">發生錯誤,請查看通知</string>
<string name="error_report_channel_name">錯誤報告通知</string>
<string name="error_report_channel_description">報告錯誤的通知</string>
<string name="pref_io">輸入輸出的方式</string>
<string name="pref_general">一般</string>
<string name="pref_appearance">外觀</string>
<string name="pref_skills_title">功能</string>
<string name="pref_skills_summary">啟用/停用功能並調整行為</string>
<string name="expand">展開</string>
<string name="reduce">減少</string>
<string name="pref_theme">主題</string>
<string name="pref_theme_summary">選擇應用顏色</string>
<string name="pref_theme_system">使用系統主題</string>
<string name="pref_theme_system_dark_black">使用系統主題(深色主題使用黑色)</string>
<string name="pref_theme_light">明亮</string>
<string name="pref_theme_dark">深色</string>
<string name="pref_theme_black">黑色</string>
<string name="pref_language">語言</string>
<string name="pref_language_summary">Dicio 聆聽何種語言並提供回答?</string>
<string name="pref_language_system">使用系統語言</string>
<string name="pref_input_method">輸入方式</string>
<string name="pref_input_method_summary">選擇和Dicio對話的服務</string>
<string name="pref_input_method_text">僅文字框</string>
<string name="pref_input_method_vosk">Vosk 離線語音辨識</string>
<string name="pref_input_method_vosk_summary">在 Dicio 中下載並離線運行 Vosk 語音轉文字模型</string>
<string name="pref_input_method_external_popup">外部語音轉文字彈窗</string>
<string name="pref_input_method_external_popup_summary">透過 ACTION_RECOGNIZE_SPEECH 開啟另一個應用程式的 UI例如 whisperIME、Kõnele、Futo Voice Input</string>
<string name="pref_speech_output_method">語音輸出方式</string>
<string name="pref_speech_output_method_summary">選擇 Dicio 和你對話的服務</string>
<string name="pref_speech_output_method_android">Android 文字轉語音引擎</string>
<string name="pref_speech_output_method_toast">Toast (彈出訊息)</string>
<string name="pref_speech_output_method_snackbar">Snackbar (底部的訊息)</string>
<string name="pref_speech_output_method_nothing"></string>
<string name="pref_wake_method">喚醒詞辨識方式</string>
<string name="pref_wake_method_summary">選擇用於在後台監聽「Hey Dicio」喚醒詞的服務</string>
<string name="pref_wake_method_disabled">已停用</string>
<string name="pref_wake_method_openwakeword">OpenWakeWord 離線音訊處理</string>
<string name="pref_wake_custom_delete">刪除自訂喚醒詞</string>
<string name="pref_wake_custom_delete_summary">還原預設喚醒詞 \"Hey Dicio\"</string>
<string name="pref_wake_custom_import">匯入自訂喚醒詞</string>
<string name="pref_wake_custom_import_summary_oww">將預設的「Hey Dicio」喚醒詞替換為自訂 TFLite 模型;您可以從 github.com/dscripka/openWakeWord/releases 下載自訂模型</string>
<string name="pref_skill_not_available">此功能不相容於您的語言。歡迎貢獻!</string>
<string name="pref_skill_missing_permissions">需要這些權限:%1$s</string>
<string name="pref_skill_grant_permissions">允許</string>
</resources>
</resources>

View File

@ -138,8 +138,6 @@
<string name="skill_sentence_example_open">Open NewPipe</string>
<string name="skill_name_media">Media control</string>
<string name="skill_sentence_example_media">Next song</string>
<string name="skill_name_joke">Joke</string>
<string name="skill_sentence_example_joke">Tell me a joke</string>
<string name="skill_name_calculator">Calculator</string>
<string name="skill_sentence_example_calculator">What is five times four minus a million?</string>
<string name="skill_name_navigation">Navigation</string>
@ -194,6 +192,7 @@
<string name="skill_timer_query_last">The last timer expires in %1$s</string>
<string name="skill_timer_none_canceled">OK, no timer was canceled</string>
<string name="stt_service_label">Dicio offline speech recognition</string>
<string name="notification_listener_label">Dicio notification event listener</string>
<string name="wake_service_label">Dicio wake word service</string>
<string name="wake_service_foreground_notification_summary">This notification allows the Dicio
wake word service to listen to the microphone in the background</string>
@ -214,21 +213,6 @@
<string name="retry">Retry</string>
<string name="stop">Stop</string>
<string name="grant_permissions">Grant permissions</string>
<string name="skill_listening_already_listening">I am already listening for the wake word</string>
<string name="skill_listening_started_listening">OK, I\'ll listen for the wake word</string>
<string name="skill_listening_not_listening">I wasn\'t listening</string>
<string name="skill_listening_stop_listening">OK</string>
<string name="skill_listening_disabled">The wake word service is disabled in settings</string>
<string name="skill_name_listening">Control wake word listening</string>
<string name="skill_sentence_example_listening">Stop listening</string>
<string name="skill_translation_success">Translated to %1$s</string>
<string name="skill_translation_unknown_language">I don\'t recognize language %1$s</string>
<string name="skill_translation_unsupported_language">Language %1$s (%2$s) is not supported</string>
<string name="skill_translation_failed">Unable to translate your query into %1$s</string>
<string name="skill_translation_failed_no_query">I didn\'t understand, could you repeat what you want to translate?</string>
<string name="skill_translation_to">to</string>
<string name="skill_name_translation">Translate</string>
<string name="skill_sentence_example_translation">Translate Hola from Spanish to English</string>
<string name="pref_weather_temperature_unit">Temperature unit</string>
<string name="use_system_default">Use system default</string>
<string name="pref_weather_unit_system_instructions">Uses the unit configured in \"System settings > System > Languages &amp; input > Regional preferences\"</string>
@ -243,7 +227,4 @@
<string name="skill_weather_kelvin">K</string>
<string name="skill_weather_meters_per_second">m/s</string>
<string name="skill_weather_miles_per_hour">mph</string>
<string name="failed_to_copy">Failed to copy to clipboard</string>
<string name="skill_translation_auto">Auto</string>
<string name="skill_search_duckduckgo_recaptcha">DuckDuckGo did not provide results, asking for a Captcha to be solved</string>
</resources>

View File

@ -1,14 +0,0 @@
stop:
- (stopp<e?>|beende das)|(nicht mehr) zuhören|lauschen
- hör<e?> auf zuzuhören|(zu lauschen)
- mach<e?>? das? mikro<fon?> aus|stumm<schalten?>
- hör<e?> mal weg
- zuhören|lauschen aus|stoppe<n?>|beenden|aufhören|unterlassen
start:
- (start<e?>|beginn<e?> das) zuhören
- beginn<e?>|(fang an) zuzuhören
- mach<e?>? das? mikro<fon?> an
- hör<e?> mir|uns|mal zu
- zuhören|lauschen an|beginnen|anfangen

View File

@ -2,4 +2,3 @@ query:
- (zeige|finde heraus|lade|finde)? mir? den|die|das? lyrics|text|liedtext|lied (von|für (das Lied|den Song)?)? .song.
- .song. lyrics|text|songtext|liedtext
- Wie heißt (das Lied)|(der Song) (dass|das|der so geht)|(mit dem Text) .song.
- (was (ist der)|(sind die))? lyrics|text (von|zu|vom|bei<m?> dem? lied|song?)? .song.

View File

@ -1,17 +0,0 @@
play:
- gib|geb<e?>|spiel<e?>|mach<e?>|start<e?> (das|den|die? audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video) wieder? ab|an?
- das|den|die? audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video abspielen|fortsetzen
pause:
- pausier<e|en?>|halt<e|en?>|stopp<e|en?> (das|den|die? audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video) an?
- mach<e?>? das|den|die? audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video auf pause
- das|den|die? audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video anhalten|pausieren|stoppen
previous:
- speil<e?>? das|den|die? letzte<n?> audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video? (in der <warte?>schlange)?
- geh<e?>? zurück|zurueck (zum|zur letzten|vorherigen audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video)
- wiederhol<e?> das|den|die? letzte<n?> audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video
next:
- skip<e?>|überspring<e?>|ueberspring<e?> das|den|die|ein<e|en?>? audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video
- spiel<e?>|spring<e?>|geh<e?>? das|den|die|zu<m|r>? nächste<s|n?>|folgende<s|n?> audio|film|hör<buch|spiel>|lied|musik<stück?>|podcast|song|stream|stück|track|video? (in der <warte?>schlange)?

View File

@ -1,4 +0,0 @@
command:
- (tell me?)|(i (d|would like)|want (to hear)?)|say|(do you know|have)|(have? you? got) a|another|any? good|funny? joke<s?>|pun<s?>|gag<s?>|prank<s?>
- (make me laugh)|(entertain me)|(cheer me up) (with a|another|any? good|funny? joke<s?>|pun<s?>|gag<s?>|prank<s?>)?
- say something|anything fun|funny

View File

@ -1,9 +0,0 @@
stop:
- stop listening (the? wake word)?
- mute microphone?
- turn off the? microphone
start:
- start listening (the? wake word)?
- unmute|(on mute) microphone?
- turn on the? microphone

View File

@ -1,6 +1,5 @@
query:
- get|show|load|display|find? me? the? lyrics|text (for|of|to|from|about (the song)?)? .song.
- get|show|load|display|find? me? the? lyrics|text (for|of|from|about (the song)?)? .song.
- sing (the song)? .song.
- .song. lyrics|text
- sing|whats|(what is|s) that|the song going|(that|which goes|says|tells|sings)|(with lyrics) .song.
- (what s|is|are)|whats the? lyrics|text (for|of|to|from|about (the song)?)? .song.

View File

@ -1,10 +1,10 @@
play:
- play|resume|unpause|start|restart (the? song|media|track|music|audio|video|movie|stream|film)
- play|resume|unpause (the? song|media|track|music|audio|video|movie|stream|film)?
- turn on the? player
- continue playing (the? song|media|track|music|audio|video|movie|stream|film)?
pause:
- pause|halt|stop|hold (the? song|media|track|music|audio|video|movie|stream|film)
- pause|halt|stop|hold (the? song|media|track|music|audio|video|movie|stream|film)?
- put the? song|media|track|music|audio|video|movie|stream|film on hold
previous:

View File

@ -1,4 +0,0 @@
translate:
- (i d|would like you? to)? please? translate .query. ((from .source.)? (<in?>to .target.)?)|(<in?>to .target. from .source.) (for me)?
- (i d|would like to know)|(please? tell me)? what (is|s|are .query.)(.query. is|are) in .target. (from .source.)?
- how <c|w|sh>ould|do|can i|one|you|people say|tell|speak|translate .query. in .target.

View File

@ -1,5 +1,5 @@
current:
- (what|how is|s)|whats the weather like? (in|on .where.)?
- (what is|s)|whats the weather like? (in|on .where.)?
- weather (in|on? .where.)?
- how is it outside
- is it cold|cool|warm|hot|sunny|rainy|raining (in|on .where.)|outside?

View File

@ -1,3 +1,3 @@
calculate:
- calcule|cacula<r|dora?>|determin<a|e>|hall<a|e>|encuentr<a|e>|operar|oper<a|e> (el? valor de)|(cuanto vale|es|fa)? .calculation.
- calculadora|caculadora|determina|halla (el? valor de)|(cuanto vale|es|fa)? .calculation.
- cuanto vale|es|fa .calculation.

View File

@ -1,18 +1,17 @@
addition:
- más|(suma<r|ando?>|añad<a|e|ir|ido|iendo>|agrega<r?> (a|con)?)
- más|(sumar|suma|sumando|suma|añade|agrega|añadiendo|añadir a?)
subtraction:
- menos|sustraer|restar|restando
multiplication:
- por|(m<o|i|u>ltiplica<r|ndo|do> por?)
- por|(multiplicar|miltiplicando|multiplicando|moltiplicar por?)
division:
- entre|(dividir|division|dividendo|dividido por|entre?)
- (dividir|division|dividendo|dividi do|por?)
power:
- elevado? a la (potencia<do?>|exponente)? (por|de)?
- elevado? a la (potenciado por)?
square_root:
- la? raiz cuadrada de?
- radical cuadrado de?
- raiz cuadrada de?

View File

@ -1,3 +0,0 @@
query:
- (disculpe|disculpa)? (a? que)|cual (es la)? hora (tiene<s?>|es)?
- d<a|i>me|(puede<s?> decir) la hora

View File

@ -1,6 +1,6 @@
query:
- dame|obtiene|obten<er?>|muestra|mostrar|carga<r?>|ve<r?>|encuentra|encontrar|(buscar la?)? me? el|la? letra|texto (del|de|desde|acerca (la cancion)?)? .song.
- canta<r?>|sing (el tema)? .song.
- .song. letra<s?>|texto<s?>|cancionero
- cancionero|letra<s?>|textos .song.
- (que|cual esa|es|fue|s la?)? cancion (esta|cual|que dice|tiene|lleva)|(con|cuy<a|o>|la|el letra|texto es?) .song.
- obtiene|muestra|carga|ver|encuentra|(buscar la?)? me? el|la? letra|texto (del|de|desde|acerca (la cancion)?)? .song.
- sing (el tema)? .song.
- .song. letras|textos
- letras|textos .song.
- (que|cual esa|es|s la?)? cancion (esta|cual|que dice|decime|sings)|(con letra|texto) .song.

View File

@ -1,19 +0,0 @@
play:
- reproducir|reproduzca|sonar|(dejar de pausar) ((el|la)? cancion|<multi?>media|pista|musica|audio|video|film|peli<cula?>|stream)?
- reanuda<r?>|continua<r?> ((el|la)? cancion|<multi?>media|pista|musica|audio|video|film|peli<cula?>|stream)
- activ<a|e>|enciend<a|e>|inicializar|inicialic<a|e> el reproductor
- continu<e|a|ar> reproduciendo ((el|la)? cancion|<multi?>media|pista|musica|audio|video|film|peli<cula?>|stream)?
pause:
- pausar|detener|(dejar en pausa) ((el|la)? cancion|<multi?>media|pista|musica|audio|video|film|peli<cula?>|stream)?
- pon (el|la)? cancion|<multi?>media|pista|musica|audio|video|film|peli<cula?>|stream en pausa|suspension
previous:
- reproducir|sonar|pasar el|la? cancion|<multi?>media|pista|musica|audio|video|film|peli<cula?>|stream|transmision anterior|antecesor<a?> (de|en la cola|fila)?
- reproducir|sonar|pasar el|la? anterior|antecesor<a?> cancion|<multi?>media|pista|musica|audio|video|film|peli<cula?>|stream|transmision (de|en la cola|fila)?
- retroceder|ir (a el)|al|la anterior|antecesor<a?>
next:
- reproducir|sonar|saltar el|la? cancion|<multi?>media|pista|musica|audio|video|film|peli<cula?>|stream|transmision siguiente|posterior<a?>|sucesor<a?> (de|en la cola|fila)?
- reproducir|sonar|saltar el|la? siguiente|posterior<a?>|sucesor<a?> cancion|<multi?>media|pista|musica|audio|video|film|peli<cula?>|stream|transmision (de|en la cola|fila)?
- ir|saltar|omitir (a el)|al|la siguiente|sucesor<a?>

View File

@ -1,4 +0,0 @@
query:
- (navega<r|me?>)|(lleva<me?>)|localiza|((dame la|las?)? direccion<es?>) a|de? el|la? .where.
- sabe<s?>|dime? donde esta|(se encuentra) .where.
- puede<s?> explicar<me?> como llegar|ir a .where.

View File

@ -1,2 +1,2 @@
query:
- abre|inicia|abrir|inicia|iniciar|corre|lanza|ejecuta (app|apli|programa|aplicacion? .what.)|(.what. app|programa|apli|aplicacion?)
- abre|inicia|abrir|inicia|iniciar|corre|lanza (app|aplicacion? .what.)|(.what. app|programa|aplicacion?)

View File

@ -1,3 +1,3 @@
query:
- busca<r?>|investiga<r?>|revisa<r?>|busca<r?>|encuentra (que|como es?)|(informacion de|sobre)? .what. online|(en|por (el|la)? internet|(motor|buscador? web))?
- señala<r|me|rme?>|mira<r?> (que|como es?)? .what. (ahora|ya mismo?)?
- busca|investiga|revisa|busca<r?>|encuentra (que es?)? .what. online|(en la? internet|web)?
- mira<r?> .what. subir

View File

@ -1,2 +1,2 @@
dial:
- telefonea<r?>|llama<r?><le?>|marca<r?><le?>|(haz<me?>|hacer una llamada)|(dar? un telefonazo)|contacta<r?> a .who.
- llama<r?><le?>|marca<r?><le?>|(haz|hacer una llamada)|contacta<r?> a .who.

View File

@ -1,11 +1,10 @@
set:
- notifica<r?>me|alerta<r?>me en .duration.
- establece<r?>|ajusta<r?>|configura<r?>|inicia<r?>|crea<r?> un? temporizador|cronometro|contador (con duracion)? de .duration. ((denominado|llamado|(con el nombre de?)) .name.)?
- configura<r?>|inicia<r?>|crea<r?> un? temporizador|cronometro|contador (con duracion)? de .duration. ((llamado|(con el nombre de?)) .name.)?
cancel:
- cancela<r?>|deten<er?> ((el? temporizador|cronometro|contador llamado|(con el nombre de?))|(los? temporizadores|cronometros|contadores (llamados|(con el nombre de?))))? .name.
- silencia<r?>|desactiva<r?> ((el|la? alarma|timbre llamad<a|o>|(con el nombre de?))|(los|las? alarma|timbre (denominad<a|o>s|llamad<a|o>s|(con el nombre de?))))? .name.
query:
- cuanto tiempo? le|te? queda|resta|falta|sobra al|(en el) temporizador|cronometro|contador (llamado|(con el nombre de?) .name.)?
- cuanto tiempo? le? queda|resta|falta|sobra al|(en el) temporizador|cronometro|contador (llamado|(con el nombre de?) .name.)?
- cuando terminara|finalizara|(se detendra) el temporizador|cronometro|contador (llamado|(con el nombre de?) .name.)?

View File

@ -1,5 +1,5 @@
yes:
- si|(claro (que si)?)|afirmativo|(por supuesto (que si)?)|adelante|segur<o|a>|va<le|mos>|procede|continua|sig<a|ue>|correcto|hagamoslo gracias|(por favor)?
- si|(claro (que si)?)|afirmativo|(por supuesto (que si)?)|adelante|segur<o|a>|vamos|procede|continua|hagamoslo
no:
- (((por supuesto que)|(claro que)|mejor|ya)? no)|negativo|para<r?>|deten<te|er>|(no continuar|proceder)|alto|basta|cancela<r?> gracias|(por favor)?
- (((por supuesto que)|(claro que)|(mejor))? no)|negativo|para<r?>|deten<te|er>|(no continuar|proceder)|alto|basta

View File

@ -1,4 +1,4 @@
current:
- (como|cual es el?)? (pronostico del)? clima (en|de? .where.)?
- como esta ahora|hoy mismo?
- esta|hay|hace frio|congelado|calor|caliente|soleado|lluvioso|lloviendo|nevando|nieve afuera|(en? .where.)?
- (que|cual es el?)? clima (en? .where.)?
- como esta hoy
- esta frio|congelado|calor|caliente|soleado|lluvioso|lloviendo afuera|(en? .where.)?

View File

@ -1,4 +0,0 @@
command:
- di<mmi|cci?>|fa<i|mmi|cci> un<o|a?>|l<o|a>|il bell<o|a>? scherzo|barzelletta|freddura|beffa|burla|battuta divertente?
- fa<mmi|cci> ridere (con un<o|a?>|l<o|a> scherzo|barzelletta)?
- di<mmi|cci?> qualcosa di? divertente|scherzoso

View File

@ -1,8 +0,0 @@
stop:
- smetti di ascoltar<e|mi> (la? parola di attivazione)?
- spegn<e|i>|muta|disattiva il microfono
start:
- ascolta<mi?> (la? parola di attivazione)?
- mettiti a<d?> ascoltar<e|mi> (la? parola di attivazione)?
- accendi|attiva il microfono

View File

@ -1,3 +0,0 @@
translate:
- puoi? tradu<ci|cimi|ca|cami|rre|rmi|rci> .query. (da<l|ll?> .source.)? (in|a<l|ll?> .target.)?
- come si? può? di<ce|co|cono|ciamo|re> .query. in .target.

View File

@ -1,2 +0,0 @@
calculate:
- bereken|evalueer|(wat is)|(vind de waarde van?)|(hoeveel is)|(reken uit) .calculation.

View File

@ -1,17 +0,0 @@
addition:
- plus|som|sommeer|erbij|(voeg toe|erbij)|(tel erbij? op)
subtraction:
- (minus|min|aftrekken|aftrekken van?)|(trek af van?)|(trek eraf)|(trek ervan af)
multiplication:
- keer|maal|(product van?)|(vermenigvuldig met?)
division:
- deel|(gedeeld door?)|delen|(quotiënt van?)
power:
- (verhef<fen?>? tot de macht van?)|macht
square_root:
- de? wortel|vierkantswortel uit|van?

View File

@ -1,2 +0,0 @@
query:
- (hoe laat is het nu?)|(hoe laat)|(wat is de tijd nu?)

View File

@ -1,13 +0,0 @@
stop:
- stop net? luisteren (naar? het? waakwoord)?
- demp|mute de? microfoon
- zet? de? microfooon uit
- microfoon dempen
- microfoon uitzetten
start:
- start|begin met? luisteren (naar? het? waakwoord)?
- unmute|(on mute) de? microfoon?
- zet? de? microfoon aan
- microfoon aanzetten
- microfoon inschakelen

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