More refactoring to split up modules, both compile.

Wear is still WIP.
This commit is contained in:
darken
2022-09-14 18:00:18 +02:00
committed by Matthias Urhahn
parent f7acb5e115
commit 6ea3127f9c
303 changed files with 1214 additions and 269 deletions
@@ -1,13 +0,0 @@
package eu.darken.capod.common
import android.content.Context
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat
fun colorString(context: Context, @ColorRes colorRes: Int, string: String): SpannableString {
val colored = SpannableString(string)
colored.setSpan(ForegroundColorSpan(ContextCompat.getColor(context, colorRes)), 0, string.length, 0)
return colored
}
@@ -1,40 +0,0 @@
package eu.darken.capod.common
import android.annotation.SuppressLint
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.res.TypedArray
import androidx.annotation.AttrRes
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
@ColorInt
fun Context.getColorForAttr(@AttrRes attrId: Int): Int {
var typedArray: TypedArray? = null
try {
typedArray = this.theme.obtainStyledAttributes(intArrayOf(attrId))
return typedArray.getColor(0, 0)
} finally {
typedArray?.recycle()
}
}
@ColorInt
fun Fragment.getColorForAttr(@AttrRes attrId: Int): Int = requireContext().getColorForAttr(attrId)
@ColorInt
fun Context.getCompatColor(@ColorRes attrId: Int): Int {
return ContextCompat.getColor(this, attrId)
}
@ColorInt
fun Fragment.getCompatColor(@ColorRes attrId: Int): Int = requireContext().getCompatColor(attrId)
@SuppressLint("NewApi")
fun Context.startServiceCompat(intent: Intent): ComponentName? {
return if (hasApiLevel(26)) startForegroundService(intent) else startService(intent)
}
@@ -1,59 +0,0 @@
package eu.darken.capod.common
import android.media.AudioManager
import android.os.SystemClock
import android.view.KeyEvent
import eu.darken.capod.common.debug.logging.Logging.Priority.INFO
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag
import kotlinx.coroutines.delay
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class MediaControl @Inject constructor(
private val audioManager: AudioManager,
) {
val isPlaying: Boolean
get() = audioManager.isMusicActive
suspend fun sendPlay() {
log(TAG, INFO) { "sendPlay()" }
if (audioManager.isMusicActive) {
log(TAG, INFO) { "Music is already playing, not sending play" }
return
}
sendKey(KeyEvent.KEYCODE_MEDIA_PLAY)
}
suspend fun sendPause() {
log(TAG, INFO) { "sendPause()" }
if (!audioManager.isMusicActive) {
log(TAG, INFO) { "Music is not playing, not sending pause" }
return
}
sendKey(KeyEvent.KEYCODE_MEDIA_PAUSE)
}
suspend fun sendPlayPause() {
log(TAG) { "sendPlayPause()" }
if (audioManager.isMusicActive) {
sendPause()
} else {
sendPlay()
}
}
private suspend fun sendKey(keyCode: Int) {
log(TAG) { "Sending up+down KeyEvent: $keyCode" }
val eventTime = SystemClock.uptimeMillis()
audioManager.dispatchMediaKeyEvent(KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, keyCode, 0))
delay(100)
audioManager.dispatchMediaKeyEvent(KeyEvent(eventTime + 200, eventTime + 200, KeyEvent.ACTION_UP, keyCode, 0))
}
companion object {
private val TAG = logTag("MediaControl")
}
}
@@ -1,18 +0,0 @@
package eu.darken.capod.common.error
import android.content.Context
import com.google.android.material.dialog.MaterialAlertDialogBuilder
fun Throwable.asErrorDialogBuilder(
context: Context
) = MaterialAlertDialogBuilder(context).apply {
val error = this@asErrorDialogBuilder
val localizedError = error.localized(context)
setTitle(localizedError.label)
setMessage(localizedError.description)
setPositiveButton(android.R.string.ok) { _, _ ->
}
}
@@ -1,7 +0,0 @@
package eu.darken.capod.common.error
import eu.darken.capod.common.livedata.SingleLiveEvent
interface ErrorEventSource {
val errorEvents: SingleLiveEvent<Throwable>
}
@@ -1,36 +0,0 @@
package eu.darken.capod.common.error
import android.content.Context
import eu.darken.capod.R
interface HasLocalizedError {
fun getLocalizedError(context: Context): LocalizedError
}
data class LocalizedError(
val throwable: Throwable,
val label: String,
val description: String
) {
fun asText() = "$label:\n$description"
}
fun Throwable.localized(c: Context): LocalizedError = when {
this is HasLocalizedError -> this.getLocalizedError(c)
localizedMessage != null -> LocalizedError(
throwable = this,
label = "${c.getString(R.string.general_error_label)}: ${this::class.simpleName!!}",
description = localizedMessage ?: getStackTracePeek()
)
else -> LocalizedError(
throwable = this,
label = "${c.getString(R.string.general_error_label)}: ${this::class.simpleName!!}",
description = getStackTracePeek()
)
}
private fun Throwable.getStackTracePeek() = this.stackTraceToString()
.lines()
.filterIndexed { index, _ -> index > 1 }
.take(3)
.joinToString("\n")
@@ -1,42 +0,0 @@
package eu.darken.capod.common.error
import java.io.PrintWriter
import java.io.StringWriter
import java.lang.reflect.InvocationTargetException
import kotlin.reflect.KClass
val Throwable.causes: Sequence<Throwable>
get() = sequence {
var subCause = cause
while (subCause != null) {
yield(subCause)
subCause = subCause.cause
}
}
fun Throwable.getRootCause(): Throwable {
var error = this
while (error.cause != null) {
error = error.cause!!
}
if (error is InvocationTargetException) {
error = error.targetException
}
return error
}
fun Throwable.hasCause(exceptionClazz: KClass<out Throwable>): Boolean {
if (exceptionClazz.isInstance(this)) return true
return exceptionClazz.isInstance(this.getRootCause())
}
fun Throwable.getStackTraceString(): String {
val sw = StringWriter(256)
val pw = PrintWriter(sw, false)
printStackTrace(pw)
pw.flush()
return sw.toString()
}
fun Throwable.tryUnwrap(kClass: KClass<RuntimeException> = RuntimeException::class): Throwable =
if (!kClass.isInstance(this)) this else cause ?: this
@@ -1,155 +0,0 @@
package eu.darken.capod.common.flow
import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE
import eu.darken.capod.common.debug.logging.asLog
import eu.darken.capod.common.debug.logging.log
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.plus
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlin.coroutines.CoroutineContext
/**
* A thread safe stateful flow that can be updated blocking and async with a lazy initial value provider.
*
* @param loggingTag will be prepended to logging tag, i.e. "$loggingTag:HD"
* @param parentScope on which the update operations and callbacks will be executed on
* @param coroutineContext used in combination with [CoroutineScope]
* @param startValueProvider provides the first value, errors will be rethrown on [CoroutineScope]
*/
class DynamicStateFlow<T>(
loggingTag: String? = null,
parentScope: CoroutineScope,
coroutineContext: CoroutineContext = parentScope.coroutineContext,
private val onRelease: CoroutineScope.(T) -> Unit = {},
private val startValueProvider: suspend CoroutineScope.() -> T,
) {
private val lTag = loggingTag?.let { "$it:DSFlow" }
private val updateActions = MutableSharedFlow<Update<T>>(
replay = Int.MAX_VALUE,
extraBufferCapacity = Int.MAX_VALUE,
onBufferOverflow = BufferOverflow.SUSPEND
)
private val valueGuard = Mutex()
private val producer: Flow<State<T>> = channelFlow {
var currentValue = valueGuard.withLock {
lTag?.let { log(it, VERBOSE) { "Providing startValue..." } }
startValueProvider().also { startValue ->
val initializer = Update<T>(onError = null, onModify = { startValue })
send(State(value = startValue, updatedBy = initializer))
lTag?.let { log(it, VERBOSE) { "...startValue provided and emitted." } }
}
}
invokeOnClose {
lTag?.let { log(it, VERBOSE) { "invokeOnClose executing..." } }
onRelease(currentValue)
lTag?.let { log(it, VERBOSE) { "internal channelFlow finished." } }
}
updateActions.collect { update ->
currentValue = valueGuard.withLock {
try {
update.onModify(currentValue).also {
send(State(value = it, updatedBy = update))
}
} catch (e: Exception) {
lTag?.let {
log(it, VERBOSE) { "Data modifying failed (onError=${update.onError}): ${e.asLog()}" }
}
if (update.onError != null) {
update.onError.invoke(e)
} else {
send(State(value = currentValue, error = e, updatedBy = update))
}
currentValue
}
}
}
}
private val internalFlow = producer
.onStart { lTag?.let { log(it, VERBOSE) { "Internal onStart" } } }
// .onEach { value -> lTag?.let { log(it, VERBOSE) { "New value: $value" } } }
.onCompletion { err ->
when {
err is CancellationException -> {
lTag?.let { log(it, VERBOSE) { "internal onCompletion() due to cancellation" } }
}
err != null -> {
lTag?.let { log(it, VERBOSE) { "internal onCompletion() due to error: ${err.asLog()}" } }
}
else -> {
lTag?.let { log(it, VERBOSE) { "internal onCompletion()" } }
}
}
}
.shareIn(
scope = parentScope + coroutineContext,
replay = 1,
started = SharingStarted.Lazily
)
val flow: Flow<T> = internalFlow
.map { it.value }
.distinctUntilChanged()
suspend fun value() = flow.first()
/**
* Non blocking update method.
* Gets executed on the scope and context this instance was initialized with.
*
* @param onError if you don't provide this, and exception in [onUpdate] will the scope passed to this class
*/
fun updateAsync(
onError: (suspend (Exception) -> Unit) = { throw it },
onUpdate: suspend T.() -> T,
) {
val update: Update<T> = Update(
onModify = onUpdate,
onError = onError
)
runBlocking { updateActions.emit(update) }
}
/**
* Blocking update method
* Gets executed on the scope and context this instance was initialized with.
* Waiting will happen on the callers scope.
*
* Any errors that occurred during [action] will be rethrown by this method.
*/
suspend fun updateBlocking(action: suspend T.() -> T): T {
val update: Update<T> = Update(onModify = action)
updateActions.emit(update)
lTag?.let { log(it, VERBOSE) { "Waiting for update." } }
val ourUpdate = internalFlow.first { it.updatedBy == update }
lTag?.let { log(it, VERBOSE) { "Finished waiting, got $ourUpdate" } }
ourUpdate.error?.let { throw it }
return ourUpdate.value
}
private data class Update<T>(
val onModify: suspend T.() -> T,
val onError: (suspend (Exception) -> Unit)? = null,
)
private data class State<T>(
val value: T,
val error: Exception? = null,
val updatedBy: Update<T>,
)
}
@@ -1,3 +0,0 @@
package eu.darken.capod.common.flow
@@ -1,213 +0,0 @@
package eu.darken.capod.common.flow
import kotlinx.coroutines.flow.Flow
//@Suppress("UNCHECKED_CAST", "LongParameterList")
//inline fun <T1, T2, R> combine(
// flow: Flow<T1>,
// flow2: Flow<T2>,
// crossinline transform: suspend (T1, T2) -> R
//): Flow<R> = kotlinx.coroutines.flow.combine(
// flow,
// flow2
//) { args: Array<*> ->
// transform(
// args[0] as T1,
// args[1] as T2
// )
//}
@Suppress("UNCHECKED_CAST", "LongParameterList")
inline fun <T1, T2, T3, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
crossinline transform: suspend (T1, T2, T3) -> R
): Flow<R> = kotlinx.coroutines.flow.combine(
flow,
flow2,
flow3,
) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
)
}
@Suppress("UNCHECKED_CAST", "LongParameterList")
inline fun <T1, T2, T3, T4, T5, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
crossinline transform: suspend (T1, T2, T3, T4, T5) -> R
): Flow<R> = kotlinx.coroutines.flow.combine(
flow,
flow2,
flow3,
flow4,
flow5
) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5
)
}
@Suppress("UNCHECKED_CAST", "LongParameterList")
inline fun <T1, T2, T3, T4, T5, T6, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6) -> R
): Flow<R> = kotlinx.coroutines.flow.combine(
flow,
flow2,
flow3,
flow4,
flow5,
flow6
) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6
)
}
@Suppress("UNCHECKED_CAST", "LongParameterList")
inline fun <T1, T2, T3, T4, T5, T6, T7, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
flow7: Flow<T7>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7) -> R
): Flow<R> = kotlinx.coroutines.flow.combine(
flow,
flow2,
flow3,
flow4,
flow5,
flow6,
flow7
) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6,
args[6] as T7
)
}
@Suppress("UNCHECKED_CAST", "LongParameterList")
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
flow7: Flow<T7>,
flow8: Flow<T8>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R
): Flow<R> = kotlinx.coroutines.flow.combine(
flow,
flow2,
flow3,
flow4,
flow5,
flow6,
flow7,
flow8
) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6,
args[6] as T7,
args[7] as T8
)
}
@Suppress("UNCHECKED_CAST", "LongParameterList")
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
flow7: Flow<T7>,
flow8: Flow<T8>,
flow9: Flow<T9>,
flow10: Flow<T10>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R
): Flow<R> = kotlinx.coroutines.flow.combine(
flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8, flow9, flow10
) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6,
args[6] as T7,
args[7] as T8,
args[8] as T9,
args[9] as T10
)
}
@Suppress("UNCHECKED_CAST", "LongParameterList")
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
flow7: Flow<T7>,
flow8: Flow<T8>,
flow9: Flow<T9>,
flow10: Flow<T10>,
flow11: Flow<T11>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R
): Flow<R> = kotlinx.coroutines.flow.combine(
flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8, flow9, flow10, flow11
) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6,
args[6] as T7,
args[7] as T8,
args[8] as T9,
args[9] as T10,
args[10] as T11
)
}
@@ -1,74 +0,0 @@
package eu.darken.capod.common.flow
import eu.darken.capod.common.debug.logging.Logging.Priority.ERROR
import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE
import eu.darken.capod.common.debug.logging.asLog
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.error.hasCause
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.*
import kotlin.time.Duration
/**
* Create a stateful flow, with the initial value of null, but never emits a null value.
* Helper method to create a new flow without suspending and without initial value
* The flow collector will just wait for the first value
*/
fun <T : Any> Flow<T>.shareLatest(
tag: String? = null,
scope: CoroutineScope,
started: SharingStarted = SharingStarted.WhileSubscribed(replayExpirationMillis = 0)
) = this
.onStart { if (tag != null) log(tag) { "shareLatest(...) start" } }
.onEach { if (tag != null) log(tag) { "shareLatest(...) emission: $it" } }
.onCompletion { if (tag != null) log(tag) { "shareLatest(...) completed." } }
.catch {
if (tag != null) log(tag) { "shareLatest(...) catch(): ${it.asLog()}" }
throw it
}
.stateIn(
scope = scope,
started = started,
initialValue = null
)
.filterNotNull()
fun <T : Any?> Flow<T>.replayingShare(scope: CoroutineScope) = this.shareIn(
scope = scope,
replay = 1,
started = SharingStarted.WhileSubscribed(replayExpiration = Duration.ZERO)
)
internal fun <T> Flow<T>.withPrevious(): Flow<Pair<T?, T>> = this
.scan(Pair<T?, T?>(null, null)) { previous, current -> Pair(previous.second, current) }
.drop(1)
.map {
@Suppress("UNCHECKED_CAST")
it as Pair<T?, T>
}
fun <T> Flow<T>.onError(block: suspend (Throwable) -> Unit) = this.catch {
block(it)
throw it
}
fun <T> Flow<T>.takeUntilAfter(predicate: suspend (T) -> Boolean) = transformWhile {
val fullfilled = predicate(it)
emit(it)
!fullfilled // We keep emitting until condition is fullfilled = true
}
fun <T> Flow<T>.setupCommonEventHandlers(tag: String, identifier: () -> String) = this
.onStart { log(tag, VERBOSE) { "${identifier()}.onStart()" } }
.onEach { log(tag, VERBOSE) { "${identifier()}.onEach(): $it" } }
.onCompletion { log(tag, VERBOSE) { "${identifier()}.onCompletion()" } }
.catch {
if (it.hasCause(CancellationException::class)) {
log(tag, VERBOSE) { "${identifier()} cancelled" }
} else {
log(tag, ERROR) { "${identifier()} failed: ${it.asLog()}" }
throw it
}
}
@@ -1,58 +0,0 @@
package eu.darken.capod.common.lists
import android.content.Context
import android.content.res.Resources
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.*
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import eu.darken.capod.common.getColorForAttr
abstract class BaseAdapter<T : BaseAdapter.VH> : RecyclerView.Adapter<T>() {
@CallSuper
final override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T {
return onCreateBaseVH(parent, viewType)
}
abstract fun onCreateBaseVH(parent: ViewGroup, viewType: Int): T
@CallSuper
final override fun onBindViewHolder(holder: T, position: Int) {
onBindBaseVH(holder, position, mutableListOf())
}
@CallSuper
final override fun onBindViewHolder(holder: T, position: Int, payloads: MutableList<Any>) {
onBindBaseVH(holder, position, payloads)
}
abstract fun onBindBaseVH(holder: T, position: Int, payloads: MutableList<Any> = mutableListOf())
abstract class VH(@LayoutRes layoutRes: Int, private val parent: ViewGroup) : RecyclerView.ViewHolder(
LayoutInflater.from(parent.context).inflate(layoutRes, parent, false)
) {
val context: Context
get() = parent.context
val resources: Resources
get() = context.resources
val layoutInflater: LayoutInflater
get() = LayoutInflater.from(context)
fun getColor(@ColorRes colorRes: Int): Int = ContextCompat.getColor(context, colorRes)
fun getColorForAttr(@AttrRes attrRes: Int): Int = context.getColorForAttr(attrRes)
fun getString(@StringRes stringRes: Int, vararg args: Any): String = context.getString(stringRes, *args)
fun getQuantityString(@PluralsRes pluralRes: Int, quantity: Int, vararg args: Any): String =
context.resources.getQuantityString(pluralRes, quantity, *args)
fun getQuantityString(@PluralsRes pluralRes: Int, quantity: Int): String =
context.resources.getQuantityString(pluralRes, quantity, quantity)
}
}
@@ -1,26 +0,0 @@
package eu.darken.capod.common.lists
import androidx.viewbinding.ViewBinding
interface BindableVH<ItemT, ViewBindingT : ViewBinding> {
val viewBinding: Lazy<ViewBindingT>
val onBindData: ViewBindingT.(item: ItemT, payloads: List<Any>) -> Unit
fun bind(item: ItemT, payloads: MutableList<Any> = mutableListOf()) = with(viewBinding.value) {
onBindData(item, payloads)
}
}
@Suppress("unused")
inline fun <reified ItemT, ViewBindingT : ViewBinding> BindableVH<ItemT, ViewBindingT>.binding(
payload: Boolean = true,
crossinline block: ViewBindingT.(ItemT) -> Unit,
): ViewBindingT.(item: ItemT, payloads: List<Any>) -> Unit = { item: ItemT, payloads: List<Any> ->
val newestItem = when (payload) {
true -> payloads.filterIsInstance<ItemT>().lastOrNull() ?: item
false -> item
}
block(newestItem)
}
@@ -1,13 +0,0 @@
package eu.darken.capod.common.lists
import androidx.recyclerview.widget.RecyclerView
interface DataAdapter<T> {
val data: MutableList<T>
}
fun <X, T> X.update(newData: List<T>?, notify: Boolean = true) where X : DataAdapter<T>, X : RecyclerView.Adapter<*> {
data.clear()
if (newData != null) data.addAll(newData)
if (notify) notifyDataSetChanged()
}
@@ -1,3 +0,0 @@
package eu.darken.capod.common.lists
interface ListItem
@@ -1,13 +0,0 @@
package eu.darken.capod.common.lists
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
fun RecyclerView.setupDefaults(adapter: RecyclerView.Adapter<*>? = null, dividers: Boolean = true) = apply {
layoutManager = LinearLayoutManager(context)
itemAnimator = DefaultItemAnimator()
if (dividers) addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
if (adapter != null) this.adapter = adapter
}
@@ -1,43 +0,0 @@
package eu.darken.capod.common.lists.differ
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil
import eu.darken.capod.common.lists.modular.ModularAdapter
import eu.darken.capod.common.lists.modular.mods.StableIdMod
class AsyncDiffer<A, T : DifferItem> internal constructor(
adapter: A,
compareItem: (T, T) -> Boolean = { i1, i2 -> i1.stableId == i2.stableId },
compareItemContent: (T, T) -> Boolean = { i1, i2 -> i1 == i2 },
determinePayload: (T, T) -> Any? = { i1, i2 ->
when {
i1::class == i2::class -> i1.payloadProvider?.invoke(i1, i2)
else -> null
}
}
) where A : HasAsyncDiffer<T>, A : ModularAdapter<*> {
private val callback = object : DiffUtil.ItemCallback<T>() {
override fun areItemsTheSame(oldItem: T, newItem: T): Boolean = compareItem(oldItem, newItem)
override fun areContentsTheSame(oldItem: T, newItem: T): Boolean = compareItemContent(oldItem, newItem)
override fun getChangePayload(oldItem: T, newItem: T): Any? = determinePayload(oldItem, newItem)
}
private val internalList = mutableListOf<T>()
private val listDiffer = AsyncListDiffer(adapter, callback)
val currentList: List<T>
get() = synchronized(internalList) { internalList }
init {
adapter.modules.add(0, StableIdMod(currentList))
}
fun submitUpdate(newData: List<T>) {
listDiffer.submitList(newData) {
synchronized(internalList) {
internalList.clear()
internalList.addAll(newData)
}
}
}
}
@@ -1,15 +0,0 @@
package eu.darken.capod.common.lists.differ
import androidx.recyclerview.widget.RecyclerView
import eu.darken.capod.common.lists.modular.ModularAdapter
fun <X, T> X.update(newData: List<T>?)
where X : HasAsyncDiffer<T>, X : RecyclerView.Adapter<*> {
asyncDiffer.submitUpdate(newData ?: emptyList())
}
fun <A, T : DifferItem> A.setupDiffer(): AsyncDiffer<A, T>
where A : HasAsyncDiffer<T>, A : ModularAdapter<*> =
AsyncDiffer(this)
@@ -1,10 +0,0 @@
package eu.darken.capod.common.lists.differ
import eu.darken.capod.common.lists.ListItem
interface DifferItem : ListItem {
val stableId: Long
val payloadProvider: ((DifferItem, DifferItem) -> DifferItem?)?
get() = null
}
@@ -1,10 +0,0 @@
package eu.darken.capod.common.lists.differ
interface HasAsyncDiffer<T : DifferItem> {
val data: List<T>
get() = asyncDiffer.currentList
val asyncDiffer: AsyncDiffer<*, T>
}
@@ -1,95 +0,0 @@
package eu.darken.capod.common.lists.modular
import android.view.ViewGroup
import androidx.annotation.CallSuper
import androidx.annotation.LayoutRes
import androidx.recyclerview.widget.RecyclerView
import eu.darken.capod.common.lists.BaseAdapter
abstract class ModularAdapter<VH : ModularAdapter.VH> : BaseAdapter<VH>() {
val modules = mutableListOf<Module>()
init {
modules.filterIsInstance<Module.Setup>().forEach { it.onAdapterReady(this) }
}
override fun getItemId(position: Int): Long {
modules.filterIsInstance<Module.ItemId>().forEach {
val id = it.getItemId(this, position)
if (id != null) return id
}
return super.getItemId(position)
}
@CallSuper
override fun getItemViewType(position: Int): Int {
modules.filterIsInstance<Module.Typing>().forEach {
val type = it.onGetItemType(this, position)
if (type != null) return type
}
return super.getItemViewType(position)
}
override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): VH {
modules.filterIsInstance<Module.Creator<VH>>().forEach {
val vh = it.onCreateModularVH(this, parent, viewType)
if (vh != null) return vh
}
throw IllegalStateException("Couldn't create VH for type $viewType with $parent")
}
@CallSuper
override fun onBindBaseVH(holder: VH, position: Int, payloads: MutableList<Any>) {
modules.filterIsInstance<Module.Binder<VH>>().forEach {
it.onBindModularVH(this, holder, position, payloads)
it.onPostBind(this, holder, position)
}
}
@CallSuper
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
modules.filterIsInstance<Module.RecyclerViewLifecycle>().forEach { it.onAttachedToRecyclerView(recyclerView) }
super.onAttachedToRecyclerView(recyclerView)
}
@CallSuper
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
modules.filterIsInstance<Module.RecyclerViewLifecycle>().forEach { it.onDetachedFromRecyclerView(recyclerView) }
super.onDetachedFromRecyclerView(recyclerView)
}
abstract class VH(@LayoutRes layoutRes: Int, parent: ViewGroup) : BaseAdapter.VH(layoutRes, parent)
interface Module {
interface Setup {
fun onAdapterReady(adapter: ModularAdapter<*>)
}
interface Creator<T : VH> : Module {
fun onCreateModularVH(adapter: ModularAdapter<T>, parent: ViewGroup, viewType: Int): T?
}
interface Binder<T : VH> : Module {
fun onBindModularVH(adapter: ModularAdapter<T>, vh: T, pos: Int, payloads: MutableList<Any>) {
// NOOP
}
fun onPostBind(adapter: ModularAdapter<T>, vh: T, pos: Int) {
// NOOP
}
}
interface Typing : Module {
fun onGetItemType(adapter: ModularAdapter<*>, pos: Int): Int?
}
interface ItemId : Module {
fun getItemId(adapter: ModularAdapter<*>, position: Int): Long?
}
interface RecyclerViewLifecycle : Module {
fun onDetachedFromRecyclerView(recyclerView: RecyclerView)
fun onAttachedToRecyclerView(recyclerView: RecyclerView)
}
}
}
@@ -1,12 +0,0 @@
package eu.darken.capod.common.lists.modular.mods
import eu.darken.capod.common.lists.modular.ModularAdapter
class ClickMod<VHT : ModularAdapter.VH> constructor(
private val listener: (VHT, Int) -> Unit
) : ModularAdapter.Module.Binder<VHT> {
override fun onBindModularVH(adapter: ModularAdapter<VHT>, vh: VHT, pos: Int, payloads: MutableList<Any>) {
vh.itemView.setOnClickListener { listener.invoke(vh, pos) }
}
}
@@ -1,17 +0,0 @@
package eu.darken.capod.common.lists.modular.mods
import androidx.viewbinding.ViewBinding
import eu.darken.capod.common.lists.BindableVH
import eu.darken.capod.common.lists.modular.ModularAdapter
class DataBinderMod<ItemT, HolderT> constructor(
private val data: List<ItemT>,
private val customBinder: (
(adapter: ModularAdapter<HolderT>, vh: HolderT, pos: Int, payload: MutableList<Any>) -> Unit
)? = null
) : ModularAdapter.Module.Binder<HolderT> where HolderT : BindableVH<ItemT, ViewBinding>, HolderT : ModularAdapter.VH {
override fun onBindModularVH(adapter: ModularAdapter<HolderT>, vh: HolderT, pos: Int, payloads: MutableList<Any>) {
customBinder?.invoke(adapter, vh, pos, mutableListOf()) ?: vh.bind(data[pos], payloads)
}
}
@@ -1,15 +0,0 @@
package eu.darken.capod.common.lists.modular.mods
import android.view.ViewGroup
import eu.darken.capod.common.lists.modular.ModularAdapter
class SimpleVHCreatorMod<HolderT> constructor(
private val viewType: Int = 0,
private val factory: (ViewGroup) -> HolderT
) : ModularAdapter.Module.Creator<HolderT> where HolderT : ModularAdapter.VH {
override fun onCreateModularVH(adapter: ModularAdapter<HolderT>, parent: ViewGroup, viewType: Int): HolderT? {
if (this.viewType != viewType) return null
return factory.invoke(parent)
}
}
@@ -1,21 +0,0 @@
package eu.darken.capod.common.lists.modular.mods
import androidx.recyclerview.widget.RecyclerView
import eu.darken.capod.common.lists.differ.DifferItem
import eu.darken.capod.common.lists.modular.ModularAdapter
class StableIdMod<ItemT : DifferItem> constructor(
private val data: List<ItemT>,
private val customResolver: (position: Int) -> Long = {
(data[it] as? DifferItem)?.stableId ?: RecyclerView.NO_ID
}
) : ModularAdapter.Module.ItemId, ModularAdapter.Module.Setup {
override fun onAdapterReady(adapter: ModularAdapter<*>) {
adapter.setHasStableIds(true)
}
override fun getItemId(adapter: ModularAdapter<*>, position: Int): Long? {
return customResolver.invoke(position)
}
}
@@ -1,29 +0,0 @@
package eu.darken.capod.common.lists.modular.mods
import android.view.ViewGroup
import eu.darken.capod.common.lists.modular.ModularAdapter
class TypedVHCreatorMod<HolderT> constructor(
private val typeResolver: (Int) -> Boolean,
private val factory: (ViewGroup) -> HolderT
) : ModularAdapter.Module.Typing,
ModularAdapter.Module.Creator<HolderT> where HolderT : ModularAdapter.VH {
private fun ModularAdapter<*>.determineOurViewType(): Int {
val typingModules = modules.filterIsInstance(ModularAdapter.Module.Typing::class.java)
return typingModules.indexOf(this@TypedVHCreatorMod)
}
override fun onGetItemType(adapter: ModularAdapter<*>, pos: Int): Int? {
return if (typeResolver.invoke(pos)) adapter.determineOurViewType() else null
}
override fun onCreateModularVH(
adapter: ModularAdapter<HolderT>,
parent: ViewGroup,
viewType: Int
): HolderT? {
if (adapter.determineOurViewType() != viewType) return null
return factory.invoke(parent)
}
}
@@ -1,76 +0,0 @@
package eu.darken.capod.common.livedata
/*
* Copyright 2017 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import androidx.annotation.MainThread
import androidx.annotation.Nullable
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
import eu.darken.capod.common.debug.logging.log
import java.util.concurrent.atomic.AtomicBoolean
/**
* A lifecycle-aware observable that sends only new updates after subscription, used for events like
* navigation and Snackbar messages.
*
*
* This avoids a common problem with events: on configuration change (like rotation) an update
* can be emitted if the observer is active. This LiveData only calls the observable if there's an
* explicit call to setValue() or call().
*
*
* Note that only one observer is going to be notified of changes.
* https://github.com/android/architecture-samples/blob/166ca3a93ad14c6e224a3ea9bfcbd773eb048fb0/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/SingleLiveEvent.java
*/
class SingleLiveEvent<T> : MutableLiveData<T>() {
private val pending = AtomicBoolean(false)
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
if (hasActiveObservers()) {
log(WARN) { "Multiple observers registered but only one will be notified of changes." }
}
// Observe the internal MutableLiveData
super.observe(
owner,
{ t ->
if (pending.compareAndSet(true, false)) {
observer.onChanged(t)
}
}
)
}
@MainThread
override fun setValue(@Nullable t: T?) {
pending.set(true)
super.setValue(t)
}
/**
* Used for cases where T is Void, to make calls cleaner.
*/
@MainThread
fun call() {
value = null
}
}
@@ -1,80 +0,0 @@
package eu.darken.capod.common.permissions
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.os.PowerManager
import androidx.annotation.StringRes
import androidx.core.content.ContextCompat
import eu.darken.capod.R
import eu.darken.capod.common.BuildConfigWrap
import eu.darken.capod.common.withinApiLevel
enum class Permission(
val minApiLevel: Int,
val maxApiLevel: Int = Int.MAX_VALUE,
@StringRes val labelRes: Int,
@StringRes val descriptionRes: Int,
val permissionId: String,
val isGranted: (Context) -> Boolean = {
ContextCompat.checkSelfPermission(it, permissionId) == PackageManager.PERMISSION_GRANTED
},
) {
BLUETOOTH(
minApiLevel = Build.VERSION_CODES.BASE,
maxApiLevel = Build.VERSION_CODES.R,
labelRes = R.string.permission_bluetooth_label,
descriptionRes = R.string.permission_bluetooth_description,
permissionId = "android.permission.BLUETOOTH",
),
BLUETOOTH_CONNECT(
minApiLevel = Build.VERSION_CODES.S,
labelRes = R.string.permission_bluetooth_connect_label,
descriptionRes = R.string.permission_bluetooth_connect_description,
permissionId = "android.permission.BLUETOOTH_CONNECT",
),
BLUETOOTH_SCAN(
minApiLevel = Build.VERSION_CODES.S,
labelRes = R.string.permission_bluetooth_scan_label,
descriptionRes = R.string.permission_bluetooth_scan_description,
permissionId = "android.permission.BLUETOOTH_SCAN",
),
ACCESS_FINE_LOCATION(
minApiLevel = Build.VERSION_CODES.BASE,
maxApiLevel = Build.VERSION_CODES.R,
labelRes = R.string.permission_access_fine_location_label,
descriptionRes = R.string.permission_access_fine_location_description,
permissionId = "android.permission.ACCESS_FINE_LOCATION",
),
ACCESS_BACKGROUND_LOCATION(
minApiLevel = Build.VERSION_CODES.Q,
maxApiLevel = Build.VERSION_CODES.R,
labelRes = R.string.permission_background_location_label,
descriptionRes = R.string.permission_background_location_description,
permissionId = "android.permission.ACCESS_BACKGROUND_LOCATION",
),
IGNORE_BATTERY_OPTIMIZATION(
minApiLevel = Build.VERSION_CODES.BASE,
labelRes = R.string.permission_ignore_battery_optimizations_label,
descriptionRes = R.string.permission_ignore_battery_optimizations_description,
permissionId = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS",
isGranted = {
val pwm = it.getSystemService(Context.POWER_SERVICE) as PowerManager
pwm.isIgnoringBatteryOptimizations(BuildConfigWrap.APPLICATION_ID)
},
),
SYSTEM_ALERT_WINDOW(
minApiLevel = Build.VERSION_CODES.BASE,
labelRes = R.string.permission_system_alert_window_label,
descriptionRes = R.string.permission_system_alert_window_description,
permissionId = "android.permission.SYSTEM_ALERT_WINDOW",
isGranted = {
android.provider.Settings.canDrawOverlays(it)
},
)
}
fun Permission.isRequired(context: Context): Boolean = when {
!withinApiLevel(minApiLevel, maxApiLevel) -> false
else -> !isGranted(context)
}
@@ -1,20 +0,0 @@
package eu.darken.capod.common.uix
import androidx.annotation.CallSuper
import androidx.lifecycle.ViewModel
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag
abstract class ViewModel1 : ViewModel() {
val TAG: String = logTag("VM", javaClass.simpleName)
init {
log(TAG) { "Initialized" }
}
@CallSuper
override fun onCleared() {
log(TAG) { "onCleared()" }
super.onCleared()
}
}
@@ -1,63 +0,0 @@
package eu.darken.capod.common.uix
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import eu.darken.capod.common.coroutine.DefaultDispatcherProvider
import eu.darken.capod.common.coroutine.DispatcherProvider
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
import eu.darken.capod.common.debug.logging.asLog
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.error.ErrorEventSource
import eu.darken.capod.common.flow.DynamicStateFlow
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.launchIn
import kotlin.coroutines.CoroutineContext
abstract class ViewModel2(
private val dispatcherProvider: DispatcherProvider = DefaultDispatcherProvider(),
) : ViewModel1() {
val vmScope = viewModelScope + dispatcherProvider.Default
var launchErrorHandler: CoroutineExceptionHandler? = null
private fun getVDCContext(): CoroutineContext {
val dispatcher = dispatcherProvider.Default
return getErrorHandler()?.let { dispatcher + it } ?: dispatcher
}
private fun getErrorHandler(): CoroutineExceptionHandler? {
val handler = launchErrorHandler
if (handler != null) return handler
if (this is ErrorEventSource) {
return CoroutineExceptionHandler { _, ex ->
log(WARN) { "Error during launch: ${ex.asLog()}" }
errorEvents.postValue(ex)
}
}
return null
}
fun <T : Any> DynamicStateFlow<T>.asLiveData2() = flow.asLiveData2()
fun <T> Flow<T>.asLiveData2() = this.asLiveData(context = getVDCContext())
fun launch(
scope: CoroutineScope = viewModelScope,
context: CoroutineContext = getVDCContext(),
block: suspend CoroutineScope.() -> Unit
) {
try {
scope.launch(context = context, block = block)
} catch (e: CancellationException) {
log(TAG, WARN) { "launch()ed coroutine was canceled (scope=$scope): ${e.asLog()}" }
}
}
open fun <T> Flow<T>.launchInViewModel() = this.launchIn(vmScope)
}
@@ -1,174 +0,0 @@
package eu.darken.capod.common.uix
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import androidx.activity.ComponentActivity
import androidx.annotation.MainThread
import androidx.fragment.app.Fragment
import androidx.lifecycle.*
import kotlin.reflect.KClass
/**
* Returns an existing ViewModel or creates a new one in the scope (usually, a fragment or
* an activity), associated with this `ViewModelProvider`.
*
* @see ViewModelProvider.get(Class)
*/
//@MainThread
//inline fun <reified VM : ViewModel> ViewModelProvider.get() = get(VM::class.java)
/**
* An implementation of [Lazy] used by [androidx.fragment.app.Fragment.viewModels] and
* [androidx.activity.ComponentActivity.viewmodels].
*
* [storeProducer] is a lambda that will be called during initialization, [VM] will be created
* in the scope of returned [ViewModelStore].
*
* [factoryProducer] is a lambda that will be called during initialization,
* returned [ViewModelProvider.Factory] will be used for creation of [VM]
*/
class ViewModelLazyKeyed<VM : ViewModel>(
private val viewModelClass: KClass<VM>,
private val keyProducer: (() -> String)? = null,
private val storeProducer: () -> ViewModelStore,
private val factoryProducer: () -> ViewModelProvider.Factory
) : Lazy<VM> {
private var cached: VM? = null
override val value: VM
get() {
val viewModel = cached
return if (viewModel == null) {
val factory = factoryProducer()
val store = storeProducer()
val key = keyProducer?.invoke() ?: "androidx.lifecycle.ViewModelProvider.DefaultKey"
ViewModelProvider(store, factory).get(
key + ":" + viewModelClass.java.canonicalName,
viewModelClass.java
).also {
cached = it
}
} else {
viewModel
}
}
override fun isInitialized() = cached != null
}
/**
* Returns a property delegate to access [ViewModel] by **default** scoped to this [Fragment]:
* ```
* class MyFragment : Fragment() {
* val viewmodel: NYViewModel by viewmodels()
* }
* ```
*
* Custom [ViewModelProvider.Factory] can be defined via [factoryProducer] parameter,
* factory returned by it will be used to create [ViewModel]:
* ```
* class MyFragment : Fragment() {
* val viewmodel: MYViewModel by viewmodels { myFactory }
* }
* ```
*
* Default scope may be overridden with parameter [ownerProducer]:
* ```
* class MyFragment : Fragment() {
* val viewmodel: MYViewModel by viewmodels ({requireParentFragment()})
* }
* ```
*
* This property can be accessed only after this Fragment is attached i.e., after
* [Fragment.onAttach()], and access prior to that will result in IllegalArgumentException.
*/
@MainThread
inline fun <reified VM : ViewModel> Fragment.viewModelsKeyed(
noinline keyProducer: (() -> String)? = null,
noinline ownerProducer: () -> ViewModelStoreOwner = { this },
noinline factoryProducer: (() -> ViewModelProvider.Factory)? = null
) = createViewModelLazyKeyed(VM::class, keyProducer, { ownerProducer().viewModelStore }, factoryProducer)
/**
* Returns a property delegate to access parent activity's [ViewModel],
* if [factoryProducer] is specified then [ViewModelProvider.Factory]
* returned by it will be used to create [ViewModel] first time.
*
* ```
* class MyFragment : Fragment() {
* val viewmodel: MyViewModel by activityViewModels()
* }
* ```
*
* This property can be accessed only after this Fragment is attached i.e., after
* [Fragment.onAttach()], and access prior to that will result in IllegalArgumentException.
*/
@MainThread
inline fun <reified VM : ViewModel> Fragment.activityViewModelsKeyed(
noinline keyProducer: (() -> String)? = null,
noinline factoryProducer: (() -> ViewModelProvider.Factory)? = null
) = createViewModelLazyKeyed(VM::class, keyProducer, { requireActivity().viewModelStore }, factoryProducer)
/**
* Helper method for creation of [ViewModelLazy], that resolves `null` passed as [factoryProducer]
* to default factory.
*/
@MainThread
fun <VM : ViewModel> Fragment.createViewModelLazyKeyed(
viewModelClass: KClass<VM>,
keyProducer: (() -> String)? = null,
storeProducer: () -> ViewModelStore,
factoryProducer: (() -> ViewModelProvider.Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
val application = activity?.application ?: throw IllegalStateException(
"ViewModel can be accessed only when Fragment is attached"
)
ViewModelProvider.AndroidViewModelFactory.getInstance(application)
}
return ViewModelLazyKeyed(viewModelClass, keyProducer, storeProducer, factoryPromise)
}
/**
* Returns a [Lazy] delegate to access the ComponentActivity's ViewModel, if [factoryProducer]
* is specified then [ViewModelProvider.Factory] returned by it will be used
* to create [ViewModel] first time.
*
* ```
* class MyComponentActivity : ComponentActivity() {
* val viewmodel: MyViewModel by viewmodels()
* }
* ```
*
* This property can be accessed only after the Activity is attached to the Application,
* and access prior to that will result in IllegalArgumentException.
*/
@MainThread
inline fun <reified VM : ViewModel> ComponentActivity.viewModelsKeyed(
noinline keyProducer: (() -> String)? = null,
noinline factoryProducer: (() -> ViewModelProvider.Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
val application = application ?: throw IllegalArgumentException(
"ViewModel can be accessed only when Activity is attached"
)
ViewModelProvider.AndroidViewModelFactory.getInstance(application)
}
return ViewModelLazyKeyed(VM::class, keyProducer, { viewModelStore }, factoryPromise)
}
@@ -1,94 +0,0 @@
package eu.darken.capod.common.viewbinding
import android.os.Handler
import android.os.Looper
import android.view.View
import androidx.annotation.MainThread
import androidx.fragment.app.Fragment
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.viewbinding.ViewBinding
import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
import eu.darken.capod.common.debug.logging.log
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
inline fun <FragmentT : Fragment, reified BindingT : ViewBinding> FragmentT.viewBinding() =
this.viewBinding(
bindingProvider = {
val bindingMethod = BindingT::class.java.getMethod("bind", View::class.java)
bindingMethod(null, requireView()) as BindingT
},
lifecycleOwnerProvider = { viewLifecycleOwner }
)
@Suppress("unused")
fun <FragmentT : Fragment, BindingT : ViewBinding> FragmentT.viewBinding(
bindingProvider: FragmentT.() -> BindingT,
lifecycleOwnerProvider: FragmentT.() -> LifecycleOwner
) = ViewBindingProperty(bindingProvider, lifecycleOwnerProvider)
class ViewBindingProperty<ComponentT : LifecycleOwner, BindingT : ViewBinding>(
private val bindingProvider: (ComponentT) -> BindingT,
private val lifecycleOwnerProvider: ComponentT.() -> LifecycleOwner
) : ReadOnlyProperty<ComponentT, BindingT> {
private val uiHandler = Handler(Looper.getMainLooper())
private var localRef: ComponentT? = null
private var viewBinding: BindingT? = null
private val onDestroyObserver = object : DefaultLifecycleObserver {
// Called right before Fragment.onDestroyView
override fun onDestroy(owner: LifecycleOwner) {
localRef?.lifecycle?.removeObserver(this) ?: return
localRef = null
uiHandler.post {
log(VERBOSE) { "Resetting viewBinding" }
viewBinding = null
}
}
}
@MainThread
override fun getValue(thisRef: ComponentT, property: KProperty<*>): BindingT {
if (localRef == null && viewBinding != null) {
log(WARN) { "Fragment.onDestroyView() was called, but the handler didn't execute our delayed reset." }
/**
* There is a fragment racecondition if you navigate to another fragment and quickly popBackStack().
* Our uiHandler.post { } will not have executed for some reason.
* In that case we manually null the old viewBinding, to allow for clean recreation.
*/
viewBinding = null
}
/**
* When quickly navigating, a fragment may be created that was never visible to the user.
* It's possible that [Fragment.onDestroyView] is called, but [DefaultLifecycleObserver.onDestroy] is not.
* This means the ViewBinding will is not be set to `null` and it still holds the previous layout,
* instead of the new layout that the Fragment inflated when navigating back to it.
*/
(localRef as? Fragment)?.view?.let {
if (it != viewBinding?.root && localRef === thisRef) {
log(WARN) { "Different view for the same fragment, resetting old viewBinding." }
viewBinding = null
}
}
viewBinding?.let {
// Only accessible from within the same component
require(localRef === thisRef)
return@getValue it
}
val lifecycle = lifecycleOwnerProvider(thisRef).lifecycle
return bindingProvider(thisRef).also {
viewBinding = it
localRef = thisRef
lifecycle.addObserver(onDestroyObserver)
}
}
}
@@ -1,73 +0,0 @@
package eu.darken.capod.main.core
import android.content.Context
import android.content.SharedPreferences
import androidx.preference.PreferenceDataStore
import com.squareup.moshi.Moshi
import dagger.hilt.android.qualifiers.ApplicationContext
import eu.darken.capod.common.bluetooth.ScannerMode
import eu.darken.capod.common.debug.autoreport.DebugSettings
import eu.darken.capod.common.preferences.PreferenceStoreMapper
import eu.darken.capod.common.preferences.Settings
import eu.darken.capod.common.preferences.createFlowPreference
import eu.darken.capod.pods.core.PodDevice
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class GeneralSettings @Inject constructor(
@ApplicationContext private val context: Context,
debugSettings: DebugSettings,
moshi: Moshi,
) : Settings() {
override val preferences: SharedPreferences = context.getSharedPreferences("settings_general", Context.MODE_PRIVATE)
val monitorMode = preferences.createFlowPreference(
"core.monitor.mode",
MonitorMode.AUTOMATIC,
moshi
)
val scannerMode = preferences.createFlowPreference(
"core.scanner.mode",
ScannerMode.LOW_LATENCY,
moshi
)
val compatibilityMode = preferences.createFlowPreference(
"core.compatibility.enabled",
false
)
val showAll = preferences.createFlowPreference(
"core.showall.enabled",
false
)
val minimumSignalQuality = preferences.createFlowPreference(
"core.signal.minimum",
0.25f
)
val mainDeviceAddress = preferences.createFlowPreference<String?>(
"core.maindevice.address",
null
)
val mainDeviceModel = preferences.createFlowPreference<PodDevice.Model>(
"core.maindevice.model",
PodDevice.Model.UNKNOWN,
moshi
)
override val preferenceDataStore: PreferenceDataStore = PreferenceStoreMapper(
monitorMode,
scannerMode,
compatibilityMode,
showAll,
minimumSignalQuality,
mainDeviceAddress,
debugSettings.isAutoReportingEnabled,
)
}
@@ -1,21 +0,0 @@
package eu.darken.capod.main.core
import androidx.annotation.StringRes
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import eu.darken.capod.R
@JsonClass(generateAdapter = false)
enum class MonitorMode(
@StringRes val labelRes: Int
) {
@Json(name = "monitor.mode.manual") MANUAL(
R.string.settings_monitor_mode_manual_label
),
@Json(name = "monitor.mode.automatic") AUTOMATIC(
R.string.settings_monitor_mode_automatic_label
),
@Json(name = "monitor.mode.always") ALWAYS(
R.string.settings_monitor_mode_always_label
),
}
@@ -1,48 +0,0 @@
package eu.darken.capod.main.core
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag
import eu.darken.capod.common.permissions.Permission
import eu.darken.capod.common.permissions.isRequired
import eu.darken.capod.reaction.settings.ReactionSettings
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.onEach
import java.util.*
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class PermissionTool @Inject constructor(
@ApplicationContext private val context: Context,
private val generalSettings: GeneralSettings,
private val reactionSettings: ReactionSettings,
) {
private val permissionCheckTrigger = MutableStateFlow(UUID.randomUUID())
fun recheck() {
log(TAG) { "recheck()" }
permissionCheckTrigger.value = UUID.randomUUID()
}
val missingPermissions: Flow<Set<Permission>> = combine(
permissionCheckTrigger,
generalSettings.monitorMode.flow,
reactionSettings.showPopUpOnCaseOpen.flow
) { _, monitorMode, showPopUp ->
Permission.values()
.filter { it != Permission.IGNORE_BATTERY_OPTIMIZATION || monitorMode == MonitorMode.ALWAYS }
.filter { it != Permission.ACCESS_BACKGROUND_LOCATION || monitorMode == MonitorMode.ALWAYS }
.filter { it != Permission.SYSTEM_ALERT_WINDOW || showPopUp }
.filter { it.isRequired(context) }
.toSet()
}
.onEach { log(TAG) { "Missing permission: $it" } }
companion object {
private val TAG = logTag("PermissionTool")
}
}
@@ -1,18 +0,0 @@
package eu.darken.capod.monitor.core
import dagger.BindsInstance
import dagger.hilt.DefineComponent
import dagger.hilt.components.SingletonComponent
@MonitorScope
@DefineComponent(parent = SingletonComponent::class)
interface MonitorComponent {
@DefineComponent.Builder
interface Builder {
fun coroutineScope(@BindsInstance coroutineScope: MonitorCoroutineScope): Builder
fun build(): MonitorComponent
}
}
@@ -1,11 +0,0 @@
package eu.darken.capod.monitor.core
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlin.coroutines.CoroutineContext
class MonitorCoroutineScope : CoroutineScope {
override val coroutineContext: CoroutineContext = SupervisorJob() + Dispatchers.Default
}
@@ -1,16 +0,0 @@
package eu.darken.capod.monitor.core
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import kotlinx.coroutines.CoroutineScope
@InstallIn(MonitorComponent::class)
@Module()
abstract class ProcessorModule {
@Binds
@MonitorScope
abstract fun processorScope(scope: MonitorCoroutineScope): CoroutineScope
}
@@ -1,8 +0,0 @@
package eu.darken.capod.monitor.core
import javax.inject.Qualifier
@Qualifier
@MustBeDocumented
@Retention(AnnotationRetention.RUNTIME)
annotation class MonitorScope
@@ -1,172 +0,0 @@
package eu.darken.capod.monitor.core
import android.bluetooth.le.ScanFilter
import eu.darken.capod.common.bluetooth.BleScanResult
import eu.darken.capod.common.bluetooth.BleScanner
import eu.darken.capod.common.bluetooth.BluetoothManager2
import eu.darken.capod.common.bluetooth.ScannerMode
import eu.darken.capod.common.coroutine.AppScope
import eu.darken.capod.common.debug.autoreport.DebugSettings
import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
import eu.darken.capod.common.debug.logging.asLog
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag
import eu.darken.capod.common.flow.replayingShare
import eu.darken.capod.main.core.GeneralSettings
import eu.darken.capod.pods.core.PodDevice
import eu.darken.capod.pods.core.PodFactory
import eu.darken.capod.pods.core.apple.protocol.ProximityPairing
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import java.time.Duration
import java.time.Instant
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class PodMonitor @Inject constructor(
private val bleScanner: BleScanner,
private val podFactory: PodFactory,
private val generalSettings: GeneralSettings,
private val bluetoothManager: BluetoothManager2,
private val debugSettings: DebugSettings,
@AppScope private val appScope: CoroutineScope
) {
private val deviceCache = mutableMapOf<PodDevice.Id, PodDevice>()
private val cacheLock = Mutex()
private suspend fun List<BleScanResult>.preFilterAndMap(
scannerMode: ScannerMode
): List<PodDevice> = this
.groupBy { it.address }
.values
.map { sameAdrDevs ->
// For each address we only want the newest result, upstream may batch data
val newest = sameAdrDevs.maxByOrNull { it.generatedAtNanos }!!
sameAdrDevs.minus(newest).let {
if (it.isNotEmpty()) log(TAG, VERBOSE) { "Discarding stale results: $it" }
}
newest
}
.mapNotNull { podFactory.createPod(it) }
val devices: Flow<List<PodDevice>> = bluetoothManager.isBluetoothEnabled
.flatMapLatest { isBluetoothEnabled ->
if (isBluetoothEnabled) {
log(TAG) { "Bluetooth is enabled" }
combine(
generalSettings.scannerMode.flow,
generalSettings.compatibilityMode.flow,
debugSettings.showUnfiltered.flow
) { scannerMode, compatMode, unfiltered ->
Triple(scannerMode, compatMode, unfiltered)
}.flatMapLatest { (mode, compat, unfiltered) ->
log(TAG, VERBOSE) { "Starting BLEScanner mode=$mode, compat=$compat, unfiltered=$unfiltered" }
val filters = if (unfiltered) {
setOf(getUnfilteredFilter())
} else {
ProximityPairing.getBleScanFilter()
}
bleScanner.scan(
filters = filters,
scannerMode = mode,
compatMode = compat,
).map { it.preFilterAndMap(mode) }
}
} else {
log(TAG, WARN) { "Bluetooth is currently disabled" }
flowOf(null)
}
}
.map { newPods ->
val pods = mutableMapOf<PodDevice.Id, PodDevice>()
cacheLock.withLock {
if (newPods == null) {
log(TAG) { "Null result, Bluetooth is disabled." }
deviceCache.clear()
return@map emptyList()
}
val now = Instant.now()
deviceCache.toList().forEach { (key, value) ->
if (Duration.between(value.seenLastAt, now) > Duration.ofSeconds(20)) {
log(TAG, VERBOSE) { "Removing stale device from cache: $value" }
deviceCache.remove(key)
}
}
pods.putAll(deviceCache)
newPods.forEach {
deviceCache[it.identifier] = it
pods[it.identifier] = it
}
}
val presorted = pods.values.sortPodsToInterest()
val main = presorted.determineMainDevice()
presorted.sortedByDescending { it == main }
}
.onStart { emit(emptyList()) }
.retryWhen { cause, attempt ->
log(TAG, WARN) { "PodMonitor failed (attempt=$attempt), will retry: ${cause.asLog()}" }
delay(3000)
true
}
.replayingShare(appScope)
val mainDevice: Flow<PodDevice?>
get() = devices
.map { it.determineMainDevice() }
.replayingShare(appScope)
private fun Collection<PodDevice>.sortPodsToInterest(): List<PodDevice> = this.let { devices ->
val now = Instant.now()
return@let devices.sortedWith(
compareByDescending<PodDevice> { true }
.thenBy {
val age = Duration.between(it.seenLastAt, now).seconds
if (age < 5) 0L else (age / 3L).toLong()
}
.thenByDescending { it.signalQuality }
.thenByDescending { (it.seenCounter / 10) }
)
}
private fun List<PodDevice>.determineMainDevice(): PodDevice? = this
.sortPodsToInterest()
.let { devices ->
val mainDeviceModel = generalSettings.mainDeviceModel.value
val presorted = devices.sortedByDescending {
it.model == mainDeviceModel && it.model != PodDevice.Model.UNKNOWN
}
return@let presorted.firstOrNull()?.let { candidate ->
when {
candidate.model == PodDevice.Model.UNKNOWN -> null
mainDeviceModel != PodDevice.Model.UNKNOWN && candidate.model != mainDeviceModel -> null
candidate.signalQuality <= generalSettings.minimumSignalQuality.value -> null
else -> candidate
}
}
}
private fun getUnfilteredFilter(): ScanFilter {
return ScanFilter.Builder().build()
}
companion object {
private val TAG = logTag("Monitor", "PodMonitor")
}
}
@@ -1,9 +0,0 @@
package eu.darken.capod.monitor.core
import dagger.Reusable
import javax.inject.Inject
@Reusable
class PodSorter @Inject constructor(
)
@@ -9,6 +9,7 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import dagger.hilt.EntryPoints
import eu.darken.capod.common.bluetooth.BluetoothManager2
import eu.darken.capod.common.coroutine.DispatcherProvider
import eu.darken.capod.common.debug.Bugs
import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
@@ -23,11 +24,11 @@ import eu.darken.capod.monitor.core.MonitorComponent
import eu.darken.capod.monitor.core.MonitorCoroutineScope
import eu.darken.capod.monitor.core.PodMonitor
import eu.darken.capod.monitor.ui.MonitorNotifications
import eu.darken.capod.reaction.ReactionHub
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.cancel
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.delay
import eu.darken.capod.reaction.core.autoconnect.AutoConnect
import eu.darken.capod.reaction.core.playpause.PlayPause
import eu.darken.capod.reaction.core.popup.PopUpReaction
import eu.darken.capod.reaction.ui.popup.PopUpWindow
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
@@ -36,13 +37,17 @@ class MonitorWorker @AssistedInject constructor(
@Assisted private val context: Context,
@Assisted private val params: WorkerParameters,
monitorComponentBuilder: MonitorComponent.Builder,
private val dispatcherProvider: DispatcherProvider,
private val monitorNotifications: MonitorNotifications,
private val notificationManager: NotificationManager,
private val generalSettings: GeneralSettings,
private val permissionTool: PermissionTool,
private val podMonitor: PodMonitor,
private val reactionHub: ReactionHub,
private val bluetoothManager: BluetoothManager2,
private val playPause: PlayPause,
private val autoConnect: AutoConnect,
private val popUpReaction: PopUpReaction,
private val popUpWindow: PopUpWindow,
) : CoroutineWorker(context, params) {
private val workerScope = MonitorCoroutineScope()
@@ -146,10 +151,27 @@ class MonitorWorker @AssistedInject constructor(
}
.launchIn(workerScope)
reactionHub.monitor()
.catch {
log(TAG, WARN) { "Pod reactions failed:\n${it.asLog()}" }
popUpReaction.monitor()
.onEach {
withContext(dispatcherProvider.Main) {
when (it) {
is PopUpReaction.Event.PopupShow -> popUpWindow.show(it.device)
is PopUpReaction.Event.PopupHide -> popUpWindow.close()
}
}
}
.setupCommonEventHandlers(TAG) { "popUpReaction" }
.catch { log(TAG, WARN) { "popUpReaction failed:\n${it.asLog()}" } }
.launchIn(workerScope)
playPause.monitor()
.setupCommonEventHandlers(TAG) { "playPause" }
.catch { log(TAG, WARN) { "playPause failed:\n${it.asLog()}" } }
.launchIn(workerScope)
autoConnect.monitor()
.setupCommonEventHandlers(TAG) { "autoConnect" }
.catch { log(TAG, WARN) { "autoConnect failed:\n${it.asLog()}" } }
.launchIn(workerScope)
log(TAG, VERBOSE) { "Monitor job is active" }
@@ -1,32 +0,0 @@
package eu.darken.capod.reaction
import dagger.Reusable
import eu.darken.capod.common.debug.logging.logTag
import eu.darken.capod.common.flow.setupCommonEventHandlers
import eu.darken.capod.reaction.autoconnect.AutoConnect
import eu.darken.capod.reaction.playpause.PlayPause
import eu.darken.capod.reaction.popup.PopUpReaction
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import javax.inject.Inject
@Reusable
class ReactionHub @Inject constructor(
private val playPause: PlayPause,
private val autoConnect: AutoConnect,
private val popUpReaction: PopUpReaction,
) {
fun monitor(): Flow<Unit> = combine(
playPause.monitor(),
autoConnect.monitor(),
popUpReaction.monitor()
) { _, _, _ ->
Unit
}
.setupCommonEventHandlers(TAG) { "monitor" }
companion object {
private val TAG = logTag("Reaction", "Hub")
}
}
@@ -1,97 +0,0 @@
package eu.darken.capod.reaction.autoconnect
import eu.darken.capod.common.bluetooth.BluetoothManager2
import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag
import eu.darken.capod.common.flow.setupCommonEventHandlers
import eu.darken.capod.main.core.GeneralSettings
import eu.darken.capod.monitor.core.PodMonitor
import eu.darken.capod.pods.core.HasEarDetection
import eu.darken.capod.pods.core.HasEarDetectionDual
import eu.darken.capod.pods.core.apple.DualAirPods
import eu.darken.capod.reaction.settings.ReactionSettings
import kotlinx.coroutines.flow.*
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class AutoConnect @Inject constructor(
private val bluetoothManager: BluetoothManager2,
private val podMonitor: PodMonitor,
private val generalSettings: GeneralSettings,
private val reactionSettings: ReactionSettings
) {
fun monitor(): Flow<Unit> = reactionSettings.autoConnect.flow
.flatMapLatest { isAutoConnectEnabled ->
if (isAutoConnectEnabled) {
combine(
bluetoothManager.connectedDevices().distinctUntilChanged(),
podMonitor.mainDevice.filterNotNull().distinctUntilChangedBy { it.rawDataHex },
) { connectedDevices, mainDevice ->
connectedDevices to mainDevice
}
} else {
emptyFlow()
}
}
.map { (connectedDevices, mainDevice) ->
log(TAG, VERBOSE) { "mainPodDevice is $mainDevice" }
val mainDeviceAddr = generalSettings.mainDeviceAddress.value
if (mainDeviceAddr.isNullOrEmpty()) {
log(TAG, WARN) { "mainDeviceAddress is null" }
return@map
}
val bondedDevice = bluetoothManager.bondedDevices().firstOrNull { it.address == mainDeviceAddr }
if (bondedDevice == null) {
log(TAG, WARN) { "No bonded device matches $mainDeviceAddr" }
return@map
} else {
log(TAG, VERBOSE) { "Found target device: $bondedDevice" }
}
val isAlreadyConnected = connectedDevices.any {
it.address == bondedDevice.address
}
if (isAlreadyConnected) {
log(TAG) { "We are already connected to the target device: $bondedDevice" }
return@map
}
val condition = reactionSettings.autoConnectCondition.value
log(TAG) { "Checking condition $condition" }
val conditionFulfilled = when (condition) {
AutoConnectCondition.WHEN_SEEN -> true
AutoConnectCondition.CASE_OPEN -> when (mainDevice) {
is DualAirPods -> mainDevice.caseLidState == DualAirPods.LidState.OPEN
else -> true
}
AutoConnectCondition.IN_EAR -> when (mainDevice) {
is HasEarDetection -> {
if (mainDevice is HasEarDetectionDual && reactionSettings.onePodMode.value) {
mainDevice.isEitherPodInEar
} else {
mainDevice.isBeingWorn
}
}
else -> true
}
}
if (!conditionFulfilled) {
log(TAG) { "Auto connect condition ($condition) is not fullfilled." }
return@map
}
val result = bluetoothManager.nudgeConnection(bondedDevice)
log(TAG) { "nudgeConnection($bondedDevice) returned $result" }
}
.setupCommonEventHandlers(TAG) { "monitor" }
companion object {
private val TAG = logTag("Reaction", "AutoConnect")
}
}
@@ -1,25 +0,0 @@
package eu.darken.capod.reaction.autoconnect
import androidx.annotation.StringRes
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import eu.darken.capod.R
@JsonClass(generateAdapter = false)
enum class AutoConnectCondition(
val identifier: String,
@StringRes val labelRes: Int
) {
@Json(name = "autoconnect.condition.seen") WHEN_SEEN(
"monitor.mode.manual",
R.string.settings_reaction_autoconnect_whenseen_label
),
@Json(name = "autoconnect.condition.case") CASE_OPEN(
"autoconnect.condition.case",
R.string.settings_reaction_autoconnect_caseopen_label
),
@Json(name = "autoconnect.condition.inear") IN_EAR(
"autoconnect.condition.inear",
R.string.settings_reaction_autoconnect_inear_label
),
}
@@ -1,91 +0,0 @@
package eu.darken.capod.reaction.playpause
import dagger.Reusable
import eu.darken.capod.common.MediaControl
import eu.darken.capod.common.bluetooth.BluetoothManager2
import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag
import eu.darken.capod.common.flow.setupCommonEventHandlers
import eu.darken.capod.common.flow.withPrevious
import eu.darken.capod.monitor.core.PodMonitor
import eu.darken.capod.pods.core.HasEarDetection
import eu.darken.capod.pods.core.HasEarDetectionDual
import eu.darken.capod.reaction.settings.ReactionSettings
import kotlinx.coroutines.flow.*
import javax.inject.Inject
@Reusable
class PlayPause @Inject constructor(
private val podMonitor: PodMonitor,
private val bluetoothManager: BluetoothManager2,
private val reactionSettings: ReactionSettings,
private val mediaControl: MediaControl,
) {
fun monitor() = combine(
reactionSettings.autoPlay.flow,
reactionSettings.autoPause.flow,
reactionSettings.onePodMode.flow,
) { play, pause, _ -> play || pause }
.flatMapLatest { if (it) bluetoothManager.connectedDevices() else emptyFlow() }
.flatMapLatest {
if (it.isEmpty()) {
log(TAG) { "No known devices connected." }
emptyFlow()
} else {
log(TAG) { "Known devices connected: $it" }
podMonitor.mainDevice
}
}
.distinctUntilChanged()
.withPrevious()
.onEach { (previous, current) ->
if (previous is HasEarDetection && current is HasEarDetection) {
log(TAG, VERBOSE) { "previous=${previous.isBeingWorn}, current=${current.isBeingWorn}" }
log(TAG, VERBOSE) { "previous-id=${previous.identifier}, current-id=${current.identifier}" }
if (previous.identifier != current.identifier) {
return@onEach
}
if (previous is HasEarDetectionDual && current is HasEarDetectionDual && reactionSettings.onePodMode.value) {
log(TAG) { "Ear status changed for dual pod device in single pod mode." }
val previousWorn = previous.isEitherPodInEar
val currentWorn = current.isEitherPodInEar
if (!previousWorn && currentWorn && !mediaControl.isPlaying) {
if (reactionSettings.autoPlay.value) {
mediaControl.sendPlay()
} else {
log(TAG) { "autoPlay is disabled" }
}
} else if (!currentWorn && previousWorn && mediaControl.isPlaying) {
if (reactionSettings.autoPause.value) {
mediaControl.sendPause()
} else {
log(TAG) { "autoPause is disabled" }
}
}
} else if (previous.isBeingWorn != current.isBeingWorn) {
log(TAG) { "Ear status changed for monitored device." }
if (current.isBeingWorn && !mediaControl.isPlaying) {
if (reactionSettings.autoPlay.value) {
mediaControl.sendPlay()
} else {
log(TAG) { "autoPlay is disabled" }
}
} else if (!current.isBeingWorn && mediaControl.isPlaying) {
if (reactionSettings.autoPause.value) {
mediaControl.sendPause()
} else {
log(TAG) { "autoPause is disabled" }
}
}
}
}
}
.setupCommonEventHandlers(TAG) { "monitor" }
companion object {
private val TAG = logTag("Reaction", "PlayPause")
}
}
@@ -1,103 +0,0 @@
package eu.darken.capod.reaction.popup
import eu.darken.capod.common.coroutine.DispatcherProvider
import eu.darken.capod.common.debug.logging.Logging.Priority.*
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag
import eu.darken.capod.common.flow.setupCommonEventHandlers
import eu.darken.capod.common.flow.withPrevious
import eu.darken.capod.monitor.core.PodMonitor
import eu.darken.capod.pods.core.PodDevice
import eu.darken.capod.pods.core.apple.DualAirPods
import eu.darken.capod.reaction.popup.ui.PopUpWindow
import eu.darken.capod.reaction.settings.ReactionSettings
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.withContext
import java.time.Duration
import java.time.Instant
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class PopUpReaction @Inject constructor(
private val podMonitor: PodMonitor,
private val reactionSettings: ReactionSettings,
private val popupWindow: PopUpWindow,
private val dispatcherProvider: DispatcherProvider,
) {
private val coolDowns = mutableMapOf<PodDevice.Id, Instant>()
fun monitor(): Flow<Unit> = reactionSettings.showPopUpOnCaseOpen.flow
.flatMapLatest { isEnabled ->
if (isEnabled) {
podMonitor.mainDevice.distinctUntilChangedBy { it?.rawDataHex }
} else {
emptyFlow()
}
}
.withPrevious()
.setupCommonEventHandlers(TAG) { "monitor" }
.map { (previous, current) ->
if (previous is DualAirPods? && current is DualAirPods) {
log(TAG, VERBOSE) {
val prev = previous?.rawCaseLidState?.let { String.format("%02X", it.toByte()) }
val cur = current.rawCaseLidState.let { String.format("%02X", it.toByte()) }
"previous=$prev (${previous?.caseLidState}), current=$cur (${current.caseLidState})"
}
log(TAG, VERBOSE) { "previous-id=${previous?.identifier}, current-id=${current.identifier}" }
val isSameDeviceWithCaseNowOpen =
previous?.identifier == current.identifier && previous.caseLidState != current.caseLidState
val isNewDeviceWithJustOpenedCase =
previous?.identifier != current.identifier && previous?.caseLidState != current.caseLidState
if (isSameDeviceWithCaseNowOpen || isNewDeviceWithJustOpenedCase) {
log(TAG) { "Case lid status changed for monitored device." }
tryPopWindow(current)
}
}
}
private suspend fun tryPopWindow(current: DualAirPods) {
if (current.caseLidState == DualAirPods.LidState.OPEN) {
log(TAG, INFO) { "Show popup" }
val now = Instant.now()
val lastShown = coolDowns[current.identifier] ?: Instant.MIN
val sinceLastPop = Duration.between(lastShown, now)
log(TAG) { "Time since last popup: $sinceLastPop" }
if (sinceLastPop < Duration.ofSeconds(10)) {
log(TAG, INFO) { "Popup is still on cooldown: $sinceLastPop" }
return
} else {
coolDowns[current.identifier] = Instant.now()
}
withContext(dispatcherProvider.Main) {
popupWindow.show(current)
}
} else if (current.caseLidState != DualAirPods.LidState.OPEN) {
when (current.caseLidState) {
DualAirPods.LidState.CLOSED -> {
log(TAG, INFO) { "Lid was actively closed, resetting cooldown." }
coolDowns.remove(current.identifier)
}
else -> {
log(TAG, WARN) { "Lid was was not actively closed, refreshing cooldown." }
coolDowns[current.identifier] = Instant.now()
}
}
log(TAG, INFO) { "Hide popup" }
withContext(dispatcherProvider.Main) {
popupWindow.close()
}
}
}
companion object {
private val TAG = logTag("Reaction", "PopUp")
}
}
@@ -1,63 +0,0 @@
package eu.darken.capod.reaction.settings
import android.content.Context
import android.content.SharedPreferences
import androidx.preference.PreferenceDataStore
import com.squareup.moshi.Moshi
import dagger.hilt.android.qualifiers.ApplicationContext
import eu.darken.capod.common.preferences.PreferenceStoreMapper
import eu.darken.capod.common.preferences.Settings
import eu.darken.capod.common.preferences.createFlowPreference
import eu.darken.capod.reaction.autoconnect.AutoConnectCondition
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class ReactionSettings @Inject constructor(
@ApplicationContext private val context: Context,
moshi: Moshi,
) : Settings() {
override val preferences: SharedPreferences =
context.getSharedPreferences("settings_reaction", Context.MODE_PRIVATE)
val autoPause = preferences.createFlowPreference(
"reaction.autopause.enabled",
false
)
val autoPlay = preferences.createFlowPreference(
"reaction.autoplay.enabled",
false
)
val autoConnect = preferences.createFlowPreference(
"reaction.autoconnect.enabled",
false
)
val autoConnectCondition = preferences.createFlowPreference(
"reaction.autoconnect.condition",
AutoConnectCondition.WHEN_SEEN,
moshi
)
val showPopUpOnCaseOpen = preferences.createFlowPreference(
"reaction.popup.caseopen",
false
)
val onePodMode = preferences.createFlowPreference(
"reaction.onepod.enabled",
false
)
override val preferenceDataStore: PreferenceDataStore = PreferenceStoreMapper(
autoPause,
autoPlay,
autoConnect,
autoConnectCondition,
showPopUpOnCaseOpen,
onePodMode,
)
}
@@ -1,4 +1,4 @@
package eu.darken.capod.reaction.settings.ui
package eu.darken.capod.reaction.ui
import android.os.Bundle
import android.view.View
@@ -15,8 +15,8 @@ import eu.darken.capod.common.upgrade.UpgradeRepo
import eu.darken.capod.main.core.GeneralSettings
import eu.darken.capod.main.core.MonitorMode
import eu.darken.capod.main.ui.settings.general.DeviceSelectionDialogFactory
import eu.darken.capod.reaction.autoconnect.AutoConnectCondition
import eu.darken.capod.reaction.settings.ReactionSettings
import eu.darken.capod.reaction.core.ReactionSettings
import eu.darken.capod.reaction.core.autoconnect.AutoConnectCondition
import javax.inject.Inject
@Keep
@@ -1,4 +1,4 @@
package eu.darken.capod.reaction.settings.ui
package eu.darken.capod.reaction.ui
import androidx.lifecycle.SavedStateHandle
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -1,4 +1,4 @@
package eu.darken.capod.reaction.popup.ui
package eu.darken.capod.reaction.ui.popup
import android.content.Context
import android.view.LayoutInflater
@@ -1,4 +1,4 @@
package eu.darken.capod.reaction.popup.ui
package eu.darken.capod.reaction.ui.popup
import android.content.Context
import android.content.Context.WINDOW_SERVICE
@@ -11,6 +11,7 @@ import android.widget.FrameLayout
import androidx.appcompat.view.ContextThemeWrapper
import dagger.hilt.android.qualifiers.ApplicationContext
import eu.darken.capod.R
import eu.darken.capod.common.coroutine.DispatcherProvider
import eu.darken.capod.common.debug.logging.Logging.Priority.ERROR
import eu.darken.capod.common.debug.logging.asLog
import eu.darken.capod.common.debug.logging.log
@@ -22,7 +23,8 @@ import javax.inject.Singleton
@Singleton
class PopUpWindow @Inject constructor(
@ApplicationContext private val appContext: Context,
private val podViewFactory: PopUpPodViewFactory
private val podViewFactory: PopUpPodViewFactory,
private val dispatcherProvider: DispatcherProvider,
) {
private val context = ContextThemeWrapper(appContext, R.style.AppTheme)
@@ -42,6 +44,7 @@ class PopUpWindow @Inject constructor(
findViewById<View>(R.id.close_action).setOnClickListener { close() }
}
private val deviceContainer = popUpView.findViewById<FrameLayout>(R.id.popup_content)
fun show(device: PodDevice) = try {
log(TAG) { "open()" }
if (popUpView.windowToken != null || popUpView.parent != null) {
@@ -57,6 +60,7 @@ class PopUpWindow @Inject constructor(
log(TAG, ERROR) { "open() failed: ${e.asLog()}" }
}
fun close() = try {
log(TAG) { "close()" }
if (popUpView.parent != null) {
@@ -1,11 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M3,3v8h8L11,3L3,3zM9,9L5,9L5,5h4v4zM3,13v8h8v-8L3,13zM9,19L5,19v-4h4v4zM13,3v8h8L21,3h-8zM19,9h-4L15,5h4v4zM13,13v8h8v-8h-8zM19,19h-4v-4h4v4z"
android:fillType="evenOdd" />
</vector>
@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,5c-3.87,0 -7,3.13 -7,7h2c0,-2.76 2.24,-5 5,-5s5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM13,14.29c0.88,-0.39 1.5,-1.26 1.5,-2.29 0,-1.38 -1.12,-2.5 -2.5,-2.5S9.5,10.62 9.5,12c0,1.02 0.62,1.9 1.5,2.29v3.3L7.59,21 9,22.41l3,-3 3,3L16.41,21 13,17.59v-3.3zM12,1C5.93,1 1,5.93 1,12h2c0,-4.97 4.03,-9 9,-9s9,4.03 9,9h2c0,-6.07 -4.93,-11 -11,-11z" />
</vector>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-30
View File
@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod المميز</string>
<string name="app_name_foss">CAPod حر ومفتوح المصدر</string>
<string name="notification_channel_device_status_label">حالة الجهاز</string>
<string name="general_error_label">خطأ</string>
<string name="general_share_action">مشاركة</string>
<string name="general_done_action">تم</string>
<string name="general_copy_action">نسخ</string>
<string name="general_thank_you_label">شكراً لك</string>
<string name="general_value_not_available_label">غير متوفر</string>
<string name="general_grant_permission_action">منح الإذن</string>
<string name="general_upgrade_action">ترقية</string>
<string name="general_check_action">فحص</string>
<string name="general_close_action">إغلاق</string>
<string name="debug_debuglog_size_label">الحجم</string>
<string name="debug_debuglog_size_compressed_label">الحجم المضغوط</string>
<string name="debug_notification_channel_label">اشعارات التصحيح</string>
<string name="debug_debuglog_file_label">ملف مسجل</string>
<string name="debug_debuglog_record_action">ملف التصحيح مسجل</string>
<string name="permission_bluetooth_connect_label">اتصال بلوتوث</string>
<string name="permission_bluetooth_connect_description">يتطلب هذا التطبيق إذن \"إتصال بلوتوث\" للتفاعل مع الأجهزة المقترنة وبدء الاتصالات.</string>
<string name="permission_bluetooth_scan_label">البحث عن بلوتوث</string>
<string name="permission_bluetooth_scan_description">يسمح إذن \"فحص البلوتوث\" لهذا التطبيق باكتشاف بيانات البلوتوث واستلامها من الأجهزة القريبة مثل AirPods.</string>
<string name="permission_bluetooth_label">بلوتوث</string>
<string name="permission_access_fine_location_label">الوصول إلى موقع جيد</string>
<string name="permission_access_fine_location_description">يستخدم CAPod إذن \"الموقع الدقيق\" لتلقي بيانات البلوتوث منخفضة الطاقة. تستخدم سماعات الرأس بلوتوث منخفض الطاقة لبث حالتها. لن يستخدم هذا التطبيق بيانات البلوتوث لتحديد موقعك.</string>
<string name="permission_background_location_label">الوصول إلى الموقع في الخلفية</string>
</resources>
-130
View File
@@ -1,130 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Cihaz vəziyyəti</string>
<string name="general_error_label">Xəta</string>
<string name="general_share_action">Paylaş</string>
<string name="general_done_action">Bitdi</string>
<string name="general_copy_action">Kopyala</string>
<string name="general_thank_you_label">Təşəkkürlər</string>
<string name="general_value_not_available_label">Mövcud deyil</string>
<string name="general_grant_permission_action">İcazə ver</string>
<string name="general_upgrade_action">Yüksəlt</string>
<string name="general_check_action">Yoxla</string>
<string name="general_close_action">Bağla</string>
<string name="debug_debuglog_size_label">Həcm</string>
<string name="debug_debuglog_size_compressed_label">Sıxışdırılmış həcm</string>
<string name="debug_notification_channel_label">Sazlama bildirişləri</string>
<string name="debug_debuglog_file_label">Yazılmış jurnal faylı</string>
<string name="debug_debuglog_record_action">Sazlama jurnalına yaz</string>
<string name="permission_bluetooth_connect_label">Bluetooth bağlantısı</string>
<string name="permission_bluetooth_connect_description">Bu tətbiq, cütləşdirilmiş cihazlarla qarşılıqlı əlaqədə olmaq və bağlantıları başlatmaq üçün \"Bluetooth bağlantısı\" icazəsini tələb edir.</string>
<string name="permission_bluetooth_scan_label">Bluetooth skan etmə</string>
<string name="permission_bluetooth_scan_description">\"Bluetooth skan etmə\" icazəsi, tətbiqə AirPods kimi yaxınlıqda olan cihazlardan Bluetooth verilənlərini almağa və kəşf etməyə icazə verir.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Bu tətbiq, cütləşdirilmiş bluetooth cihazlarına bağlanmaq üçün \"Bluetooth\" icazəsini tələb edir.</string>
<string name="permission_access_fine_location_label">Həssas yerləşməyə müraciət</string>
<string name="permission_access_fine_location_description">CAPod, Bluetooth Zəif Enerji verilənlərini almaq üçün \"dəqiq yerləşmə\" icazəsini istifadə edir. Qulaqlıqlarınız, öz vəziyyətlərini (qalan batereya faizini) yayımlamaq Bluetooth Zəif Enerji texnologiyasını istifadə edir. Bu tətbiq, Bluetooth verilənlərini yerləşmənizi müəyyənləşdirmək üçün İSTİFADƏ ETMİR.</string>
<string name="permission_background_location_label">Arxaplanda yerləşmə müraciəti</string>
<string name="permission_background_location_description">CAPod, tətbiq bağlı ikən \"Açılan pəncərəni göstər\" və \"Avto-bağlantı qurma\" kimi özəllikləri fəallaşdırmaq üçün \"arxaplanda yerləşmə müraciəti\"ni istifadə edir. Arxaplanda yerləşmə müraciəti tətbiqin arxaplanda olarkən Bluetooth Zəif Enerji verilənlərini almasına icazə verir. Bu tətbiq, Bluetooth verilənlərini yerləşmənizi müəyyənləşdirmək üçün İSTİFADƏ ETMİR.</string>
<string name="permission_ignore_battery_optimizations_label">Batereya optimallaşdırmasını sıradan çıxart</string>
<string name="permission_ignore_battery_optimizations_description">Batereya optimallaşdırması, bu tətbiqin, tətbiq arxaplanda olarkən güvənli şəkildə Bluetooth verilənlərini almasına mane olur.</string>
<string name="pods_dual_left_label">Sol tərəf</string>
<string name="pods_dual_right_label">Sağ tərəf</string>
<string name="pods_case_label">Qutu</string>
<string name="pods_case_status_open_label"></string>
<string name="pods_case_status_closed_label">Bağlı</string>
<string name="pods_connection_state_disconnected_label">Heç bir cihazla bağlantı qurulmayıb</string>
<string name="pods_connection_state_idle_label">Bir cihazla bağlantı qurulub, ancaq boşdadır</string>
<string name="pods_connection_state_music_label">Musiqi rejimində</string>
<string name="pods_connection_state_call_label">Zəng rejimində</string>
<string name="pods_connection_state_ringing_label">Çağırır</string>
<string name="pods_connection_state_hanging_up_label">Dəstək asılır</string>
<string name="pods_connection_state_unknown_label">Bilinməyən bağlantı vəziyyəti</string>
<string name="pods_unknown_raw_data_label">Xam verilənlər</string>
<string name="pods_unknown_label">Bilinməyən cihaz</string>
<string name="pods_unknown_contact_dev">Bu bir bilinməyən cihazdır, ancaq oxşar mesaj formatı istifadə edir. Bunun üçün dəstək əlavə edək, mənimlə əlaqə saxlayın :)</string>
<string name="pods_none_label_short">Cihaz yoxdur</string>
<string name="pods_charging_label">Enerji yığır</string>
<string name="pods_inear_label">Qulaqda</string>
<string name="pods_microphone_label">Mikrofon</string>
<string name="pods_yours">Sizin</string>
<string name="headset_being_worn_label">Taxılır</string>
<string name="pods_case_unknown_state">Bilinməyən vəziyyət</string>
<string name="overview_nomaindevice_label">Əsas cihaz yoxdur</string>
<string name="overview_nomaindevice_description">Aşkarlanan bütün cihazların sizin olma ehtimalı azdır. Cihazınızı açın, bağlantını qurun və ya tənzimləmələri edin.</string>
<string name="settings_label">Tənzimləmələr</string>
<string name="settings_privacy_policy_label">Gizlilik siyasəti</string>
<string name="settings_privacy_policy_desc">Verilənlərin idarə edilməsi məsuliyyəti.</string>
<string name="settings_licenses_label">Lisenziyalar</string>
<string name="settings_category_other_label">Digər</string>
<string name="settings_general_label">Tənzimləmələr</string>
<string name="settings_general_description">Bütün tətbiqə təsir edən ümumi incə tənzimləmələr.</string>
<string name="settings_acknowledgements_label">Təşəkkürlər</string>
<string name="changelog_label">Dəyişiklik jurnalı</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Tərtibatçıya e-poçt göndər</string>
<string name="settings_support_installid_label">Quraşdırma kimliyi</string>
<string name="settings_support_installid_desc">Avtomatik xəta hesabatları anonimdir. Tərtibatçının xəta hesabatlarınızı tapmasına ehtiyacı varsa quraşdırma kimliyinizi paylaşın.</string>
<string name="settings_support_label">Dəstək</string>
<string name="settings_support_description">Köməyə ehtiyacınız olarsa.</string>
<string name="issue_tracker_label">Problem izləyici</string>
<string name="issue_tracker_description">Xəta hesabatları və özəllik tələbləri üçün ictimai bir problem izləyici (yalnız ingiliscə).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Suallarınızı vermək üçün yer.</string>
<string name="settings_support_email_developer_description">Unutmayın, yalnız almanca və ya ingiliscə cavablandıra bilirəm.</string>
<string name="settings_debug_autoreports_label">Avtomatik xəta hesabatları</string>
<string name="settings_debug_autoreports_description">Xətaları avtomatik bildirir, məs. tətbiq çökməsi ilə bağlı təfsilatlar daxildir, beləcə onu necə düzəldə biləcəyimi bilirəm.</string>
<string name="settings_debug_mode_label">Sazlama rejimi</string>
<string name="settings_debug_mode_description">Problemləri aradan qaldırmaq üçün əlavə məlumatları göstər.</string>
<string name="settings_monitor_mode_label">Müşahidə rejimi</string>
<string name="settings_monitor_mode_description">Bu tətbiq hansı şərtlər altında Bluetooth verilənlərini müşahidə edir.</string>
<string name="settings_scanner_mode_label">Skaner rejimi</string>
<string name="settings_monitor_mode_manual_label">Tətbiq açılanda</string>
<string name="settings_monitor_mode_automatic_label">Cihazla bağlantı qurulanda</string>
<string name="settings_monitor_mode_always_label">Həmişə</string>
<string name="settings_scanner_mode_lowpower_label">Zəif enerji</string>
<string name="settings_scanner_mode_balanced_label">Tarazlı</string>
<string name="settings_scanner_mode_lowlatency_label">Aşağı gecikmə</string>
<string name="settings_autopause_label">Avto-fasilə</string>
<string name="settings_showall_label">Bütün cihazları göstər</string>
<string name="settings_showall_description">Sizə yaxın olan digər insanların cihazlarını göstər.</string>
<string name="settings_autopplay_label">Avto-oynatma</string>
<string name="settings_fake_data_label">Saxta verilənlər</string>
<string name="settings_debug_label">Sazlama tənzimləmələri</string>
<string name="settings_debug_description">Tətbiqlə əlaqəli problemləri aradan qaldırmağa kömək edəcək əlavə tənzimləmələr.</string>
<string name="settings_signal_minimum_label">Minimum siqnal keyfiyyəti</string>
<string name="settings_signal_minimum_description">Bir cihazın sahib olması lazım olan minimum siqnal keyfiyyəti sizə aid olaraq qəbul edilməlidir.</string>
<string name="settings_autoconnect_label">Avto-bağlanma</string>
<string name="settings_autoconnect_description">Android, avtomatik olaraq bağlantı qurmasa, biz də soruşa bilərik. Bu, müşahidə rejimini \"Həmişə\" olaraq tənzimləyəcək.</string>
<string name="settings_autoconnect_condition_label">Avto-bağlanma şərti</string>
<string name="settings_autoconnect_condition_description">Cihazınızla nə vaxt bağlantı qurmağa çalışacağıq?</string>
<string name="settings_reaction_label">Reaksiyalar</string>
<string name="settings_reaction_description">Tədbirlərə və davranışlara reaksiya verin.</string>
<string name="settings_category_yourdevice_label">Cihazınız</string>
<string name="settings_maindevice_address_label">Cihaz ünvanınız</string>
<string name="settings_maindevice_address_description">Cütləşdirilmiş cihazınızın ünvanı. Tətbiq, telefonunuzla nə vaxt bağlantı qurulacağını müəyyənləşdirmək üçün bunu istifadə edir.</string>
<string name="settings_maindevice_address_none">Heç biri</string>
<string name="settings_maindevice_model_label">Cihazınızın modeli</string>
<string name="settings_maindevice_model_description">Əsas cihazının modeli. Bu, telefonunuzla bağlantı qurulmadığı vaxtlarda tətbiqin cihazınızı tanımasına kömək edir.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Görünəndə</string>
<string name="settings_reaction_autoconnect_caseopen_label">Qutu açıqdır</string>
<string name="settings_reaction_autoconnect_inear_label">Qulaqda</string>
<string name="upgrade_capod_label">CAPod-u yüksəlt</string>
<string name="upgrade_capod_description">Əlavə özəllikləri əldə edin və tərtibatçını dəstəkləyin.</string>
<string name="settings_popup_caseopen_label">Açılan pəncərəni göstər</string>
<string name="settings_popup_caseopen_description">Cihazın qutusu açılanda bir açılan pəncərə göstər (təcrübi).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth sıradan çıxarıldı</string>
<string name="overview_bluetooth_disabled_description">Bluetooth sıradan çıxarıldı, fəallaşdırın ;)</string>
<string name="help_translate_label">Tərcümə</string>
<string name="settings_onepod_mode_label">Tək tərəf rejimi</string>
<string name="settings_onepod_mode_description">Hər iki tərəfi də taxmağa ehtiyac yoxdur, reaksiyaları tətikləmək üçün tək tərəfi taxmaq yetərlidir.</string>
<string name="permission_system_alert_window_label">Sistem xəbərdarlıq pəncərəsi</string>
<string name="permission_system_alert_window_description">\"Açılan pəncərəni göstər\" özəlliyini fəal etmək üçün CAPod-a digər tətbiqlərin üzərində göstərmə icazəsi verin.</string>
<string name="last_seen_x">Son görünmə: %s</string>
<string name="first_seen_x">İlk görünmə: %s</string>
<string name="settings_blescanner_unfiltered_label">Filtrlənməmiş BLE verilənləri</string>
<string name="settings_blescanner_unfiltered_description">Bütün yayımlanan BLE verilənlərini göstərmək üçün BLE skanerindən bütün filtrləri silin. Yeni qulaqlıq növləri üçün dəstək əlavə etmək üçün faydalıdır.</string>
<string name="permission_required_title">Aşağıdakı icazə verilməlidir:</string>
</resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Статус прылады</string>
<string name="general_error_label">Памылка</string>
<string name="general_share_action">Падзяліцца</string>
<string name="general_done_action">Гатова</string>
<string name="general_copy_action">Скапіраваць</string>
<string name="general_thank_you_label">Дзякуй</string>
<string name="general_value_not_available_label">Н</string>
<string name="general_grant_permission_action">Даць дазвол</string>
<string name="general_upgrade_action">Палепшыць</string>
<string name="general_check_action">Праверыць</string>
<string name="general_close_action">Закрыць</string>
<string name="debug_debuglog_size_label">Памер</string>
<string name="debug_debuglog_size_compressed_label">Сціснуты памер</string>
<string name="debug_notification_channel_label">Апавяшчэнні адладкі</string>
<string name="debug_debuglog_file_label">Файл журнала</string>
<string name="debug_debuglog_record_action">Запісаць лог аладкі ў журнал</string>
<string name="permission_bluetooth_connect_label">Злучэнне па Bluetooth</string>
<string name="permission_bluetooth_connect_description">Гэтай праграме патрабуецца дазвол на выкарыстанне Bluetooth для ўзаемадзеяння са спалучанымі прыладамі і стварэння новых злучэнняў.</string>
<string name="permission_bluetooth_scan_label">Сканіраванне Bluetooth</string>
<string name="permission_bluetooth_scan_description">Дазвол на сканіраванне Bluetooth дасць магчымасць гэтай праграме выяўляць і атрымліваць даныя па Bluetooth з навакольных прылад, такіх як вашы AirPods.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Гэтай праграме патрабуецца дазвол на выкарыстанне Bluetooth для злучэння са спалучанымі прыладамі.</string>
<string name="permission_access_fine_location_label">Доступ да дакладнага месцазнаходжання</string>
<string name="permission_access_fine_location_description">CAPod выкарыстоўвае дазвол \"Дакладнае месцазнаходжанне\" для атрымання даных Bluetooth Low Energy. Вашы навушнікі з дапамогай тэхналогіі Bluetooth Low Energy перадаюць інфармацыю пра свой стан. Гэта праграма НЕ будзе карыстацца данымі Bluetooth для вызначэння вашага месцазнаходжання.</string>
<string name="permission_background_location_label">Доступ да месцазнаходжання ў фоне</string>
<string name="permission_background_location_description">CAPod выкарыстоўвае службу \"Доступ да месцазнаходжання ў фоне\" для ўключэння такіх функцый, як \"Апавяшчэнні\" і \"Аўтапакдлючэнне\", калі праграма закрыта. Фонавы доступ да месцазнаходжання дазваляе праграме атрымліваць даныя Bluetooth Low Energy у фоне. Гэтая праграма НЕ будзе выкарыстоўваць даныя Bluetooth для вызначэння Вашага месцазнаходжання.</string>
<string name="permission_ignore_battery_optimizations_label">Адключыць аптымізацыю батарэі</string>
<string name="permission_ignore_battery_optimizations_description">Аптымізацыя батарэі перашкаджае гэтай праграме надзейна атрымліваць даныя Bluetooth падчас яе знаходжання ў фоне.</string>
<string name="pods_dual_left_label">Левы навушнік</string>
<string name="pods_dual_right_label">Правы навушнік</string>
<string name="pods_case_label">Футляр</string>
<string name="pods_case_status_open_label">Адчынены</string>
<string name="pods_case_status_closed_label">Зачынены</string>
<string name="pods_connection_state_disconnected_label">Не падключаны да прылады</string>
<string name="pods_connection_state_idle_label">Злучаны з прыладай, але ў рэжыме чакання</string>
<string name="pods_connection_state_music_label">У рэжыме музыкі</string>
<string name="pods_connection_state_call_label">У рэжыме выкліку</string>
<string name="pods_connection_state_ringing_label">Выклік</string>
<string name="pods_connection_state_hanging_up_label">Адбой выкліку</string>
<string name="pods_connection_state_unknown_label">Невядомы стан падключэння</string>
<string name="pods_unknown_raw_data_label">Неапрацаваныя даныя</string>
<string name="pods_unknown_label">Невядомая прылада</string>
<string name="pods_unknown_contact_dev">Гэта невядомая прылада, але яна выкарыстоўвае падобны фармат даных. Забяспечце яго падтрымку — звяжыцеся са мной :)</string>
<string name="pods_none_label_short">Няма прылады</string>
<string name="pods_charging_label">Зарадка</string>
<string name="pods_inear_label">У вуху</string>
<string name="pods_microphone_label">Мікрафон</string>
<string name="pods_yours">Вашы</string>
<string name="headset_being_worn_label">Надзеты</string>
<string name="pods_case_unknown_state">Невядомы стан</string>
<string name="overview_nomaindevice_label">Няма асноўнай прылады</string>
<string name="overview_nomaindevice_description">Сярод усіх выяўленых прылад не знойдзена вашай. Уключыце сілкаванне і падключыце вашу прыладу, або змяніце налады.</string>
<string name="settings_label">Налады</string>
<string name="settings_privacy_policy_label">Палітыка канфідэнцыяльнасці</string>
<string name="settings_privacy_policy_desc">Адказнасць за апрацоўку даных.</string>
<string name="settings_licenses_label">Ліцэнзіі</string>
<string name="settings_category_other_label">Іншае</string>
<string name="settings_general_label">Налады</string>
<string name="settings_general_description">Генеральныя налады, якія ўплываюць на ўсю праграму.</string>
<string name="settings_acknowledgements_label">Падзякі</string>
<string name="changelog_label">Спіс змяненняў</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Ліст распрацоўшчыку</string>
<string name="settings_support_installid_label">ID інсталяцыі</string>
<string name="settings_support_installid_desc">Аўтаматычныя справаздачы пра памылкі з\'яўляюцца ананімнымі. Падзяліцеся вашым ID інсталяцыі, калі распрацоўшчыку спатрэбіцца доступ да вашых справаздач пра памылкі.</string>
<string name="settings_support_label">Падтрымка</string>
<string name="settings_support_description">Калі неабходна дапамога.</string>
<string name="issue_tracker_label">Спіс праблем</string>
<string name="issue_tracker_description">Агульнадаступны спіс для справаздач пра памылкі і запыту новых функцый (толькі англійская мова).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Месца для гутарак і задавання пытанняў.</string>
<string name="settings_support_email_developer_description">Звярніце ўвагу, што я магу адказваць толькі на нямецкай або англійскай мове.</string>
<string name="settings_debug_autoreports_label">Аўтаматычная справаздача пра памылкі</string>
<string name="settings_debug_autoreports_description">Аўтаматычныя справаздачы пра памылкі, напрыклад, дэталі пра збой у праграме, якія могуць дапамагчы ў вырашэнні праблемы.</string>
<string name="settings_debug_mode_label">Рэжым адладкі</string>
<string name="settings_debug_mode_description">Паказваць дадатковую інфармацыю з мэтай вырашэння ўзнікшых праблем.</string>
<string name="settings_monitor_mode_label">Рэжым маніторынгу</string>
<string name="settings_monitor_mode_description">Пры якіх умовах гэта праграма збірае даныя Bluetooth.</string>
<string name="settings_scanner_mode_label">Рэжым сканера</string>
<string name="settings_scanner_mode_description">На якім рэжыме мае сканцэнтравацца сканер даных Bluetooth Low Energy — прадукцыйным або эканоміі энергіі?</string>
<string name="settings_monitor_mode_manual_label">Калі праграма адкрыта</string>
<string name="settings_monitor_mode_automatic_label">Калі прылада падключана</string>
<string name="settings_monitor_mode_always_label">Заўсёды</string>
<string name="settings_scanner_mode_lowpower_label">Эканомія энергіі</string>
<string name="settings_scanner_mode_balanced_label">Збалансаваны</string>
<string name="settings_scanner_mode_lowlatency_label">Малая затрымка</string>
<string name="settings_autopause_label">Аўтапаўза</string>
<string name="settings_autopause_description">Прайграванне аўдыяфайла прыпыняецца, калі навушнік прыбраны з вашага вуха.</string>
<string name="settings_showall_label">Паказаць усе прылады</string>
<string name="settings_showall_description">Паказаць прылады іншых людзей, якія знаходзяцца побач з вамі.</string>
<string name="settings_autopplay_label">Аўтапрайграванне</string>
<string name="settings_autoplay_description">Пачаць прайграванне аўдыяфайлаў пры абуджэнні прылады.</string>
<string name="settings_fake_data_label">Пустыя даныя</string>
<string name="settings_fake_data_description">Адлюстроўваць пустыя даныя, напрыклад, сімуляваць прылады, якіх не існуе.</string>
<string name="settings_debug_label">Налады аладкі</string>
<string name="settings_debug_description">Дадатковыя налады для вырашэння праблем з дапамогай праграмы.</string>
<string name="settings_signal_minimum_label">Мінімальная якасць сігналу</string>
<string name="settings_signal_minimum_description">Мінімальная якасць сігналу, неабходная прыладзе, для распазнання яе як вашай.</string>
<string name="settings_autoconnect_label">Аўтазлучэнне</string>
<string name="settings_autoconnect_description">Калі Android не падключаецца аўтаматычна, мы можам даслаць яму запыт. Такім чынам рэжым маніторынгу зменіць свой статус на \'Заўсёды\'.</string>
<string name="settings_autoconnect_condition_label">Умова аўтаматычнага падключэння</string>
<string name="settings_autoconnect_condition_description">Калі неабходна здзейсняць спробу падключэння да вашай прылады?</string>
<string name="settings_reaction_label">Рэакцыі</string>
<string name="settings_reaction_description">Рэакцыі на падзеі і дзеянні.</string>
<string name="settings_category_yourdevice_label">Ваша прылада</string>
<string name="settings_maindevice_address_label">Адрас вашай прылады</string>
<string name="settings_maindevice_address_description">Адрас вашай звязанай прылады. Праграма выкарыстоўвае яго для вызначэння падключэння да вашага тэлефона.</string>
<string name="settings_maindevice_address_none">Няма</string>
<string name="settings_maindevice_model_label">Мадэль вашай прылады</string>
<string name="settings_maindevice_model_description">Мадэль вашай прылады. Гэта дапамагае праграме апазнаць вашу прыладу, калі яна не падключана да вашага тэлефона.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Пры выяўленні</string>
<string name="settings_reaction_autoconnect_caseopen_label">Футляр адкрыты</string>
<string name="settings_reaction_autoconnect_inear_label">У вуху</string>
<string name="upgrade_capod_label">Палепшыць CAPod</string>
<string name="upgrade_capod_description">Атрымайце дадатковыя функцыі і падтрымайце распрацоўшчыка.</string>
<string name="settings_popup_caseopen_label">Паказваць апавяшчэнне</string>
<string name="settings_popup_caseopen_description">Паказваць апавяшчэнне, калі футляр прылады адчынены (эксперыментальная функцыя).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth адключаны</string>
<string name="overview_bluetooth_disabled_description">Bluetooth адключаны, уключыце яго ;)</string>
<string name="help_translate_label">Пераклад</string>
<string name="help_translate_description">Дапамажыце перакласці гэту праграму на вашу мову.</string>
<string name="settings_onepod_mode_label">Рэжым аднаго навушніка</string>
<string name="settings_onepod_mode_description">Нашэнне абодвух навушнікаў не абавязкова, нашэнне аднаго навушніка цалкам дастаткова для запуску рэакцый.</string>
<string name="permission_system_alert_window_label">Акно сістэмных папярэджанняў</string>
<string name="permission_system_alert_window_description">Дазвольце CAPod накладанне паверх іншых праграм для карэктнай работы функцыі \"Апавяшчэнні\".</string>
<string name="last_seen_x">Апошні раз быў: %s</string>
<string name="first_seen_x">Упершыню быў: %s</string>
<string name="settings_blescanner_unfiltered_label">Нефільтраваныя даныя BLE</string>
<string name="settings_blescanner_unfiltered_description">Выдаліце ўсе фільтры са сканера BLE, каб паказаць усе перададзеныя даныя BLE. Карысна пры дадаванні падтрымкі новых тыпаў навушнікаў.</string>
<string name="permission_required_title">Патрабуецца наступны дазвол:</string>
<string name="settings_compatibility_mode_label">Рэжым сумяшчальнасці</string>
<string name="settings_compatibility_mode_description">Рэжым адключае аптымізацыю для паляпшэння сумяшчальнасці. Паспрабуйце яго, калі вы не бачыце ніякіх даных.</string>
<string name="translators_thanks_title">Перакладчыкі</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Goshaproject(goooosha@gmail.com)</string>
</resources>
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="general_done_action">সম্পন্ন</string>
<string name="general_thank_you_label">ধন্যবাদ</string>
<string name="general_grant_permission_action">অনুমতি প্রদান করুন</string>
<string name="general_upgrade_action">আপগ্রেড</string>
<string name="debug_debuglog_size_label">আকার</string>
<string name="settings_general_label">সেটিংস</string>
</resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Estat del dispositiu</string>
<string name="general_error_label">Error</string>
<string name="general_share_action">Comparteix</string>
<string name="general_done_action">Fet</string>
<string name="general_copy_action">Copia</string>
<string name="general_thank_you_label">Gràcies</string>
<string name="general_value_not_available_label">N/D</string>
<string name="general_grant_permission_action">Concedeix el permís</string>
<string name="general_upgrade_action">Actualitza</string>
<string name="general_check_action">Comprova</string>
<string name="general_close_action">Tanca</string>
<string name="debug_debuglog_size_label">Mida</string>
<string name="debug_debuglog_size_compressed_label">Mida comprimida</string>
<string name="debug_notification_channel_label">Notificacions de depuració</string>
<string name="debug_debuglog_file_label">Fitxer de registre gravat</string>
<string name="debug_debuglog_record_action">Grava el registre de depuració</string>
<string name="permission_bluetooth_connect_label">Connexió Bluetooth</string>
<string name="permission_bluetooth_connect_description">Aquesta aplicació requereix el permís «Connexió Bluetooth» per interactuar amb dispositius emparellats i iniciar connexions.</string>
<string name="permission_bluetooth_scan_label">Escaneig Bluetooth</string>
<string name="permission_bluetooth_scan_description">El permís «Escaneig Bluetooth» permet que aquesta aplicació descobreixi i rebi dades Bluetooth de dispositius propers, com ara els vostres AirPods.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Aquesta aplicació requereix el permís «Bluetooth» per connectar-se als dispositius Bluetooth emparellats.</string>
<string name="permission_access_fine_location_label">Accés a la ubicació precisa</string>
<string name="permission_access_fine_location_description">El CAPod utilitza el permís «ubicació precisa» per rebre dades Bluetooth Low Energy. Els vostres auriculars utilitzen la tecnologia Bluetooth Low Energy per transmetre el seu estat. Aquesta aplicació NO utilitzarà dades Bluetooth per determinar la vostra ubicació.</string>
<string name="permission_background_location_label">Accés a la ubicació de fons</string>
<string name="permission_background_location_description">El CAPod utilitza «accés a la ubicació de fons» per activar funcions com «Mostra la finestra emergent» i «Connexió automàtica» mentre l\'aplicació està tancada. L\'accés a la ubicació de fons permet que l\'aplicació rebi dades Bluetooth Low Energy mentre està en segon pla. Aquesta aplicació NO utilitzarà dades Bluetooth per determinar la vostra ubicació.</string>
<string name="permission_ignore_battery_optimizations_label">Desactiva les optimitzacions de la bateria</string>
<string name="permission_ignore_battery_optimizations_description">Les optimitzacions de la bateria impedeixen que aquesta aplicació rebi dades Bluetooth de manera fiable mentre l\'aplicació està en segon pla.</string>
<string name="pods_dual_left_label">AirdPod esquerre</string>
<string name="pods_dual_right_label">AirPod dret</string>
<string name="pods_case_label">Funda</string>
<string name="pods_case_status_open_label">Oberta</string>
<string name="pods_case_status_closed_label">Tancada</string>
<string name="pods_connection_state_disconnected_label">No està connectat a un dispositiu</string>
<string name="pods_connection_state_idle_label">Connectat a un dispositiu, però inactiu</string>
<string name="pods_connection_state_music_label">En mode música</string>
<string name="pods_connection_state_call_label">En mode trucada</string>
<string name="pods_connection_state_ringing_label">Sonant</string>
<string name="pods_connection_state_hanging_up_label">Penjant</string>
<string name="pods_connection_state_unknown_label">Estat de connexió desconegut</string>
<string name="pods_unknown_raw_data_label">Dades en brut</string>
<string name="pods_unknown_label">Dispositiu desconegut</string>
<string name="pods_unknown_contact_dev">Aquest és un dispositiu desconegut, però utilitza un format de missatge similar. Anem a fer-lo compatible, contacteu amb mi :)</string>
<string name="pods_none_label_short">Cap dispositiu</string>
<string name="pods_charging_label">Carregant</string>
<string name="pods_inear_label">A l\'orella</string>
<string name="pods_microphone_label">Micròfon</string>
<string name="pods_yours">Vostres</string>
<string name="headset_being_worn_label">En ús</string>
<string name="pods_case_unknown_state">Estat desconegut</string>
<string name="overview_nomaindevice_label">Cap dispositiu principal</string>
<string name="overview_nomaindevice_description">És poc probable que tots els dispositius detectats siguin vostres. Enceneu i connecteu el dispositiu o ajusteu la configuració.</string>
<string name="settings_label">Configuració</string>
<string name="settings_privacy_policy_label">Política de privadesa</string>
<string name="settings_privacy_policy_desc">Tractament responsable de les dades.</string>
<string name="settings_licenses_label">Llicències</string>
<string name="settings_category_other_label">Altres</string>
<string name="settings_general_label">Configuració</string>
<string name="settings_general_description">Configuracions generals que afecten a tota l\'aplicació.</string>
<string name="settings_acknowledgements_label">Agraïments</string>
<string name="changelog_label">Registre de canvis</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Correu del desenvolupador</string>
<string name="settings_support_installid_label">ID d\'instal·lació</string>
<string name="settings_support_installid_desc">Els informes d\'error automàtics són anònims. Compartiu el vostre ID d\'instal·lació si el desenvolupador necessita trobar els vostres informes d\'error.</string>
<string name="settings_support_label">Suport</string>
<string name="settings_support_description">Si necessiteu ajuda.</string>
<string name="issue_tracker_label">Seguiment de problemes</string>
<string name="issue_tracker_description">Un seguiment de problemes públics per a informes d\'errors i sol·licituds de característiques (només en anglès).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Un lloc on passar l\'estona i fer preguntes.</string>
<string name="settings_support_email_developer_description">Tingueu en compte que només puc respondre en alemany o anglès.</string>
<string name="settings_debug_autoreports_label">Informes automàtics d\'errors</string>
<string name="settings_debug_autoreports_description">Informa automàticament de problemes. Per exemple: detalls sobre un bloqueig de l\'aplicació perquè pugui esbrinar com solucionar-ho.</string>
<string name="settings_debug_mode_label">Mode depuració</string>
<string name="settings_debug_mode_description">Mostra informació addicional per resoldre problemes.</string>
<string name="settings_monitor_mode_label">Mode monitor</string>
<string name="settings_monitor_mode_description">En quines circumstàncies aquesta aplicació supervisa les dades Bluetooth.</string>
<string name="settings_scanner_mode_label">Mode escàner</string>
<string name="settings_scanner_mode_description">L\'escàner de dades Bluetooth Low Energy hauria de prioritzar el rendiment o estalviar energia?</string>
<string name="settings_monitor_mode_manual_label">Quan l\'aplicació està oberta</string>
<string name="settings_monitor_mode_automatic_label">Quan el dispositiu està connectat</string>
<string name="settings_monitor_mode_always_label">Sempre</string>
<string name="settings_scanner_mode_lowpower_label">Baixa potència</string>
<string name="settings_scanner_mode_balanced_label">Equilibrat</string>
<string name="settings_scanner_mode_lowlatency_label">Baixa latència</string>
<string name="settings_autopause_label">Pausa automàtica</string>
<string name="settings_autopause_description">Pausa l\'àudio quan ús tragueu el dispositiu de l\'orella.</string>
<string name="settings_showall_label">Mostra tots els dispositius</string>
<string name="settings_showall_description">Mostra els dispositius d\'altres persones que estan a prop vostre.</string>
<string name="settings_autopplay_label">Reproducció automàtica</string>
<string name="settings_autoplay_description">Inicia la reproducció d\'àudio en utilitzar el dispositiu.</string>
<string name="settings_fake_data_label">Dades falses</string>
<string name="settings_fake_data_description">Mostra dades falses. Per exemple: simula dispositius que no existeixen.</string>
<string name="settings_debug_label">Configuració de depuració</string>
<string name="settings_debug_description">Configuració addicional per ajudar a resoldre problemes amb l\'aplicació.</string>
<string name="settings_signal_minimum_label">Qualitat de senyal mínima</string>
<string name="settings_signal_minimum_description">La qualitat de senyal mínima que ha de tenir un dispositiu per considerar-se vostre.</string>
<string name="settings_autoconnect_label">Connexió automàtica</string>
<string name="settings_autoconnect_description">Si l\'Android no es connecta automàticament, també ho podem demanar. Això establirà la configuració del mode de monitor a «Sempre».</string>
<string name="settings_autoconnect_condition_label">Condició de connexió automàtica</string>
<string name="settings_autoconnect_condition_description">Quan hem d\'intentar connectar-nos al vostre dispositiu?</string>
<string name="settings_reaction_label">Reaccions</string>
<string name="settings_reaction_description">Reacció davant esdeveniments i comportaments.</string>
<string name="settings_category_yourdevice_label">El vostre dispositiu</string>
<string name="settings_maindevice_address_label">L\'adreça del vostre dispositiu</string>
<string name="settings_maindevice_address_description">L\'adreça del dispositiu emparellat. L\'aplicació la fa servir per determinar quan està connectat al telèfon.</string>
<string name="settings_maindevice_address_none">Cap</string>
<string name="settings_maindevice_model_label">El vostre model de dispositiu</string>
<string name="settings_maindevice_model_description">El model del vostre dispositiu principal. Això ajuda l\'aplicació a reconèixer el vostre dispositiu quan no està connectat al vostre telèfon.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Quan es veu</string>
<string name="settings_reaction_autoconnect_caseopen_label">La funda està oberta</string>
<string name="settings_reaction_autoconnect_inear_label">A l\'orella</string>
<string name="upgrade_capod_label">Actualitza el CAPod</string>
<string name="upgrade_capod_description">Obteniu característiques addicionals i doneu suport al desenvolupador.</string>
<string name="settings_popup_caseopen_label">Mostra la finestra emergent</string>
<string name="settings_popup_caseopen_description">Mostra una finestra emergent quan s\'obre la funda del dispositiu (experimental).</string>
<string name="overview_bluetooth_disabled_label">El Bluetooth està desactivat</string>
<string name="overview_bluetooth_disabled_description">El Bluetooth està desactivat, activeu-lo ;)</string>
<string name="help_translate_label">Traducció</string>
<string name="help_translate_description">Ajudeu a traduir aquesta aplicació al vostre idioma preferit.</string>
<string name="settings_onepod_mode_label">Mode d\'un AirPod</string>
<string name="settings_onepod_mode_description">No cal portar els dos AirdPods, per provocar reaccions només cal portar-ne un.</string>
<string name="permission_system_alert_window_label">Finestra d\'alerta del sistema</string>
<string name="permission_system_alert_window_description">Permet que el CAPod dibuixi sobre altres aplicacions per fer possible la característica «Mostra emergent».</string>
<string name="last_seen_x">Últim cop vist: %s</string>
<string name="first_seen_x">Primera vegada vist: %s</string>
<string name="settings_blescanner_unfiltered_label">Dades BLE sense filtrar</string>
<string name="settings_blescanner_unfiltered_description">Elimina els filtres de l\'escàner BLE per mostrar totes les dades BLE emeses. Útil per afegir suport a nous tipus d\'auriculars.</string>
<string name="permission_required_title">Cal el permís següent:</string>
<string name="settings_compatibility_mode_label">Mode de compatibilitat</string>
<string name="settings_compatibility_mode_description">Desactiva les optimitzacions per millorar la compatibilitat. Proveu això si no veieu cap dada.</string>
<string name="translators_thanks_title">Traductors</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Jaime Muñoz(jmmartin_5@outlook.com)</string>
</resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Stav zařízení</string>
<string name="general_error_label">Chyba</string>
<string name="general_share_action">Sdílet</string>
<string name="general_done_action">Hotovo</string>
<string name="general_copy_action">Kopírovat</string>
<string name="general_thank_you_label">Děkuji Vám</string>
<string name="general_value_not_available_label">N/A</string>
<string name="general_grant_permission_action">Udělit oprávnění</string>
<string name="general_upgrade_action">Upgradovat</string>
<string name="general_check_action">Ověřit</string>
<string name="general_close_action">Zavřít</string>
<string name="debug_debuglog_size_label">Velikost</string>
<string name="debug_debuglog_size_compressed_label">Komprimovaná velikost</string>
<string name="debug_notification_channel_label">Oznámení o ladění</string>
<string name="debug_debuglog_file_label">Zaznamenaný soubor protokolu</string>
<string name="debug_debuglog_record_action">Zaznamenat protokol ladění</string>
<string name="permission_bluetooth_connect_label">Připojení Bluetooth</string>
<string name="permission_bluetooth_connect_description">Tato aplikace vyžaduje oprávnění „připojení Bluetooth“ pro interakci se spárovanými zařízeními a zahájení připojení.</string>
<string name="permission_bluetooth_scan_label">Skenování Bluetooth</string>
<string name="permission_bluetooth_scan_description">Oprávnění „Skenování Bluetooth“ umožňuje této aplikaci zjišťovat a přijímat data z okolních Bluetooth zařízení, jako jsou například sluchátka AirPods.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Tato aplikace vyžaduje oprávněni k „Bluetooth“ pro připojení ke spárovaným zařízením Bluetooth.</string>
<string name="permission_access_fine_location_label">Přístup k přesné poloze</string>
<string name="permission_access_fine_location_description">CAPod používá pro příjem dat Bluetooth Low Energy oprávnění k „přesné poloze“. Sluchátka používají k vysílání svého stavu technologii Bluetooth Low Energy. Tato aplikace NEPOUŽÍVÁ data Bluetooth k určování vaší polohy.</string>
<string name="permission_background_location_label">Přístup k poloze na pozadí</string>
<string name="permission_background_location_description">Aplikace CAPod používá „přístup k poloze na pozadí“ pro funkce jako „Zobrazit vyskakovací okno“ a „Automatické připojení“, když je aplikace zavřená. Přístup k poloze na pozadí umožňuje aplikaci přijímat data Bluetooth Low Energy, když je na pozadí. Tato aplikace NEPOUŽÍVÁ data Bluetooth k určování vaší polohy.</string>
<string name="permission_ignore_battery_optimizations_label">Vypnout optimalizaci baterie</string>
<string name="permission_ignore_battery_optimizations_description">Optimalizace baterie zabraňuje této aplikaci spolehlivě přijímat data Bluetooth, pokud běží na pozadí.</string>
<string name="pods_dual_left_label">Levé sluchátko</string>
<string name="pods_dual_right_label">Pravé sluchátko</string>
<string name="pods_case_label">Pouzdro</string>
<string name="pods_case_status_open_label">Otevřeno</string>
<string name="pods_case_status_closed_label">Zavřeno</string>
<string name="pods_connection_state_disconnected_label">Nepřipojeno k zařízení</string>
<string name="pods_connection_state_idle_label">Připojeno k zařízení, ale bez aktivity</string>
<string name="pods_connection_state_music_label">V režimu hudby</string>
<string name="pods_connection_state_call_label">V režimu hovoru</string>
<string name="pods_connection_state_ringing_label">Vyzvánění</string>
<string name="pods_connection_state_hanging_up_label">Zavěšování</string>
<string name="pods_connection_state_unknown_label">Neznámý stav připojení</string>
<string name="pods_unknown_raw_data_label">Nezpracovaná data</string>
<string name="pods_unknown_label">Neznámé zařízení</string>
<string name="pods_unknown_contact_dev">Jedná se o neznámé zařízení, ale používá podobný formát zprávy. Přidejme pro něj podporu. Kontaktujte mě :)</string>
<string name="pods_none_label_short">Žádné zařízení</string>
<string name="pods_charging_label">Nabíjení</string>
<string name="pods_inear_label">V uchu</string>
<string name="pods_microphone_label">Mikrofon</string>
<string name="pods_yours">Vaše</string>
<string name="headset_being_worn_label">Používá se</string>
<string name="pods_case_unknown_state">Neznámý stav</string>
<string name="overview_nomaindevice_label">Žádné hlavní zařízení</string>
<string name="overview_nomaindevice_description">Je nepravděpodobné, že by všechna zjištěná zařízení patřila vám. Zapněte a připojte zařízení nebo upravte nastavení.</string>
<string name="settings_label">Nastavení</string>
<string name="settings_privacy_policy_label">Zásady ochrany osobních údajů</string>
<string name="settings_privacy_policy_desc">Zodpovědné zacházení s daty.</string>
<string name="settings_licenses_label">Licence</string>
<string name="settings_category_other_label">Další</string>
<string name="settings_general_label">Nastavení</string>
<string name="settings_general_description">Obecná vylepšení, která ovlivňují celou aplikaci.</string>
<string name="settings_acknowledgements_label">Poděkování</string>
<string name="changelog_label">Seznam změn</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">E-mail vývojáři</string>
<string name="settings_support_installid_label">ID instalace</string>
<string name="settings_support_installid_desc">Automatická hlášení chyb jsou anonymní. Sdílíte pouze své ID instalace, pokud vývojář potřebuje najít vaše chybová hlášení.</string>
<string name="settings_support_label">Podpora</string>
<string name="settings_support_description">Potřebujete-li pomoc.</string>
<string name="issue_tracker_label">Sledování problémů</string>
<string name="issue_tracker_description">Veřejné sledování problémů pro hlášení chyb a požadavky na funkce (pouze v angličtině).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Místo, kde můžete psát a klást otázky.</string>
<string name="settings_support_email_developer_description">Upozorňuji, že mohu odpovídat pouze v němčině nebo angličtině.</string>
<string name="settings_debug_autoreports_label">Automatické hlášení chyb</string>
<string name="settings_debug_autoreports_description">Automatické hlášení chyb např. podrobnosti o pádech aplikace.</string>
<string name="settings_debug_mode_label">Režim ladění</string>
<string name="settings_debug_mode_description">Zobrazit další informace pro řešení problémů.</string>
<string name="settings_monitor_mode_label">Režim monitorování</string>
<string name="settings_monitor_mode_description">Za jakých okolností tato aplikace monitoruje data Bluetooth.</string>
<string name="settings_scanner_mode_label">Režim skenování</string>
<string name="settings_scanner_mode_description">Má skenování Bluetooth Low Energy upřednostnit výkon, nebo úsporu energie?</string>
<string name="settings_monitor_mode_manual_label">Při otevření aplikace</string>
<string name="settings_monitor_mode_automatic_label">Při připojení zařízení</string>
<string name="settings_monitor_mode_always_label">Vždy</string>
<string name="settings_scanner_mode_lowpower_label">Nízký výkon</string>
<string name="settings_scanner_mode_balanced_label">Vyvážený</string>
<string name="settings_scanner_mode_lowlatency_label">Nízká latence</string>
<string name="settings_autopause_label">Autom. pozastavení</string>
<string name="settings_autopause_description">Pozastavení zvuku při vyjmutí zařízení z ucha.</string>
<string name="settings_showall_label">Zobrazit všechna zařízení</string>
<string name="settings_showall_description">Zobrazit zařízení ostatních osob, které se nacházejí ve vaší blízkosti.</string>
<string name="settings_autopplay_label">Autom. přehrávání</string>
<string name="settings_autoplay_description">Spuštění přehrávání zvuku při nošení zařízení.</string>
<string name="settings_fake_data_label">Falešná data</string>
<string name="settings_fake_data_description">Zobrazit falešná data např. simulovat zařízení, které neexistuje.</string>
<string name="settings_debug_label">Nastavení ladění</string>
<string name="settings_debug_description">Další nastavení, která pomáhají řešit problémy s aplikací.</string>
<string name="settings_signal_minimum_label">Minimální kvalita signálu</string>
<string name="settings_signal_minimum_description">Minimální kvalita signálu, kterou musí zařízení mít, aby bylo považováno za vaše.</string>
<string name="settings_autoconnect_label">Automatické připojení</string>
<string name="settings_autoconnect_description">Pokud se systém Android nepřipojí automaticky, můžeme jej o to požádat. Tím se nastaví režim monitorování na hodnotu „Vždy“.</string>
<string name="settings_autoconnect_condition_label">Stav automatického připojení</string>
<string name="settings_autoconnect_condition_description">Kdy se máme pokusit připojit k vašemu zařízení?</string>
<string name="settings_reaction_label">Reakce</string>
<string name="settings_reaction_description">Reakce na události a chování.</string>
<string name="settings_category_yourdevice_label">Vaše zařízení</string>
<string name="settings_maindevice_address_label">Adresa vašeho zařízení</string>
<string name="settings_maindevice_address_description">Adresa spárovaného zařízení. Podle toho aplikace určí, kdy je připojena k telefonu.</string>
<string name="settings_maindevice_address_none">Žádná</string>
<string name="settings_maindevice_model_label">Model vašeho zařízení</string>
<string name="settings_maindevice_model_description">Model vašeho hlavního zařízení. To pomůže aplikaci rozpoznat vaše zařízení, když není připojeno k telefonu.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Když je vidět</string>
<string name="settings_reaction_autoconnect_caseopen_label">Pouzdro je otevřeno</string>
<string name="settings_reaction_autoconnect_inear_label">V uchu</string>
<string name="upgrade_capod_label">Upgradovat CAPod</string>
<string name="upgrade_capod_description">Získat další funkce a podpořit vývojáře.</string>
<string name="settings_popup_caseopen_label">Zobrazit vyskakovací okno</string>
<string name="settings_popup_caseopen_description">Zobrazit vyskakovací okno, pokud je pouzdro zařízení otevřeno (experimentální).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth je vypnuto</string>
<string name="overview_bluetooth_disabled_description">Bluetooth je vypnuto, zapněte jej ;)</string>
<string name="help_translate_label">Překlad</string>
<string name="help_translate_description">Pomozte přeložit tuto aplikaci do svého oblíbeného jazyka.</string>
<string name="settings_onepod_mode_label">Režim jednoho sluchátka</string>
<string name="settings_onepod_mode_description">Není nutné nosit obě sluchátka, k vyvolání reakce stačí nosit jen jedno.</string>
<string name="permission_system_alert_window_label">Okno systémových upozornění</string>
<string name="permission_system_alert_window_description">Aby bylo možné použít unkci „Zobrazit vyskakovací okno“, je nutné umožnot aplikaci CAPod vykreslení přes jiné aplikace.</string>
<string name="last_seen_x">Naposledy spatřeno: %s</string>
<string name="first_seen_x">Poprvé spatřeno: %s</string>
<string name="settings_blescanner_unfiltered_label">Nefiltrovaná data BLE</string>
<string name="settings_blescanner_unfiltered_description">Aby se zobrazovala všechna vysílaná data BLE, odstraňte ze skenování BLE všechny filtry. Užitečné pro přidání podpory nových typů sluchátek.</string>
<string name="permission_required_title">Je vyžadováno následující oprávnění:</string>
<string name="settings_compatibility_mode_label">Režim kompatibility</string>
<string name="settings_compatibility_mode_description">Vypnutí optimalizace pro zlepšení kompatibility. Zkuste to, pokud se vám nezobrazují žádná data.</string>
<string name="translators_thanks_title">Překladatelé</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">novas78@xda; woytazzer</string>
</resources>
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Geräte Status</string>
<string name="general_error_label">Fehler</string>
<string name="general_share_action">Teilen</string>
<string name="general_done_action">Fertig</string>
<string name="general_copy_action">Kopieren</string>
<string name="general_thank_you_label">Danke</string>
<string name="general_value_not_available_label">k.A.</string>
<string name="general_grant_permission_action">Berechtigung erteilen</string>
<string name="general_upgrade_action">Upgrade</string>
<string name="general_check_action">Überprüfen</string>
<string name="general_close_action">Schließen</string>
<string name="debug_debuglog_size_label">Größe</string>
<string name="debug_debuglog_size_compressed_label">Komprimierte Größe</string>
<string name="debug_notification_channel_label">Debug Benachrichtigungen</string>
<string name="debug_debuglog_file_label">Aufgenommene Log-Datei</string>
<string name="debug_debuglog_record_action">Debug Log aufnehmen</string>
<string name="permission_bluetooth_connect_label">Bluetooth verbinden</string>
<string name="permission_bluetooth_connect_description">Diese App benötigt die \"Bluetooth verbinden\" Berechtigung um mit bereits verbundenen und neuen Geräten zu interagieren.</string>
<string name="permission_bluetooth_scan_label">Bluetooth Suche</string>
<string name="permission_bluetooth_scan_description">Die \"Bluetooth verbinden\" Berechtigung erlaubt dieser App Bluetooth Daten von Geräten wie AirPods zu finden und zu erhalten.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Diese App benötigt die \"Bluetooth\" Berechtigung um sich mit gekoppelten Geräten zu verbinden.</string>
<string name="permission_access_fine_location_label">Auf genauen Standort zugreifen</string>
<string name="permission_access_fine_location_description">CAPod benutzt die \"genauen Gerätestandort verwenden\" Berechtigung um Bluetooth Low Energy Daten zu erhalten. Ihre Kopfhörer nutzen Bluetooth Low Energy um ihren Batterie Status zu übertragen. Diese App greift nicht auf ihren Standort zu.</string>
<string name="permission_background_location_label">Standort Zugriff im Hintergrund</string>
<string name="permission_background_location_description">CAPod nutzt \"Standort Zugriff im Hintergrund\" um Funktionen wie \"Pop-up anzeigen\" und \"AutoConnect\" zu verwenden während die App geschlossen ist. Standort Zugriff im Hintergrund erlaubt der App Bluetooth Low Energy Daten im Hintergrund zu erhalten und NICHT ihren Standort zu finden.</string>
<string name="permission_ignore_battery_optimizations_label">Batterie Optimierung deaktivieren</string>
<string name="permission_ignore_battery_optimizations_description">Batterie Optimierung hindert die App daran Bluetooth Daten zu erhalten während die App im Hintergrund ist.</string>
<string name="pods_dual_left_label">Linker Pod</string>
<string name="pods_dual_right_label">Rechter Pod</string>
<string name="pods_case_label">Ladecase</string>
<string name="pods_case_status_open_label">Offen</string>
<string name="pods_case_status_closed_label">Geschlossen</string>
<string name="pods_connection_state_disconnected_label">Mit keinem Gerät verbunden</string>
<string name="pods_connection_state_idle_label">Mit einem Gerät verbunden, aber im Leerlauf</string>
<string name="pods_connection_state_music_label">Im Musik Modus</string>
<string name="pods_connection_state_call_label">Im Anruf Modus</string>
<string name="pods_connection_state_ringing_label">Klingelt</string>
<string name="pods_connection_state_hanging_up_label">Legt auf</string>
<string name="pods_connection_state_unknown_label">Unbekannter Verbindungsstatus</string>
<string name="pods_unknown_raw_data_label">Rohe Daten</string>
<string name="pods_unknown_label">Unbekanntes Gerät</string>
<string name="pods_unknown_contact_dev">Dies ist ein unbekanntes Gerät, aber es verwendet ein ähnliches Nachrichtenformat. Lassen Sie uns Unterstützung dafür hinzufügen, kontaktieren Sie mich :)</string>
<string name="pods_none_label_short">Kein Gerät</string>
<string name="pods_charging_label">Laden</string>
<string name="pods_inear_label">Im Ohr</string>
<string name="pods_microphone_label">Mikrofon</string>
<string name="pods_yours">Dein</string>
<string name="headset_being_worn_label">Wird getragen</string>
<string name="pods_case_unknown_state">Unbekannter Zustand</string>
<string name="overview_nomaindevice_label">Kein primäres Gerät</string>
<string name="overview_nomaindevice_description">Alle gefundenen Geräte sind unwahrscheinlich ihnen zu gehören. Verbinden sie ihr Gerät oder passen sie die Einstellungen an.</string>
<string name="settings_label">Einstellungen</string>
<string name="settings_privacy_policy_label">Datenschutzbestimmungen</string>
<string name="settings_privacy_policy_desc">Verantwortungsvoller Umgang mit Daten.</string>
<string name="settings_licenses_label">Lizenzen</string>
<string name="settings_category_other_label">Andere</string>
<string name="settings_general_label">Einstellungen</string>
<string name="settings_general_description">Allgemeine Optimierungen, die die gesamte App betreffen.</string>
<string name="settings_acknowledgements_label">Danksagungen</string>
<string name="changelog_label">Änderungsprotokoll</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">E-Mail-Entwickler</string>
<string name="settings_support_installid_label">ID installieren</string>
<string name="settings_support_installid_desc">Automatische Fehlermeldungen sind anonym. Teilen Sie Ihre Installations- ID mit, wenn der Entwickler Ihre Fehlerberichte finden muss.</string>
<string name="settings_support_label">Unterstützung</string>
<string name="settings_support_description">Wenn Sie Hilfe brauchen.</string>
<string name="issue_tracker_label">Issue-Tracker</string>
<string name="issue_tracker_description">Ein öffentlicher Issue-Tracker für Fehlerberichte und Funktionsanfragen (nur auf Englisch).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Ein Ort zum Verweilen und Fragen stellen.</string>
<string name="settings_support_email_developer_description">Beachten Sie, dass ich nur auf Deutsch oder Englisch antworten kann.</string>
<string name="settings_debug_autoreports_label">Automatische Fehlerberichte</string>
<string name="settings_debug_autoreports_description">Meldet Probleme automatisch, Details zu einem App-Absturz, damit ich herausfinden kann, wie ich ihn beheben kann.</string>
<string name="settings_debug_mode_label">Debug-Modus</string>
<string name="settings_debug_mode_description">Zeigen Sie zusätzliche Informationen an, um Probleme zu beheben.</string>
<string name="settings_monitor_mode_label">Überwachungsmodus</string>
<string name="settings_monitor_mode_description">Unter welchen Umständen überwacht diese App Bluetooth-Daten.</string>
<string name="settings_scanner_mode_label">Scannermodus</string>
<string name="settings_scanner_mode_description">Soll der Bluetooth Low Energy Datenscanner Leistung priorisieren oder Energie sparen?</string>
<string name="settings_monitor_mode_manual_label">Wenn die App geöffnet ist</string>
<string name="settings_monitor_mode_automatic_label">Wenn das Gerät verbunden ist</string>
<string name="settings_monitor_mode_always_label">Stets</string>
<string name="settings_scanner_mode_lowpower_label">Geringer Strom</string>
<string name="settings_scanner_mode_balanced_label">Ausgewogen</string>
<string name="settings_scanner_mode_lowlatency_label">Geringe Latenz</string>
<string name="settings_autopause_label">Automatische Pause</string>
<string name="settings_autopause_description">Halten Sie den Ton an, wenn Sie das Gerät von Ihrem Ohr entfernen.</string>
<string name="settings_showall_label">Alle Geräte anzeigen</string>
<string name="settings_showall_description">Zeigen Sie die Geräte anderer Personen in Ihrer Nähe an.</string>
<string name="settings_autopplay_label">Automatisches Abspielen</string>
<string name="settings_autoplay_description">Starten Sie die Audiowiedergabe, wenn das Gerät getragen wird.</string>
<string name="settings_fake_data_label">Gefälschte Daten</string>
<string name="settings_fake_data_description">Falsche Daten anzeigen, also nicht existierende Geräte simulieren.</string>
<string name="settings_debug_label">Debug-Einstellungen</string>
<string name="settings_debug_description">Zusätzliche Einstellungen zur Behebung von Problemen mit der App.</string>
<string name="settings_signal_minimum_label">Minimale Signalqualität</string>
<string name="settings_signal_minimum_description">Die minimale Signalqualität, die ein Gerät haben muss, muss als Ihre angesehen werden.</string>
<string name="settings_autoconnect_label">Automatisch verbinden</string>
<string name="settings_autoconnect_description">Wenn Android nicht automatisch eine Verbindung herstellt, können wir es auch fragen. Dadurch wird die Monitormodus-Einstellung auf „Immer“ gesetzt.</string>
<string name="settings_autoconnect_condition_label">Bedingung für automatische Verbindung</string>
<string name="settings_autoconnect_condition_description">Wann sollten wir versuchen, eine Verbindung zu Ihrem Gerät herzustellen?</string>
<string name="settings_reaction_label">Reaktionen</string>
<string name="settings_reaction_description">Reagieren Sie auf Ereignisse und Verhaltensweisen.</string>
<string name="settings_category_yourdevice_label">Ihr Gerät</string>
<string name="settings_maindevice_address_label">Ihre Geräteadresse</string>
<string name="settings_maindevice_address_description">Die Adresse Ihres gekoppelten Geräts. Die App verwendet dies, um festzustellen, wann sie mit Ihrem Telefon verbunden ist.</string>
<string name="settings_maindevice_address_none">Keine</string>
<string name="settings_maindevice_model_label">Ihr Gerätemodell</string>
<string name="settings_maindevice_model_description">Das Modell Ihres Hauptgeräts. Dies hilft der App, Ihr Gerät zu erkennen, wenn es nicht mit Ihrem Telefon verbunden ist.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Wenn gesehen</string>
<string name="settings_reaction_autoconnect_caseopen_label">Fall ist offen</string>
<string name="settings_reaction_autoconnect_inear_label">Im Ohr</string>
<string name="upgrade_capod_label">Verbesser CAPod</string>
<string name="upgrade_capod_description">Erhalten Sie zusätzliche Funktionen und unterstützen Sie den Entwickler.</string>
<string name="settings_popup_caseopen_label">Popup zeigen</string>
<string name="settings_popup_caseopen_description">Ein Popup anzeigen, wenn das Gerätegehäuse geöffnet wird (experimentell).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth ist deaktiviert</string>
<string name="overview_bluetooth_disabled_description">Bluetooth ist deaktiviert, aktiviere es ;)</string>
<string name="help_translate_label">Übersetzung</string>
<string name="help_translate_description">Helfen Sie mit, diese App in Ihre Lieblingssprache zu übersetzen.</string>
<string name="settings_onepod_mode_label">Ein-Pod-Modus</string>
<string name="settings_onepod_mode_description">Das Tragen beider Pods ist nicht erforderlich, das Tragen eines einzigen Pods reicht aus, um Reaktionen auszulösen.</string>
<string name="permission_system_alert_window_label">Systemwarnungsfenster</string>
<string name="permission_system_alert_window_description">Erlauben Sie CAPod, über andere Apps zu zeichnen, um die Funktion \"PopUp anzeigen\" zu ermöglichen.</string>
<string name="last_seen_x">Zuletzt gesehen: %s</string>
<string name="first_seen_x">Zum ersten Mal gesehen: %s</string>
<string name="settings_blescanner_unfiltered_label">Ungefilterte BLE-Daten</string>
<string name="settings_blescanner_unfiltered_description">Entfernen Sie alle Filter aus dem BLE-Scanner, um alle übertragenen BLE-Daten anzuzeigen. Nützlich, um Unterstützung für neue Kopfhörertypen hinzuzufügen.</string>
<string name="permission_required_title">Die folgende Genehmigung ist erforderlich:</string>
<string name="settings_compatibility_mode_label">Kompatibilitätsmodus</string>
<string name="settings_compatibility_mode_description">Deaktivieren Sie Optimierungen, um die Kompatibilität zu verbessern. Versuchen Sie dies, wenn Sie keine Daten sehen.</string>
<string name="translators_thanks_title">Übersetzer</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Gamechanger181</string>
</resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Κατάσταση συσκευής</string>
<string name="general_error_label">Σφάλμα</string>
<string name="general_share_action">Κοινοποίηση</string>
<string name="general_done_action">Τέλος</string>
<string name="general_copy_action">Αντιγραφή</string>
<string name="general_thank_you_label">Σας ευχαριστώ</string>
<string name="general_value_not_available_label">Δε διατίθεται</string>
<string name="general_grant_permission_action">Παραχώρηση άδειας</string>
<string name="general_upgrade_action">Αναβάθμιση</string>
<string name="general_check_action">Έλεγχος</string>
<string name="general_close_action">Κλείσιμο</string>
<string name="debug_debuglog_size_label">Μέγεθος</string>
<string name="debug_debuglog_size_compressed_label">Συμπιεσμένο μέγεθος</string>
<string name="debug_notification_channel_label">Ειδοποιήσεις εντοπισμού σφαλμάτων</string>
<string name="debug_debuglog_file_label">Εγγεγραμμένο αρχείο καταγραφής</string>
<string name="debug_debuglog_record_action">Εγγραφή καταγραφής εντοπισμού σφαλμάτων</string>
<string name="permission_bluetooth_connect_label">Σύνδεση Bluetooth</string>
<string name="permission_bluetooth_connect_description">Αυτή η εφαρμογή απαιτεί την άδεια \"Σύνδεση Bluetooth\" για να αλληλεπιδρά με αντιστοιχισμένες συσκευές και να ξεκινά συνδέσεις.</string>
<string name="permission_bluetooth_scan_label">Σάρωση Bluetooth</string>
<string name="permission_bluetooth_scan_description">Η άδεια \"Σάρωση Bluetooth\" επιτρέπει σε αυτήν την εφαρμογή να εντοπίζει και να λαμβάνει δεδομένα Bluetooth από κοντινές συσκευές, όπως τα AirPods σας.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Αυτή η εφαρμογή απαιτεί την άδεια \"Bluetooth\" για να συνδέεται σε αντιστοιχισμένες συσκευές Bluetooth.</string>
<string name="permission_access_fine_location_label">Πρόσβαση ακριβούς τοποθεσίας</string>
<string name="permission_access_fine_location_description">Το CAPod χρησιμοποιεί την άδεια \"Ακριβής τοποθεσία\" για να λαμβάνει δεδομένα χαμηλής ενέργειας Bluetooth. Τα ακουστικά σας χρησιμοποιούν τεχνολογία χαμηλής ενέργειας Bluetooth για να μεταδίδουν την κατάστασή τους. Αυτή η εφαρμογή ΔΕΝ θα χρησιμοποιεί δεδομένα Bluetooth για να προσδιορίσει την τοποθεσία σας.</string>
<string name="permission_background_location_label">Πρόσβαση τοποθεσίας στο παρασκήνιο</string>
<string name="permission_background_location_description">Το CAPod χρησιμοποιεί \"Πρόσβαση τοποθεσίας στο παρασκήνιο\" για να ενεργοποιεί λειτουργίες όπως \"Εμφάνιση αναδυόμενου\" και \"Αυτόματη σύνδεση\" ενώ η εφαρμογή είναι κλειστή. Η πρόσβαση τοποθεσίας στο παρασκήνιο επιτρέπει στην εφαρμογή να λαμβάνει δεδομένα χαμηλής ενέργειας Bluetooth ενώ βρίσκεται στο παρασκήνιο. Αυτή η εφαρμογή ΔΕΝ θα χρησιμοποιεί δεδομένα Bluetooth για τον προσδιορισμό της τοποθεσία σας.</string>
<string name="permission_ignore_battery_optimizations_label">Απενεργοποίηση βελτιστοποιήσεων μπαταρίας</string>
<string name="permission_ignore_battery_optimizations_description">Οι βελτιστοποιήσεις μπαταρίας εμποδίζουν αυτήν την εφαρμογή να λαμβάνει αξιόπιστα δεδομένα Bluetooth ενώ η εφαρμογή βρίσκεται στο παρασκήνιο.</string>
<string name="pods_dual_left_label">Αριστερό pod</string>
<string name="pods_dual_right_label">Δεξί pod</string>
<string name="pods_case_label">Θήκη</string>
<string name="pods_case_status_open_label">Ανοιχτή</string>
<string name="pods_case_status_closed_label">Κλειστή</string>
<string name="pods_connection_state_disconnected_label">Δεν είναι συνδεδεμένο σε συσκευή</string>
<string name="pods_connection_state_idle_label">Συνδεδεμένο σε συσκευή, αλλά αδρανές</string>
<string name="pods_connection_state_music_label">Σε λειτουργία μουσικής</string>
<string name="pods_connection_state_call_label">Σε λειτουργία κλήσης</string>
<string name="pods_connection_state_ringing_label">Κουδούνισμα</string>
<string name="pods_connection_state_hanging_up_label">Τερματισμός κλήσης</string>
<string name="pods_connection_state_unknown_label">Άγνωστη κατάσταση σύνδεσης</string>
<string name="pods_unknown_raw_data_label">Ανεπεξέργαστα δεδομένα</string>
<string name="pods_unknown_label">Άγνωστη συσκευή</string>
<string name="pods_unknown_contact_dev">Αυτή είναι μια άγνωστη συσκευή, αλλά χρησιμοποιεί παρόμοια μορφή μηνυμάτων. Ας προσθέσουμε υποστήριξη για αυτήν, επικοινωνήστε μαζί μου :)</string>
<string name="pods_none_label_short">Καμία συσκευή</string>
<string name="pods_charging_label">Φόρτιση</string>
<string name="pods_inear_label">Στο αυτί</string>
<string name="pods_microphone_label">Μικρόφωνο</string>
<string name="pods_yours">Δικό σας</string>
<string name="headset_being_worn_label">Φοριέται</string>
<string name="pods_case_unknown_state">Άγνωστη κατάσταση</string>
<string name="overview_nomaindevice_label">Καμία κύρια συσκευή</string>
<string name="overview_nomaindevice_description">Όλες οι συσκευές που εντοπίστηκαν είναι απίθανο να είναι δικές σας. Ενεργοποιήστε και συνδέστε τη συσκευή σας ή προσαρμόστε τις ρυθμίσεις.</string>
<string name="settings_label">Ρυθμίσεις</string>
<string name="settings_privacy_policy_label">Πολιτική απορρήτου</string>
<string name="settings_privacy_policy_desc">Τα δεδομένα διαχειρίζονται υπεύθυνα.</string>
<string name="settings_licenses_label">Άδειες χρήσης</string>
<string name="settings_category_other_label">Άλλο</string>
<string name="settings_general_label">Ρυθμίσεις</string>
<string name="settings_general_description">Γενικές ρυθμίσεις που επηρεάζουν όλη την εφαρμογή.</string>
<string name="settings_acknowledgements_label">Ευχαριστίες</string>
<string name="changelog_label">Αρχείο αλλαγών</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Email στον προγραμματιστή</string>
<string name="settings_support_installid_label">Αναγνωριστικό εγκατάστασης</string>
<string name="settings_support_installid_desc">Οι αυτόματες αναφορές σφαλμάτων είναι ανώνυμες. Κοινοποιήστε το αναγνωριστικό εγκατάστασης εάν ο προγραμματιστής πρέπει να βρει τις αναφορές σας σφαλμάτων.</string>
<string name="settings_support_label">Υποστήριξη</string>
<string name="settings_support_description">Εάν χρειάζεστε κάποια βοήθεια.</string>
<string name="issue_tracker_label">Εργαλείο παρακολούθησης θεμάτων</string>
<string name="issue_tracker_description">Δημόσιο εργαλείο παρακολούθησης θεμάτων για αναφορές σφαλμάτων και αιτήματα για δυνατότητες (μόνο αγγλικά).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Ένα μέρος για να αράξετε και να κάνετε ερωτήσεις.</string>
<string name="settings_support_email_developer_description">Σημειώστε ότι μπορώ να απαντήσω μόνο στα γερμανικά ή στα αγγλικά.</string>
<string name="settings_debug_autoreports_label">Αυτόματες αναφορές σφαλμάτων</string>
<string name="settings_debug_autoreports_description">Αυτόματες αναφορές προβλημάτων, π.χ. πληροφορίες για αιφνίδια διακοπή λειτουργίας της εφαρμογής, ώστε να μπορώ να καταλάβω πώς να το διορθώσω.</string>
<string name="settings_debug_mode_label">Λειτουργία εντοπισμού σφαλμάτων</string>
<string name="settings_debug_mode_description">Εμφάνιση επιπλέον πληροφοριών για την αντιμετώπιση προβλημάτων.</string>
<string name="settings_monitor_mode_label">Λειτουργία παρακολούθησης</string>
<string name="settings_monitor_mode_description">Κάτω από ποιες συνθήκες αυτή η εφαρμογή παρακολουθεί τα δεδομένα Bluetooth.</string>
<string name="settings_scanner_mode_label">Λειτουργία σάρωσης</string>
<string name="settings_scanner_mode_description">Θα πρέπει η σάρωση δεδομένων χαμηλής ενέργειας Bluetooth να δίνει προτεραιότητα στην απόδοση ή να εξοικονομεί ενέργεια;</string>
<string name="settings_monitor_mode_manual_label">Όταν η εφαρμογή είναι ανοιχτή</string>
<string name="settings_monitor_mode_automatic_label">Όταν η συσκευή είναι συνδεδεμένη</string>
<string name="settings_monitor_mode_always_label">Πάντα</string>
<string name="settings_scanner_mode_lowpower_label">Χαμηλή ισχύς</string>
<string name="settings_scanner_mode_balanced_label">Εξισορρόπηση</string>
<string name="settings_scanner_mode_lowlatency_label">Χαμηλή καθυστέρηση</string>
<string name="settings_autopause_label">Αυτόματη παύση</string>
<string name="settings_autopause_description">Παύση ήχου όταν αφαιρείται τη συσκευή από το αυτί σας.</string>
<string name="settings_showall_label">Εμφάνιση όλων των συσκευών</string>
<string name="settings_showall_description">Εμφάνιση συσκευών άλλων ανθρώπων που είναι κοντά σας.</string>
<string name="settings_autopplay_label">Αυτόματη αναπαραγωγή</string>
<string name="settings_autoplay_description">Έναρξη αναπαραγωγής ήχου όταν φορεθεί η συσκευή.</string>
<string name="settings_fake_data_label">Ψευδή δεδομένα</string>
<string name="settings_fake_data_description">Εμφάνιση ψευδών δεδομένων, π.χ., προσομοίωση συσκευών που δεν υπάρχουν.</string>
<string name="settings_debug_label">Ρυθμίσεις αντιμετώπισης σφαλμάτων</string>
<string name="settings_debug_description">Πρόσθετες ρυθμίσεις που βοηθούν στην αντιμετώπιση προβλημάτων με την εφαρμογή.</string>
<string name="settings_signal_minimum_label">Ελάχιστη ποιότητα σήματος</string>
<string name="settings_signal_minimum_description">Η ελάχιστη ποιότητα σήματος που πρέπει να έχει μια συσκευή για να θεωρείται δική σας.</string>
<string name="settings_autoconnect_label">Αυτόματη σύνδεση</string>
<string name="settings_autoconnect_description">Εάν το Android δε συνδεθεί αυτόματα, μπορούμε επίσης να το ζητήσουμε. Αυτό θα θέσει τη ρύθμιση λειτουργίας παρακολούθησης σε \'Πάντα\'.</string>
<string name="settings_autoconnect_condition_label">Συνθήκη αυτόματης σύνδεσης</string>
<string name="settings_autoconnect_condition_description">Πότε να προσπαθήσουμε να συνδέσουμε τη συσκευή σας;</string>
<string name="settings_reaction_label">Αντιδράσεις</string>
<string name="settings_reaction_description">Αντίδραση σε συμβάντα και συμπεριφορές.</string>
<string name="settings_category_yourdevice_label">Η συσκευή σας</string>
<string name="settings_maindevice_address_label">Διεύθυνση της συσκευής σας</string>
<string name="settings_maindevice_address_description">Η διεύθυνση της αντιστοιχισμένης συσκευής σας. Η εφαρμογή τη χρησιμοποιεί για να προσδιορίσει εάν η συσκευή σας είναι συνδεδεμένη στο τηλέφωνό σας.</string>
<string name="settings_maindevice_address_none">Καμία</string>
<string name="settings_maindevice_model_label">Μοντέλο της συσκευής σας</string>
<string name="settings_maindevice_model_description">Το μοντέλο της κύριας συσκευής σας. Αυτό βοηθά την εφαρμογή να αναγνωρίσει τη συσκευή σας όταν δεν είναι συνδεδεμένη στο τηλέφωνό σας.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Όταν εμφανιστεί</string>
<string name="settings_reaction_autoconnect_caseopen_label">Η θήκη είναι ανοιχτή</string>
<string name="settings_reaction_autoconnect_inear_label">Στο αυτί</string>
<string name="upgrade_capod_label">Αναβάθμιση του CAPod</string>
<string name="upgrade_capod_description">Λάβετε επιπλέον λειτουργίες και υποστηρίξτε τον προγραμματιστή.</string>
<string name="settings_popup_caseopen_label">Εμφάνιση αναδυόμενου</string>
<string name="settings_popup_caseopen_description">Εμφάνιση αναδυόμενου όταν η θήκη της συσκευής είναι ανοιχτή (πειραματικό).</string>
<string name="overview_bluetooth_disabled_label">Το Bluetooth είναι απενεργοποιημένο</string>
<string name="overview_bluetooth_disabled_description">Το Bluetooth είναι απενεργοποιημένο, ενεργοποιήστε το ;)</string>
<string name="help_translate_label">Μετάφραση</string>
<string name="help_translate_description">Βοηθήστε να μεταφραστεί αυτή η εφαρμογή στην αγαπημένη σας γλώσσα.</string>
<string name="settings_onepod_mode_label">Λειτουργία ενός pod</string>
<string name="settings_onepod_mode_description">Δεν απαιτείται να φοράτε και τα δύο pods, αρκεί να φοράτε ένα μόνο pod για να ενεργοποιούνται αντιδράσεις.</string>
<string name="permission_system_alert_window_label">Παράθυρο ειδοποίησης συστήματος</string>
<string name="permission_system_alert_window_description">Επιτρέψτε στο CAPod να εμφανίζεται πάνω από άλλες εφαρμογές για να είναι δυνατή η λειτουργία \"Εμφάνιση αναδυόμενου\".</string>
<string name="last_seen_x">Τελευταία εμφάνιση: %s</string>
<string name="first_seen_x">Πρώτη εμφάνιση: %s</string>
<string name="settings_blescanner_unfiltered_label">Μη φιλτραρισμένα δεδομένα BLE</string>
<string name="settings_blescanner_unfiltered_description">Αφαιρέστε τυχόν φίλτρα από τη σάρωση BLE για να εμφανίσετε όλα τα δεδομένα BLE που μεταδίδονται. Χρήσιμο για την προσθήκη υποστήριξης για νέους τύπους ακουστικών.</string>
<string name="permission_required_title">Η ακόλουθη άδεια είναι απαραίτητη:</string>
<string name="settings_compatibility_mode_label">Λειτουργία συμβατότητας</string>
<string name="settings_compatibility_mode_description">Απενεργοποίηση βελτιστοποιήσεων για βελτίωση συμβατότητας. Δοκιμάστε αυτό εάν δε βλέπετε δεδομένα.</string>
<string name="translators_thanks_title">Μεταφραστές</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Vagelis1608</string>
</resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,55 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Estado del dispositivo</string>
<string name="general_error_label">Error</string>
<string name="general_share_action">Compartir</string>
<string name="general_done_action">Hecho</string>
<string name="general_copy_action">Copiar</string>
<string name="general_thank_you_label">Gracias</string>
<string name="general_value_not_available_label">N/A</string>
<string name="general_grant_permission_action">Conceder permiso</string>
<string name="general_upgrade_action">Mejorar</string>
<string name="general_check_action">Verificar</string>
<string name="general_close_action">Cerrar</string>
<string name="debug_debuglog_size_label">Tamaño</string>
<string name="debug_debuglog_size_compressed_label">Tamaño comprimido</string>
<string name="debug_notification_channel_label">Depurar notificaciones</string>
<string name="debug_debuglog_file_label">Archivo de registro guardado</string>
<string name="debug_debuglog_record_action">Grabar registro de depuracion</string>
<string name="permission_bluetooth_connect_label">Conexión Bluetooth</string>
<string name="permission_bluetooth_connect_description">Esta aplicacion requiere el permiso \"Conexión Bluetooth\" para interactuar con los dispositivos vinculados e iniciar las conexiones.</string>
<string name="permission_bluetooth_scan_label">Escaneo Bluetooth</string>
<string name="permission_bluetooth_scan_description">El permiso \"Escaneo Bluetooth\" permite que esta aplicación descubra y reciba datos de Bluetooth de dispositivos cercanos como tus AirPods.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Esta aplicacion requiere el permiso \"Bluetooth\" para conectarse a los dispositivos vinculados.</string>
<string name="permission_access_fine_location_label">Acceso a la ubicación precisa</string>
<string name="permission_access_fine_location_description">CAPod utiliza el permiso de \"ubicación precisa\" para recibir Datos de Bluetooth de bajo consumo. Sus auriculares utilizan la tecnología Datos de Bluetooth de bajo consumo para transmitir su estado. Esta aplicación NO utilizará datos de Bluetooth para determinar su ubicación.</string>
<string name="permission_background_location_label">Acceso a la ubicación en segundo plano</string>
<string name="permission_background_location_description">CAPod usa el \"acceso a la ubicación en segundo plano\" para habilitar funciones como \"Mostrar ventana emergente\" y \"Conexión automática\" mientras la aplicación está cerrada. El acceso a la ubicación en segundo plano permite que la aplicación reciba datos de Bluetooth de bajo consumo mientras está en segundo plano. Esta aplicación NO utilizará datos de Bluetooth para determinar su ubicación.</string>
<string name="permission_ignore_battery_optimizations_label">Deshabilitar optimizaciones de batería</string>
<string name="permission_ignore_battery_optimizations_description">Las optimizaciones de la batería evitan que esta aplicación reciba datos de Bluetooth de manera confiable mientras la aplicación está en segundo plano.</string>
<string name="pods_dual_left_label">Audífono izquierdo</string>
<string name="pods_dual_right_label">Audífono derecho</string>
<string name="pods_case_label">Estuche</string>
<string name="pods_case_status_open_label">Estuche abierto</string>
<string name="pods_case_status_closed_label">Estuche cerrado</string>
<string name="pods_connection_state_disconnected_label">No está conectado a un dispositivo</string>
<string name="pods_connection_state_idle_label">Conectado a un dispositivo, pero inactivo</string>
<string name="pods_connection_state_music_label">En modo música</string>
<string name="pods_connection_state_call_label">En modo llamada</string>
<string name="pods_connection_state_ringing_label">Sonando</string>
<string name="pods_connection_state_hanging_up_label">Colgar</string>
<string name="pods_connection_state_unknown_label">Estado de conexión desconocido</string>
<string name="pods_unknown_raw_data_label">Datos sin procesar</string>
<string name="pods_unknown_label">Dispositivo desconocido</string>
<string name="pods_unknown_contact_dev">Este es un dispositivo desconocido, pero está usando un formato de mensaje similar. Agreguemos soporte para ello, contáctame :)</string>
<string name="pods_none_label_short">Sin dispositivo</string>
<string name="pods_charging_label">Cargando</string>
<string name="pods_inear_label">En el oído</string>
<string name="pods_microphone_label">Micrófono</string>
<string name="pods_yours">Tuyos</string>
<string name="headset_being_worn_label">En uso</string>
</resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Estado del dispositivo</string>
<string name="general_error_label">Error</string>
<string name="general_share_action">Compartir</string>
<string name="general_done_action">Hecho</string>
<string name="general_copy_action">Copiar</string>
<string name="general_thank_you_label">Gracias</string>
<string name="general_value_not_available_label">N/D</string>
<string name="general_grant_permission_action">Conceder permiso</string>
<string name="general_upgrade_action">Actualizar</string>
<string name="general_check_action">Verificar</string>
<string name="general_close_action">Cerrar</string>
<string name="debug_debuglog_size_label">Tamaño</string>
<string name="debug_debuglog_size_compressed_label">Tamaño comprimido</string>
<string name="debug_notification_channel_label">Notificaciones depuradas</string>
<string name="debug_debuglog_file_label">Registro guardado</string>
<string name="debug_debuglog_record_action">Grabar registro de depuracion</string>
<string name="permission_bluetooth_connect_label">Conexión Bluetooth</string>
<string name="permission_bluetooth_connect_description">Esta aplicación requiere el permiso \"conexión Bluetooth\" para interactuar con los dispositivos pareados, e iniciar las conexiones.</string>
<string name="permission_bluetooth_scan_label">Buscando Bluetooth</string>
<string name="permission_bluetooth_scan_description">El permiso \"Escaneo Bluetooth\" permite que esta aplicación descubra y reciba datos de Bluetooth de dispositivos cercanos, como sus AirPods.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Esta aplicacion requiere \"Bluetooth\" para conectarse a los dispositivos pareados.</string>
<string name="permission_access_fine_location_label">Acceso a la ubicación precisa</string>
<string name="permission_access_fine_location_description">CAPod utiliza el permiso de \"ubicación precisa\" para recibir datos de Bluetooth Low Energy. Sus auriculares utilizan la tecnología Bluetooth Low Energy para transmitir su estado. Esta aplicación NO utilizará datos de Bluetooth para determinar su ubicación.</string>
<string name="permission_background_location_label">Acceso a la ubicación en segundo plano</string>
<string name="permission_background_location_description">CAPod usa el \"Acceso a la ubicación en segundo plano\" para habilitar funciones como \"Mostrar ventana emergente\" y \"Conexión automática\" mientras la aplicación está cerrada. El acceso a la ubicación en segundo plano permite que la aplicación reciba datos de Bluetooth Low Energy mientras está en segundo plano. Esta aplicación NO utilizará datos de Bluetooth para determinar su ubicación.</string>
<string name="permission_ignore_battery_optimizations_label">Desactivar Optimización de Batería</string>
<string name="permission_ignore_battery_optimizations_description">La Optimización de Batería evitan que esta aplicación reciba datos de Bluetooth de manera confiable mientras la aplicación está en segundo plano.</string>
<string name="pods_dual_left_label">Audífono izquierdo</string>
<string name="pods_dual_right_label">Audífono derecho</string>
<string name="pods_case_label">Estuche</string>
<string name="pods_case_status_open_label">Abierto</string>
<string name="pods_case_status_closed_label">Cerrado</string>
<string name="pods_connection_state_disconnected_label">No conectado a un dispositivo</string>
<string name="pods_connection_state_idle_label">Conectado a un dispositivo, pero inactivo</string>
<string name="pods_connection_state_music_label">En modo música</string>
<string name="pods_connection_state_call_label">En modo llamada</string>
<string name="pods_connection_state_ringing_label">Sonando</string>
<string name="pods_connection_state_hanging_up_label">Colgar</string>
<string name="pods_connection_state_unknown_label">Estado de la conexion desconocido</string>
<string name="pods_unknown_raw_data_label">Datos sin procesar</string>
<string name="pods_unknown_label">Dispositivo desconocido</string>
<string name="pods_unknown_contact_dev">Este es un dispositivo desconocido, pero está usando un formato de mensaje similar. Agreguemos soporte para ello, contácteme :)</string>
<string name="pods_none_label_short">Sin dispositivo</string>
<string name="pods_charging_label">Cargando</string>
<string name="pods_inear_label">En el oído</string>
<string name="pods_microphone_label">Micrófono</string>
<string name="pods_yours">Tuyos</string>
<string name="headset_being_worn_label">En uso</string>
<string name="pods_case_unknown_state">Estado desconocido</string>
<string name="overview_nomaindevice_label">Ningún dispositivo principal</string>
<string name="overview_nomaindevice_description">Es poco probable que todos los dispositivos detectados sean suyos. Encienda y conecte su dispositivo o ajuste la configuración.</string>
<string name="settings_label">Ajustes</string>
<string name="settings_privacy_policy_label">Política de privacidad</string>
<string name="settings_privacy_policy_desc">Manejo responsable de datos.</string>
<string name="settings_licenses_label">Licencias</string>
<string name="settings_category_other_label">Otros</string>
<string name="settings_general_label">Ajustes</string>
<string name="settings_general_description">Ajustes generales que afectan a toda la aplicación.</string>
<string name="settings_acknowledgements_label">Agradecimientos</string>
<string name="changelog_label">Registro de cambios</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Correo del desarrollador</string>
<string name="settings_support_installid_label">ID de instalación</string>
<string name="settings_support_installid_desc">Los informes automáticos de errores son anónimos. Comparta su ID de instalación si el desarrollador necesita encontrar sus informes de error.</string>
<string name="settings_support_label">Ayuda</string>
<string name="settings_support_description">Si necesita ayuda.</string>
<string name="issue_tracker_label">Rastreador de problemas</string>
<string name="issue_tracker_description">Un rastreador público de problemas para informes de errores y solicitudes de funciones (solo en inglés).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Un lugar para pasar el rato y hacer preguntas.</string>
<string name="settings_support_email_developer_description">Tenga en cuenta que solo puedo responder en alemán o inglés.</string>
<string name="settings_debug_autoreports_label">Informes automáticos de errores</string>
<string name="settings_debug_autoreports_description">Informa automáticamente de los problemas. Por ejemplo: detalles sobre un bloqueo de la aplicación para que pueda averiguar cómo solucionarlo.</string>
<string name="settings_debug_mode_label">Modo depuración</string>
<string name="settings_debug_mode_description">Muestra información adicional para solucionar problemas.</string>
<string name="settings_monitor_mode_label">Modo monitor</string>
<string name="settings_monitor_mode_description">Bajo qué circunstancias esta aplicación monitorea los datos Bluetooth.</string>
<string name="settings_scanner_mode_label">Modo escáner</string>
<string name="settings_scanner_mode_description">¿El escáner de datos Bluetooth Low Energy debe priorizar el rendimiento o ahorrar energía?</string>
<string name="settings_monitor_mode_manual_label">Cuando la aplicación está abierta</string>
<string name="settings_monitor_mode_automatic_label">Cuando el dispositivo está conectado</string>
<string name="settings_monitor_mode_always_label">Siempre</string>
<string name="settings_scanner_mode_lowpower_label">Bajo consumo</string>
<string name="settings_scanner_mode_balanced_label">Balanceado</string>
<string name="settings_scanner_mode_lowlatency_label">Baja latencia</string>
<string name="settings_autopause_label">Pausar automáticamente</string>
<string name="settings_autopause_description">Pausa el audio cuando te quites el dispositivo de la oreja.</string>
<string name="settings_showall_label">Mostrar todos los dispositivos</string>
<string name="settings_showall_description">Muestra los dispositivos de otras personas que están cerca de ti.</string>
<string name="settings_autopplay_label">Reproducción automática</string>
<string name="settings_autoplay_description">Inicia la reproducción de audio cuando se use el dispositivo.</string>
<string name="settings_fake_data_label">Información falsa</string>
<string name="settings_fake_data_description">Mostrar datos falsos. Por ejemplo: simular un dispositivo que no existe.</string>
<string name="settings_debug_label">Configuración de depuración</string>
<string name="settings_debug_description">Configuraciones adicionales para ayudar a solucionar problemas con la aplicación.</string>
<string name="settings_signal_minimum_label">Calidad de señal mínima</string>
<string name="settings_signal_minimum_description">La calidad de señal mínima que debe tener un dispositivo para ser considerado suyo.</string>
<string name="settings_autoconnect_label">Autoconectar</string>
<string name="settings_autoconnect_description">Si Android no se conecta automáticamente, también podemos preguntarlo. Esto establecerá la configuración del modo de monitor en \'Siempre\'.</string>
<string name="settings_autoconnect_condition_label">Condición de autoconexión</string>
<string name="settings_autoconnect_condition_description">¿Cuándo debemos intentar conectarnos a su dispositivo?</string>
<string name="settings_reaction_label">Reacciones</string>
<string name="settings_reaction_description">Reaccionar a eventos y comportamientos.</string>
<string name="settings_category_yourdevice_label">Tu dispositivo</string>
<string name="settings_maindevice_address_label">La dirección de su dispositivo</string>
<string name="settings_maindevice_address_description">La dirección de su dispositivo emparejado. La aplicación usa esto para determinar cuándo está conectado a su teléfono.</string>
<string name="settings_maindevice_address_none">Ninguno</string>
<string name="settings_maindevice_model_label">El modelo de su dispositivo</string>
<string name="settings_maindevice_model_description">El modelo de su dispositivo principal. Esto ayuda a que la aplicación reconozca su dispositivo cuando no está conectado a su teléfono.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Cuando se ve</string>
<string name="settings_reaction_autoconnect_caseopen_label">El estuche está abierto</string>
<string name="settings_reaction_autoconnect_inear_label">En el oído</string>
<string name="upgrade_capod_label">Actualitzar CAPod</string>
<string name="upgrade_capod_description">Obtenga funciones adicionales y apoye al desarrollador.</string>
<string name="settings_popup_caseopen_label">Mostrar ventanas emergentes</string>
<string name="settings_popup_caseopen_description">Muestra una ventana emergente cuando se abre el estuche del dispositivo (experimental).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth deshabilitado</string>
<string name="overview_bluetooth_disabled_description">El Bluetooth está deshabilitado, habilítelo ;)</string>
<string name="help_translate_label">Traducción</string>
<string name="help_translate_description">Ayuda a traducir esta aplicación a tu idioma favorito.</string>
<string name="settings_onepod_mode_label">Modo un audífono</string>
<string name="settings_onepod_mode_description">No es necesario usar ambos AirPods, usar un solo AirPod es suficiente para desencadenar reacciones.</string>
<string name="permission_system_alert_window_label">Ventana de alerta del sistema</string>
<string name="permission_system_alert_window_description">Permita que CAPod dibuje sobre otras aplicaciones para que la función \"Mostrar ventana emergente\" sea posible.</string>
<string name="last_seen_x">Visto por última vez: %s</string>
<string name="first_seen_x">Visto por primera vez: %s</string>
<string name="settings_blescanner_unfiltered_label">Datos BLE sin filtrar</string>
<string name="settings_blescanner_unfiltered_description">Elimina los filtros del escáner BLE para mostrar todos los datos BLE transmitidos. Útil para agregar soporte para nuevos tipos de auriculares.</string>
<string name="permission_required_title">Se requiere el siguiente permiso:</string>
<string name="settings_compatibility_mode_label">Modo de compatibilidad</string>
<string name="settings_compatibility_mode_description">Deshabilita las optimizaciones para mejorar la compatibilidad. Prueba esto si no ves ningún dato.</string>
<string name="translators_thanks_title">Traductores</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Jaime Muñoz(jmmartin_5@outlook.com)</string>
</resources>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pods_dual_left_label">Vasak klapp</string>
<string name="pods_dual_right_label">Parem klapp</string>
</resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-31
View File
@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="general_share_action">Ibahagi</string>
<string name="general_done_action">Tapos Na</string>
<string name="general_copy_action">Kopyahin</string>
<string name="general_thank_you_label">Salamat sayo</string>
<string name="general_value_not_available_label">N/A</string>
<string name="general_grant_permission_action">Bigyan ng permiso</string>
<string name="general_close_action">Sarado</string>
<string name="debug_debuglog_size_label">Sukat</string>
<string name="permission_bluetooth_connect_description">Ang app na ito ay kailangan ng \"Bluetooth connect\" permission para makipag interact sa mga na-paired na devices at maka gawa ng connection.</string>
<string name="permission_bluetooth_scan_description">Ang \"Bluetooth scanning\" permission ay pag na ibigay, itong app na ito ay puwedeng mag diskubre o maka receive ng data galing sa isang malapit na Bluetooth devices tulad ng iyong AirPods.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Ang app na ito ay kailangan ng \"Bluetooth\" permission upang maka connect sa naka-paired na bluetooth device.</string>
<string name="permission_access_fine_location_description">Ang CAPod app ay gumagamit ng \"Fine location\" permission para maka receiveng Bluetooth Low Energy Data. Iyong headphones ay gumagamit ng Bluetooth Low Energy technology pa ma-broadcaast ang kanilang Status. Itong app na ito ay HINDI gagamitin ang Bluetooth data para malaman ang iyong lokasyon.</string>
<string name="pods_dual_left_label">Kaliwang pod</string>
<string name="pods_dual_right_label">Kanan na pod</string>
<string name="pods_case_status_open_label">Buksan</string>
<string name="pods_case_status_closed_label">Sarado</string>
<string name="pods_connection_state_disconnected_label">Hindi Konektado sa device</string>
<string name="pods_unknown_contact_dev">Ito ay hindi kilalang Device, pero ginagamit ang kilalang message format. lagyan nating ng support para diyan, contact mo ko :)</string>
<string name="pods_yours">Sayo</string>
<string name="headset_being_worn_label">Ginagamit</string>
<string name="pods_case_unknown_state">Hindi alam ang stado</string>
<string name="overview_nomaindevice_description">Lahat ng mga device ay malabong saiyo. I-power on at i-connect ang device mo o i-adjust ang settings.</string>
<string name="settings_licenses_label">Lisensiya</string>
<string name="settings_category_other_label">Iba</string>
</resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod libre et ouvert</string>
<string name="notification_channel_device_status_label">État de lappareil</string>
<string name="general_error_label">Erreur</string>
<string name="general_share_action">Partager</string>
<string name="general_done_action">Terminé</string>
<string name="general_copy_action">Copier</string>
<string name="general_thank_you_label">Merci</string>
<string name="general_value_not_available_label">Non disponible</string>
<string name="general_grant_permission_action">Accorder lautorisation</string>
<string name="general_upgrade_action">Surclasser vers Pro</string>
<string name="general_check_action">Vérifier</string>
<string name="general_close_action">Fermer</string>
<string name="debug_debuglog_size_label">Taille</string>
<string name="debug_debuglog_size_compressed_label">Taille compressée</string>
<string name="debug_notification_channel_label">Notifications de débogage</string>
<string name="debug_debuglog_file_label">Ficher journal enregistré</string>
<string name="debug_debuglog_record_action">Enregistrer le journal de débogage</string>
<string name="permission_bluetooth_connect_label">Connexion Bluetooth</string>
<string name="permission_bluetooth_connect_description">Cette appli exige lautorisation « Connexion Bluetooth » pour interagir avec les appareils jumelés et démarrer les connexions.</string>
<string name="permission_bluetooth_scan_label">Analyse Bluetooth</string>
<string name="permission_bluetooth_scan_description">Lautorisation « Analyse Bluetooth » permet à lappli de découvrir et de réceptionner les données Bluetooth des appareils à proximité tels que vos AirPods.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Cette appli exige lautorisation « Bluetooth » pour se connecter aux appareils Bluetooth jumelés.</string>
<string name="permission_access_fine_location_label">Accéder à la position précise</string>
<string name="permission_access_fine_location_description">CAPod utilise lautorisation « position précise » pour recevoir les données « faible énergie » de Bluetooth. Votre casque-micro utilise la technologie « basse énergie » de Bluetooth pour diffuser son état. Cette appli nutilisera PAS les données Bluetooth pour déterminer votre position.</string>
<string name="permission_background_location_label">Accès à la position en arrière-plan</string>
<string name="permission_background_location_description">CAPod utilise « laccès à la position en arrière-plan » afin de permettre des fonctions telles qu’« Afficher une notification » et « Connexion automatique » alors que lappli est fermée. Laccès à la position en arrière-plan permet à lappli de recevoir les données « basse énergie » de Bluetooth. Elles ne seront PAS utilisées pour déterminer votre position géographie.</string>
<string name="permission_ignore_battery_optimizations_label">Désactiver les optimisations de la pile/batterie</string>
<string name="permission_ignore_battery_optimizations_description">Les optimisations de la pile/batterie empêchent lappli de recevoir les données Bluetooth de manière fiable alors que lappli est en arrière-plan.</string>
<string name="pods_dual_left_label">AirPod gauche</string>
<string name="pods_dual_right_label">AirPod droit</string>
<string name="pods_case_label">Étui</string>
<string name="pods_case_status_open_label">Ouvert</string>
<string name="pods_case_status_closed_label">Fermé</string>
<string name="pods_connection_state_disconnected_label">Non connecté à un appareil</string>
<string name="pods_connection_state_idle_label">Connecté à un appareil, mais au repos</string>
<string name="pods_connection_state_music_label">En mode musique</string>
<string name="pods_connection_state_call_label">En mode appel</string>
<string name="pods_connection_state_ringing_label">Sonnerie</string>
<string name="pods_connection_state_hanging_up_label">Fin de lappel</string>
<string name="pods_connection_state_unknown_label">État de connexion inconnu</string>
<string name="pods_unknown_raw_data_label">Données brutes</string>
<string name="pods_unknown_label">Appareil inconnu</string>
<string name="pods_unknown_contact_dev">Cet appareil est inconnu, mais il utilise un message de format semblable. Prenons-le en charge, contactez-moi :)</string>
<string name="pods_none_label_short">Aucun appareil</string>
<string name="pods_charging_label">En charge</string>
<string name="pods_inear_label">Dans loreille</string>
<string name="pods_microphone_label">Microphone</string>
<string name="pods_yours">Les vôtres</string>
<string name="headset_being_worn_label">Porté</string>
<string name="pods_case_unknown_state">État inconnu</string>
<string name="overview_nomaindevice_label">Aucun appareil principal</string>
<string name="overview_nomaindevice_description">Tous les appareils détectés ne sont probablement pas les vôtres. Allumez et connectez votre appareil ou réglez les paramètres.</string>
<string name="settings_label">Paramètres</string>
<string name="settings_privacy_policy_label">Politique de confidentialité</string>
<string name="settings_privacy_policy_desc">Gestion responsable des données.</string>
<string name="settings_licenses_label">Licences</string>
<string name="settings_category_other_label">Autre</string>
<string name="settings_general_label">Paramètres</string>
<string name="settings_general_description">Réglage généraux qui affectent l\'appli entière.</string>
<string name="settings_acknowledgements_label">Remerciements</string>
<string name="changelog_label">Journal des changements</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Envoyer un courriel au développeur</string>
<string name="settings_support_installid_label">ID dinstallation</string>
<string name="settings_support_installid_desc">Les relevés automatiques derreur sont anonymes. Partagez votre ID dinstallation au cas où le développeur aurait besoin de trouver votre relevé derreur.</string>
<string name="settings_support_label">Assistance</string>
<string name="settings_support_description">Si vous avez besoin daide.</string>
<string name="issue_tracker_label">Gestionnaire de problèmes</string>
<string name="issue_tracker_description">Un gestionnaire public de problèmes pour les signalements de bogues et les demandes de fonction (anglais seulement).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Un endroit à fréquenter où poser des questions.</string>
<string name="settings_support_email_developer_description">Noter que je ne peux répondre quen allemand ou en anglais.</string>
<string name="settings_debug_autoreports_label">Relevés de bogue automatiques</string>
<string name="settings_debug_autoreports_description">Signale automatiquement les problèmes, p. ex., les détails dun plantage de lappli, afin que je puisse essayer de les corriger.</string>
<string name="settings_debug_mode_label">Mode de débogage</string>
<string name="settings_debug_mode_description">Afficher des renseignements supplémentaires pour dépanner les problèmes.</string>
<string name="settings_monitor_mode_label">Mode surveillance</string>
<string name="settings_monitor_mode_description">Les circonstances de surveillance des données Bluetooth par lappli.</string>
<string name="settings_scanner_mode_label">Mode analyse</string>
<string name="settings_scanner_mode_description">Lanalyseur des données « basse énergie » de Bluetooth devrait-il prioriser les performances ou préserver l’énergie?</string>
<string name="settings_monitor_mode_manual_label">Si lappli est en fonction</string>
<string name="settings_monitor_mode_automatic_label">Si lappareil est connecté</string>
<string name="settings_monitor_mode_always_label">Toujours</string>
<string name="settings_scanner_mode_lowpower_label">Faible puissance</string>
<string name="settings_scanner_mode_balanced_label">Équilibré</string>
<string name="settings_scanner_mode_lowlatency_label">Faible latence</string>
<string name="settings_autopause_label">Pause automatique</string>
<string name="settings_autopause_description">Mettre le son en pause si vous ôtez lappareil de votre oreille.</string>
<string name="settings_showall_label">Afficher tous les appareils</string>
<string name="settings_showall_description">Afficher les appareils dautres personnes à proximité.</string>
<string name="settings_autopplay_label">Lecture automatique</string>
<string name="settings_autoplay_description">Démarrer la lecture du son quand lappareil est porté.</string>
<string name="settings_fake_data_label">Fausses données</string>
<string name="settings_fake_data_description">Afficher les fausses données, c.-à-d. simuler les appareils qui nexistent pas.</string>
<string name="settings_debug_label">Paramètres de débogage</string>
<string name="settings_debug_description">Autres paramètres pour aider à diagnostiquer les problèmes de lappli.</string>
<string name="settings_signal_minimum_label">Qualité minimale du signal</string>
<string name="settings_signal_minimum_description">Qualité minimale du signal quun appareil doit émettre pour être considéré le vôtre.</string>
<string name="settings_autoconnect_label">Connexion automatique</string>
<string name="settings_autoconnect_description">Si Android ne se connecte pas automatiquement, nous pouvons lui demander de le faire. Le paramètre du mode surveillance sera « Toujours ».</string>
<string name="settings_autoconnect_condition_label">Condition de connexion automatique</string>
<string name="settings_autoconnect_condition_description">Quand devrions-nous tenter de nous connecter à votre appareil?</string>
<string name="settings_reaction_label">Réactions</string>
<string name="settings_reaction_description">Réagir à des événements et à des comportements.</string>
<string name="settings_category_yourdevice_label">Votre appareil</string>
<string name="settings_maindevice_address_label">Ladresse de votre appareil</string>
<string name="settings_maindevice_address_description">Ladresse de votre appareil jumelé. Lappli lutilise pour déterminer sil est connecté à votre téléphone.</string>
<string name="settings_maindevice_address_none">Aucune</string>
<string name="settings_maindevice_model_label">Le modèle de votre appareil</string>
<string name="settings_maindevice_model_description">Le modèle de votre appareil principal. Facilite la reconnaissance de votre appareil par lappli sil nest pas connecté à votre téléphone.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Sil est présent</string>
<string name="settings_reaction_autoconnect_caseopen_label">Si l’étui est ouvert</string>
<string name="settings_reaction_autoconnect_inear_label">Sil est porté</string>
<string name="upgrade_capod_label">Surclasser CAPod</string>
<string name="upgrade_capod_description">Obtenez des fonctions supplémentaires et soutenez le développeur.</string>
<string name="settings_popup_caseopen_label">Afficher une notification</string>
<string name="settings_popup_caseopen_description">Afficher une notification à louverture de l’étui de l\'appareil (expérimental).</string>
<string name="overview_bluetooth_disabled_label">Le Bluetooth est désactivé</string>
<string name="overview_bluetooth_disabled_description">Le Bluetooth est désactivé, activez-le ;)</string>
<string name="help_translate_label">Traduction</string>
<string name="help_translate_description">Aider à traduire cette appli dans votre langue préférée.</string>
<string name="settings_onepod_mode_label">Mode à un seul AirPod</string>
<string name="settings_onepod_mode_description">Il nest pas nécessaire de porter deux AirPods, en porter un seul suffit à déclencher les réactions.</string>
<string name="permission_system_alert_window_label">Fenêtre dalerte système</string>
<string name="permission_system_alert_window_description">Permettre à CAPod dapparaître par-dessus les autres applis pour rendre la fonction « Afficher une notification » possible.</string>
<string name="last_seen_x">Vu pour la dernière fois : %s</string>
<string name="first_seen_x">Vu pour la première fois : %s</string>
<string name="settings_blescanner_unfiltered_label">Données BÉB non filtrées</string>
<string name="settings_blescanner_unfiltered_description">Supprimer tous les filtres de lanalyseur BÉB pour afficher toutes les données BÉB diffusées. Utile pour prendre en charge les nouveaux types de casques-micros.</string>
<string name="permission_required_title">Lautorisation suivante est nécessaire :</string>
<string name="settings_compatibility_mode_label">Mode de compatibilité</string>
<string name="settings_compatibility_mode_description">Désactiver les optimisations pour améliorer la compatibilité. À essayer si vous ne voyez aucune donnée.</string>
<string name="translators_thanks_title">Traducteurs</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">AO</string>
</resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">उपकरण की स्थिति</string>
<string name="general_error_label">त्रुटि</string>
<string name="general_share_action">साझा करना</string>
<string name="general_done_action">पूर्ण</string>
<string name="general_copy_action">प्रतिलिपि</string>
<string name="general_thank_you_label">शुक्रिया</string>
<string name="general_value_not_available_label">N/A</string>
</resources>
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-131
View File
@@ -1,131 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod_pro</string>
<string name="app_name_foss">CAPod nyílt_forráskód</string>
<string name="notification_channel_device_status_label">Értesítési_állapot</string>
<string name="general_error_label">Hiba</string>
<string name="general_share_action">Megosztás</string>
<string name="general_done_action">Kész</string>
<string name="general_copy_action">Másolás</string>
<string name="general_thank_you_label">Köszönöm</string>
<string name="general_value_not_available_label">Nincs_adat</string>
<string name="general_grant_permission_action">Hozzáférés megadva</string>
<string name="general_upgrade_action">Frissítés_előfizetésre</string>
<string name="general_check_action">Ellenőrzés</string>
<string name="general_close_action">Zárt</string>
<string name="debug_debuglog_size_label">Méret</string>
<string name="debug_debuglog_size_compressed_label">Tömörített_méret</string>
<string name="debug_notification_channel_label">Hibakeresési_értesítések</string>
<string name="debug_debuglog_file_label">Rögzített_naplófájl</string>
<string name="debug_debuglog_record_action">Hibakeresési_napló_rögzítése</string>
<string name="permission_bluetooth_connect_label">Bluetooth_kapcsolat</string>
<string name="permission_bluetooth_connect_description">Ehhez az alkalmazáshoz a \"Bluetooth kapcsolat\" engedély szükséges a párosított eszközökkel való interakcióhoz és a kapcsolatok kezdeményezéséhez.</string>
<string name="permission_bluetooth_scan_label">Bluetooth_keresés</string>
<string name="permission_bluetooth_scan_description">A „Bluetooth-keresés” engedély lehetővé teszi az alkalmazás számára, hogy Bluetooth-adatokat keressen és fogadjon a közeli eszközökről, például az Ön AirPodjairól.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Ehhez az alkalmazáshoz „Bluetooth” engedély szükséges a párosított Bluetooth-eszközökhöz való csatlakozáshoz.</string>
<string name="permission_access_fine_location_label">Lokalizálás engedélyezése</string>
<string name="permission_access_fine_location_description">A CAPod a „megfelelő hely” engedélyt használja a Bluetooth alacsony töltés adatok fogadására. Fejhallgatója Bluetooth alacsony töltés technológiát használ az állapotának közvetítésére. Ez az alkalmazás NEM használ Bluetooth-adatokat az Ön tartózkodási helyének meghatározásához.</string>
<string name="permission_background_location_label">Háttér helyhozzáférés</string>
<string name="permission_background_location_description">\"Automatikus_csatlakozás\".</string>
<string name="permission_ignore_battery_optimizations_label">Az akkumulátor optimalizálás letiltása</string>
<string name="permission_ignore_battery_optimizations_description">Az akkumulátor optimalizálás megakadályozza, hogy ez az alkalmazás megbízhatóan fogadja a Bluetooth-adatokat, miközben az alkalmazás a háttérben működik.</string>
<string name="pods_dual_left_label">Bal hangszóró</string>
<string name="pods_dual_right_label">Jobb hangszóró</string>
<string name="pods_case_label">Tok</string>
<string name="pods_case_status_open_label">Nyitott</string>
<string name="pods_case_status_closed_label">Zárt</string>
<string name="pods_connection_state_disconnected_label">Nincs eszközhöz csatlakoztatva</string>
<string name="pods_connection_state_idle_label">Eszközhöz csatlakozik, de tétlen</string>
<string name="pods_connection_state_music_label">Zenei mód</string>
<string name="pods_connection_state_call_label">Hívás üzemmód</string>
<string name="pods_connection_state_ringing_label">Hívás</string>
<string name="pods_connection_state_hanging_up_label">Hívás vége</string>
<string name="pods_connection_state_unknown_label">Ismeretlen kapcsolati állapot</string>
<string name="pods_unknown_raw_data_label">Rossz adat</string>
<string name="pods_unknown_label">Ismeretlen eszköz</string>
<string name="pods_unknown_contact_dev">Ez egy ismeretlen eszköz, de hasonló üzenetformátumot használ. Adjunk hozzá támogatást, vedd fel velem a kapcsolatot :)</string>
<string name="pods_none_label_short">Nincs eszköz</string>
<string name="pods_charging_label">Töltés</string>
<string name="pods_inear_label">Fülhalgató</string>
<string name="pods_microphone_label">Mikrofon</string>
<string name="pods_yours">A tied</string>
<string name="headset_being_worn_label">Használt</string>
<string name="pods_case_unknown_state">Ismeretlen állapot</string>
<string name="overview_nomaindevice_label">Nincs elsődleges eszköz</string>
<string name="overview_nomaindevice_description">Valószínűleg nem minden észlelt eszköz az Öné. Kapcsolja be és csatlakoztassa a készüléket, vagy módosítsa a beállításokat.</string>
<string name="settings_label">Beéllítások</string>
<string name="settings_privacy_policy_label">Adatvédelmi irányelvek</string>
<string name="settings_privacy_policy_desc">Az adatok felelősségteljes kezelése.</string>
<string name="settings_licenses_label">Licensz</string>
<string name="settings_category_other_label">Másik</string>
<string name="settings_general_label">Beéllítások</string>
<string name="settings_general_description">Általános módosítások, amelyek az egész alkalmazást érintik.</string>
<string name="settings_acknowledgements_label">Köszönetnyilvánítások</string>
<string name="changelog_label">Napló</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Fejlesztő Email címe</string>
<string name="settings_support_installid_label">Azonosító</string>
<string name="settings_support_installid_desc">Az automatikus hibajelentések névtelenek. Ossza meg azonosítóját, hogy a fejlesztő megtalálja a hibajelentéseket.</string>
<string name="settings_support_label">Támogatás</string>
<string name="settings_support_description">Ha segítségre van szüksége.</string>
<string name="issue_tracker_label">Problémakövető</string>
<string name="issue_tracker_description">Nyilvános problémakövető hibajelentésekhez és szolgáltatáskérésekhez (csak angol nyelven).</string>
<string name="discord_label">Viszály</string>
<string name="discord_description">Egy hely, ahol kérdéseket tehet fel.</string>
<string name="settings_support_email_developer_description">Vegye figyelembe, hogy csak németül vagy angolul tudok válaszolni.</string>
<string name="settings_debug_autoreports_label">Automatikus hibajelentések</string>
<string name="settings_debug_autoreports_description">Automatikusan jelenti a problémákat, például részleteket az alkalmazás összeomlásáról, hogy kitaláljam, hogyan javíthatom ki.</string>
<string name="settings_debug_mode_label">Hibakeresési mód</string>
<string name="settings_debug_mode_description">További információk megjelenítése a problémák hibaelhárításához.</string>
<string name="settings_monitor_mode_label">Monitor mód</string>
<string name="settings_monitor_mode_description">Milyen körülmények között figyeli ez az alkalmazás a Bluetooth-adatokat.</string>
<string name="settings_scanner_mode_label">Szkenner mód</string>
<string name="settings_monitor_mode_manual_label">Amikor az alkalmazás nyitva van</string>
<string name="settings_monitor_mode_automatic_label">Amikor az eszköz csatlakoztatva van</string>
<string name="settings_monitor_mode_always_label">Mindig</string>
<string name="settings_scanner_mode_lowpower_label">Kis fogyasztású</string>
<string name="settings_scanner_mode_balanced_label">Kiegyensúlyozott</string>
<string name="settings_scanner_mode_lowlatency_label">Alacsony késleltetés</string>
<string name="settings_autopause_label">Automatikus megszakítás</string>
<string name="settings_showall_label">Az összes eszköz megjelenítése</string>
<string name="settings_showall_description">Mutassa meg másoknak az Ön közelében lévő eszközeit.</string>
<string name="settings_autopplay_label">Automatikus lejátszás</string>
<string name="settings_fake_data_label">Hamis adat</string>
<string name="settings_debug_label">Hibakeresési beállítások</string>
<string name="settings_debug_description">További beállítások az alkalmazással kapcsolatos problémák megoldásához.</string>
<string name="settings_signal_minimum_label">Minimális jelerősség</string>
<string name="settings_signal_minimum_description">Vegye figyelembe a minimális jelerősséget, amelyre egy eszköznek szüksége van.</string>
<string name="settings_autoconnect_label">Automatikus csatlakozás</string>
<string name="settings_autoconnect_description">Ha az Android nem csatlakozik automatikusan. A monitor mód beállítása „Mindig” lesz.</string>
<string name="settings_autoconnect_condition_label">Automatikus csatlakozás állapota</string>
<string name="settings_autoconnect_condition_description">Mikor próbáljunk meg csatlakozni az eszközéhez?</string>
<string name="settings_reaction_label">Reakciók</string>
<string name="settings_reaction_description">Reagáljon az eseményekre és viselkedésekre.</string>
<string name="settings_category_yourdevice_label">A Te eszközöd</string>
<string name="settings_maindevice_address_label">A készüléked címe</string>
<string name="settings_maindevice_address_description">A párosított eszköz címe. Az alkalmazás ezt használja annak meghatározására, hogy mikor csatlakozik a telefonhoz.</string>
<string name="settings_maindevice_address_none">Semmi</string>
<string name="settings_maindevice_model_label">Az Ön készülékének modellje</string>
<string name="settings_maindevice_model_description">A fő eszköz modellje. Ez segít az alkalmazásnak felismerni az eszközt, amikor az nincs csatlakoztatva a telefonhoz.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Amikor látható</string>
<string name="settings_reaction_autoconnect_caseopen_label">Tok Nyitva</string>
<string name="settings_reaction_autoconnect_inear_label">Fülhallgató</string>
<string name="upgrade_capod_label">CAPod frissítése</string>
<string name="upgrade_capod_description">Szerezzen be további funkciókat és támogassa a fejlesztőt.</string>
<string name="settings_popup_caseopen_label">Előugró ablak megjelenítése</string>
<string name="settings_popup_caseopen_description">Egy előugró ablak megjelenítése az eszköz házának kinyitásakor (kísérleti).</string>
<string name="overview_bluetooth_disabled_label">A Bluetooth kikapcsolva</string>
<string name="overview_bluetooth_disabled_description">Bluetooth kikapcsolva, engedélyezd ;)</string>
<string name="help_translate_label">Fordítás</string>
<string name="settings_onepod_mode_label">Egy fülhallgató mód</string>
<string name="settings_onepod_mode_description">Nem szükséges mindkét fülhallgató viselése, elég egy, a működéshez.</string>
<string name="permission_system_alert_window_label">Rendszer figyelmeztető ablak</string>
<string name="permission_system_alert_window_description">Engedélyezze a CAPod számára, hogy más alkalmazások fölé kerüljön, hogy lehetővé tegye a „Előugró ablak” funkciót.</string>
<string name="last_seen_x">Utoljára volt látható %s</string>
<string name="first_seen_x">Először volt látható: %s</string>
<string name="settings_blescanner_unfiltered_label">Szűretlen BLE adatok</string>
<string name="settings_blescanner_unfiltered_description">Távolítson el minden szűrőt a BLE szkennerből, hogy megjelenjen az összes adat. Hasznos új fejhallgató típusok támogatásához.</string>
<string name="permission_required_title">A következő engedély szükséges:</string>
<string name="translators_thanks_title">Fordító</string>
</resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Status perangkat</string>
<string name="general_error_label">Error</string>
<string name="general_share_action">Bagikan</string>
<string name="general_done_action">Selesai</string>
<string name="general_copy_action">Salin</string>
<string name="general_thank_you_label">Terima kasih</string>
<string name="general_value_not_available_label">T/A</string>
<string name="general_grant_permission_action">Berikan izin</string>
<string name="general_upgrade_action">Tingkatkan</string>
<string name="general_check_action">Memeriksa</string>
<string name="general_close_action">Tutup</string>
<string name="debug_debuglog_size_label">Ukuran</string>
<string name="debug_debuglog_size_compressed_label">Ukuran terkompresi</string>
<string name="debug_notification_channel_label">Notifikasi debug</string>
<string name="debug_debuglog_file_label">File log yang direkam</string>
<string name="debug_debuglog_record_action">Rekam log debug</string>
<string name="permission_bluetooth_connect_label">Bluetooth tersambung</string>
<string name="permission_bluetooth_connect_description">Aplikasi ini memerlukan izin \"Koneksi Bluetooth\" untuk berinteraksi dengan perangkat yang akan dipasangkan &amp; memulai koneksi.</string>
<string name="permission_bluetooth_scan_label">Pemindaian Bluetooth</string>
<string name="permission_bluetooth_scan_description">Izin \"Pemindaian Bluetooth\" memungkinkan aplikasi ini menemukan &amp; menerima data Bluetooth dari perangkat terdekat seperti AirPods anda.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Aplikasi ini memerlukan izin \"Bluetooth\" untuk terhubung ke perangkat bluetooth yang ingin dipasangkan.</string>
<string name="permission_access_fine_location_label">Akses lokasi halus</string>
<string name="permission_access_fine_location_description">CAPod menggunakan izin \"lokasi halus\" untuk menerima data Bluetooth Hemat Energi. Headphone anda menggunakan teknologi Bluetooth Hemat Energi untuk menyiarkan statusnya. Aplikasi ini TIDAK akan menggunakan data Bluetooth untuk menentukan lokasi anda.</string>
<string name="permission_background_location_label">Akses lokasi latar belakang</string>
<string name="permission_background_location_description">CAPod menggunakan \"akses lokasi latar belakang\" untuk mengaktifkan fitur seperti \"Tampilkan popup\" dan \"Sambungan Otomatis\" saat aplikasi ditutup. Akses lokasi latar belakang memungkinkan aplikasi menerima data Bluetooth Hemat Energi saat berada di latar belakang. Aplikasi ini TIDAK akan menggunakan data Bluetooth untuk menentukan lokasi Anda.</string>
<string name="permission_ignore_battery_optimizations_label">Nonaktifkan pengoptimalan baterai</string>
<string name="permission_ignore_battery_optimizations_description">Pengoptimalan baterai mencegah aplikasi ini menerima data Bluetooth secara andal saat aplikasi berada di latar belakang.</string>
<string name="pods_dual_left_label">Pod kiri</string>
<string name="pods_dual_right_label">Pod kanan</string>
<string name="pods_case_label">Kasing</string>
<string name="pods_case_status_open_label">Terbuka</string>
<string name="pods_case_status_closed_label">Tertutup</string>
<string name="pods_connection_state_disconnected_label">Tidak terhubung ke perangkat</string>
<string name="pods_connection_state_idle_label">Terhubung ke perangkat, tetapi menganggur</string>
<string name="pods_connection_state_music_label">Dalam mode musik</string>
<string name="pods_connection_state_call_label">Dalam mode panggilan</string>
<string name="pods_connection_state_ringing_label">Berdering</string>
<string name="pods_connection_state_hanging_up_label">Mengangkat</string>
<string name="pods_connection_state_unknown_label">Status koneksi tidak diketahui</string>
<string name="pods_unknown_raw_data_label">Data mentah</string>
<string name="pods_unknown_label">Perangkat tidak dikenal</string>
<string name="pods_unknown_contact_dev">Ini adalah perangkat yang tidak dikenal, tapi menggunakan format pesan yang serupa. Mari tambahkan dukungan untuk itu, hubungi saya :)</string>
<string name="pods_none_label_short">Tidak ada perangkat</string>
<string name="pods_charging_label">Mengisi</string>
<string name="pods_inear_label">Di telinga</string>
<string name="pods_microphone_label">Mikrofon</string>
<string name="pods_yours">Milikmu</string>
<string name="headset_being_worn_label">Sedang dipakai</string>
<string name="pods_case_unknown_state">Status tidak diketahui</string>
<string name="overview_nomaindevice_label">Tidak ada perangkat utama</string>
<string name="overview_nomaindevice_description">Semua perangkat yang terdeteksi tidak mungkin menjadi milik anda. Nyalakan &amp; sambungkan perangkat anda atau sesuaikan pengaturan.</string>
<string name="settings_label">Pengaturan</string>
<string name="settings_privacy_policy_label">Kebijakan privasi</string>
<string name="settings_privacy_policy_desc">Menangani data secara bertanggung jawab.</string>
<string name="settings_licenses_label">Lisensi</string>
<string name="settings_category_other_label">Lainnya</string>
<string name="settings_general_label">Pengaturan</string>
<string name="settings_general_description">Penyesuaian umum yang memengaruhi seluruh aplikasi.</string>
<string name="settings_acknowledgements_label">Ucapan terima kasih</string>
<string name="changelog_label">Catatan perubahan</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Email pengembang</string>
<string name="settings_support_installid_label">ID pemasangan</string>
<string name="settings_support_installid_desc">Laporan kesalahan otomatis bersifat anonim. Bagikan ID pemasangan anda jika pengembang perlu menemukan laporan kesalahan anda.</string>
<string name="settings_support_label">Dukungan</string>
<string name="settings_support_description">Jika anda membutuhkan bantuan.</string>
<string name="issue_tracker_label">Pelacak masalah</string>
<string name="issue_tracker_description">Pelacak masalah publik untuk laporan bug &amp; permintaan fitur (hanya dalam bahasa Inggris).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Tempat nongkrong &amp; bertanya-tanya.</string>
<string name="settings_support_email_developer_description">Catatan: bahwa saya hanya dapat menjawab dalam bahasa Jerman atau Inggris.</string>
<string name="settings_debug_autoreports_label">Laporan bug otomatis</string>
<string name="settings_debug_autoreports_description">Secara otomatis melaporkan masalah, mis. detail tentang kerusakan aplikasi sehingga saya dapat mengetahui cara memperbaikinya.</string>
<string name="settings_debug_mode_label">Mode debug</string>
<string name="settings_debug_mode_description">Tampilkan informasi tambahan untuk memecahkan masalah.</string>
<string name="settings_monitor_mode_label">Mode monitor</string>
<string name="settings_monitor_mode_description">Dalam keadaan apa aplikasi ini memonitor data Bluetooth.</string>
<string name="settings_scanner_mode_label">Modus memindai</string>
<string name="settings_scanner_mode_description">Haruskah pemindai data Bluetooth Hemat Energi memprioritaskan kinerja atau menghemat energi?</string>
<string name="settings_monitor_mode_manual_label">Saat aplikasi terbuka</string>
<string name="settings_monitor_mode_automatic_label">Saat perangkat terhubung</string>
<string name="settings_monitor_mode_always_label">Selalu</string>
<string name="settings_scanner_mode_lowpower_label">Daya rendah</string>
<string name="settings_scanner_mode_balanced_label">Seimbang</string>
<string name="settings_scanner_mode_lowlatency_label">Latemsi rendah</string>
<string name="settings_autopause_label">Jeda otomatis</string>
<string name="settings_autopause_description">Jeda audio saat melepaskan perangkat dari telinga anda.</string>
<string name="settings_showall_label">Tampilkan semua perangkat</string>
<string name="settings_showall_description">Tampilkan perangkat orang lain yang ada di dekat anda.</string>
<string name="settings_autopplay_label">Putar otomatis</string>
<string name="settings_autoplay_description">Mulai pemutaran audio saat perangkat dipakai.</string>
<string name="settings_fake_data_label">Data palsu</string>
<string name="settings_fake_data_description">Tampilkan data palsu, yaitu, mensimulasikan perangkat yang tidak ada.</string>
<string name="settings_debug_label">Pengaturan debug</string>
<string name="settings_debug_description">Pengaturan tambahan untuk membantu memecahkan masalah dengan aplikasi.</string>
<string name="settings_signal_minimum_label">Kualitas sinyal minimum</string>
<string name="settings_signal_minimum_description">Kualitas sinyal minimum yang harus dimiliki perangkat agar dianggap milik anda.</string>
<string name="settings_autoconnect_label">Sambung otomatis</string>
<string name="settings_autoconnect_description">Jika Android tidak terhubung secara otomatis, kami juga dapat menanyakannya. Ini akan men-set pengaturan mode monitor ke \'Selalu\'.</string>
<string name="settings_autoconnect_condition_label">Kondisi koneksi otomatis</string>
<string name="settings_autoconnect_condition_description">Kapan kami harus mencoba menyambung ke perangkat anda?</string>
<string name="settings_reaction_label">Reaksi</string>
<string name="settings_reaction_description">Bereaksi terhadap peristiwa dan kebiasaan.</string>
<string name="settings_category_yourdevice_label">Perangkat anda</string>
<string name="settings_maindevice_address_label">Alamat perangkat anda</string>
<string name="settings_maindevice_address_description">Alamat perangkat anda yang telah terpasang. Aplikasi menggunakan ini untuk menentukan kapan terhubung ke ponsel anda.</string>
<string name="settings_maindevice_address_none">Tidak ada</string>
<string name="settings_maindevice_model_label">Model perangkat anda</string>
<string name="settings_maindevice_model_description">Model perangkat utama anda. Ini membantu aplikasi mengenali perangkat anda saat tidak terhubung ke ponsel anda.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Saat terlihat</string>
<string name="settings_reaction_autoconnect_caseopen_label">Kasing terbuka</string>
<string name="settings_reaction_autoconnect_inear_label">Di telinga</string>
<string name="upgrade_capod_label">Upgrade CAPod</string>
<string name="upgrade_capod_description">Dapatkan fitur tambahan &amp; bantu dukung pengembang.</string>
<string name="settings_popup_caseopen_label">Tampilkan popup</string>
<string name="settings_popup_caseopen_description">Tampilkan popup saat kasing perangkat dibuka (eksperimental).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth dinonaktifkan</string>
<string name="overview_bluetooth_disabled_description">Bluetooth dinonaktifkan, aktifkan terlebih dahulu ;)</string>
<string name="help_translate_label">Terjemahan</string>
<string name="help_translate_description">Bantu terjemahkan applikasi ini ke bahasa favorit anda.</string>
<string name="settings_onepod_mode_label">Mode satu pod</string>
<string name="settings_onepod_mode_description">Menggunakan kedua pod tidak diperlukan, memakai satu pod sudah cukup untuk memicu reaksi.</string>
<string name="permission_system_alert_window_label">Jendela Peringatan Sistem</string>
<string name="permission_system_alert_window_description">Izinkan CAPod untuk tampil di atas aplikasi lain untuk memungkinkan fitur \"Tampilkan PopUp\".</string>
<string name="last_seen_x">Terakhir terlihat: %s</string>
<string name="first_seen_x">Pertama kali terlihat: %s</string>
<string name="settings_blescanner_unfiltered_label">Data BLE yang tidak difilter</string>
<string name="settings_blescanner_unfiltered_description">Hapus semua filter dari pemindai BLE untuk menampilkan semua data BLE yang disiarkan. Berguna untuk menambahkan dukungan pada jenis headphone baru.</string>
<string name="permission_required_title">Izin berikut diperlukan:</string>
<string name="settings_compatibility_mode_label">Mode kompatibilitas</string>
<string name="settings_compatibility_mode_description">Nonaktifkan pengoptimalan untuk meningkatkan kompatibilitas. Coba ini jika anda tidak melihat data apa pun.</string>
<string name="translators_thanks_title">Penerjemah</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">darken</string>
</resources>
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-138
View File
@@ -1,138 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Stato dispositivo</string>
<string name="general_error_label">Errore</string>
<string name="general_share_action">Condividi</string>
<string name="general_done_action">Fatto</string>
<string name="general_copy_action">Copia</string>
<string name="general_thank_you_label">Grazie</string>
<string name="general_value_not_available_label">N/A</string>
<string name="general_grant_permission_action">Concedi permessi</string>
<string name="general_upgrade_action">Aggiorna</string>
<string name="general_check_action">Controlla</string>
<string name="general_close_action">Chiudi</string>
<string name="debug_debuglog_size_label">Dimensione</string>
<string name="debug_debuglog_size_compressed_label">Dimensione compressa</string>
<string name="debug_notification_channel_label">Notifiche di Debug</string>
<string name="debug_debuglog_file_label">Log file salvato</string>
<string name="debug_debuglog_record_action">Log di debug</string>
<string name="permission_bluetooth_connect_label">Connesione bluetooth</string>
<string name="permission_bluetooth_connect_description">Questa applicazione richiede il permesso di \"Connesione bluetooth\" per interagire con i dispotivi collegati e iniziare le connesioni.</string>
<string name="permission_bluetooth_scan_label">Scansione bluetooth</string>
<string name="permission_bluetooth_scan_description">Il permesso di \"Scansione bluetooth\" permette a questa app di trovare e ricevere dati Bluetooth da dispositivi vicini come le tue Airpods.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Questa app richiede il permesso \"Bluetooth\" per connettersi ai dispoitivi Bluetooth.</string>
<string name="permission_access_fine_location_label">Access fine location</string>
<string name="permission_access_fine_location_description">CAPod usa i permessi di Geolocalizzazione per ricevere dati Bluetooth a basso consumo. Le tue cuffie suano la tecnologia Bluetooth a basso consumo per inviare al dispositivo al quale sono connesse il loro stato. Questa app non utilizza i dati Bluetooth per geolocalizzarti.</string>
<string name="permission_background_location_label">Accesso in background alla tua posizione</string>
<string name="permission_background_location_description">CAPod usa l\'accesso in background alla tua posizione per far funzionare opzioni come \"Mostra popup\" e \"AutoConnect\" mentre l\'applicazione é chiusa. L\'accesso in background abiliterà l\'applicazione nella ricezione di dati Bluetooth a basso consume mentre l\'app non é aperta. Questa applicazione non utilizza i dati Bluetooth per geolocalizzarti.</string>
<string name="permission_ignore_battery_optimizations_label">Disabilita ottimizzazione batteria</string>
<string name="permission_ignore_battery_optimizations_description">L\'ottimizzazione della batteria impedisce a questa applicazione di ricevere dati Bluetooth mentre l\'app é chiusa.</string>
<string name="pods_dual_left_label">Pod sinistra</string>
<string name="pods_dual_right_label">Pod destra</string>
<string name="pods_case_label">Custodia</string>
<string name="pods_case_status_open_label">Aperto</string>
<string name="pods_case_status_closed_label">Chiuso</string>
<string name="pods_connection_state_disconnected_label">Non connesso</string>
<string name="pods_connection_state_idle_label">Connesso ad un device, ma inattivo</string>
<string name="pods_connection_state_music_label">In modalità musica</string>
<string name="pods_connection_state_call_label">In modalità chiamata</string>
<string name="pods_connection_state_ringing_label">Squilla</string>
<string name="pods_connection_state_hanging_up_label">Riconnessione</string>
<string name="pods_connection_state_unknown_label">Stato di connessione sconosciuto</string>
<string name="pods_unknown_raw_data_label">Dati non elaborati</string>
<string name="pods_unknown_label">Dispositivo sconosciuto</string>
<string name="pods_unknown_contact_dev">Questo é un dispositivo sconosciutom ma sta utilizzando un formato di comunicazione noto. Aggiungiamo il supporto per questo device, Contattami! :)</string>
<string name="pods_none_label_short">Nessun dispositivo</string>
<string name="pods_charging_label">In ricarica</string>
<string name="pods_inear_label">Nell\'orecchio</string>
<string name="pods_microphone_label">Microfono</string>
<string name="pods_yours">Tuoi</string>
<string name="headset_being_worn_label">Indossato</string>
<string name="pods_case_unknown_state">Stato sconosciuto</string>
<string name="overview_nomaindevice_label">Nessun device primario</string>
<string name="overview_nomaindevice_description">Tutti i dispositivi rilevati molto probabilmente non sono tuoi. Accendi e connetti i tuoi dispositivi oppure sistema le impostazioni.</string>
<string name="settings_label">Impostazioni</string>
<string name="settings_privacy_policy_label">Politica sulla privacy</string>
<string name="settings_privacy_policy_desc">Gestione dei dati responsabile.</string>
<string name="settings_licenses_label">Licenze</string>
<string name="settings_category_other_label">Altro</string>
<string name="settings_general_label">Impostazioni</string>
<string name="settings_general_description">Modifiche generali che riguardano l\'intera applicazione.</string>
<string name="settings_acknowledgements_label">Riconoscimenti</string>
<string name="changelog_label">Changelog</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Email sviluppatore</string>
<string name="settings_support_installid_label">ID installazione</string>
<string name="settings_support_installid_desc">Le segnalazioni automatiche degli errori sono anonime. Condividi il tuo ID di installazione con lo sviluppatore se necessità di trovare la tua segnalazione all\'interno del registro segnalazioni.</string>
<string name="settings_support_label">Supporto</string>
<string name="settings_support_description">Se ti serve un aiuto.</string>
<string name="issue_tracker_label">Issue tracker</string>
<string name="issue_tracker_description">Un issue tracker pubblico per segnalare i problemi e le richieste per aggiungere nuove funzionalità (solo in inglese).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Un posto dove poter fare domande.</string>
<string name="settings_support_email_developer_description">Sono in grado di rispondere solamente in tedesco oppure in inglee.</string>
<string name="settings_debug_autoreports_label">Segnalazione automatica dei problemi</string>
<string name="settings_debug_autoreports_description">Segnala automatica i problemi con i dettagli sui crash dell\'applicazione così che io possa poi sistemarli.</string>
<string name="settings_debug_mode_label">Modalità di debug</string>
<string name="settings_debug_mode_description">Mostra informazioni aggiuntive per risolvere il problema.</string>
<string name="settings_monitor_mode_label">Monitor mode</string>
<string name="settings_monitor_mode_description">Sotto quali circostanze questa applicazione monitora i dati Bluetooth.</string>
<string name="settings_scanner_mode_label">Modalità di scansione</string>
<string name="settings_scanner_mode_description">Il bluetooth a basso consumo energetico dovrebbe dare priorità alle performance o al risparmio della batteria?</string>
<string name="settings_monitor_mode_manual_label">Quando l\'applicazione è aperta</string>
<string name="settings_monitor_mode_automatic_label">Quando il device è connesso</string>
<string name="settings_monitor_mode_always_label">Sempre</string>
<string name="settings_scanner_mode_lowpower_label">Basso consumo</string>
<string name="settings_scanner_mode_balanced_label">Bilanciato</string>
<string name="settings_scanner_mode_lowlatency_label">Bassa latenza</string>
<string name="settings_autopause_label">Pausa automatica</string>
<string name="settings_autopause_description">Metti in pausa l\'audio quando viene rimossa la cuffia da un orecchio.</string>
<string name="settings_showall_label">Mostra tutti i dispositivi</string>
<string name="settings_showall_description">Mostra i dispositivi delle altre persone vicine a te.</string>
<string name="settings_autopplay_label">Riproduzione automatica</string>
<string name="settings_autoplay_description">Avvia riproduzione audio quando il dispositivo è indossato.</string>
<string name="settings_fake_data_label">Dati immaginari</string>
<string name="settings_fake_data_description">Mostra dati fittizi, ovvero simula dispositivi che in realtà non esistono.</string>
<string name="settings_debug_label">Impostazioni di debug</string>
<string name="settings_debug_description">Impostazioni aggiuntive che possono aiutare a risolvere i problemi con l\'applicazione.</string>
<string name="settings_signal_minimum_label">Qualità del segnale minima</string>
<string name="settings_signal_minimum_description">La minima qualità del segnale che il dispositivo necessità per poter essere considerato tuo.</string>
<string name="settings_autoconnect_label">Connessione automatica</string>
<string name="settings_autoconnect_description">Se android non si connette automaticamente, noi possiamo chiedergli di farlo. Questo imposterà la modalità di monitoramento su \'sempre\'.</string>
<string name="settings_autoconnect_condition_label">Condizione per la connessione automatica</string>
<string name="settings_autoconnect_condition_description">Quando dovremmo provare a connetere il tuo dispositivo?</string>
<string name="settings_reaction_label">Reazioni</string>
<string name="settings_reaction_description">Reazione ad eventi o comportamenti.</string>
<string name="settings_category_yourdevice_label">Il tuo dispositivo</string>
<string name="settings_maindevice_address_label">L\'indirizzo del tuo dispositivo</string>
<string name="settings_maindevice_address_description">L\'indirizzo del dispositivo connesso. L\'applicazione usa questo per determinare quando il tuo dispositivo è connesso al telefono.</string>
<string name="settings_maindevice_address_none">Niente</string>
<string name="settings_maindevice_model_label">Il modello del tuo dispositivo</string>
<string name="settings_maindevice_model_description">Il modello del tuo dispositivo principale. Questo aiuta la applicazione a riconoscere il tuo dispositivo quando non è connesso al tuo telefono.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Quando rilevato</string>
<string name="settings_reaction_autoconnect_caseopen_label">La custodia é aperta</string>
<string name="settings_reaction_autoconnect_inear_label">Nell\'orecchio</string>
<string name="upgrade_capod_label">Aggiorna CAPod</string>
<string name="upgrade_capod_description">Ottieni funzionalità aggiuntive e supporta lo sviluppatore.</string>
<string name="settings_popup_caseopen_label">Mostra popup</string>
<string name="settings_popup_caseopen_description">Mostra un popup quando la custodia del dispositivo è aperta (sperimentale).</string>
<string name="overview_bluetooth_disabled_label">Il Bluetooth é disabilitato</string>
<string name="overview_bluetooth_disabled_description">Il bluetooth é disabilitato, abilitalo ;)</string>
<string name="help_translate_label">Traduzione</string>
<string name="help_translate_description">Aiuta a tradurre l\'applicazione nella tua lingua preferita.</string>
<string name="settings_onepod_mode_label">Modalità singolo pod</string>
<string name="settings_onepod_mode_description">Indossare entrambi i pod non è necessario, indossare un singolo pod è sufficiente per far funzionare le reazioni.</string>
<string name="permission_system_alert_window_label">Finestra di avviso di sistema</string>
<string name="permission_system_alert_window_description">Permetti a CAPod di far apprarire overlay sopra le altre applicazioni per far funzionare \"Mostra PopUp\".</string>
<string name="last_seen_x">Ultimo accesso: %s</string>
<string name="first_seen_x">Primo accesso: %s</string>
<string name="settings_blescanner_unfiltered_label">Dati BLE non filtrati</string>
<string name="settings_blescanner_unfiltered_description">Rimuovi eventuali filtri dallo scanner BLE per mostrate tutti i dati BLE trasmetti. Utile per aggiungere supporto per nuovi tipi di cuffie.</string>
<string name="permission_required_title">È richiesta la seguente autorizzazione:</string>
<string name="settings_compatibility_mode_label">Modalità di compatibilità</string>
<string name="settings_compatibility_mode_description">Disattiva le ottimizzazioni per migliorare la compatibilità. Prova questa opzione se non vedi alcun dato.</string>
<string name="translators_thanks_title">Traduttori</string>
</resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod מקצועי</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">מצב המכשיר</string>
<string name="general_error_label">שגיאה</string>
<string name="general_share_action">שתף</string>
<string name="general_done_action">בוצע</string>
<string name="general_copy_action">העתק</string>
<string name="general_thank_you_label">תודה רבה</string>
<string name="general_value_not_available_label">לא זמין</string>
<string name="general_grant_permission_action">מתן רשות</string>
<string name="general_upgrade_action">שידרוג</string>
<string name="general_check_action">בדיקה</string>
<string name="general_close_action">סגור</string>
<string name="debug_debuglog_size_label">מידה</string>
<string name="debug_debuglog_size_compressed_label">גודל דחיסה</string>
<string name="debug_notification_channel_label">ניפוי באגים</string>
<string name="debug_debuglog_file_label">קובץ לוג מוקלט</string>
<string name="debug_debuglog_record_action">הקלט יומן ניפוי באגים</string>
<string name="permission_bluetooth_connect_label">חיבור Bluetooth</string>
<string name="permission_bluetooth_connect_description">אפליקציה זו דורשת הרשאת \"חיבור Bluetooth\" כדי ליצור אינטראקציה עם מכשירים מותאמים וליזום חיבורים.</string>
<string name="permission_bluetooth_scan_label">סריקת Bluetooth</string>
<string name="permission_bluetooth_scan_description">הרשאת \"סריקת Bluetooth\" מאפשרת לאפליקציה הזו לגלות ולקבל נתוני Bluetooth ממכשירים קרובים כמו ה-AirPods שלך.</string>
<string name="permission_bluetooth_label">בלוטות</string>
<string name="permission_bluetooth_description">אפליקציה זו דורשת הרשאת \"בלוטות\'\" כדי להתחבר למכשירי בלוטות\' מותאמים.</string>
<string name="permission_access_fine_location_label">גישה למיקום מדוייק</string>
<string name="permission_access_fine_location_description">CAPod משתמש בהרשאת \"שיפור מיקום\" כדי לקבל הפחתת צריכת אנרגיה בנתוני Bluetooth. האוזניות שלך משתמשות בטכנולוגיית Bluetooth Low Energy כדי לשדר את הסטטוס שלהן. אפליקציה זו לא תשתמש בנתוני Bluetooth כדי לקבוע את מיקומך.</string>
<string name="permission_background_location_label">גישה למיקום ברקע</string>
<string name="permission_background_location_description">CAPod משתמש ב\"גישה למיקום ברקע\" כדי לאפשר תכונות כמו \"הצג התראה\" ו\"חיבור אוטומטי\" בזמן שהאפליקציה סגורה. גישה למיקום ברקע מאפשרת לאפליקציה לקבל נתוני Bluetooth Low Energy כשהיא ברקע. אפליקציה זו לא תשתמש בנתוני Bluetooth כדי לקבוע את מיקומך.</string>
<string name="permission_ignore_battery_optimizations_label">כבה את אופטימיזציית הסוללה</string>
<string name="permission_ignore_battery_optimizations_description">אופטימיזציות של סוללה מונעות מהאפליקציה הזו לקבל נתוני Bluetooth באופן בטוח כשהאפליקציה נמצאת ברקע.</string>
<string name="pods_dual_left_label">אוזניה שמאלית</string>
<string name="pods_dual_right_label">אוזניה ימנית</string>
<string name="pods_case_label">מארז</string>
<string name="pods_case_status_open_label">פתוח</string>
<string name="pods_case_status_closed_label">סגור</string>
<string name="pods_connection_state_disconnected_label">לא מחובר למכשיר</string>
<string name="pods_connection_state_idle_label">מחובר למכשיר, אבל לא פעיל</string>
<string name="pods_connection_state_music_label">במצב מוזיקה</string>
<string name="pods_connection_state_call_label">במצב שיחה</string>
<string name="pods_connection_state_ringing_label">מצלצל</string>
<string name="pods_connection_state_hanging_up_label">מנתק</string>
<string name="pods_connection_state_unknown_label">מצב חיבור לא ידוע</string>
<string name="pods_unknown_raw_data_label">נתונים גולמיים</string>
<string name="pods_unknown_label">מכשיר לא ידוע</string>
<string name="pods_unknown_contact_dev">מכשיר זה אינו יגיע, אבל עושה שימוש בפורמט הודעה דומה. בואו נוסיף תמיכה עבורו, צרו עימי קשר :)</string>
<string name="pods_none_label_short">מכשיר לא קיים</string>
<string name="pods_charging_label">טוען</string>
<string name="pods_inear_label">באוזן</string>
<string name="pods_microphone_label">מיקרופון</string>
<string name="pods_yours">שנים</string>
<string name="headset_being_worn_label">להיות משוחק</string>
<string name="pods_case_unknown_state">מצב לא ידוע</string>
<string name="overview_nomaindevice_label">אין מכשיר ראשי</string>
<string name="overview_nomaindevice_description">לא יתכן שכל המכשירים המזוהים הם שלך. הפעל וחבר את המכשיר או התאם את ההגדרות.</string>
<string name="settings_label">הגדרות</string>
<string name="settings_privacy_policy_label">מדיניות הפרטיות</string>
<string name="settings_privacy_policy_desc">טיפול בנתונים בצורה אחראית.</string>
<string name="settings_licenses_label">רישיונות</string>
<string name="settings_category_other_label">אחר</string>
<string name="settings_general_label">הגדרות</string>
<string name="settings_general_description">שינויים כלליים שמשפיעים על האפליקציה כולה.</string>
<string name="settings_acknowledgements_label">תודות</string>
<string name="changelog_label">יומן שינויים</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">אימייל של המפתח</string>
<string name="settings_support_installid_label">מזהה התקנה</string>
<string name="settings_support_installid_desc">דוחות שגיאה אוטומטיים הם אנונימיים. שתף את מזהה ההתקנה שלך אם המפתח צריך למצוא את דוחות השגיאות שלך.</string>
<string name="settings_support_label">תמיכה</string>
<string name="settings_support_description">אם אתה צריך קצת עזרה.</string>
<string name="issue_tracker_label">מאתר בעיות</string>
<string name="issue_tracker_description">מעקב אחר בעיות ציבוריות לדיווחי באגים ובקשות לתכונות (באנגלית בלבד).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">מקום לבלות בו ולשאול שאלות.</string>
<string name="settings_support_email_developer_description">שימו לב שאני יכול להגיב רק בגרמנית או באנגלית.</string>
<string name="settings_debug_autoreports_label">דוחות באגים אוטומטיים</string>
<string name="settings_debug_autoreports_description">מדווח אוטומטית על בעיות, למשל, פרטים על קריסת אפליקציה כדי שאוכל להבין איך לתקן את זה.</string>
<string name="settings_debug_mode_label">מצב ניפוי באגים</string>
<string name="settings_debug_mode_description">הצג מידע נוסף לפתרון בעיות.</string>
<string name="settings_monitor_mode_label">מצב מוניטור</string>
<string name="settings_monitor_mode_description">באילו נסיבות אפליקציה זו עוקבת אחר נתוני Bluetooth.</string>
<string name="settings_scanner_mode_label">מצב סורק</string>
<string name="settings_scanner_mode_description">האם סורק ה-Bluetooth Low Energy צריך לתת עדיפות לביצועים או לחסוך באנרגיה?</string>
<string name="settings_monitor_mode_manual_label">כאשר האפליקציה פתוחה</string>
<string name="settings_monitor_mode_automatic_label">כאשר המכשיר מחובר</string>
<string name="settings_monitor_mode_always_label">תמיד</string>
<string name="settings_scanner_mode_lowpower_label">צריכת חשמל נמוכה</string>
<string name="settings_scanner_mode_balanced_label">מאוזן</string>
<string name="settings_scanner_mode_lowlatency_label">זמן אחזור נמוך</string>
<string name="settings_autopause_label">השהייה אוטומטית</string>
<string name="settings_autopause_description">עצירת אודיו בהסרת המכשיר מהאוזן.</string>
<string name="settings_showall_label">הצג את כל המכשירים</string>
<string name="settings_showall_description">הצג מכשירים של אנשים אחרים שנמצאים בקרבתך.</string>
<string name="settings_autopplay_label">הפעלה אוטומטית</string>
<string name="settings_autoplay_description">התחלת ניגון אודיו בלבישת המכשיר.</string>
<string name="settings_fake_data_label">נתונים מזויפים</string>
<string name="settings_fake_data_description">הצגת נתונים מזויפים, לרבות, הדמיית מכשירים שאינם קיימים.</string>
<string name="settings_debug_label">הגדרות ניפוי באגים</string>
<string name="settings_debug_description">הגדרות נוספות שיסייעו בפתרון בעיות באפליקציה.</string>
<string name="settings_signal_minimum_label">איכות אות מינימלית</string>
<string name="settings_signal_minimum_description">איכות האות המינימלית שמכשיר צריך להתחשב עבורך.</string>
<string name="settings_autoconnect_label">חיבור אוטומטי</string>
<string name="settings_autoconnect_description">אם אנדרואיד לא מתחבר אוטומטית, אנחנו גם יכולים לבקש זאת. פעולה זו תגדיר את הגדרת מצב ניתור ל\'תמיד\'.</string>
<string name="settings_autoconnect_condition_label">מצב חיבור אוטומטי</string>
<string name="settings_autoconnect_condition_description">מתי עלינו לנסות להתחבר למכשיר שלך?</string>
<string name="settings_reaction_label">תגובות</string>
<string name="settings_reaction_description">להגיב לאירועים והתנהגויות.</string>
<string name="settings_category_yourdevice_label">המכשיר שלך</string>
<string name="settings_maindevice_address_label">כתובת המכשיר שלך</string>
<string name="settings_maindevice_address_description">הכתובת של המכשיר המחובר שלך. האפליקציה משתמשת בזה כדי לקבוע מתי היא מחוברת לטלפון שלך.</string>
<string name="settings_maindevice_address_none">אף אחד</string>
<string name="settings_maindevice_model_label">דגם המכשיר שלך</string>
<string name="settings_maindevice_model_description">הדגם של המכשיר הראשי שלך. זה עוזר לאפליקציה לזהות את המכשיר שלך כשהוא לא מחובר לטלפון שלך.</string>
<string name="settings_reaction_autoconnect_whenseen_label">כאשר רואים</string>
<string name="settings_reaction_autoconnect_caseopen_label">המארז פתוח</string>
<string name="settings_reaction_autoconnect_inear_label">באוזן</string>
<string name="upgrade_capod_label">שדרוג CAPod</string>
<string name="upgrade_capod_description">קבל תכונות נוספות ותמיכה במפתח.</string>
<string name="settings_popup_caseopen_label">הצג הודעה</string>
<string name="settings_popup_caseopen_description">הצג חלון הודעה כאשר מארז המכשיר נפתח (ניסיוני).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth כבוי</string>
<string name="overview_bluetooth_disabled_description">בלוטות\' מכובה, יש להדליקו ;)</string>
<string name="help_translate_label">תרגום</string>
<string name="help_translate_description">עזרו בתרגום אפליקציה זו לשפה המועדפת עליכם.</string>
<string name="settings_onepod_mode_label">מצב אוזניה בודדת</string>
<string name="settings_onepod_mode_description">אין צורך לענוד את שני האוזניות, לבישת אוזניה בודדת מספיקה כדי לעורר תגובות.</string>
<string name="permission_system_alert_window_label">חלון התראות מערכת</string>
<string name="permission_system_alert_window_description">אפשר ל-CAPod לצייר מעל אפליקציות אחרות כדי לאפשר את התכונה \"הצג חלון הודעות\".</string>
<string name="last_seen_x">נראה לאחרונה: %s</string>
<string name="first_seen_x">נראה לראשונה: %s</string>
<string name="settings_blescanner_unfiltered_label">נתוני BLE לא מפולטרים</string>
<string name="settings_blescanner_unfiltered_description">הסר מסננים מסורק BLE כדי להציג את כל נתוני BLE ששודרו. שימושי להוספת תמיכה בסוגי אוזניות חדשים.</string>
<string name="permission_required_title">ההרשאה הבאה נדרשת:</string>
<string name="settings_compatibility_mode_label">מצב תאימות</string>
<string name="settings_compatibility_mode_description">נטרול אופטימיזציה לשיפור התאימות. נסו את זה אם לא מוצגים נתונים כלל.</string>
<string name="translators_thanks_title">מתרגמים</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">AL_Cool_T</string>
</resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">デバイスの状態</string>
<string name="general_error_label">エラー</string>
<string name="general_share_action">共有</string>
<string name="general_done_action">完了</string>
<string name="general_copy_action">コピー</string>
<string name="general_thank_you_label">ありがとう</string>
<string name="general_value_not_available_label">該当なし</string>
<string name="general_grant_permission_action">許可する</string>
<string name="general_upgrade_action">アップグレード</string>
<string name="general_check_action">確認</string>
<string name="general_close_action">閉じる</string>
<string name="debug_debuglog_size_label">サイズ</string>
<string name="debug_debuglog_size_compressed_label">圧縮サイズ</string>
<string name="debug_notification_channel_label">デバッグ通知</string>
<string name="debug_debuglog_file_label">記録されたログファイル</string>
<string name="debug_debuglog_record_action">デバッグログを記録する</string>
<string name="permission_bluetooth_connect_label">Bluetooth接続</string>
<string name="permission_bluetooth_connect_description">このアプリでは、ペアリングされたデバイスとやり取りして接続を開始するには、「Bluetooth接続」の権限が必要です。</string>
<string name="permission_bluetooth_scan_label">Bluetoothスキャン</string>
<string name="permission_bluetooth_scan_description">「Bluetooth スキャン」権限により、このアプリはAirPodsなどの近くのデバイスからBluetoothのデータを検出して受信することができます。</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">このアプリは、ペアリングされたBluetoothデバイスに接続するために「Bluetooth」権限が必要です。</string>
<string name="permission_access_fine_location_label">正確な位置情報</string>
<string name="permission_access_fine_location_description">CAPodは、Bluetooth Low Energyデータを受信するために、「正確な位置情報」権限の許可を使用します。ヘッドホンはBluetooth Low Energyテクノロジーを使用してデバイスの状態を送信します。このアプリは、Bluetoothデータを使用して現在地を特定することはありません。</string>
<string name="permission_background_location_label">バックグラウンドでの位置情報へのアクセス</string>
<string name="permission_background_location_description">CAPodは「バックグラウンドでの位置情報へのアクセス」を使用して、アプリが閉じている間に「ポップアップ表示」や「自動接続」などの機能を有効にします。バックグラウンドでの位置情報アクセスにより、アプリはバックグラウンドでBluetooth Low Energyデータを受信できます。このアプリはBluetoothデータを使用して現在地を特定しません。</string>
<string name="permission_ignore_battery_optimizations_label">バッテリーの最適化を無効にする</string>
<string name="permission_ignore_battery_optimizations_description">バッテリーの最適化により、アプリがバックグラウンドにある間、このアプリはBluetoothデータを確実に受信できなくなります。</string>
<string name="pods_dual_left_label">左側</string>
<string name="pods_dual_right_label">右側</string>
<string name="pods_case_label">ケース</string>
<string name="pods_case_status_open_label">開いています</string>
<string name="pods_case_status_closed_label">閉じています</string>
<string name="pods_connection_state_disconnected_label">デバイスが接続されていません</string>
<string name="pods_connection_state_idle_label">デバイスに接続されていますが、アイドル状態です</string>
<string name="pods_connection_state_music_label">音楽モード中</string>
<string name="pods_connection_state_call_label">通話モード中</string>
<string name="pods_connection_state_ringing_label">着信中</string>
<string name="pods_connection_state_hanging_up_label">通話を終了</string>
<string name="pods_connection_state_unknown_label">接続状態が不明</string>
<string name="pods_unknown_raw_data_label">RAWデータ</string>
<string name="pods_unknown_label">不明なデバイス</string>
<string name="pods_unknown_contact_dev">これは不明なデバイスですが、似ている信号の形式が使われています。サポートをするために、連絡をください。(^-^)</string>
<string name="pods_none_label_short">デバイスなし</string>
<string name="pods_charging_label">充電中</string>
<string name="pods_inear_label">耳に装着中</string>
<string name="pods_microphone_label">マイク</string>
<string name="pods_yours">あなたの</string>
<string name="headset_being_worn_label">着用中</string>
<string name="pods_case_unknown_state">不明な状態</string>
<string name="overview_nomaindevice_label">主要なデバイスがありません</string>
<string name="overview_nomaindevice_description">検出されたすべてのデバイスは、あなたのものである可能性は低いです。デバイスの電源を入れて接続するか、設定を調整してください。</string>
<string name="settings_label">設定</string>
<string name="settings_privacy_policy_label">個人情報の取り扱いについて</string>
<string name="settings_privacy_policy_desc">責任を持ってデータを取り扱います。</string>
<string name="settings_licenses_label">ライセンス情報</string>
<string name="settings_category_other_label">その他</string>
<string name="settings_general_label">全般</string>
<string name="settings_general_description">アプリの一般的な設定</string>
<string name="settings_acknowledgements_label">謝辞</string>
<string name="changelog_label">更新の内容</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">開発者にメールを送る</string>
<string name="settings_support_installid_label">インストールID</string>
<string name="settings_support_installid_desc">自動エラーレポートは匿名です。開発者があなたのエラーレポートを見つける必要がある場合は、インストールIDを共有してください。</string>
<string name="settings_support_label">サポート</string>
<string name="settings_support_description">何か困ったことがあったら</string>
<string name="issue_tracker_label">イシュー・トラッカー</string>
<string name="issue_tracker_description">バグレポートや機能要望のための公開されたイシュー・トラッカー(英語のみ)。</string>
<string name="discord_label">Discord</string>
<string name="discord_description">質問がしやすい場所です。</string>
<string name="settings_support_email_developer_description">ドイツ語または英語での対応となります。</string>
<string name="settings_debug_autoreports_label">自動的にバグレポートを送信</string>
<string name="settings_debug_autoreports_description">アプリのクラッシュに関する詳細情報など、問題を自動的に報告してくれるので、修正の方法を把握することができます。</string>
<string name="settings_debug_mode_label">デバッグモード</string>
<string name="settings_debug_mode_description">トラブルシューティングのための追加情報を表示します。</string>
<string name="settings_monitor_mode_label">モニターモード</string>
<string name="settings_monitor_mode_description">いつ、このアプリがBluetoothデータの監視をしますか。</string>
<string name="settings_scanner_mode_label">スキャンモード</string>
<string name="settings_scanner_mode_description">Bluetooth Low Energyデータスキャンは、パフォーマンスと省電力のどちらを優先すべきでしょうか?</string>
<string name="settings_monitor_mode_manual_label">アプリ起動時</string>
<string name="settings_monitor_mode_automatic_label">デバイス接続時</string>
<string name="settings_monitor_mode_always_label">常に</string>
<string name="settings_scanner_mode_lowpower_label">省電力</string>
<string name="settings_scanner_mode_balanced_label">バランス</string>
<string name="settings_scanner_mode_lowlatency_label">低遅延</string>
<string name="settings_autopause_label">自動停止</string>
<string name="settings_autopause_description">耳から外したときに再生を一時停止する。</string>
<string name="settings_showall_label">すべてのデバイスを表示</string>
<string name="settings_showall_description">近くにいる他の人の端末を表示します。</string>
<string name="settings_autopplay_label">自動再生</string>
<string name="settings_autoplay_description">装着時に再生を開始する。</string>
<string name="settings_fake_data_label">フェイクデータ</string>
<string name="settings_fake_data_description">実在しない機器を模したフェイクデータを表示する。</string>
<string name="settings_debug_label">デバッグ用の設定</string>
<string name="settings_debug_description">トラブルシューティングに役立つ追加設定。</string>
<string name="settings_signal_minimum_label">最低限必要な信号品質</string>
<string name="settings_signal_minimum_description">デバイスが自分のものとみなすために必要な最低限の信号品質。</string>
<string name="settings_autoconnect_label">自動接続</string>
<string name="settings_autoconnect_description">Androidが自動的に接続しない場合は、こちらからも問い合わせることができます。これにより、モニターモードの設定が「常に」になります。</string>
<string name="settings_autoconnect_condition_label">自動接続の条件</string>
<string name="settings_autoconnect_condition_description">いつ接続を試みればよいですか。</string>
<string name="settings_reaction_label">アクション</string>
<string name="settings_reaction_description">イベントや行動に対して機能が動作します。</string>
<string name="settings_category_yourdevice_label">あなたのデバイス</string>
<string name="settings_maindevice_address_label">あなたのデバイスのアドレス</string>
<string name="settings_maindevice_address_description">ペアリングされたデバイスのアドレス。 アプリはこれを使って、携帯電話にいつ接続されたかを判断します。</string>
<string name="settings_maindevice_address_none">無し</string>
<string name="settings_maindevice_model_label">あなたのデバイスのモデル</string>
<string name="settings_maindevice_model_description">あなたが主に使うデバイスのモデルです。これにより、デバイスが機器に接続されていないときに、アプリがデバイスを認識しやすくなります。</string>
<string name="settings_reaction_autoconnect_whenseen_label">デバイスが見えたとき</string>
<string name="settings_reaction_autoconnect_caseopen_label">ケースが開いたとき</string>
<string name="settings_reaction_autoconnect_inear_label">デバイスを装着したとき</string>
<string name="upgrade_capod_label">CAPodをアップグレード</string>
<string name="upgrade_capod_description">追加機能を取得し、開発者を支援する。</string>
<string name="settings_popup_caseopen_label">ポップアップ表示</string>
<string name="settings_popup_caseopen_description">デバイスのケースが開いたときにポップアップを表示します (実験的)。</string>
<string name="overview_bluetooth_disabled_label">Bluetoothが無効になっています</string>
<string name="overview_bluetooth_disabled_description">Bluetoothが無効になっています。有効にしてください(;_;)</string>
<string name="help_translate_label">翻訳</string>
<string name="help_translate_description">このアプリをあなたの好きな言語に翻訳するのを手伝ってください。</string>
<string name="settings_onepod_mode_label">片耳モード</string>
<string name="settings_onepod_mode_description">両方装着する必要はなく、1つだけを装着することで反応します。</string>
<string name="permission_system_alert_window_label">他のアプリの上に重ねて表示できるようにする。</string>
<string name="permission_system_alert_window_description">CAPodが他のアプリの上に描画できるようにして、「ポップアップ表示」機能を有効にします。</string>
<string name="last_seen_x">最後に確認した時間:%s</string>
<string name="first_seen_x">最初に確認した時間:%s</string>
<string name="settings_blescanner_unfiltered_label">未処理のBLEデータ</string>
<string name="settings_blescanner_unfiltered_description">Bluetooth Low EnergyBLE)のフィルタを完全に削除して、すべての配信されているBLEデータを表示します。 新しいデバイスをアプリでサポートしようとするために便利です。</string>
<string name="permission_required_title">次の権限の許可が必要です:</string>
<string name="settings_compatibility_mode_label">互換モード</string>
<string name="settings_compatibility_mode_description">互換性を向上させるために最適化を無効にします。データが表示されない場合は、こちらをお試しください。</string>
<string name="translators_thanks_title">翻訳者</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">OrangeOC(translation.love@na-cat.com)</string>
</resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">디바이스 상태</string>
<string name="general_error_label">오류</string>
<string name="general_share_action">공유</string>
<string name="general_done_action">완료</string>
<string name="general_copy_action">복사</string>
<string name="general_thank_you_label">감사합니다</string>
<string name="general_value_not_available_label">N/A</string>
<string name="general_grant_permission_action">권한 부여</string>
<string name="general_upgrade_action">업그레이드</string>
<string name="general_check_action">체크</string>
<string name="general_close_action">닫기</string>
<string name="debug_debuglog_size_label">크기</string>
<string name="debug_debuglog_size_compressed_label">압축된 크기</string>
<string name="debug_notification_channel_label">디버그 알림</string>
<string name="debug_debuglog_file_label">기록된 로그 파일</string>
<string name="debug_debuglog_record_action">기록된 디버그 로그</string>
<string name="permission_bluetooth_connect_label">블루투스 연결</string>
<string name="permission_bluetooth_connect_description">이 앱은 페어링된 기기와 상호작용하고 연결을 시작하기 위해 블루투스 연결 권한을 필요로 합니다.</string>
<string name="permission_bluetooth_scan_label">블루투스 스캔</string>
<string name="permission_bluetooth_scan_description">블루투스 스캔 권한은 앱이 AirPods와 같은 주변 기기에서 블루투스 정보를 받을 수 있게 합니다.</string>
<string name="permission_bluetooth_label">블루투스</string>
<string name="permission_bluetooth_description">이 앱은 페어링된 기기에 접근하기 위해 블루투스 권한을 필요로 합니다.</string>
<string name="permission_access_fine_location_label">정밀 위치 접근</string>
<string name="permission_access_fine_location_description">CAPod는 저전력 블루투스 정보를 받기 위해 정밀 위치 접근 권한을 사용합니다. 앱은 블루투스 헤드폰의 저전력 블루투스 기술을 사용해 기기의 상태에 접근합니다. CAPod는 이 권한으로 사용자의 위치를 확인하지 않습니다.</string>
<string name="permission_background_location_label">백그라운드 위치 접근</string>
<string name="permission_background_location_description">CAPod는 팝업 보기나 자동 연결과 같은 기능을 앱이 꺼져있는 상태에서도 사용할 수 있게 하기 위해 백그라운드 위치 접근 권한을 사용합니다. 백그라운드 위치 접근 권한은 백그라운드에서도 저전력 블루투스 정보를 받을 수 있게 합니다. CAPod는 이 권한으로 사용자의 위치를 확인하지 않습니다.</string>
<string name="permission_ignore_battery_optimizations_label">배터리 최적화 비활성화</string>
<string name="permission_ignore_battery_optimizations_description">배터리 최적화 기능은 앱이 안정적으로 백그라운드에서 블루투스 정보를 받는 것을 막습니다.</string>
<string name="pods_dual_left_label">왼쪽</string>
<string name="pods_dual_right_label">오른쪽</string>
<string name="pods_case_label">케이스</string>
<string name="pods_case_status_open_label">열림</string>
<string name="pods_case_status_closed_label">닫힘</string>
<string name="pods_connection_state_disconnected_label">기기에 연결되지 않음</string>
<string name="pods_connection_state_idle_label">작동하고 있지 않은 기기에 연결됨</string>
<string name="pods_connection_state_music_label">음악 모드</string>
<string name="pods_connection_state_call_label">통화 모드</string>
<string name="pods_connection_state_ringing_label">울리는 중</string>
<string name="pods_connection_state_hanging_up_label">끊는 중</string>
<string name="pods_connection_state_unknown_label">연결 상태 알 수 없음</string>
<string name="pods_unknown_raw_data_label">원시 데이터</string>
<string name="pods_unknown_label">알 수 없는 기기</string>
<string name="pods_unknown_contact_dev">알 수 없는 기기이나 블루투스 헤드폰과 비슷한 기기인 것 같습니다. 제게 알려주시면 앱에 해당 기기 지원을 추가해 드릴게요 :)</string>
<string name="pods_none_label_short">기기 없음</string>
<string name="pods_charging_label">충전 중</string>
<string name="pods_inear_label">귀에 있음</string>
<string name="pods_microphone_label">마이크</string>
<string name="pods_yours">소유함</string>
<string name="headset_being_worn_label">쓰고 있음</string>
<string name="pods_case_unknown_state">알 수 없는 상태</string>
<string name="overview_nomaindevice_label">내 기기 없음</string>
<string name="overview_nomaindevice_description">감지된 모든 기기가 다른 사람의 기기인 것 같습니다. 기기를 켠 다음 연결하거나 설정을 조정하세요.</string>
<string name="settings_label">설정</string>
<string name="settings_privacy_policy_label">개인 정보 보호 정책</string>
<string name="settings_privacy_policy_desc">여러분의 개인정보는 소중하니까요.</string>
<string name="settings_licenses_label">라이센스</string>
<string name="settings_category_other_label">기타</string>
<string name="settings_general_label">설정</string>
<string name="settings_general_description">앱 전체에 영향을 주는 일반적인 설정들입니다.</string>
<string name="settings_acknowledgements_label">감사의 말</string>
<string name="changelog_label">체인지로그</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">개발자에게 메일 보내기</string>
<string name="settings_support_installid_label">설치 ID</string>
<string name="settings_support_installid_desc">자동 오류 보고는 익명성이 보장됩니다. 개발자가 오류 보고서를 필요로 할 때 설치 ID를 알려주세요.</string>
<string name="settings_support_label">지원</string>
<string name="settings_support_description">가끔 도움이 필요할 때도 있지요.</string>
<string name="issue_tracker_label">이슈 트래커</string>
<string name="issue_tracker_description">오류 제보와 새 기능 제안 등을 받는 공개 이슈 트래커입니다. (영어 전용)</string>
<string name="discord_label">디스코드</string>
<string name="discord_description">수다 떨고 질문하며 쉬다 가세요.</string>
<string name="settings_support_email_developer_description">아, 참고로 개발자는 영어와 독일어만 할 수 있어요.</string>
<string name="settings_debug_autoreports_label">자동 오류 보고</string>
<string name="settings_debug_autoreports_description">자동으로 오류를 보고합니다. 예를 들어 앱이 비정상적으로 갑자기 종료한 이유를 찾기 위해 사용합니다.</string>
<string name="settings_debug_mode_label">디버그 모드</string>
<string name="settings_debug_mode_description">문제 해결을 위해 몇 가지 정보를 더 표시합니다.</string>
<string name="settings_monitor_mode_label">모니터링 모드</string>
<string name="settings_monitor_mode_description">어떤 상황에서 블루투스 정보를 열람하는지 설정합니다.</string>
<string name="settings_scanner_mode_label">스캐너 모드</string>
<string name="settings_scanner_mode_description">저전력 블루투스 데이터 스캐너가 성능과 전력 효율 중 무엇을 우선으로 할 지 선택합니다.</string>
<string name="settings_monitor_mode_manual_label">앱이 열려 있을 때</string>
<string name="settings_monitor_mode_automatic_label">기기가 연결되어 있을 때</string>
<string name="settings_monitor_mode_always_label">항상</string>
<string name="settings_scanner_mode_lowpower_label">저전력</string>
<string name="settings_scanner_mode_balanced_label">균형있게</string>
<string name="settings_scanner_mode_lowlatency_label">저레이턴시</string>
<string name="settings_autopause_label">자동 일시정지</string>
<string name="settings_autopause_description">기기를 귀에서 뺄 때 오디오를 일시정지합니다.</string>
<string name="settings_showall_label">모든 기기 보이기</string>
<string name="settings_showall_description">다른 사람의 기기도 보이게 합니다.</string>
<string name="settings_autopplay_label">자동 재생</string>
<string name="settings_autoplay_description">귀에 기기를 착용하면 오디오를 다시 시작합니다.</string>
<string name="settings_fake_data_label">가짜 데이터</string>
<string name="settings_fake_data_description">가짜 기기에 연결하는 것처럼 보이는 등 가짜 정보를 보여줍니다.</string>
<string name="settings_debug_label">디버그 설정</string>
<string name="settings_debug_description">문제 해결을 위한 추가 설정들입니다.</string>
<string name="settings_signal_minimum_label">최소 연결 품질</string>
<string name="settings_signal_minimum_description">기기가 사용자의 것인지 다른 사람의 것인지 판단하는 최소의 연결 품질입니다.</string>
<string name="settings_autoconnect_label">자동 연결</string>
<string name="settings_autoconnect_description">만약 안드로이드에서 자동으로 연결하지 않으면, 앱에서 자동 연결할 수 있습니다. 이 경우 모니터링 모드가 \'항상\' 으로 설정됩니다.</string>
<string name="settings_autoconnect_condition_label">자동 연결 조건</string>
<string name="settings_autoconnect_condition_description">자동 연결을 시도하는 조건을 설정할 수 있습니다.</string>
<string name="settings_reaction_label">반응</string>
<string name="settings_reaction_description">이벤트나 자극에 반응합니다.</string>
<string name="settings_category_yourdevice_label">내 기기</string>
<string name="settings_maindevice_address_label">내 기기 주소</string>
<string name="settings_maindevice_address_description">연결된 기기의 주소입니다. 앱에서 기기가 연결되어 있는지 확인할 때 사용합니다.</string>
<string name="settings_maindevice_address_none">없음</string>
<string name="settings_maindevice_model_label">내 기기 모델</string>
<string name="settings_maindevice_model_description">사용하고 있는 기기의 모델입니다. 전화기에 기기가 연결되지 않았을 때 기기를 찾는 데 도움을 줍니다.</string>
<string name="settings_reaction_autoconnect_whenseen_label">기기가 보일 때</string>
<string name="settings_reaction_autoconnect_caseopen_label">케이스 열림</string>
<string name="settings_reaction_autoconnect_inear_label">귀에 있음</string>
<string name="upgrade_capod_label">CAPod 업그레이드</string>
<string name="upgrade_capod_description">개발자에게 후원하고 추가적 기능도 받습니다.</string>
<string name="settings_popup_caseopen_label">팝업 보이기</string>
<string name="settings_popup_caseopen_description">기기 케이스가 열렸을 때 팝업을 보여줍니다. (실험적)</string>
<string name="overview_bluetooth_disabled_label">블루투스 꺼져 있음</string>
<string name="overview_bluetooth_disabled_description">블루투스를 켜야 연결할 수 있어요 ;)</string>
<string name="help_translate_label">번역</string>
<string name="help_translate_description">이 앱을 여러분의 언어로 번역하는 것을 도와주세요.</string>
<string name="settings_onepod_mode_label">한쪽 기기 모드</string>
<string name="settings_onepod_mode_description">양쪽 기기를 모두 착용할 필요 없이, 앱에서 한 쪽만 있어도 반응하도록 합니다.</string>
<string name="permission_system_alert_window_label">시스템 알림 창</string>
<string name="permission_system_alert_window_description">팝업 기능을 활성화하려면 CAPod에서 다른 앱 위에 그릴 수 있게 해야 합니다.</string>
<string name="last_seen_x">마지막으로 확인: %s</string>
<string name="first_seen_x">처음 확인: %s</string>
<string name="settings_blescanner_unfiltered_label">무보정 BLE 데이터</string>
<string name="settings_blescanner_unfiltered_description">BLE 스캐너에서 보정을 제거해 모든 BLE 정보를 보입니다. 새로운 모델에 대한 지원을 추가하기 좋습니다.</string>
<string name="permission_required_title">다음 권한을 부여해야 합니다:</string>
<string name="settings_compatibility_mode_label">호환성 모드</string>
<string name="settings_compatibility_mode_description">최적화 설정들 몇 개를 비활성화해 호환성을 높입니다. 데이터가 보이지 않을 때 사용하세요.</string>
<string name="translators_thanks_title">번역가</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">윤지호(annyeong1alt@gmail.com)</string>
</resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
-139
View File
@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="notification_channel_device_status_label">Status peranti</string>
<string name="general_error_label">Ralat</string>
<string name="general_share_action">Kongsi</string>
<string name="general_done_action">Selesai</string>
<string name="general_copy_action">Salin</string>
<string name="general_thank_you_label">Terima kasih</string>
<string name="general_value_not_available_label">N/A</string>
<string name="general_grant_permission_action">Berikan kebenaran</string>
<string name="general_upgrade_action">Naik taraf</string>
<string name="general_check_action">Semak</string>
<string name="general_close_action">Tutup</string>
<string name="debug_debuglog_size_label">Saiz</string>
<string name="debug_debuglog_size_compressed_label">Saiz termampat</string>
<string name="debug_notification_channel_label">Notifikasi nyahpepijat</string>
<string name="debug_debuglog_file_label">Fail log yang direkodkan</string>
<string name="debug_debuglog_record_action">Rekod log nyahpepijat</string>
<string name="permission_bluetooth_connect_label">Sambung bluetooth</string>
<string name="permission_bluetooth_connect_description">Apl ini memerlukan kebenaran \"Bluetooth connect\" untuk berinteraksi dengan pasangan peranti dan memulakan sambungan.</string>
<string name="permission_bluetooth_scan_label">Pengimbasan bluetooth</string>
<string name="permission_bluetooth_scan_description">Kebenaran \"Pengimbasan Bluetooth\" membolehkan apl ini menemui dan menerima data Bluetooth daripada peranti berdekatan seperti AirPods anda.</string>
<string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Apl ini memerlukan kebenaran \"Bluetooth\" untuk menyambung ke peranti bluetooth yang dipasangkan.</string>
<string name="permission_access_fine_location_label">Akses lokasi yang baik</string>
<string name="permission_access_fine_location_description">CAPod menggunakan kebenaran \"lokasi baik\" untuk menerima data Bluetooth Tenaga Rendah. Fon kepala anda menggunakan teknologi Bluetooth Tenaga Rendah untuk menyiarkan statusnya. Apl ini TIDAK akan menggunakan data Bluetooth untuk menentukan lokasi anda.</string>
<string name="permission_background_location_label">Akses lokasi latar belakang</string>
<string name="permission_background_location_description">CAPod menggunakan \"akses lokasi latar belakang\" untuk mendayakan ciri seperti \"Tunjukkan popup\" dan \"AutoConnect\" semasa apl ditutup. Akses lokasi latar belakang membolehkan apl menerima data Bluetooth Tenaga Rendah semasa ia berada di latar belakang. Apl ini TIDAK akan menggunakan data Bluetooth untuk menentukan lokasi anda.</string>
<string name="permission_ignore_battery_optimizations_label">Nyahdayakan pengoptimuman bateri</string>
<string name="permission_ignore_battery_optimizations_description">Pengoptimuman bateri menghalang apl ini daripada menerima data Bluetooth dengan pasti semasa apl berada di latar belakang.</string>
<string name="pods_dual_left_label">Pod kiri</string>
<string name="pods_dual_right_label">Pod kanan</string>
<string name="pods_case_label">Sarung</string>
<string name="pods_case_status_open_label">Buka</string>
<string name="pods_case_status_closed_label">Tertutup</string>
<string name="pods_connection_state_disconnected_label">Tidak disambungkan ke peranti</string>
<string name="pods_connection_state_idle_label">Disambungkan ke peranti, tetapi melahu</string>
<string name="pods_connection_state_music_label">Dalam mod muzik</string>
<string name="pods_connection_state_call_label">Dalam mod panggilan</string>
<string name="pods_connection_state_ringing_label">Berdering</string>
<string name="pods_connection_state_hanging_up_label">Meletakkan telefon</string>
<string name="pods_connection_state_unknown_label">Keadaan sambungan tidak diketahui</string>
<string name="pods_unknown_raw_data_label">Data mentah</string>
<string name="pods_unknown_label">Peranti tidak diketahui</string>
<string name="pods_unknown_contact_dev">Ini ialah peranti yang tidak diketahui, tetapi ia menggunakan format mesej yang serupa. Mari tambah sokongan untuknya, hubungi saya :)</string>
<string name="pods_none_label_short">Tiada peranti</string>
<string name="pods_charging_label">Mengecas</string>
<string name="pods_inear_label">Dalam telinga</string>
<string name="pods_microphone_label">Mikrofon</string>
<string name="pods_yours">Milik anda</string>
<string name="headset_being_worn_label">Sedang dipakai</string>
<string name="pods_case_unknown_state">Keadaan tidak diketahui</string>
<string name="overview_nomaindevice_label">Tiada peranti utama</string>
<string name="overview_nomaindevice_description">Semua peranti yang dikesan tidak mungkin menjadi milik anda. Hidupkan dan sambung peranti anda atau laraskan tetapan.</string>
<string name="settings_label">Tetapan</string>
<string name="settings_privacy_policy_label">Polisi privasi</string>
<string name="settings_privacy_policy_desc">Mengendalikan data secara bertanggungjawab.</string>
<string name="settings_licenses_label">Lesen</string>
<string name="settings_category_other_label">Lain-lain</string>
<string name="settings_general_label">Tetapan</string>
<string name="settings_general_description">Tweak umum yang mempengaruhi keseluruhan apl.</string>
<string name="settings_acknowledgements_label">Ucapan terima kasih</string>
<string name="changelog_label">Changelog</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Pembangun e-mel</string>
<string name="settings_support_installid_label">Pasang ID</string>
<string name="settings_support_installid_desc">Laporan ralat automatik adalah tanpa nama. Kongsi ID pemasangan anda jika pembangun perlu mencari laporan ralat anda.</string>
<string name="settings_support_label">Sokongan</string>
<string name="settings_support_description">Jika anda perlukan bantuan.</string>
<string name="issue_tracker_label">Penjejak isu</string>
<string name="issue_tracker_description">Penjejak isu awam untuk laporan pepijat dan permintaan ciri (bahasa Inggeris sahaja).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Tempat melepak dan bertanya soalan.</string>
<string name="settings_support_email_developer_description">Ambil perhatian bahawa saya hanya boleh membalas dalam bahasa Jerman atau Inggeris.</string>
<string name="settings_debug_autoreports_label">Laporan pepijat automatik</string>
<string name="settings_debug_autoreports_description">Melaporkan isu secara automatik, e.g. butiran tentang ranap aplikasi agar saya dapat mengetahui cara untuk membetulkannya.</string>
<string name="settings_debug_mode_label">Mod nyahpepijat</string>
<string name="settings_debug_mode_description">Tunjukkan maklumat tambahan untuk selesaikan masalah.</string>
<string name="settings_monitor_mode_label">Mod monitor</string>
<string name="settings_monitor_mode_description">Dalam keadaan yang mana apl ini memantau data Bluetooth.</string>
<string name="settings_scanner_mode_label">Mod pengimbas</string>
<string name="settings_scanner_mode_description">Apakah sepatutnya pengimbas data Tenaga Rendah Bluetooth mengutamakan prestasi atau penjimatan tenaga?</string>
<string name="settings_monitor_mode_manual_label">Apabila apl dibuka</string>
<string name="settings_monitor_mode_automatic_label">Apabila peranti disambungkan</string>
<string name="settings_monitor_mode_always_label">Sentiasa</string>
<string name="settings_scanner_mode_lowpower_label">Kuasa rendah</string>
<string name="settings_scanner_mode_balanced_label">Seimbang</string>
<string name="settings_scanner_mode_lowlatency_label">Latensi rendah</string>
<string name="settings_autopause_label">Auto jeda</string>
<string name="settings_autopause_description">Jeda audio apabila peranti dikeluarkan dari telinga anda.</string>
<string name="settings_showall_label">Tunjukkan semua peranti</string>
<string name="settings_showall_description">Tunjukkan peranti orang lain yang berdekatan dengan anda.</string>
<string name="settings_autopplay_label">Auto main</string>
<string name="settings_autoplay_description">Mulakan main balik audio apabila peranti dipakai.</string>
<string name="settings_fake_data_label">Data palsu</string>
<string name="settings_fake_data_description">Tunjukkan data palsu, yakni, simulasi peranti yang tidak wujud.</string>
<string name="settings_debug_label">Tetapan nyahpepijat</string>
<string name="settings_debug_description">Tetapan tambahan untuk membantu menyelesaikan isu dengan apl.</string>
<string name="settings_signal_minimum_label">Kualiti isyarat minimum</string>
<string name="settings_signal_minimum_description">Kualiti isyarat minimum yang diperlukan oleh peranti perlu dipertimbangkan sebagai milik anda.</string>
<string name="settings_autoconnect_label">Auto sambung</string>
<string name="settings_autoconnect_description">Jika Android tidak menyambung secara automatik, kita juga boleh bertanyakannya. Ini akan menetapkan tetapan mod pantau kepada \'Sentiasa\'.</string>
<string name="settings_autoconnect_condition_label">Kondisi auto sambung</string>
<string name="settings_autoconnect_condition_description">Bilakah harus kita cuba menyambung ke peranti anda?</string>
<string name="settings_reaction_label">Reaksi</string>
<string name="settings_reaction_description">Bereaksi terhadap peristiwa dan tingkah laku.</string>
<string name="settings_category_yourdevice_label">Peranti anda</string>
<string name="settings_maindevice_address_label">Alamat peranti anda</string>
<string name="settings_maindevice_address_description">Alamat pasangan peranti anda. Apl menggunakan ini bagi menentukan bila ia disambungkan ke telefon anda.</string>
<string name="settings_maindevice_address_none">Tiada</string>
<string name="settings_maindevice_model_label">Model peranti anda</string>
<string name="settings_maindevice_model_description">Model peranti utama anda. Ini membantu apl mengenali peranti anda apabila ia tidak disambungkan ke telefon anda.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Apabila dilihat</string>
<string name="settings_reaction_autoconnect_caseopen_label">Sarung dibuka</string>
<string name="settings_reaction_autoconnect_inear_label">Dalam telinga</string>
<string name="upgrade_capod_label">Naik taraf CAPod</string>
<string name="upgrade_capod_description">Dapatkan ciri tambahan dan sokongi pemaju.</string>
<string name="settings_popup_caseopen_label">Tunjukkan popup</string>
<string name="settings_popup_caseopen_description">Tunjukkan popup apabila sarung peranti dibuka (percubaan).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth dinyahdayakan</string>
<string name="overview_bluetooth_disabled_description">Bluetooth dinyahdayakan, dayakan ia ;)</string>
<string name="help_translate_label">Terjemahan</string>
<string name="help_translate_description">Bantu terjemahkan apl ini ke dalam bahasa kegemaran anda.</string>
<string name="settings_onepod_mode_label">Satu mod pod</string>
<string name="settings_onepod_mode_description">Tidak perlu memakai kedua-dua pod, memakai satu pod sudah memadai untuk mencetuskan tindak balas.</string>
<string name="permission_system_alert_window_label">Tetingkap Makluman Sistem</string>
<string name="permission_system_alert_window_description">Benarkan CAPod melakar di atas apl lain untuk membolehkan ciri \"Tunjukkan PopUp\".</string>
<string name="last_seen_x">Terakhir dilihat: %s</string>
<string name="first_seen_x">Pertama dilihat: %s</string>
<string name="settings_blescanner_unfiltered_label">Data BLE tanpa tapisan</string>
<string name="settings_blescanner_unfiltered_description">Alih keluar sebarang tapisan daripada pengimbas BLE untuk menunjukkan semua data BLE yang disiarkan. Berguna bagi menambah sokongan untuk jenis fon kepala baharu.</string>
<string name="permission_required_title">Kebenaran berikut diperlukan:</string>
<string name="settings_compatibility_mode_label">Mod keserasian</string>
<string name="settings_compatibility_mode_description">Nyahdayakan pengoptimuman untuk tingkatkan keserasian. Cuba ini jika anda tidak melihat sebarang data.</string>
<string name="translators_thanks_title">Penterjemah</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">bob hasnul(bobhasnul@gmail. com)</string>
</resources>
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

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