Merge branch 'main' into release/2.7.0

This commit is contained in:
James Rich 2025-09-06 15:02:11 -05:00 committed by GitHub
commit 7b5b270899
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
55 changed files with 822 additions and 331 deletions

View file

@ -16,10 +16,17 @@ jobs:
uses: actions/github-script@v8
with:
script: |
const labels = context.payload.pull_request.labels.map(label => label.name);
// Always fetch the latest labels from the GitHub API to avoid stale context
const prNumber = context.payload.pull_request.number;
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber,
});
const latestLabels = pr.labels.map(label => label.name);
const requiredLabels = ['bugfix', 'enhancement', 'automation', 'dependencies', 'repo', 'release'];
const hasRequiredLabel = labels.some(label => requiredLabels.includes(label));
console.log(labels);
const hasRequiredLabel = latestLabels.some(label => requiredLabels.includes(label));
console.log('Latest labels:', latestLabels);
if (!hasRequiredLabel) {
core.setFailed(`PR must have at least one of the following labels before it can be merged: ${requiredLabels.join(', ')}.`);
}

View file

@ -24,10 +24,12 @@ import com.google.maps.android.compose.MapType
interface GoogleMapsPrefs {
var selectedGoogleMapType: String?
var selectedCustomTileUrl: String?
var hiddenLayerUrls: Set<String>
}
class GoogleMapsPrefsImpl(prefs: SharedPreferences) : GoogleMapsPrefs {
override var selectedGoogleMapType: String? by
NullableStringPrefDelegate(prefs, "selected_google_map_type", MapType.NORMAL.name)
override var selectedCustomTileUrl: String? by NullableStringPrefDelegate(prefs, "selected_custom_tile_url", null)
override var hiddenLayerUrls: Set<String> by StringSetPrefDelegate(prefs, "hidden_layer_urls", emptySet())
}

View file

@ -19,11 +19,13 @@
package com.geeksville.mesh.ui.map
import android.app.Activity
import android.content.Intent
import android.graphics.Canvas
import android.graphics.Paint
import android.location.Location
import android.net.Uri
import android.view.WindowManager
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatDelegate
@ -190,6 +192,7 @@ fun MapView(
// Location tracking state
var isLocationTrackingEnabled by remember { mutableStateOf(false) }
var followPhoneBearing by remember { mutableStateOf(false) }
LocationPermissionsHandler { isGranted -> hasLocationPermission = isGranted }
@ -214,7 +217,16 @@ fun MapView(
var mapTypeMenuExpanded by remember { mutableStateOf(false) }
var showCustomTileManagerSheet by remember { mutableStateOf(false) }
val cameraPositionState = rememberCameraPositionState {}
val cameraPositionState = rememberCameraPositionState {
position =
CameraPosition.fromLatLngZoom(
LatLng(
ourNodeInfo?.position?.latitudeI?.times(DEG_D) ?: 0.0,
ourNodeInfo?.position?.longitudeI?.times(DEG_D) ?: 0.0,
),
7f,
)
}
// Location tracking functionality
val fusedLocationClient = remember { LocationServices.getFusedLocationProviderClient(context) }
@ -224,11 +236,27 @@ fun MapView(
if (isLocationTrackingEnabled) {
locationResult.lastLocation?.let { location ->
val latLng = LatLng(location.latitude, location.longitude)
val cameraUpdate =
if (followPhoneBearing) {
val bearing =
if (location.hasBearing()) {
location.bearing
} else {
cameraPositionState.position.bearing
}
CameraUpdateFactory.newCameraPosition(
CameraPosition.Builder()
.target(latLng)
.zoom(cameraPositionState.position.zoom)
.bearing(bearing)
.build(),
)
} else {
CameraUpdateFactory.newLatLngZoom(latLng, cameraPositionState.position.zoom)
}
coroutineScope.launch {
try {
cameraPositionState.animate(
CameraUpdateFactory.newLatLngZoom(latLng, cameraPositionState.position.zoom),
)
cameraPositionState.animate(cameraUpdate)
} catch (e: IllegalStateException) {
debug("Error animating camera to location: ${e.message}")
}
@ -260,8 +288,12 @@ fun MapView(
}
}
// Clean up location tracking on disposal
DisposableEffect(Unit) { onDispose { fusedLocationClient.removeLocationUpdates(locationCallback) } }
DisposableEffect(Unit) {
onDispose {
fusedLocationClient.removeLocationUpdates(locationCallback)
mapViewModel.clearLoadedLayerData()
}
}
val allNodes by
mapViewModel.nodes
@ -333,6 +365,17 @@ fun MapView(
var showClusterItemsDialog by remember { mutableStateOf<List<NodeClusterItem>?>(null) }
LaunchedEffect(isLocationTrackingEnabled) {
val activity = context as? Activity ?: return@LaunchedEffect
val window = activity.window
if (isLocationTrackingEnabled) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} else {
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
Scaffold { paddingValues ->
Box(modifier = Modifier.fillMaxSize().padding(paddingValues)) {
GoogleMap(
@ -344,7 +387,7 @@ fun MapView(
zoomControlsEnabled = true,
mapToolbarEnabled = true,
compassEnabled = false,
myLocationButtonEnabled = false, // Disabled - we use custom location button
myLocationButtonEnabled = false,
rotationGesturesEnabled = true,
scrollGesturesEnabled = true,
tiltGesturesEnabled = true,
@ -574,46 +617,30 @@ fun MapView(
isLocationTrackingEnabled = isLocationTrackingEnabled,
onToggleLocationTracking = {
if (hasLocationPermission) {
if (!isLocationTrackingEnabled) {
// When enabling tracking, get current location and center on it
try {
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
location?.let {
val latLng = LatLng(it.latitude, it.longitude)
coroutineScope.launch {
try {
cameraPositionState.animate(
CameraUpdateFactory.newLatLngZoom(latLng, 16f),
)
} catch (e: IllegalStateException) {
debug("Error centering camera on location: ${e.message}")
}
}
}
}
} catch (e: SecurityException) {
debug("Location permission not available: ${e.message}")
}
}
isLocationTrackingEnabled = !isLocationTrackingEnabled
if (!isLocationTrackingEnabled) {
followPhoneBearing = false
}
}
},
bearing = cameraPositionState.position.bearing,
onOrientNorth = {
coroutineScope.launch {
try {
val currentPosition = cameraPositionState.position
val newCameraPosition =
CameraPosition.Builder(currentPosition)
.bearing(0f) // Orient to north
.build()
cameraPositionState.animate(CameraUpdateFactory.newCameraPosition(newCameraPosition))
debug("Oriented map to north")
} catch (e: IllegalStateException) {
debug("Error orienting map to north: ${e.message}")
onCompassClick = {
if (isLocationTrackingEnabled) {
followPhoneBearing = !followPhoneBearing
} else {
coroutineScope.launch {
try {
val currentPosition = cameraPositionState.position
val newCameraPosition = CameraPosition.Builder(currentPosition).bearing(0f).build()
cameraPositionState.animate(CameraUpdateFactory.newCameraPosition(newCameraPosition))
debug("Oriented map to north")
} catch (e: IllegalStateException) {
debug("Error orienting map to north: ${e.message}")
}
}
}
},
followPhoneBearing = followPhoneBearing,
)
}
if (showLayersBottomSheet) {

View file

@ -44,6 +44,7 @@ import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
@ -231,8 +232,11 @@ constructor(
val mapLayers: StateFlow<List<MapLayerItem>> = _mapLayers.asStateFlow()
init {
viewModelScope.launch {
customTileProviderRepository.getCustomTileProviders().first()
loadPersistedMapType()
}
loadPersistedLayers()
loadPersistedMapType()
}
private fun loadPersistedMapType() {
@ -271,6 +275,7 @@ constructor(
val persistedLayerFiles = layersDir.listFiles()
if (persistedLayerFiles != null) {
val hiddenLayerUrls = googleMapsPrefs.hiddenLayerUrls
val loadedItems =
persistedLayerFiles.mapNotNull { file ->
if (file.isFile) {
@ -286,10 +291,11 @@ constructor(
}
layerType?.let {
val uri = Uri.fromFile(file)
MapLayerItem(
name = file.nameWithoutExtension,
uri = Uri.fromFile(file),
isVisible = true,
uri = uri,
isVisible = !hiddenLayerUrls.contains(uri.toString()),
layerType = it,
)
}
@ -372,7 +378,25 @@ constructor(
}
fun toggleLayerVisibility(layerId: String) {
_mapLayers.value = _mapLayers.value.map { if (it.id == layerId) it.copy(isVisible = !it.isVisible) else it }
var toggledLayer: MapLayerItem? = null
val updatedLayers =
_mapLayers.value.map {
if (it.id == layerId) {
toggledLayer = it.copy(isVisible = !it.isVisible)
toggledLayer
} else {
it
}
}
_mapLayers.value = updatedLayers
toggledLayer?.let {
if (it.isVisible) {
googleMapsPrefs.hiddenLayerUrls -= it.uri.toString()
} else {
googleMapsPrefs.hiddenLayerUrls += it.uri.toString()
}
}
}
fun removeMapLayer(layerId: String) {
@ -383,7 +407,10 @@ constructor(
LayerType.GEOJSON -> layerToRemove.geoJsonLayerData?.removeLayerFromMap()
null -> {}
}
layerToRemove?.uri?.let { uri -> deleteFileToInternalStorage(uri) }
layerToRemove?.uri?.let { uri ->
deleteFileToInternalStorage(uri)
googleMapsPrefs.hiddenLayerUrls -= uri.toString()
}
_mapLayers.value = _mapLayers.value.filterNot { it.id == layerId }
}
}
@ -418,40 +445,55 @@ constructor(
if (layerItem.kmlLayerData != null || layerItem.geoJsonLayerData != null) return
try {
when (layerItem.layerType) {
LayerType.KML -> {
val kmlLayer =
getInputStreamFromUri(layerItem)?.use { KmlLayer(map, it, application.applicationContext) }
_mapLayers.update { currentLayers ->
currentLayers.map {
if (it.id == layerItem.id) {
it.copy(kmlLayerData = kmlLayer)
} else {
it
}
}
}
}
LayerType.GEOJSON -> {
val geoJsonLayer =
getInputStreamFromUri(layerItem)?.use { inputStream ->
val jsonObject = JSONObject(inputStream.bufferedReader().use { it.readText() })
GeoJsonLayer(map, jsonObject)
}
_mapLayers.update { currentLayers ->
currentLayers.map {
if (it.id == layerItem.id) {
it.copy(geoJsonLayerData = geoJsonLayer)
} else {
it
}
}
}
}
LayerType.KML -> loadKmlLayerIfNeeded(layerItem, map)
LayerType.GEOJSON -> loadGeoJsonLayerIfNeeded(layerItem, map)
}
} catch (e: Exception) {
Timber.tag("MapViewModel").e(e, "Error loading map layer for ${layerItem.uri}")
}
}
private suspend fun loadKmlLayerIfNeeded(layerItem: MapLayerItem, map: GoogleMap) {
val kmlLayer =
getInputStreamFromUri(layerItem)?.use {
KmlLayer(map, it, application.applicationContext).apply {
if (!layerItem.isVisible) removeLayerFromMap()
}
}
_mapLayers.update { currentLayers ->
currentLayers.map {
if (it.id == layerItem.id) {
it.copy(kmlLayerData = kmlLayer)
} else {
it
}
}
}
}
private suspend fun loadGeoJsonLayerIfNeeded(layerItem: MapLayerItem, map: GoogleMap) {
val geoJsonLayer =
getInputStreamFromUri(layerItem)?.use { inputStream ->
val jsonObject = JSONObject(inputStream.bufferedReader().use { it.readText() })
GeoJsonLayer(map, jsonObject).apply { if (!layerItem.isVisible) removeLayerFromMap() }
}
_mapLayers.update { currentLayers ->
currentLayers.map {
if (it.id == layerItem.id) {
it.copy(geoJsonLayerData = geoJsonLayer)
} else {
it
}
}
}
}
fun clearLoadedLayerData() {
_mapLayers.update { currentLayers ->
currentLayers.map { it.copy(kmlLayerData = null, geoJsonLayerData = null) }
}
}
}
enum class LayerType {

View file

@ -20,6 +20,7 @@ package com.geeksville.mesh.ui.map.components
import androidx.compose.foundation.layout.Box
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.LocationDisabled
import androidx.compose.material.icons.filled.Navigation
import androidx.compose.material.icons.outlined.Layers
import androidx.compose.material.icons.outlined.Map
import androidx.compose.material.icons.outlined.MyLocation
@ -55,7 +56,8 @@ fun MapControlsOverlay(
isLocationTrackingEnabled: Boolean = false,
onToggleLocationTracking: () -> Unit = {},
bearing: Float = 0f,
onOrientNorth: () -> Unit = {},
onCompassClick: () -> Unit = {},
followPhoneBearing: Boolean,
) {
HorizontalFloatingToolbar(
modifier = modifier,
@ -63,7 +65,7 @@ fun MapControlsOverlay(
leadingContent = {},
trailingContent = {},
content = {
CompassButton(onOrientNorth = onOrientNorth, bearing = bearing)
CompassButton(onClick = onCompassClick, bearing = bearing, isFollowing = followPhoneBearing)
if (showFilterButton) {
Box {
MapButton(
@ -117,14 +119,14 @@ fun MapControlsOverlay(
}
@Composable
private fun CompassButton(onOrientNorth: () -> Unit, bearing: Float) {
val icon = Icons.Outlined.Navigation
private fun CompassButton(onClick: () -> Unit, bearing: Float, isFollowing: Boolean) {
val icon = if (isFollowing) Icons.Filled.Navigation else Icons.Outlined.Navigation
MapButton(
modifier = Modifier.rotate(-bearing),
icon = icon,
iconTint = MaterialTheme.colorScheme.StatusRed.takeIf { bearing == 0f },
contentDescription = stringResource(id = R.string.orient_north),
onClick = onOrientNorth,
onClick = onClick,
)
}

View file

@ -0,0 +1,35 @@
/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.geeksville.mesh.android.prefs
import android.content.SharedPreferences
import androidx.core.content.edit
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class StringSetPrefDelegate(
private val prefs: SharedPreferences,
private val key: String,
private val defaultValue: Set<String>,
) : ReadWriteProperty<Any?, Set<String>> {
override fun getValue(thisRef: Any?, property: KProperty<*>): Set<String> =
prefs.getStringSet(key, defaultValue) ?: emptySet()
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Set<String>) =
prefs.edit { putStringSet(key, value) }
}

View file

@ -84,7 +84,7 @@ data class MetricsState(
val powerMetrics: List<Telemetry> = emptyList(),
val hostMetrics: List<Telemetry> = emptyList(),
val tracerouteRequests: List<MeshLog> = emptyList(),
val tracerouteResults: List<MeshPacket> = emptyList(),
val tracerouteResults: List<MeshLog> = emptyList(),
val positionLogs: List<Position> = emptyList(),
val deviceHardware: DeviceHardware? = null,
val isLocalDevice: Boolean = false,
@ -321,7 +321,7 @@ constructor(
combine(
meshLogRepository.getLogsFrom(nodeNum = 0, PortNum.TRACEROUTE_APP_VALUE),
meshLogRepository.getMeshPacketsFrom(destNum, PortNum.TRACEROUTE_APP_VALUE),
meshLogRepository.getLogsFrom(destNum ?: 0, PortNum.TRACEROUTE_APP_VALUE),
) { request, response ->
_state.update { state ->
state.copy(

View file

@ -22,48 +22,51 @@ import com.geeksville.mesh.MeshProtos.RouteDiscovery
import com.geeksville.mesh.Portnums
val MeshProtos.MeshPacket.fullRouteDiscovery: RouteDiscovery?
get() = with(decoded) {
if (hasDecoded() && !wantResponse && portnum == Portnums.PortNum.TRACEROUTE_APP) {
runCatching { RouteDiscovery.parseFrom(payload).toBuilder() }.getOrNull()?.apply {
val fullRoute = listOf(to) + routeList + from
clearRoute()
addAllRoute(fullRoute)
get() =
with(decoded) {
if (hasDecoded() && !wantResponse && portnum == Portnums.PortNum.TRACEROUTE_APP) {
runCatching { RouteDiscovery.parseFrom(payload).toBuilder() }
.getOrNull()
?.apply {
val fullRoute = listOf(to) + routeList + from
clearRoute()
addAllRoute(fullRoute)
val fullRouteBack = listOf(from) + routeBackList + to
clearRouteBack()
if (hopStart > 0 && snrBackCount > 0) { // otherwise back route is invalid
addAllRouteBack(fullRouteBack)
}
}?.build()
} else {
null
val fullRouteBack = listOf(from) + routeBackList + to
clearRouteBack()
if (hopStart > 0 && snrBackCount > 0) { // otherwise back route is invalid
addAllRouteBack(fullRouteBack)
}
}
?.build()
} else {
null
}
}
}
@Suppress("MagicNumber")
private fun formatTraceroutePath(nodesList: List<String>, snrList: List<Int>): String {
// nodesList should include both origin and destination nodes
// origin will not have an SNR value, but destination should
val snrStr = if (snrList.size == nodesList.size - 1) {
snrList
} else {
// use unknown SNR for entire route if snrList has invalid size
List(nodesList.size - 1) { -128 }
}.map { snr ->
val str = if (snr == -128) "?" else "${snr / 4f}"
"$str dB"
}
val snrStr =
if (snrList.size == nodesList.size - 1) {
snrList
} else {
// use unknown SNR for entire route if snrList has invalid size
List(nodesList.size - 1) { -128 }
}
.map { snr ->
val str = if (snr == -128) "?" else "${snr / 4f}"
"$str dB"
}
return nodesList.map { userName ->
"$userName"
}.flatMapIndexed { i, nodeStr ->
if (i == 0) listOf(nodeStr) else listOf(snrStr[i - 1], nodeStr)
}.joinToString("\n")
return nodesList
.map { userName -> "$userName" }
.flatMapIndexed { i, nodeStr -> if (i == 0) listOf(nodeStr) else listOf(snrStr[i - 1], nodeStr) }
.joinToString("\n")
}
private fun RouteDiscovery.getTracerouteResponse(
getUser: (nodeNum: Int) -> String,
): String = buildString {
private fun RouteDiscovery.getTracerouteResponse(getUser: (nodeNum: Int) -> String): String = buildString {
if (routeList.isNotEmpty()) {
append("Route traced toward destination:\n\n")
append(formatTraceroutePath(routeList.map(getUser), snrTowardsList))
@ -75,6 +78,10 @@ private fun RouteDiscovery.getTracerouteResponse(
}
}
fun MeshProtos.MeshPacket.getTracerouteResponse(
getUser: (nodeNum: Int) -> String,
): String? = fullRouteDiscovery?.getTracerouteResponse(getUser)
fun MeshProtos.MeshPacket.getTracerouteResponse(getUser: (nodeNum: Int) -> String): String? =
fullRouteDiscovery?.getTracerouteResponse(getUser)
/** Returns a traceroute response string only when the result is complete (both directions). */
fun MeshProtos.MeshPacket.getFullTracerouteResponse(getUser: (nodeNum: Int) -> String): String? = fullRouteDiscovery
?.takeIf { it.routeList.isNotEmpty() && it.routeBackList.isNotEmpty() }
?.getTracerouteResponse(getUser)

View file

@ -845,13 +845,21 @@ constructor(
}
}
/** Write the persisted packet data out to a CSV file in the specified location. */
/**
* Export all persisted packet data to a CSV file at the given URI.
*
* The CSV will include all packets, or only those matching the given port number if specified. Each row contains:
* date, time, sender node number, sender name, sender latitude, sender longitude, receiver latitude, receiver
* longitude, receiver elevation, received SNR, distance, hop limit, and payload.
*
* @param uri The destination URI for the CSV file.
* @param filterPortnum If provided, only packets with this port number will be exported.
*/
@Suppress("detekt:CyclomaticComplexMethod", "detekt:LongMethod")
fun saveRangeTestCsv(uri: Uri) {
fun saveDataCsv(uri: Uri, filterPortnum: Int? = null) {
viewModelScope.launch(Dispatchers.Main) {
// Extract distances to this device from position messages and put (node,SNR,distance)
// in
// the file_uri
// in the file_uri
val myNodeNum = myNodeNum ?: return@launch
// Capture the current node value while we're still on main thread
@ -888,9 +896,10 @@ constructor(
}
}
// Only look at range test messages, with SNR reported.
// packets must have rxSNR, and optionally match the filter given as a param.
if (
proto.decoded.portnumValue == Portnums.PortNum.RANGE_TEST_APP_VALUE && proto.rxSnr != 0.0f
(filterPortnum == null || proto.decoded.portnumValue == filterPortnum) &&
proto.rxSnr != 0.0f
) {
val rxDateTime = dateFormat.format(packet.received_date)
val rxFrom = proto.from.toUInt()

View file

@ -73,7 +73,7 @@ import com.geeksville.mesh.fromRadio
import com.geeksville.mesh.model.DeviceVersion
import com.geeksville.mesh.model.NO_DEVICE_SELECTED
import com.geeksville.mesh.model.Node
import com.geeksville.mesh.model.getTracerouteResponse
import com.geeksville.mesh.model.getFullTracerouteResponse
import com.geeksville.mesh.position
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.repository.location.LocationRepository
@ -148,6 +148,8 @@ class MeshService :
@Inject lateinit var meshPrefs: MeshPrefs
private val tracerouteStartTimes = ConcurrentHashMap<Int, Long>()
companion object : Logging {
// Intents broadcast by MeshService
@ -848,7 +850,21 @@ class MeshService :
}
Portnums.PortNum.TRACEROUTE_APP_VALUE -> {
radioConfigRepository.setTracerouteResponse(packet.getTracerouteResponse(::getUserName))
val full = packet.getFullTracerouteResponse(::getUserName)
if (full != null) {
val requestId = packet.decoded.requestId
val start = tracerouteStartTimes.remove(requestId)
val response =
if (start != null) {
val elapsedMs = System.currentTimeMillis() - start
val seconds = elapsedMs / 1000.0
info("Traceroute $requestId complete in $seconds s")
"$full\n\nDuration: ${"%.1f".format(seconds)} s"
} else {
full
}
radioConfigRepository.setTracerouteResponse(response)
}
}
else -> debug("No custom processing needed for ${data.portnumValue}")
@ -2376,6 +2392,7 @@ class MeshService :
}
override fun requestTraceroute(requestId: Int, destNum: Int) = toRemoteExceptions {
tracerouteStartTimes[requestId] = System.currentTimeMillis()
packetHandler.sendToRadio(
newMeshPacketTo(destNum).buildMeshPacket(
wantAck = true,

View file

@ -18,8 +18,10 @@
package com.geeksville.mesh.ui.debug
import android.content.Context
import android.os.Environment
import android.net.Uri
import android.widget.Toast
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.clickable
@ -88,8 +90,6 @@ import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File
import java.io.FileOutputStream
import java.io.OutputStreamWriter
import java.nio.charset.StandardCharsets
import java.text.SimpleDateFormat
@ -136,6 +136,14 @@ internal fun DebugScreen(viewModel: DebugViewModel = hiltViewModel()) {
listState.requestScrollToItem(searchState.allMatches[searchState.currentMatchIndex].logIndex)
}
}
// Prepare a document creator for exporting logs via SAF
val exportLogsLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { createdUri ->
if (createdUri != null) {
scope.launch { exportAllLogsToUri(context, createdUri, filteredLogs) }
}
}
Column(modifier = Modifier.fillMaxSize()) {
LazyColumn(modifier = Modifier.fillMaxSize(), state = listState) {
stickyHeader {
@ -149,7 +157,11 @@ internal fun DebugScreen(viewModel: DebugViewModel = hiltViewModel()) {
logs = logs,
filterMode = filterMode,
onFilterModeChange = { filterMode = it },
onExportLogs = { scope.launch { exportAllLogs(context, filteredLogs) } },
onExportLogs = {
val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date())
val fileName = "meshtastic_debug_$timestamp.txt"
exportLogsLauncher.launch(fileName)
},
)
}
items(filteredLogs, key = { it.uuid }) { log ->
@ -338,57 +350,54 @@ fun DebugMenuActions(viewModel: DebugViewModel = hiltViewModel(), modifier: Modi
}
}
private suspend fun exportAllLogs(context: Context, logs: List<UiMeshLog>) = withContext(Dispatchers.IO) {
try {
val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date())
val fileName = "meshtastic_debug_$timestamp.txt"
val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
val logFile = File(downloadsDir, fileName)
OutputStreamWriter(FileOutputStream(logFile), StandardCharsets.UTF_8).use { writer ->
logs.forEach { log ->
writer.write("${log.formattedReceivedDate} [${log.messageType}]\n")
writer.write(log.logMessage)
if (!log.decodedPayload.isNullOrBlank()) {
writer.write("\n\nDecoded Payload:\n{")
writer.write("\n")
// Redact Decoded keys.
log.decodedPayload.lineSequence().forEach { line ->
var outputLine = line
val redacted = redactedKeys.firstOrNull { line.contains(it) }
if (redacted != null) {
val idx = line.indexOf(':')
if (idx != -1) {
outputLine = line.substring(0, idx + 1)
outputLine += "<redacted>"
private suspend fun exportAllLogsToUri(context: Context, targetUri: Uri, logs: List<UiMeshLog>) =
withContext(Dispatchers.IO) {
try {
context.contentResolver.openOutputStream(targetUri)?.use { os ->
OutputStreamWriter(os, StandardCharsets.UTF_8).use { writer ->
logs.forEach { log ->
writer.write("${log.formattedReceivedDate} [${log.messageType}]\n")
writer.write(log.logMessage)
if (!log.decodedPayload.isNullOrBlank()) {
writer.write("\n\nDecoded Payload:\n{")
writer.write("\n")
// Redact Decoded keys.
log.decodedPayload.lineSequence().forEach { line ->
var outputLine = line
val redacted = redactedKeys.firstOrNull { line.contains(it) }
if (redacted != null) {
val idx = line.indexOf(':')
if (idx != -1) {
outputLine = line.substring(0, idx + 1)
outputLine += "<redacted>"
}
}
writer.write(outputLine)
writer.write("\n")
}
writer.write("\n}")
}
writer.write(outputLine)
writer.write("\n")
writer.write("\n\n")
}
writer.write("\n}")
}
writer.write("\n\n")
}
}
} ?: run { throw IOException("Unable to open output stream for URI: $targetUri") }
withContext(Dispatchers.Main) {
Toast.makeText(context, "${logs.size} logs exported to ${logFile.absolutePath}", Toast.LENGTH_LONG)
.show()
withContext(Dispatchers.Main) {
Toast.makeText(context, context.getString(R.string.debug_export_success, logs.size), Toast.LENGTH_LONG)
.show()
}
} catch (e: IOException) {
withContext(Dispatchers.Main) {
Toast.makeText(
context,
context.getString(R.string.debug_export_failed, e.message ?: ""),
Toast.LENGTH_LONG,
)
.show()
}
warn("Error:IOException: " + e.toString())
}
} catch (e: SecurityException) {
withContext(Dispatchers.Main) {
Toast.makeText(context, "Permission denied: Cannot write to Downloads folder", Toast.LENGTH_LONG).show()
warn("Error:SecurityException: " + e.toString())
}
} catch (e: IOException) {
withContext(Dispatchers.Main) {
Toast.makeText(context, "Failed to write log file: ${e.message}", Toast.LENGTH_LONG).show()
}
warn("Error:IOException: " + e.toString())
}
}
@Composable
private fun DecodedPayloadBlock(

View file

@ -24,7 +24,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
@ -45,6 +44,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@ -120,35 +120,45 @@ fun EnvironmentMetricsScreen(viewModel: MetricsViewModel = hiltViewModel()) {
}
@Composable
private fun TemperatureDisplay(temperature: Float, environmentDisplayFahrenheit: Boolean) {
if (!temperature.isNaN()) {
val textFormat = if (environmentDisplayFahrenheit) "%s %.1f°F" else "%s %.1f°C"
Text(
text = textFormat.format(stringResource(id = R.string.temperature), temperature),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
private fun TemperatureDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics, environmentDisplayFahrenheit: Boolean) {
envMetrics.temperature?.let { temperature ->
if (!temperature.isNaN()) {
val textFormat = if (environmentDisplayFahrenheit) "%s %.1f°F" else "%s %.1f°C"
Text(
text = textFormat.format(stringResource(id = R.string.temperature), temperature),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
}
}
}
@Composable
private fun HumidityAndBarometricPressureDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics) {
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
envMetrics.relativeHumidity?.let { humidity ->
if (!humidity.isNaN()) {
val hasHumidity = envMetrics.relativeHumidity?.let { !it.isNaN() } == true
val hasPressure = envMetrics.barometricPressure?.let { !it.isNaN() && it > 0 } == true
if (hasHumidity || hasPressure) {
Row(
modifier = Modifier.fillMaxWidth().padding(vertical = 0.dp),
horizontalArrangement = Arrangement.SpaceBetween,
) {
if (hasHumidity) {
val humidity = envMetrics.relativeHumidity!!
Text(
text = "%s %.2f%%".format(stringResource(id = R.string.humidity), humidity),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
modifier = Modifier.padding(vertical = 0.dp),
)
}
}
envMetrics.barometricPressure?.let { pressure ->
if (!pressure.isNaN() && pressure > 0) { // Keep pressure > 0 check
if (hasPressure) {
val pressure = envMetrics.barometricPressure!!
Text(
text = "%.2f hPa".format(pressure),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
modifier = Modifier.padding(vertical = 0.dp),
)
}
}
@ -161,7 +171,6 @@ private fun SoilMetricsDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics, e
envMetrics.soilTemperature != null ||
(envMetrics.soilMoisture != null && envMetrics.soilMoisture != Int.MIN_VALUE)
) {
Spacer(modifier = Modifier.height(4.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
val soilTemperatureTextFormat = if (environmentDisplayFahrenheit) "%s %.1f°F" else "%s %.1f°C"
val soilMoistureTextFormat = "%s %d%%"
@ -191,41 +200,23 @@ private fun SoilMetricsDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics, e
}
}
@Composable
private fun IaqDisplay(iaqValue: Int) {
if (iaqValue != Int.MIN_VALUE) {
Spacer(modifier = Modifier.height(4.dp))
/* Air Quality */
Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
Text(
text = stringResource(R.string.iaq),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
Spacer(modifier = Modifier.width(4.dp))
IndoorAirQuality(iaq = iaqValue, displayMode = IaqDisplayMode.Dot)
}
}
}
@Composable
private fun LuxUVLuxDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics) {
envMetrics.lux?.let { luxValue ->
if (!luxValue.isNaN()) {
Spacer(modifier = Modifier.height(4.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
val hasLux = envMetrics.lux != null && !envMetrics.lux.isNaN()
val hasUvLux = envMetrics.uvLux != null && !envMetrics.uvLux.isNaN()
if (hasLux || hasUvLux) {
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
if (hasLux) {
val luxValue = envMetrics.lux!!
Text(
text = "%s %.0f lx".format(stringResource(R.string.lux), luxValue),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
}
}
}
envMetrics.uvLux?.let { uvLuxValue ->
if (!uvLuxValue.isNaN()) {
Spacer(modifier = Modifier.height(4.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
if (hasUvLux) {
val uvLuxValue = envMetrics.uvLux!!
Text(
text = "%s %.0f UVlx".format(stringResource(R.string.uv_lux), uvLuxValue),
color = MaterialTheme.colorScheme.onSurface,
@ -238,23 +229,21 @@ private fun LuxUVLuxDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics) {
@Composable
private fun VoltageCurrentDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics) {
envMetrics.voltage?.let { voltage ->
if (!voltage.isNaN()) {
Spacer(modifier = Modifier.height(4.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
val hasVoltage = envMetrics.voltage != null && !envMetrics.voltage.isNaN()
val hasCurrent = envMetrics.current != null && !envMetrics.current.isNaN()
if (hasVoltage || hasCurrent) {
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
if (hasVoltage) {
val voltage = envMetrics.voltage!!
Text(
text = "%s %.2f V".format(stringResource(R.string.voltage), voltage),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
}
}
}
envMetrics.current?.let { current ->
if (!current.isNaN()) {
Spacer(modifier = Modifier.height(4.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
if (hasCurrent) {
val current = envMetrics.current!!
Text(
text = "%s %.2f mA".format(stringResource(R.string.current), current),
color = MaterialTheme.colorScheme.onSurface,
@ -266,15 +255,66 @@ private fun VoltageCurrentDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics
}
@Composable
private fun GasResistanceDisplay(gasResistance: Float) {
if (!gasResistance.isNaN()) {
Spacer(modifier = Modifier.height(4.dp))
private fun GasCompositionDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics) {
val iaqValue = envMetrics.iaq
val gasResistance = envMetrics.gasResistance
if ((iaqValue != null && iaqValue != Int.MIN_VALUE) || (gasResistance?.isFinite() == true)) {
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text(
text = "%s %.2f Ohm".format(stringResource(R.string.gas_resistance), gasResistance),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
if (iaqValue != null && iaqValue != Int.MIN_VALUE) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text = stringResource(R.string.iaq),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
Spacer(modifier = Modifier.width(4.dp))
IndoorAirQuality(iaq = iaqValue, displayMode = IaqDisplayMode.Dot)
}
}
if (gasResistance != null && !gasResistance.isNaN()) {
Text(
text = "%s %.2f Ohm".format(stringResource(R.string.gas_resistance), gasResistance),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
}
}
}
// These are in a differnt proto ...
// envMetrics.co2?.let { co2 ->
// Spacer(modifier = Modifier.height(4.dp))
// Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
// Text(
// text = "%s %.0f ppm".format(stringResource(R.string.co2), co2),
// color = MaterialTheme.colorScheme.onSurface,
// fontSize = MaterialTheme.typography.labelLarge.fontSize,
// )
// }
// }
// envMetrics.tvoc?.let { tvoc ->
// Spacer(modifier = Modifier.height(4.dp))
// Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
// Text(
// text = "%s %.0f ppb".format(stringResource(R.string.tvoc), tvoc),
// color = MaterialTheme.colorScheme.onSurface,
// fontSize = MaterialTheme.typography.labelLarge.fontSize,
// )
// }
// }
}
@Composable
private fun RadiationDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics) {
envMetrics.radiation?.let { radiation ->
if (!radiation.isNaN() && radiation > 0f) {
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text(
text = "%s %.2f µSv/h".format(stringResource(R.string.radiation), radiation),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
}
}
}
}
@ -292,7 +332,7 @@ private fun EnvironmentMetricsCard(telemetry: Telemetry, environmentDisplayFahre
private fun EnvironmentMetricsContent(telemetry: Telemetry, environmentDisplayFahrenheit: Boolean) {
val envMetrics = telemetry.environmentMetrics
val time = telemetry.time * MS_PER_SEC
Column(modifier = Modifier.fillMaxWidth().padding(8.dp)) {
Column(modifier = Modifier.fillMaxWidth().padding(horizontal = 2.dp, vertical = 2.dp)) {
/* Time and Temperature */
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text(
@ -300,23 +340,48 @@ private fun EnvironmentMetricsContent(telemetry: Telemetry, environmentDisplayFa
style = TextStyle(fontWeight = FontWeight.Bold),
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
envMetrics.temperature?.let { temperature -> TemperatureDisplay(temperature, environmentDisplayFahrenheit) }
TemperatureDisplay(envMetrics, environmentDisplayFahrenheit)
}
Spacer(modifier = Modifier.height(4.dp))
/* Humidity and Barometric Pressure */
HumidityAndBarometricPressureDisplay(envMetrics)
/* Soil Moisture and Soil Temperature */
SoilMetricsDisplay(envMetrics, environmentDisplayFahrenheit)
envMetrics.iaq?.let { iaqValue -> IaqDisplay(iaqValue) }
GasCompositionDisplay(envMetrics)
LuxUVLuxDisplay(envMetrics)
VoltageCurrentDisplay(envMetrics)
envMetrics.gasResistance?.let { gasResistance -> GasResistanceDisplay(gasResistance) }
RadiationDisplay(envMetrics)
}
}
@Suppress("MagicNumber") // preview data
@Preview(showBackground = true)
@Composable
private fun PreviewEnvironmentMetricsContent() {
// Build a fake EnvironmentMetrics using the generated proto builder APIs
val fakeEnvMetrics =
TelemetryProtos.EnvironmentMetrics.newBuilder()
.setTemperature(22.5f)
.setRelativeHumidity(55.0f)
.setBarometricPressure(1013.25f)
.setSoilMoisture(33)
.setSoilTemperature(18.0f)
.setLux(100.0f)
.setUvLux(100.0f)
.setVoltage(3.7f)
.setCurrent(0.12f)
.setIaq(100)
.setRadiation(0.15f)
.setGasResistance(1200.0f)
.build()
val fakeTelemetry =
TelemetryProtos.Telemetry.newBuilder()
.setTime((System.currentTimeMillis() / 1000).toInt())
.setEnvironmentMetrics(fakeEnvMetrics)
.build()
MaterialTheme {
Surface { EnvironmentMetricsContent(telemetry = fakeTelemetry, environmentDisplayFahrenheit = false) }
}
}

View file

@ -63,6 +63,7 @@ import com.geeksville.mesh.model.fullRouteDiscovery
import com.geeksville.mesh.model.getTracerouteResponse
import com.geeksville.mesh.ui.common.components.SimpleAlertDialog
import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC
import java.text.DateFormat
@OptIn(ExperimentalFoundationApi::class)
@ -88,9 +89,9 @@ fun TracerouteLogScreen(modifier: Modifier = Modifier, viewModel: MetricsViewMod
items(state.tracerouteRequests, key = { it.uuid }) { log ->
val result =
remember(state.tracerouteRequests) {
state.tracerouteResults.find { it.decoded.requestId == log.fromRadio.packet.id }
state.tracerouteResults.find { it.fromRadio.packet.decoded.requestId == log.fromRadio.packet.id }
}
val route = remember(result) { result?.fullRouteDiscovery }
val route = remember(result) { result?.fromRadio?.packet?.fullRouteDiscovery }
val time = dateFormat.format(log.received_date)
val (text, icon) = route.getTextAndIcon()
@ -103,7 +104,15 @@ fun TracerouteLogScreen(modifier: Modifier = Modifier, viewModel: MetricsViewMod
modifier =
Modifier.combinedClickable(onLongClick = { expanded = true }) {
if (result != null) {
showDialog = result.getTracerouteResponse(::getUsername)
val full = route
if (full != null && full.routeList.isNotEmpty() && full.routeBackList.isNotEmpty()) {
val elapsedMs = (result.received_date - log.received_date).coerceAtLeast(0)
val seconds = elapsedMs.toDouble() / MS_PER_SEC
val base = result.fromRadio.packet.getTracerouteResponse(::getUsername)
showDialog = "$base\n\nDuration: ${"%.1f".format(seconds)} s"
} else {
showDialog = result.fromRadio.packet.getTracerouteResponse(::getUsername)
}
}
},
)

View file

@ -66,6 +66,9 @@ import com.geeksville.mesh.ui.settings.radio.components.EditDeviceProfileDialog
import com.geeksville.mesh.ui.settings.radio.components.PacketResponseStateDialog
import com.geeksville.mesh.util.LanguageUtils
import kotlinx.coroutines.delay
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import kotlin.time.Duration.Companion.seconds
@Suppress("LongMethod", "CyclomaticComplexMethod")
@ -132,11 +135,15 @@ fun SettingsScreen(
viewModel.installProfile(it)
} else {
deviceProfile = it
val nodeName = it.shortName.ifBlank { "node" }
val dateFormat = java.text.SimpleDateFormat("yyyyMMdd", java.util.Locale.getDefault())
val dateStr = dateFormat.format(java.util.Date())
val fileName = "Meshtastic_${nodeName}_${dateStr}_nodeConfig.cfg"
val intent =
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/*"
putExtra(Intent.EXTRA_TITLE, "device_profile.cfg")
putExtra(Intent.EXTRA_TITLE, fileName)
}
exportConfigLauncher.launch(intent)
}
@ -222,11 +229,12 @@ fun SettingsScreen(
choices = themeMap.mapValues { (_, value) -> { uiViewModel.setTheme(value) } },
)
}
val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date())
val exportRangeTestLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
it.data?.data?.let { uri -> uiViewModel.saveRangeTestCsv(uri) }
it.data?.data?.let { uri -> uiViewModel.saveDataCsv(uri) }
}
}
SettingsItem(
@ -238,11 +246,31 @@ fun SettingsScreen(
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/csv"
putExtra(Intent.EXTRA_TITLE, "rangetest.csv")
putExtra(Intent.EXTRA_TITLE, "Meshtastic_rangetest_$timestamp.csv")
}
exportRangeTestLauncher.launch(intent)
}
val exportDataLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
it.data?.data?.let { uri -> uiViewModel.saveDataCsv(uri) }
}
}
SettingsItem(
text = stringResource(R.string.export_data_csv),
leadingIcon = Icons.Rounded.Output,
trailingIcon = null,
) {
val intent =
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/csv"
putExtra(Intent.EXTRA_TITLE, "Meshtastic_datalog_$timestamp.csv")
}
exportDataLauncher.launch(intent)
}
SettingsItem(
text = stringResource(R.string.intro_show),
leadingIcon = Icons.Rounded.WavingHand,

@ -1 +1 @@
Subproject commit 07d6573e1065344e80845de704885f011e515233
Subproject commit a84657c220421536f18d11fc5edf680efadbceeb

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Debug Panel</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">حسنا</string>
<string name="must_set_region">واجب إدخال المنطقة!</string>
<string name="cant_change_no_radio">Couldn\'t change channel, because radio is not yet connected. Please try again.</string>
<string name="save_rangetest">Export rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Reset</string>
<string name="scan">البحث</string>
<string name="add_network_device">أضف</string>
@ -644,6 +648,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -781,7 +786,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Panel za otklanjanje grešaka</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Океј</string>
<string name="must_set_region">Мораш одабрати регион!</string>
<string name="cant_change_no_radio">Није било могуће променити канал, јер радио још није повезан. Молимо покушајте поново.</string>
<string name="save_rangetest">Извези rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Поново покрени</string>
<string name="scan">Скенирај</string>
<string name="add_network_device">Додај</string>
@ -638,6 +642,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -775,7 +780,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Панел за отстраняване на грешки</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Експортиране на журнали</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Филтри</string>
<string name="debug_active_filters">Активни филтри</string>
<string name="debug_default_search">Търсене в журналите…</string>
@ -139,7 +142,8 @@
<string name="okay">Добре</string>
<string name="must_set_region">Трябва да зададете регион!</string>
<string name="cant_change_no_radio">Каналът не може да бъде сменен, тъй като радиото все още не е свързано. Моля, опитайте отново.</string>
<string name="save_rangetest">Експорт на rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Нулиране</string>
<string name="scan">Сканиране</string>
<string name="add_network_device">Добавяне</string>
@ -636,6 +640,7 @@
<string name="export_keys">Експортиране на ключовете</string>
<string name="export_keys_confirmation">Експортира публичния и частния ключове във файл. Моля, съхранявайте го на сигурно място.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Отдалечен</string>
<string name="node_count_template">(%1$d онлайн / %2$d общо)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">Шаблон за URL</string>
<string name="track_point">track point</string>
<string name="phone_settings">Настройки на телефона</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Panell de depuració</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Acceptar</string>
<string name="must_set_region">Has de configurar la regió!</string>
<string name="cant_change_no_radio">No s\'ha pogut canviar el canal perquè la ràdio no està configurada correctament. Si us plau torna-ho a provar.</string>
<string name="save_rangetest">Exportat rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Restablir</string>
<string name="scan">Escanejar</string>
<string name="add_network_device">Afegir</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Panel pro ladění</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filtry</string>
<string name="debug_active_filters">Aktivní filtry</string>
<string name="debug_default_search">Hledat v protokolech…</string>
@ -139,7 +142,8 @@
<string name="okay">OK</string>
<string name="must_set_region">Musíte specifikovat region!</string>
<string name="cant_change_no_radio">Kanál nelze změnit, protože rádio ještě není připojeno. Zkuste to znovu.</string>
<string name="save_rangetest">Exportovat rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Reset</string>
<string name="scan">Skenovat</string>
<string name="add_network_device">Přidat</string>
@ -640,6 +644,7 @@
<string name="export_keys">Exportovat klíče</string>
<string name="export_keys_confirmation">Exportuje veřejné a soukromé klíče do souboru. Uložte je prosím bezpečně.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d celkem)</string>
<string name="react">Odpovědět</string>
@ -777,7 +782,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Debug-Ausgaben</string>
<string name="debug_decoded_payload">Dekodiertes Payload:</string>
<string name="debug_logs_export">Protokolle exportieren</string>
<string name="debug_export_cancelled">Export abgebrochen</string>
<string name="debug_export_success">%1$d Protokolle exportiert</string>
<string name="debug_export_failed">Fehler beim Scheiben der Protokolldatei: %1$s</string>
<string name="debug_filters">Filter</string>
<string name="debug_active_filters">Aktive Filter</string>
<string name="debug_default_search">In Protokollen suchen</string>
@ -139,7 +142,8 @@
<string name="okay">OK</string>
<string name="must_set_region">Sie müssen eine Region festlegen!</string>
<string name="cant_change_no_radio">Konnte den Kanal nicht ändern, da das Funkgerät noch nicht verbunden ist. Bitte versuchen Sie es erneut.</string>
<string name="save_rangetest">Exportiere rangetest.csv</string>
<string name="save_rangetest">Reichweitentest exportieren</string>
<string name="export_data_csv">Alle Pakete exportieren</string>
<string name="reset">Zurücksetzen</string>
<string name="scan">Scannen</string>
<string name="add_network_device">Hinzufügen</string>
@ -636,6 +640,7 @@
<string name="export_keys">Schlüssel exportieren</string>
<string name="export_keys_confirmation">Exportiert den öffentlichen und privaten Schlüssel in eine Datei. Bitte speichern Sie diese an einem sicheren Ort.</string>
<string name="modules_unlocked">Entsperrte Module</string>
<string name="modules_already_unlocked">Module sind bereits freigeschaltet</string>
<string name="remote">Entfernt</string>
<string name="node_count_template">(%1$d Online / %2$d Gesamt)</string>
<string name="react">Reagieren</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL muss Platzhalter enthalten.</string>
<string name="url_template">URL Vorlage</string>
<string name="track_point">Verlaufspunkt</string>
<string name="phone_settings">Telefoneinstellungen</string>
<string name="app_settings">Anwendung</string>
<string name="app_version">Version</string>
<string name="channel_features">Kanalfunktionen</string>
<string name="location_sharing">Standortfreigabe</string>
<string name="periodic_position_broadcast">Regelmäßige Standortübertragung</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Πίνακας αποσφαλμάτωσης</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Εντάξει</string>
<string name="must_set_region">Πρέπει να ορίσετε μια περιοχή!</string>
<string name="cant_change_no_radio">Couldn\'t change channel, because radio is not yet connected. Please try again.</string>
<string name="save_rangetest">Εξαγωγή rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Επαναφορά</string>
<string name="scan">Σάρωση</string>
<string name="add_network_device">Προσθήκη</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Panel de depuración</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Exportar registros</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filtros</string>
<string name="debug_active_filters">Filtros activos</string>
<string name="debug_default_search">Buscar en registros…</string>
@ -139,7 +142,8 @@
<string name="okay">Vale</string>
<string name="must_set_region">¡Debe establecer una región!</string>
<string name="cant_change_no_radio">No se puede cambiar de canal porque la radio aún no está conectada. Por favor inténtelo de nuevo.</string>
<string name="save_rangetest">Guardar rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Reiniciar</string>
<string name="scan">Escanear</string>
<string name="add_network_device">Añadir</string>
@ -637,6 +641,7 @@ Rango de Valores 0 - 500.</string>
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">Reaccionar</string>
@ -774,7 +779,8 @@ Rango de Valores 0 - 500.</string>
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Arendaja paneel</string>
<string name="debug_decoded_payload">Dekodeeritud andmed:</string>
<string name="debug_logs_export">Salvesta logi</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filtrid</string>
<string name="debug_active_filters">Aktiivsed filtrid</string>
<string name="debug_default_search">Otsi logist…</string>
@ -139,7 +142,8 @@
<string name="okay">Olgu</string>
<string name="must_set_region">Pead valima regiooni!</string>
<string name="cant_change_no_radio">Kanalit ei saanud vahetada, kuna raadio pole veel ühendatud. Proovi uuesti.</string>
<string name="save_rangetest">Lae alla rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Taasta</string>
<string name="scan">Otsi</string>
<string name="add_network_device">Lisa</string>
@ -636,6 +640,7 @@
<string name="export_keys">Salvesta võtmed</string>
<string name="export_keys_confirmation">Ekspordib avalikud- ja privaatvõtmed faili. Palun hoidke kuskil turvalises kohas.</string>
<string name="modules_unlocked">Moodulid on lukustamata</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Kaugjuhtimine</string>
<string name="node_count_template">(%1$d võrgus / %2$d kokku)</string>
<string name="react">Reageeri</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL peab sisaldama vahesümboleid.</string>
<string name="url_template">URL mall</string>
<string name="track_point">jälgimispunkt</string>
<string name="phone_settings">Telefoni seaded</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Vianetsintäpaneeli</string>
<string name="debug_decoded_payload">Dekoodattu data:</string>
<string name="debug_logs_export">Vie lokitiedot</string>
<string name="debug_export_cancelled">Vienti peruutettu</string>
<string name="debug_export_success">%1$d lokitietoa viety</string>
<string name="debug_export_failed">Lokitiedoston kirjoittaminen epäonnistui: %1$s</string>
<string name="debug_filters">Suodattimet</string>
<string name="debug_active_filters">Aktiiviset suodattimet</string>
<string name="debug_default_search">Hae lokitiedoista…</string>
@ -139,7 +142,8 @@
<string name="okay">OK</string>
<string name="must_set_region">Sinun täytyy määrittää alue!</string>
<string name="cant_change_no_radio">Kanavaa ei voitu vaihtaa, koska radiota ei ole vielä yhdistetty. Yritä uudelleen.</string>
<string name="save_rangetest">Vie rangetest.csv</string>
<string name="save_rangetest">Vie kuuluvuustestin paketit</string>
<string name="export_data_csv">Vie kaikki paketit</string>
<string name="reset">Palauta</string>
<string name="scan">Etsi</string>
<string name="add_network_device">Lisää</string>
@ -636,6 +640,7 @@
<string name="export_keys">Vie avaimet</string>
<string name="export_keys_confirmation">Vie julkiset ja yksityiset avaimet tiedostoon. Säilytä tiedosto turvallisessa paikassa.</string>
<string name="modules_unlocked">Lukitsemattomat moduulit</string>
<string name="modules_already_unlocked">Moduulit ovat jo käytettävissä</string>
<string name="remote">Etäyhteys</string>
<string name="node_count_template">(%1$d yhdistetty / %2$d yhteensä)</string>
<string name="react">Reagoi</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL-osoitteessa on oltava paikkamerkkejä.</string>
<string name="url_template">URL-mallipohja</string>
<string name="track_point">seurantapiste</string>
<string name="phone_settings">Puhelimen asetukset</string>
<string name="app_settings">Sovellus</string>
<string name="app_version">Versio</string>
<string name="channel_features">Kanavan ominaisuudet</string>
<string name="location_sharing">Sijainnin jakaminen</string>
<string name="periodic_position_broadcast">Sijainnin toistuva lähetys</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Panneau de débogage</string>
<string name="debug_decoded_payload">Contenu décodé :</string>
<string name="debug_logs_export">Exporter les logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filtres</string>
<string name="debug_active_filters">Filtres actifs</string>
<string name="debug_default_search">Rechercher dans les journaux…</string>
@ -139,7 +142,8 @@
<string name="okay">D\'accord</string>
<string name="must_set_region">Vous devez définir une région !</string>
<string name="cant_change_no_radio">Impossible de modifier le canal, car la radio n\'est pas encore connectée. Veuillez réessayer.</string>
<string name="save_rangetest">Exporter rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Réinitialiser</string>
<string name="scan">Scanner</string>
<string name="add_network_device">Ajouter</string>
@ -636,6 +640,7 @@
<string name="export_keys">Exporter les clés</string>
<string name="export_keys_confirmation">Exporte les clés publiques et privées vers un fichier. Veuillez stocker quelque part en toute sécurité.</string>
<string name="modules_unlocked">Modules déverrouillés</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Distant</string>
<string name="node_count_template">(%1$d en ligne / %2$d total)</string>
<string name="react">Réagir</string>
@ -770,7 +775,8 @@
<string name="url_must_contain_placeholders">L\'URL doit contenir des espaces réservés.</string>
<string name="url_template">Modèle d\'URL</string>
<string name="track_point">Point de suivi</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Painéal Laige</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Ceadaigh</string>
<string name="must_set_region">Caithfidh tú réigiún a shocrú!</string>
<string name="cant_change_no_radio">Ní féidir an cainéal a athrú, toisc nach bhfuil an raidió nasctha fós. Déan iarracht arís.</string>
<string name="save_rangetest">Onnmhairigh rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Athshocraigh</string>
<string name="scan">Scanadh</string>
<string name="add_network_device">Cuir leis</string>
@ -642,6 +646,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -779,7 +784,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Panel de depuración</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">OK</string>
<string name="must_set_region">Tes que seleccionar rexión!</string>
<string name="cant_change_no_radio">Non se puido cambiar de canle, porque a radio aínda non está conectada. Por favor inténteo de novo.</string>
<string name="save_rangetest">Exportar rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Restablecer</string>
<string name="scan">Escanear</string>
<string name="add_network_device">Engadir</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Otklanjanje pogrešaka</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">U redu</string>
<string name="must_set_region">Potrebno je postaviti regiju!</string>
<string name="cant_change_no_radio">Nije moguće promijeniti kanal jer radio još nije povezan. Molim pokušajte ponovno.</string>
<string name="save_rangetest">Izvezi rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Resetiraj</string>
<string name="scan">Pretraži</string>
<string name="add_network_device">Dodaj</string>
@ -638,6 +642,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -775,7 +780,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Panno Debug</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Dakò</string>
<string name="must_set_region">Ou dwe mete yon rejyon!</string>
<string name="cant_change_no_radio">Nou pa t kapab chanje kanal la paske radyo a poko konekte. Tanpri eseye ankò.</string>
<string name="save_rangetest">Eksporte rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Reyajiste</string>
<string name="scan">Eskane</string>
<string name="add_network_device">Ajoute</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Hibakereső panel</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">OK</string>
<string name="must_set_region">Be kell állítania egy régiót</string>
<string name="cant_change_no_radio">Nem lehet csatornát váltani, mert a rádió nincs csatlakoztatva. Kérem próbálja meg újra.</string>
<string name="save_rangetest">Rangetest.csv exportálása</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Újraindítás</string>
<string name="scan">Keresés</string>
<string name="add_network_device">Új hozzáadása</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Villuleitarborð</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Í lagi</string>
<string name="must_set_region">Þú verður að velja svæði!</string>
<string name="cant_change_no_radio">Gat ekki skipt um rás vegna þess að radíó er ekki enn tengt. Vinsamlegast reyndu aftur.</string>
<string name="save_rangetest">Flytja út skránna rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Endurræsa</string>
<string name="scan">Leita</string>
<string name="add_network_device">Bæta við</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Pannello Di Debug</string>
<string name="debug_decoded_payload">Payload decodificato:</string>
<string name="debug_logs_export">Esporta i logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filtri</string>
<string name="debug_active_filters">Filtri attivi</string>
<string name="debug_default_search">Cerca nei log…</string>
@ -139,7 +142,8 @@
<string name="okay">Ok</string>
<string name="must_set_region">Devi impostare una regione!</string>
<string name="cant_change_no_radio">Impossibile cambiare il canale, perché la radio non è ancora connessa. Riprova.</string>
<string name="save_rangetest">Esporta rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Reset</string>
<string name="scan">Scan</string>
<string name="add_network_device">Aggiungere</string>
@ -636,6 +640,7 @@
<string name="export_keys">Esporta Chiavi</string>
<string name="export_keys_confirmation">Esporta le chiavi pubbliche e private in un file. Si prega di memorizzarlo da qualche parte in modo sicuro.</string>
<string name="modules_unlocked">Moduli sbloccati</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Controllo remoto</string>
<string name="node_count_template">(%1$d online / %2$d in totale)</string>
<string name="react">Rispondi</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">L\'URL deve contenere dei placeholder.</string>
<string name="url_template">Template dell\'URL</string>
<string name="track_point">punto di interesse</string>
<string name="phone_settings">Impostazioni telefono</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">פאנל דיבאג</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">אישור</string>
<string name="must_set_region">חובה לבחור אזור!</string>
<string name="cant_change_no_radio">לא ניתן לשנות ערוץ כי אין מכשיר מחובר. בבקשה נסה שנית.</string>
<string name="save_rangetest">ייצא rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">איפוס</string>
<string name="scan">סריקה</string>
<string name="add_network_device">הוסף</string>
@ -640,6 +644,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -777,7 +782,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -117,6 +117,9 @@
<string name="debug_panel">デバッグ</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -140,7 +143,8 @@
<string name="okay">OK</string>
<string name="must_set_region">リージョンを指定する必要があります。</string>
<string name="cant_change_no_radio">デバイスが未接続のため、チャンネルが変更できませんでした。もう一度やり直してください。</string>
<string name="save_rangetest">rangetest.csv をエクスポート</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">リセット</string>
<string name="scan">スキャン</string>
<string name="add_network_device">追加</string>
@ -635,6 +639,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -772,7 +777,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">디버그 패널</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">로그 내보내기</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">필터</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">확인</string>
<string name="must_set_region">지역을 설정해 주세요!</string>
<string name="cant_change_no_radio">장치가 연결되지않아 채널을 변경할 수 없습니다. 다시 시도해주세요.</string>
<string name="save_rangetest">rangetest.csv 내보내기</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">초기화</string>
<string name="scan">스캔</string>
<string name="add_network_device">추가</string>
@ -634,6 +638,7 @@
<string name="export_keys">키 내보내기</string>
<string name="export_keys_confirmation">공개 및 개인 키를 파일로 내 보냅니다. 안전하게 보관하십시오.</string>
<string name="modules_unlocked">모듈 잠금해제</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">원격</string>
<string name="node_count_template">(%1$d 온라인 / 총 %2$d )</string>
<string name="react">반응</string>
@ -771,7 +776,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Derinimo skydelis</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Gerai</string>
<string name="must_set_region">Turite nustatyti regioną!</string>
<string name="cant_change_no_radio">Nepavyko pakeisti kanalo, nes radijas dar nėra prisijungęs. Bandykite dar kartą.</string>
<string name="save_rangetest">Eksportuoti rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Nustatyti iš naujo</string>
<string name="scan">Skenuoti</string>
<string name="add_network_device">Pridėti</string>
@ -640,6 +644,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -777,7 +782,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Debug-paneel</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">OK</string>
<string name="must_set_region">Je moet een regio instellen!</string>
<string name="cant_change_no_radio">Kon kanaal niet wijzigen, omdat de radio nog niet is aangesloten. Probeer het opnieuw.</string>
<string name="save_rangetest">Exporteer rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Reset</string>
<string name="scan">Scan</string>
<string name="add_network_device">Voeg toe</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Feilsøkningspanel</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Ok</string>
<string name="must_set_region">Du må angi en region!</string>
<string name="cant_change_no_radio">Kunne ikke endre kanalen, fordi radio ikke er tilkoblet enda. Vennligst prøv på nytt.</string>
<string name="save_rangetest">Eksporter rekkeviddetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Nullstill</string>
<string name="scan">Søk</string>
<string name="add_network_device">Legg til</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Panel debugowania</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">OK</string>
<string name="must_set_region">Musisz ustawić region!</string>
<string name="cant_change_no_radio">Nie można zmienić kanału, ponieważ urządzenie nie jest jeszcze podłączone. Proszę, spróbuj ponownie.</string>
<string name="save_rangetest">Eksport rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Zresetuj</string>
<string name="scan">Skanowanie</string>
<string name="add_network_device">Dodaj</string>
@ -640,6 +644,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -777,7 +782,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Painel de depuração</string>
<string name="debug_decoded_payload">Pacote Decodificado:</string>
<string name="debug_logs_export">Exportar Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filtros</string>
<string name="debug_active_filters">Filtros ativos</string>
<string name="debug_default_search">Pesquisar nos logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Ok</string>
<string name="must_set_region">Você deve informar uma região!</string>
<string name="cant_change_no_radio">Não foi possível mudar de canal, rádio não conectado. Tente novamente.</string>
<string name="save_rangetest">Exportar rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Redefinir</string>
<string name="scan">Escanear</string>
<string name="add_network_device">Adicionar</string>
@ -636,6 +640,7 @@
<string name="export_keys">Exportar chaves</string>
<string name="export_keys_confirmation">Exporta as chaves públicas e privadas para um arquivo. Por favor, armazene em algum lugar com segurança.</string>
<string name="modules_unlocked">Módulos desbloqueados</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remoto</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">Reagir</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">A URL deve conter espaços reservados.</string>
<string name="url_template">Modelo de URL</string>
<string name="track_point">ponto de rastreamento</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Painel de depuração</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Okay</string>
<string name="must_set_region">Você deve informar uma região!</string>
<string name="cant_change_no_radio">Não foi possível mudar de canal, rádio desligado. Tente novamente.</string>
<string name="save_rangetest">Exportar rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Redefinir</string>
<string name="scan">Digitalizar</string>
<string name="add_network_device">Adicionar</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Panou debug</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Ok</string>
<string name="must_set_region">Trebuie să alegeți o regiune!</string>
<string name="cant_change_no_radio">Nu s-a putut schimba canalul, deoarece radioul nu este conectat încă. Vă rugăm să încercați din nou.</string>
<string name="save_rangetest">Export rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Resetare</string>
<string name="scan">Scanare</string>
<string name="add_network_device">Adaugă</string>
@ -638,6 +642,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -775,7 +780,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Панель отладки</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Экспортировать логи</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Фильтры</string>
<string name="debug_active_filters">Активные фильтры</string>
<string name="debug_default_search">Искать в журнале…</string>
@ -139,7 +142,8 @@
<string name="okay">Лады</string>
<string name="must_set_region">Вы должны задать регион!</string>
<string name="cant_change_no_radio">Не удалось изменить канал, потому что радио еще не подключено. Пожалуйста, попробуйте еще раз.</string>
<string name="save_rangetest">Экспортировать rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Сброс</string>
<string name="scan">Сканирования</string>
<string name="add_network_device">Добавить</string>
@ -640,6 +644,7 @@
<string name="export_keys">Экспортировать ключи</string>
<string name="export_keys_confirmation">Экспортирует публичный и приватный ключи в файл. Пожалуйста, храните их где-нибудь в безопасности.</string>
<string name="modules_unlocked">Модули разблокированы</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Удаленные</string>
<string name="node_count_template">(%1$d в сети / всего %2$d)</string>
<string name="react">Среагировать</string>
@ -774,7 +779,8 @@
<string name="url_must_contain_placeholders">URL должен содержать placeholders.</string>
<string name="url_template">Шаблон URL</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Debug okno</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">OK</string>
<string name="must_set_region">Musíte nastaviť región!</string>
<string name="cant_change_no_radio">Nie je možné zmeniť kanál, pretože vysielač ešte nie je pripojený. Skúste to neskôr.</string>
<string name="save_rangetest">Exportovať rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Obnoviť</string>
<string name="scan">Skenovať</string>
<string name="add_network_device">Pridať</string>
@ -640,6 +644,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -777,7 +782,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Plošča za odpravljanje napak</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">V redu</string>
<string name="must_set_region">Nastavitev regije!</string>
<string name="cant_change_no_radio">Menjava ni možna ni radia.</string>
<string name="save_rangetest">Izvozi rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Ponastavi</string>
<string name="scan">Skeniraj</string>
<string name="add_network_device">Dodaj</string>
@ -640,6 +644,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -777,7 +782,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Paneli i debug-ut</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Mirë</string>
<string name="must_set_region">Duhet të vendosni një rajon!</string>
<string name="cant_change_no_radio">Nuk mund të ndryshoni kanalin, sepse radioja ende nuk është lidhur. Ju lutemi provoni përsëri.</string>
<string name="save_rangetest">Eksporto rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Rivendos</string>
<string name="scan">Skano</string>
<string name="add_network_device">Shto</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Панел за отклањање грешака</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Океј</string>
<string name="must_set_region">Мораш одабрати регион!</string>
<string name="cant_change_no_radio">Није било могуће променити канал, јер радио још није повезан. Молимо покушајте поново.</string>
<string name="save_rangetest">Извези rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Поново покрени</string>
<string name="scan">Скенирај</string>
<string name="add_network_device">Додај</string>
@ -638,6 +642,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -775,7 +780,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Felsökningspanel</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Okej</string>
<string name="must_set_region">Du måste ställa in en region!</string>
<string name="cant_change_no_radio">Det gick inte att byta kanal, eftersom radiomodulen ännu inte är ansluten. Försök igen.</string>
<string name="save_rangetest">Exportera rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Nollställ</string>
<string name="scan">Sök</string>
<string name="add_network_device">Lägg till</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Hata Ayıklama Paneli</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filtreler</string>
<string name="debug_active_filters">Aktif Filtreler</string>
<string name="debug_default_search">Loglarda ara…</string>
@ -139,7 +142,8 @@
<string name="okay">Tamam</string>
<string name="must_set_region">Bölge seçmelisin!</string>
<string name="cant_change_no_radio">Radyo bağlı olmadığından, kanal değiştirilemedi. Lütfen tekrar deneyin.</string>
<string name="save_rangetest">Dışa aktar: rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Sıfırla</string>
<string name="scan">Tara</string>
<string name="add_network_device">Ekle</string>
@ -636,6 +640,7 @@
<string name="export_keys">Export Keys</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -773,7 +778,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">Панель налагодження</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Експортувати журнали</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Фільтри</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -139,7 +142,8 @@
<string name="okay">Гаразд</string>
<string name="must_set_region">Ви повинні встановити регіон!</string>
<string name="cant_change_no_radio">Неможливо змінити канал, тому що радіо поки що не підключені. Будь ласка, спробуйте ще раз.</string>
<string name="save_rangetest">Експортувати rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Скинути</string>
<string name="scan">Сканувати</string>
<string name="add_network_device">Додати</string>
@ -640,6 +644,7 @@
<string name="export_keys">Експортувати ключі</string>
<string name="export_keys_confirmation">Exports public and private keys to a file. Please store somewhere securely.</string>
<string name="modules_unlocked">Modules unlocked</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">Remote</string>
<string name="node_count_template">(%1$d online / %2$d total)</string>
<string name="react">React</string>
@ -777,7 +782,8 @@
<string name="url_must_contain_placeholders">URL must contain placeholders.</string>
<string name="url_template">URL Template</string>
<string name="track_point">track point</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">调试面板</string>
<string name="debug_decoded_payload">解码Payload</string>
<string name="debug_logs_export">导出程序日志</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">筛选器</string>
<string name="debug_active_filters">启用的过滤器</string>
<string name="debug_default_search">搜索日志…</string>
@ -139,7 +142,8 @@
<string name="okay">确定</string>
<string name="must_set_region">您必须先选择一个地区</string>
<string name="cant_change_no_radio">无法更改频道,因为装置尚未连接。请再试一次。</string>
<string name="save_rangetest">导出信号测试数据.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">重置</string>
<string name="scan">扫描</string>
<string name="add_network_device">新增</string>
@ -636,6 +640,7 @@
<string name="export_keys">导出密钥</string>
<string name="export_keys_confirmation">导出公钥和私钥到文件。请安全地存储某处。</string>
<string name="modules_unlocked">模块已解锁</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">远程</string>
<string name="node_count_template">(%1$d 在线 / %2$d 总计)</string>
<string name="react">互动</string>
@ -772,7 +777,8 @@
<string name="url_must_contain_placeholders">URL 必须包含占位符。</string>
<string name="url_template">URL 模板</string>
<string name="track_point">轨迹点</string>
<string name="phone_settings">Phone Settings</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -116,6 +116,9 @@
<string name="debug_panel">除錯面板</string>
<string name="debug_decoded_payload">解析封包:</string>
<string name="debug_logs_export">匯出日誌</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">篩選</string>
<string name="debug_active_filters">啟動篩選功能</string>
<string name="debug_default_search">在日誌中搜尋…</string>
@ -139,7 +142,8 @@
<string name="okay">好的</string>
<string name="must_set_region">您必須設定一個區域!</string>
<string name="cant_change_no_radio">無法更改頻道,因為裝置尚未連接。請再試一次。</string>
<string name="save_rangetest">匯出範圍測試資料.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">重設</string>
<string name="scan">掃描</string>
<string name="add_network_device">新增</string>
@ -634,6 +638,7 @@
<string name="export_keys">匯出金鑰</string>
<string name="export_keys_confirmation">請將匯出後的私鑰及公鑰妥善保存。</string>
<string name="modules_unlocked">模組已解鎖</string>
<string name="modules_already_unlocked">Modules already unlocked</string>
<string name="remote">遠端</string>
<string name="node_count_template">(%1$d 個上線 / 共計 %2$d 個)</string>
<string name="react">回應</string>
@ -771,7 +776,8 @@
<string name="url_must_contain_placeholders">網址必須包含佔位符。</string>
<string name="url_template">URL 範本</string>
<string name="track_point">軌跡點</string>
<string name="phone_settings">手機設定</string>
<string name="app_settings">App</string>
<string name="app_version">Version</string>
<string name="channel_features">Channel Features</string>
<string name="location_sharing">Location Sharing</string>
<string name="periodic_position_broadcast">Periodic position broadcast</string>

View file

@ -133,6 +133,9 @@
<string name="debug_panel">Debug Panel</string>
<string name="debug_decoded_payload">Decoded Payload:</string>
<string name="debug_logs_export">Export Logs</string>
<string name="debug_export_cancelled">Export canceled</string>
<string name="debug_export_success">%1$d logs exported</string>
<string name="debug_export_failed">Failed to write log file: %1$s</string>
<string name="debug_filters">Filters</string>
<string name="debug_active_filters">Active filters</string>
<string name="debug_default_search">Search in logs…</string>
@ -156,7 +159,8 @@
<string name="okay">OK</string>
<string name="must_set_region">You must set a region!</string>
<string name="cant_change_no_radio">Couldn\'t change channel, because radio is not yet connected. Please try again.</string>
<string name="save_rangetest">Export rangetest.csv</string>
<string name="save_rangetest">Export rangetest packets</string>
<string name="export_data_csv">Export all packets</string>
<string name="reset">Reset</string>
<string name="scan">Scan</string>
<string name="add_network_device">Add</string>

@ -1 +1 @@
Subproject commit 07d6573e1065344e80845de704885f011e515233
Subproject commit a84657c220421536f18d11fc5edf680efadbceeb