mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
Merge branch 'main' into release/2.7.0
This commit is contained in:
commit
7b5b270899
55 changed files with 822 additions and 331 deletions
13
.github/workflows/pr_enforce_labels.yml
vendored
13
.github/workflows/pr_enforce_labels.yml
vendored
|
|
@ -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(', ')}.`);
|
||||
}
|
||||
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) }
|
||||
}
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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) }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
},
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue