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
52d4659568
55 changed files with 520 additions and 285 deletions
|
|
@ -15,7 +15,6 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import com.datadog.gradle.plugin.InstrumentationMode
|
||||
import io.gitlab.arturbosch.detekt.Detekt
|
||||
import java.io.FileInputStream
|
||||
import java.util.Properties
|
||||
|
|
@ -182,9 +181,9 @@ secrets {
|
|||
}
|
||||
|
||||
datadog {
|
||||
if (!gradle.startParameter.taskNames.any { it.contains("fdroid", ignoreCase = true) }) {
|
||||
composeInstrumentation = InstrumentationMode.AUTO
|
||||
}
|
||||
// if (!gradle.startParameter.taskNames.any { it.contains("fdroid", ignoreCase = true) }) {
|
||||
// composeInstrumentation = InstrumentationMode.AUTO
|
||||
// }
|
||||
}
|
||||
|
||||
// per protobuf-gradle-plugin docs, this is recommended for android
|
||||
|
|
|
|||
|
|
@ -40,11 +40,6 @@ abstract class GeeksvilleApplication :
|
|||
lateinit var analytics: AnalyticsProvider
|
||||
}
|
||||
|
||||
val isGooglePlayAvailable: Boolean
|
||||
get() {
|
||||
return false
|
||||
}
|
||||
|
||||
// / Are we running inside the testlab?
|
||||
val isInTestLab: Boolean
|
||||
get() {
|
||||
|
|
@ -57,19 +52,8 @@ abstract class GeeksvilleApplication :
|
|||
|
||||
abstract val analyticsPrefs: AnalyticsPrefs
|
||||
|
||||
var isAnalyticsAllowed: Boolean
|
||||
get() = analyticsPrefs.analyticsAllowed
|
||||
set(value) {
|
||||
analyticsPrefs.analyticsAllowed = value
|
||||
|
||||
// Change the flag with the providers
|
||||
analytics.setEnabled(value && !isInTestLab) // Never do analytics in the test lab
|
||||
}
|
||||
|
||||
@Suppress("UnusedParameter")
|
||||
fun askToRate(activity: AppCompatActivity) {
|
||||
// No-op for F-Droid version
|
||||
}
|
||||
@Suppress("EmptyFunctionBlock", "UnusedParameter")
|
||||
fun askToRate(application: AppCompatActivity) {}
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
|
@ -80,13 +64,9 @@ abstract class GeeksvilleApplication :
|
|||
|
||||
val nopAnalytics = NopAnalytics(this)
|
||||
analytics = nopAnalytics
|
||||
isAnalyticsAllowed = false
|
||||
}
|
||||
}
|
||||
|
||||
val Context.isGooglePlayAvailable: Boolean
|
||||
get() = false
|
||||
|
||||
@Suppress("UnusedParameter")
|
||||
fun setAttributes(deviceVersion: String, deviceHardware: DeviceHardware) {
|
||||
// No-op for F-Droid version
|
||||
|
|
@ -100,3 +80,6 @@ fun AddNavigationTracking(navController: NavHostController) {
|
|||
debug("Navigation changed to: ${destination.route}")
|
||||
}
|
||||
}
|
||||
|
||||
val Context.isAnalyticsAvailable: Boolean
|
||||
get() = false
|
||||
|
|
|
|||
|
|
@ -17,69 +17,16 @@
|
|||
|
||||
package com.geeksville.mesh
|
||||
|
||||
import android.os.Debug
|
||||
import com.geeksville.mesh.android.BuildUtils.isEmulator
|
||||
import com.geeksville.mesh.android.GeeksvilleApplication
|
||||
import com.geeksville.mesh.android.prefs.AnalyticsPrefs
|
||||
import com.geeksville.mesh.util.Exceptions
|
||||
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
||||
import com.google.firebase.crashlytics.setCustomKeys
|
||||
import dagger.hilt.android.HiltAndroidApp
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltAndroidApp
|
||||
class MeshUtilApplication : GeeksvilleApplication() {
|
||||
|
||||
@Inject override lateinit var analyticsPrefs: AnalyticsPrefs
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
||||
// We default to off in the manifest - we turn on here if the user approves
|
||||
// leave off when running in the debugger
|
||||
if (!isEmulator && (!BuildConfig.DEBUG || !Debug.isDebuggerConnected())) {
|
||||
val crashlytics = FirebaseCrashlytics.getInstance()
|
||||
crashlytics.setUserId(analyticsPrefs.installId) // be able to group all bugs per anonymous user
|
||||
|
||||
fun sendCrashReports() {
|
||||
if (isAnalyticsAllowed) {
|
||||
crashlytics.sendUnsentReports()
|
||||
}
|
||||
}
|
||||
|
||||
// Send any old reports if user approves
|
||||
sendCrashReports()
|
||||
|
||||
// Attach to our exception wrapper
|
||||
Exceptions.reporter = { exception, _, _ ->
|
||||
crashlytics.recordException(exception)
|
||||
sendCrashReports() // Send the new report
|
||||
}
|
||||
Timber.plant(CrashlyticsTree())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class CrashlyticsTree : Timber.Tree() {
|
||||
|
||||
companion object {
|
||||
private const val KEY_PRIORITY = "priority"
|
||||
private const val KEY_TAG = "tag"
|
||||
private const val KEY_MESSAGE = "message"
|
||||
}
|
||||
|
||||
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
|
||||
FirebaseCrashlytics.getInstance().setCustomKeys {
|
||||
key(KEY_PRIORITY, priority)
|
||||
key(KEY_TAG, tag ?: "No Tag")
|
||||
key(KEY_MESSAGE, message)
|
||||
}
|
||||
|
||||
if (t == null) {
|
||||
FirebaseCrashlytics.getInstance().recordException(Exception(message))
|
||||
} else {
|
||||
FirebaseCrashlytics.getInstance().recordException(t)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ package com.geeksville.mesh.android
|
|||
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.provider.Settings
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.runtime.Composable
|
||||
|
|
@ -52,6 +53,11 @@ import com.geeksville.mesh.model.DeviceHardware
|
|||
import com.geeksville.mesh.util.exceptionReporter
|
||||
import com.google.android.gms.common.ConnectionResult
|
||||
import com.google.android.gms.common.GoogleApiAvailabilityLight
|
||||
import com.google.firebase.Firebase
|
||||
import com.google.firebase.analytics.analytics
|
||||
import com.google.firebase.crashlytics.crashlytics
|
||||
import com.google.firebase.crashlytics.setCustomKeys
|
||||
import com.google.firebase.initialize
|
||||
import com.suddenh4x.ratingdialog.AppRating
|
||||
import io.opentracing.util.GlobalTracer
|
||||
import timber.log.Timber
|
||||
|
|
@ -76,29 +82,6 @@ abstract class GeeksvilleApplication :
|
|||
|
||||
abstract val analyticsPrefs: AnalyticsPrefs
|
||||
|
||||
var isAnalyticsAllowed: Boolean
|
||||
get() = analyticsPrefs.analyticsAllowed
|
||||
set(value) {
|
||||
analyticsPrefs.analyticsAllowed = value
|
||||
val newConsent =
|
||||
if (value && !isInTestLab) {
|
||||
TrackingConsent.GRANTED
|
||||
} else {
|
||||
TrackingConsent.NOT_GRANTED
|
||||
}
|
||||
|
||||
info(if (value) "Analytics enabled" else "Analytics disabled")
|
||||
|
||||
if (Datadog.isInitialized()) {
|
||||
Datadog.setTrackingConsent(newConsent)
|
||||
} else {
|
||||
initDatadog()
|
||||
}
|
||||
|
||||
// Change the flag with the providers
|
||||
analytics.setEnabled(value && !isInTestLab) // Never do analytics in the test lab
|
||||
}
|
||||
|
||||
private val minimumLaunchTimes: Int = 10
|
||||
private val minimumDays: Int = 10
|
||||
private val minimumLaunchTimesToShowAgain: Int = 5
|
||||
|
|
@ -130,19 +113,71 @@ abstract class GeeksvilleApplication :
|
|||
}
|
||||
}
|
||||
|
||||
lateinit var analyticsPrefsChangedListener: SharedPreferences.OnSharedPreferenceChangeListener
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
||||
val firebaseAnalytics = FirebaseAnalytics(analyticsPrefs.installId)
|
||||
analytics = firebaseAnalytics
|
||||
|
||||
// Set analytics per prefs
|
||||
isAnalyticsAllowed = isAnalyticsAllowed
|
||||
initDatadog()
|
||||
initCrashlytics()
|
||||
updateAnalyticsConsent()
|
||||
// listen for changes to analytics prefs
|
||||
analyticsPrefsChangedListener =
|
||||
SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
|
||||
if (key == "allowed") {
|
||||
updateAnalyticsConsent()
|
||||
}
|
||||
}
|
||||
getSharedPreferences("analytics-prefs", MODE_PRIVATE)
|
||||
.registerOnSharedPreferenceChangeListener(analyticsPrefsChangedListener)
|
||||
}
|
||||
|
||||
private val sampleRate = 100f
|
||||
|
||||
private fun initCrashlytics() {
|
||||
analytics = FirebaseAnalytics(analyticsPrefs.installId)
|
||||
Firebase.initialize(this)
|
||||
Firebase.crashlytics.setUserId(analyticsPrefs.installId)
|
||||
Timber.plant(CrashlyticsTree())
|
||||
}
|
||||
|
||||
private fun updateAnalyticsConsent() {
|
||||
if (!isAnalyticsAvailable || isInTestLab) {
|
||||
info("Analytics not available")
|
||||
return
|
||||
}
|
||||
val isAnalyticsAllowed = analyticsPrefs.analyticsAllowed
|
||||
info(if (isAnalyticsAllowed) "Analytics enabled" else "Analytics disabled")
|
||||
Datadog.setTrackingConsent(if (isAnalyticsAllowed) TrackingConsent.GRANTED else TrackingConsent.NOT_GRANTED)
|
||||
|
||||
analytics.setEnabled(isAnalyticsAllowed)
|
||||
Firebase.crashlytics.isCrashlyticsCollectionEnabled = isAnalyticsAllowed
|
||||
Firebase.analytics.setAnalyticsCollectionEnabled(isAnalyticsAllowed)
|
||||
Firebase.crashlytics.sendUnsentReports()
|
||||
}
|
||||
|
||||
private class CrashlyticsTree : Timber.Tree() {
|
||||
|
||||
companion object {
|
||||
private const val KEY_PRIORITY = "priority"
|
||||
private const val KEY_TAG = "tag"
|
||||
private const val KEY_MESSAGE = "message"
|
||||
}
|
||||
|
||||
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
|
||||
Firebase.crashlytics.setCustomKeys {
|
||||
key(KEY_PRIORITY, priority)
|
||||
key(KEY_TAG, tag ?: "No Tag")
|
||||
key(KEY_MESSAGE, message)
|
||||
}
|
||||
|
||||
if (t == null) {
|
||||
Firebase.crashlytics.recordException(Exception(message))
|
||||
} else {
|
||||
Firebase.crashlytics.recordException(t)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun initDatadog() {
|
||||
val logger =
|
||||
Logger.Builder()
|
||||
|
|
@ -161,13 +196,9 @@ abstract class GeeksvilleApplication :
|
|||
.setCrashReportsEnabled(true)
|
||||
.setUseDeveloperModeWhenDebuggable(true)
|
||||
.build()
|
||||
val consent =
|
||||
if (isAnalyticsAllowed && !isInTestLab) {
|
||||
TrackingConsent.GRANTED
|
||||
} else {
|
||||
TrackingConsent.NOT_GRANTED
|
||||
}
|
||||
val consent = TrackingConsent.PENDING
|
||||
Datadog.initialize(this, configuration, consent)
|
||||
Datadog.setUserInfo(analyticsPrefs.installId)
|
||||
|
||||
val rumConfiguration =
|
||||
RumConfiguration.Builder(BuildConfig.datadogApplicationId)
|
||||
|
|
@ -207,12 +238,17 @@ fun setAttributes(firmwareVersion: String, deviceHardware: DeviceHardware) {
|
|||
GlobalRumMonitor.get().addAttribute("device_hardware", deviceHardware.hwModelSlug)
|
||||
}
|
||||
|
||||
val Context.isGooglePlayAvailable: Boolean
|
||||
private val Context.isGooglePlayAvailable: Boolean
|
||||
get() =
|
||||
GoogleApiAvailabilityLight.getInstance().isGooglePlayServicesAvailable(this).let {
|
||||
it != ConnectionResult.SERVICE_MISSING && it != ConnectionResult.SERVICE_INVALID
|
||||
}
|
||||
|
||||
private val isDatadogAvailable: Boolean = Datadog.isInitialized()
|
||||
|
||||
val Context.isAnalyticsAvailable: Boolean
|
||||
get() = isDatadogAvailable && isGooglePlayAvailable
|
||||
|
||||
@OptIn(ExperimentalTrackingApi::class)
|
||||
@Composable
|
||||
fun AddNavigationTracking(navController: NavHostController) {
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ import androidx.compose.material3.Card
|
|||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
|
||||
import androidx.compose.material3.FloatingToolbarDefaults
|
||||
import androidx.compose.material3.FloatingToolbarDefaults.ScreenOffset
|
||||
import androidx.compose.material3.FloatingToolbarExitDirection.Companion.End
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
|
|
@ -509,8 +508,12 @@ fun MapView(
|
|||
}
|
||||
}
|
||||
|
||||
DisappearingScaleBar(cameraPositionState = cameraPositionState)
|
||||
val currentCameraPosition = cameraPositionState.position
|
||||
var displayedZoom by remember { mutableStateOf(currentCameraPosition.zoom) }
|
||||
|
||||
if (displayedZoom != 0f) {
|
||||
DisappearingScaleBar(cameraPositionState = cameraPositionState)
|
||||
}
|
||||
editingWaypoint?.let { waypointToEdit ->
|
||||
EditWaypointDialog(
|
||||
waypoint = waypointToEdit,
|
||||
|
|
@ -539,7 +542,7 @@ fun MapView(
|
|||
}
|
||||
|
||||
MapControlsOverlay(
|
||||
modifier = Modifier.align(Alignment.CenterEnd).offset(x = -ScreenOffset),
|
||||
modifier = Modifier.align(Alignment.TopEnd).padding(top = 50.dp),
|
||||
mapFilterMenuExpanded = mapFilterMenuExpanded,
|
||||
onMapFilterMenuDismissRequest = { mapFilterMenuExpanded = false },
|
||||
onToggleMapFilterMenu = { mapFilterMenuExpanded = true },
|
||||
|
|
|
|||
|
|
@ -60,6 +60,13 @@ fun CustomMapLayersSheet(
|
|||
)
|
||||
HorizontalDivider()
|
||||
}
|
||||
item {
|
||||
Text(
|
||||
modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 0.dp),
|
||||
text = stringResource(R.string.map_layer_formats),
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
)
|
||||
}
|
||||
|
||||
if (mapLayers.isEmpty()) {
|
||||
item {
|
||||
|
|
|
|||
|
|
@ -1032,7 +1032,7 @@
|
|||
"hwModelSlug": "T_DECK_PRO",
|
||||
"platformioTarget": "t-deck-pro",
|
||||
"architecture": "esp32-s3",
|
||||
"activelySupported": false,
|
||||
"activelySupported": true,
|
||||
"supportLevel": 1,
|
||||
"displayName": "LILYGO T-Deck Pro",
|
||||
"tags": [
|
||||
|
|
|
|||
|
|
@ -20,7 +20,8 @@ package com.geeksville.mesh.repository.radio
|
|||
import com.geeksville.mesh.android.Logging
|
||||
|
||||
/**
|
||||
* An interface that assumes we are talking to a meshtastic device over some sort of stream connection (serial or TCP probably)
|
||||
* An interface that assumes we are talking to a meshtastic device over some sort of stream connection (serial or TCP
|
||||
* probably)
|
||||
*/
|
||||
abstract class StreamInterface(protected val service: RadioInterfaceService) :
|
||||
Logging,
|
||||
|
|
@ -46,12 +47,16 @@ abstract class StreamInterface(protected val service: RadioInterfaceService) :
|
|||
onDeviceDisconnect(true)
|
||||
}
|
||||
|
||||
/** Tell MeshService our device has gone away, but wait for it to come back
|
||||
/**
|
||||
* Tell MeshService our device has gone away, but wait for it to come back
|
||||
*
|
||||
* @param waitForStopped if true we should wait for the manager to finish - must be false if called from inside the manager callbacks
|
||||
* */
|
||||
* @param waitForStopped if true we should wait for the manager to finish - must be false if called from inside the
|
||||
* manager callbacks
|
||||
*/
|
||||
protected open fun onDeviceDisconnect(waitForStopped: Boolean) {
|
||||
service.onDisconnect(isPermanent = true) // if USB device disconnects it is definitely permanently gone, not sleeping)
|
||||
service.onDisconnect(
|
||||
isPermanent = true,
|
||||
) // if USB device disconnects it is definitely permanently gone, not sleeping)
|
||||
}
|
||||
|
||||
protected open fun connect() {
|
||||
|
|
@ -85,14 +90,12 @@ abstract class StreamInterface(protected val service: RadioInterfaceService) :
|
|||
/** Print device serial debug output somewhere */
|
||||
private fun debugOut(b: Byte) {
|
||||
when (val c = b.toChar()) {
|
||||
'\r' -> {
|
||||
} // ignore
|
||||
'\r' -> {} // ignore
|
||||
'\n' -> {
|
||||
debug("DeviceLog: $debugLineBuf")
|
||||
debugLineBuf.clear()
|
||||
}
|
||||
else ->
|
||||
debugLineBuf.append(c)
|
||||
else -> debugLineBuf.append(c)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -133,16 +136,19 @@ abstract class StreamInterface(protected val service: RadioInterfaceService) :
|
|||
// We've read our header, do one big read for the packet itself
|
||||
packetLen = (msb shl 8) or lsb
|
||||
if (packetLen > MAX_TO_FROM_RADIO_SIZE) {
|
||||
lostSync() // If packet len is too long, the bytes must have been corrupted, start looking for START1 again
|
||||
lostSync() // If packet len is too long, the bytes must have been corrupted, start looking for
|
||||
// START1 again
|
||||
} else if (packetLen == 0) {
|
||||
deliverPacket() // zero length packets are valid and should be delivered immediately (because there won't be a next byte of payload)
|
||||
deliverPacket() // zero length packets are valid and should be delivered immediately (because there
|
||||
// won't be a next byte of payload)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
// We are looking at the packet bytes now
|
||||
rxPacket[ptr - 4] = c
|
||||
|
||||
// Note: we have to check if ptr +1 is equal to packet length (for example, for a 1 byte packetlen, this code will be run with ptr of4
|
||||
// Note: we have to check if ptr +1 is equal to packet length (for example, for a 1 byte packetlen, this
|
||||
// code will be run with ptr of4
|
||||
if (ptr - 4 + 1 == packetLen) {
|
||||
deliverPacket()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,9 +17,13 @@
|
|||
|
||||
package com.geeksville.mesh.ui.common.components
|
||||
|
||||
import androidx.compose.animation.AnimatedContent
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.selection.toggleable
|
||||
import androidx.compose.material3.CircularWavyProgressIndicator
|
||||
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
|
||||
import androidx.compose.material3.ListItem
|
||||
import androidx.compose.material3.ListItemDefaults
|
||||
import androidx.compose.material3.Switch
|
||||
|
|
@ -30,6 +34,7 @@ import androidx.compose.ui.graphics.Color
|
|||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
||||
@Composable
|
||||
fun SwitchPreference(
|
||||
modifier: Modifier = Modifier,
|
||||
|
|
@ -40,46 +45,47 @@ fun SwitchPreference(
|
|||
onCheckedChange: (Boolean) -> Unit,
|
||||
padding: PaddingValues? = null,
|
||||
containerColor: Color? = null,
|
||||
loading: Boolean = false,
|
||||
) {
|
||||
ListItem(
|
||||
colors = ListItemDefaults.colors().copy(
|
||||
headlineColor = if (enabled) {
|
||||
ListItemDefaults.colors().headlineColor
|
||||
} else {
|
||||
ListItemDefaults.colors().headlineColor.copy(alpha = 0.5f)
|
||||
},
|
||||
supportingTextColor = if (enabled) {
|
||||
ListItemDefaults.colors().supportingTextColor
|
||||
} else {
|
||||
ListItemDefaults.colors().supportingTextColor.copy(alpha = 0.5f)
|
||||
},
|
||||
containerColor = containerColor ?: ListItemDefaults.colors().containerColor,
|
||||
),
|
||||
modifier = (padding?.let { Modifier.padding(it) } ?: modifier).toggleable(
|
||||
colors =
|
||||
ListItemDefaults.colors()
|
||||
.copy(
|
||||
headlineColor =
|
||||
if (enabled) {
|
||||
ListItemDefaults.colors().headlineColor
|
||||
} else {
|
||||
ListItemDefaults.colors().headlineColor.copy(alpha = 0.5f)
|
||||
},
|
||||
supportingTextColor =
|
||||
if (enabled) {
|
||||
ListItemDefaults.colors().supportingTextColor
|
||||
} else {
|
||||
ListItemDefaults.colors().supportingTextColor.copy(alpha = 0.5f)
|
||||
},
|
||||
containerColor = containerColor ?: ListItemDefaults.colors().containerColor,
|
||||
),
|
||||
modifier =
|
||||
(padding?.let { Modifier.padding(it) } ?: modifier).toggleable(
|
||||
value = checked,
|
||||
enabled = enabled,
|
||||
onValueChange = onCheckedChange,
|
||||
),
|
||||
trailingContent = {
|
||||
Switch(
|
||||
enabled = enabled,
|
||||
checked = checked,
|
||||
onCheckedChange = null,
|
||||
)
|
||||
AnimatedContent(targetState = loading) { loading ->
|
||||
if (loading) {
|
||||
CircularWavyProgressIndicator(modifier = Modifier.size(24.dp))
|
||||
} else {
|
||||
Switch(enabled = enabled, checked = checked, onCheckedChange = null)
|
||||
}
|
||||
}
|
||||
},
|
||||
supportingContent = {
|
||||
if (summary.isNotEmpty()) {
|
||||
Text(
|
||||
text = summary,
|
||||
modifier = Modifier.padding(bottom = 16.dp),
|
||||
)
|
||||
Text(text = summary, modifier = Modifier.padding(bottom = 16.dp))
|
||||
}
|
||||
},
|
||||
headlineContent = {
|
||||
Text(
|
||||
text = title,
|
||||
)
|
||||
}
|
||||
headlineContent = { Text(text = title) },
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ import androidx.compose.foundation.layout.size
|
|||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.selection.selectable
|
||||
import androidx.compose.foundation.selection.selectableGroup
|
||||
import androidx.compose.foundation.selection.toggleable
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Bluetooth
|
||||
|
|
@ -49,7 +48,6 @@ import androidx.compose.material.icons.rounded.Bluetooth
|
|||
import androidx.compose.material.icons.rounded.Usb
|
||||
import androidx.compose.material.icons.rounded.Wifi
|
||||
import androidx.compose.material3.Card
|
||||
import androidx.compose.material3.Checkbox
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.SegmentedButton
|
||||
|
|
@ -71,7 +69,6 @@ import androidx.compose.ui.Modifier
|
|||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.semantics.Role
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
|
|
@ -83,10 +80,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
|||
import com.geeksville.mesh.BuildConfig
|
||||
import com.geeksville.mesh.ConfigProtos
|
||||
import com.geeksville.mesh.R
|
||||
import com.geeksville.mesh.android.BuildUtils.debug
|
||||
import com.geeksville.mesh.android.GeeksvilleApplication
|
||||
import com.geeksville.mesh.android.gpsDisabled
|
||||
import com.geeksville.mesh.android.isGooglePlayAvailable
|
||||
import com.geeksville.mesh.model.BTScanModel
|
||||
import com.geeksville.mesh.model.BluetoothViewModel
|
||||
import com.geeksville.mesh.model.DeviceListEntry
|
||||
|
|
@ -141,7 +135,6 @@ fun ConnectionsScreen(
|
|||
val connectionState by uiViewModel.connectionState.collectAsStateWithLifecycle(ConnectionState.DISCONNECTED)
|
||||
val scanning by scanModel.spinner.collectAsStateWithLifecycle(false)
|
||||
val context = LocalContext.current
|
||||
val app = (context.applicationContext as GeeksvilleApplication)
|
||||
val info by uiViewModel.myNodeInfo.collectAsStateWithLifecycle()
|
||||
val selectedDevice by scanModel.selectedNotNullFlow.collectAsStateWithLifecycle()
|
||||
val bluetoothEnabled by bluetoothViewModel.enabled.collectAsStateWithLifecycle(false)
|
||||
|
|
@ -425,42 +418,6 @@ fun ConnectionsScreen(
|
|||
|
||||
LaunchedEffect(Unit) { uiViewModel.suppressNoPairedWarning() }
|
||||
}
|
||||
|
||||
// Analytics Okay Checkbox
|
||||
|
||||
val isGooglePlayAvailable = context.isGooglePlayAvailable
|
||||
val isAnalyticsAllowed = app.isAnalyticsAllowed && isGooglePlayAvailable
|
||||
if (isGooglePlayAvailable) {
|
||||
var loading by remember { mutableStateOf(false) }
|
||||
LaunchedEffect(isAnalyticsAllowed) { loading = false }
|
||||
Row(
|
||||
modifier =
|
||||
Modifier.fillMaxWidth()
|
||||
.toggleable(
|
||||
value = isAnalyticsAllowed,
|
||||
onValueChange = {
|
||||
debug("User changed analytics to $it")
|
||||
app.isAnalyticsAllowed = it
|
||||
loading = true
|
||||
},
|
||||
role = Role.Checkbox,
|
||||
enabled = isGooglePlayAvailable && !loading,
|
||||
)
|
||||
.padding(horizontal = 16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
Checkbox(
|
||||
enabled = isGooglePlayAvailable,
|
||||
checked = isAnalyticsAllowed,
|
||||
onCheckedChange = null,
|
||||
)
|
||||
Text(
|
||||
text = stringResource(R.string.analytics_okay),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
modifier = Modifier.padding(start = 16.dp),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,28 +17,23 @@
|
|||
|
||||
package com.geeksville.mesh.ui.settings.components
|
||||
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.ColumnScope
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.RowScope
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.wrapContentWidth
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.rounded.KeyboardArrowRight
|
||||
import androidx.compose.material.icons.rounded.Android
|
||||
import androidx.compose.material3.Card
|
||||
import androidx.compose.material3.CardDefaults
|
||||
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.ListItem
|
||||
import androidx.compose.material3.ListItemDefaults
|
||||
import androidx.compose.material3.LocalContentColor
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Switch
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
|
|
@ -67,6 +62,7 @@ fun SettingsItem(
|
|||
}
|
||||
|
||||
/** A toggleable settings switch item. */
|
||||
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
||||
@Composable
|
||||
fun SettingsItemSwitch(
|
||||
checked: Boolean,
|
||||
|
|
@ -120,17 +116,14 @@ private fun ClickableWrapper(enabled: Boolean, onClick: () -> Unit, content: @Co
|
|||
|
||||
/** The row content to display for a settings item. */
|
||||
@Composable
|
||||
private fun Content(leading: @Composable () -> Unit, text: String, trailing: @Composable RowScope.() -> Unit) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.spacedBy(16.dp),
|
||||
modifier = Modifier.fillMaxWidth().padding(vertical = 12.dp, horizontal = 16.dp),
|
||||
) {
|
||||
leading()
|
||||
Text(text = text, style = MaterialTheme.typography.bodyLarge, modifier = Modifier.wrapContentWidth())
|
||||
Spacer(modifier = Modifier.weight(1f))
|
||||
trailing()
|
||||
}
|
||||
private fun Content(leading: @Composable () -> Unit, text: String, trailing: @Composable () -> Unit) {
|
||||
ListItem(
|
||||
modifier = Modifier.padding(horizontal = 8.dp),
|
||||
colors = ListItemDefaults.colors(containerColor = Color.Transparent),
|
||||
headlineContent = { Text(text) },
|
||||
leadingContent = { leading() },
|
||||
trailingContent = { trailing() },
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ import androidx.compose.foundation.lazy.items
|
|||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.twotone.KeyboardArrowRight
|
||||
import androidx.compose.material.icons.filled.BugReport
|
||||
import androidx.compose.material.icons.filled.Download
|
||||
import androidx.compose.material.icons.filled.Upload
|
||||
import androidx.compose.material.icons.twotone.Warning
|
||||
|
|
@ -79,6 +80,7 @@ import com.geeksville.mesh.ui.common.components.TitledCard
|
|||
import com.geeksville.mesh.ui.common.theme.AppTheme
|
||||
import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
|
||||
import com.geeksville.mesh.ui.settings.components.SettingsItem
|
||||
import com.geeksville.mesh.ui.settings.components.SettingsItemSwitch
|
||||
import com.geeksville.mesh.ui.settings.radio.components.EditDeviceProfileDialog
|
||||
import com.geeksville.mesh.ui.settings.radio.components.PacketResponseStateDialog
|
||||
import kotlinx.coroutines.delay
|
||||
|
|
@ -201,6 +203,7 @@ fun RadioConfigScreen(
|
|||
deviceProfile = null
|
||||
showEditDeviceProfileDialog = true
|
||||
},
|
||||
onToggleAnalytics = { viewModel.toggleAnalytics() },
|
||||
onNavigate = onNavigate,
|
||||
)
|
||||
}
|
||||
|
|
@ -286,6 +289,7 @@ private fun RadioConfigItemList(
|
|||
onRouteClick: (Enum<*>) -> Unit = {},
|
||||
onImport: () -> Unit = {},
|
||||
onExport: () -> Unit = {},
|
||||
onToggleAnalytics: () -> Unit = {},
|
||||
onNavigate: (Route) -> Unit,
|
||||
) {
|
||||
val enabled = state.connected && !state.responseState.isWaiting() && !isManaged
|
||||
|
|
@ -364,6 +368,18 @@ private fun RadioConfigItemList(
|
|||
)
|
||||
}
|
||||
}
|
||||
item {
|
||||
if (state.analyticsAvailable) {
|
||||
TitledCard(title = stringResource(R.string.phone_settings), modifier = Modifier.padding(top = 16.dp)) {
|
||||
SettingsItemSwitch(
|
||||
text = stringResource(R.string.analytics_okay),
|
||||
checked = state.analyticsEnabled,
|
||||
leadingIcon = Icons.Default.BugReport,
|
||||
onClick = onToggleAnalytics,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,10 @@ import com.geeksville.mesh.ModuleConfigProtos
|
|||
import com.geeksville.mesh.Portnums
|
||||
import com.geeksville.mesh.Position
|
||||
import com.geeksville.mesh.R
|
||||
import com.geeksville.mesh.android.GeeksvilleApplication
|
||||
import com.geeksville.mesh.android.Logging
|
||||
import com.geeksville.mesh.android.isAnalyticsAvailable
|
||||
import com.geeksville.mesh.android.prefs.AnalyticsPrefs
|
||||
import com.geeksville.mesh.android.prefs.MapConsentPrefs
|
||||
import com.geeksville.mesh.config
|
||||
import com.geeksville.mesh.database.entity.MyNodeEntity
|
||||
|
|
@ -92,6 +95,8 @@ data class RadioConfigState(
|
|||
val ringtone: String = "",
|
||||
val cannedMessageMessages: String = "",
|
||||
val responseState: ResponseState<Boolean> = ResponseState.Empty,
|
||||
val analyticsAvailable: Boolean = true,
|
||||
val analyticsEnabled: Boolean = false,
|
||||
)
|
||||
|
||||
@HiltViewModel
|
||||
|
|
@ -103,6 +108,7 @@ constructor(
|
|||
private val radioConfigRepository: RadioConfigRepository,
|
||||
private val locationRepository: LocationRepository,
|
||||
private val mapConsentPrefs: MapConsentPrefs,
|
||||
private val analyticsPrefs: AnalyticsPrefs,
|
||||
) : ViewModel(),
|
||||
Logging {
|
||||
private val meshService: IMeshService?
|
||||
|
|
@ -159,6 +165,8 @@ constructor(
|
|||
}
|
||||
.launchIn(viewModelScope)
|
||||
|
||||
_radioConfigState.update { it.copy(analyticsAvailable = (app as GeeksvilleApplication).isAnalyticsAvailable) }
|
||||
|
||||
debug("RadioConfigViewModel created")
|
||||
}
|
||||
|
||||
|
|
@ -695,4 +703,9 @@ constructor(
|
|||
requestIds.update { it.apply { remove(data.requestId) } }
|
||||
}
|
||||
}
|
||||
|
||||
fun toggleAnalytics() {
|
||||
analyticsPrefs.analyticsAllowed = !analyticsPrefs.analyticsAllowed
|
||||
_radioConfigState.update { it.copy(analyticsEnabled = analyticsPrefs.analyticsAllowed) }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@
|
|||
<string name="unknown_username">اسم المستخدم غير معروف</string>
|
||||
<string name="send">ارسل</string>
|
||||
<string name="you">أنت</string>
|
||||
<string name="analytics_okay">إحصاءات الاستخدام المجهولة الهُوِيَّة وتقارير الأعطال.</string>
|
||||
<string name="accept">قبول</string>
|
||||
<string name="cancel">إلغاء</string>
|
||||
<string name="new_channel_rcvd">تم تلقي رابط القناة الجديدة</string>
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@
|
|||
<string name="send">Pošalji</string>
|
||||
<string name="warning_not_paired">Још нисте упарили Мештастик компатибилан радио са овим телефоном. Молимо вас да упарите уређај и поставите своје корисничко име.\n\nОва апликација отвореног кода је у развоју, ако нађете проблеме, молимо вас да их објавите на нашем форуму: https://github.com/orgs/meshtastic/discussions\n\nЗа више информација посетите нашу веб страницу - www.meshtastic.org.</string>
|
||||
<string name="you">Ti</string>
|
||||
<string name="analytics_okay">Anonimne statistike korišćenja i izveštaji o greškama.</string>
|
||||
<string name="accept">Prihvati</string>
|
||||
<string name="cancel">Otkaži</string>
|
||||
<string name="new_channel_rcvd">Primljen novi link kanala</string>
|
||||
|
|
|
|||
|
|
@ -68,7 +68,6 @@
|
|||
<string name="send">Изпрати</string>
|
||||
<string name="warning_not_paired">Все още не сте сдвоили радио, съвместимо с Meshtastic, с този телефон. Моля, сдвоете устройство и задайте вашето потребителско име.\n\nТова приложение с отворен код е в процес на разработка, ако откриете проблеми, моля, публикувайте в нашия форум: https://github.com/orgs/meshtastic/discussions\n\nЗа повече информация вижте нашата уеб страница на адрес www.meshtastic.org.</string>
|
||||
<string name="you">Вие</string>
|
||||
<string name="analytics_okay">Анонимна статистика за използване и доклади за сривове.</string>
|
||||
<string name="accept">Приеми</string>
|
||||
<string name="cancel">Отказ</string>
|
||||
<string name="clear_changes">Изчистване на промените</string>
|
||||
|
|
|
|||
|
|
@ -78,7 +78,6 @@
|
|||
<string name="send">Enviar</string>
|
||||
<string name="warning_not_paired">Encara no has emparellat una ràdio compatible amb Meshtastic amb aquest telèfon. Si us plau emparella un dispositiu i configura el teu nom d\'usuari. \n\nAquesta aplicació de codi obert està en desenvolupament. Si hi trobes problemes publica-ho en el nostre fòrum https://github.com/orgs/meshtastic/discussions\n\nPer a més informació visita la nostra pàgina web - www.meshtastic.org.</string>
|
||||
<string name="you">Tu</string>
|
||||
<string name="analytics_okay">Estadístiques anònimes d\'ús i informes de fallades.</string>
|
||||
<string name="accept">Acceptar</string>
|
||||
<string name="cancel">Cancel·lar</string>
|
||||
<string name="new_channel_rcvd">Nova URL de canal rebuda</string>
|
||||
|
|
|
|||
|
|
@ -80,7 +80,6 @@
|
|||
<string name="send">Odeslat</string>
|
||||
<string name="warning_not_paired">Ještě jste s tímto telefonem nespárovali rádio kompatibilní s Meshtastic. Spárujte prosím zařízení a nastavte své uživatelské jméno.\n\nTato open-source aplikace je ve vývoji, pokud narazíte na problémy, napište na naše fórum: https://github.com/orgs/meshtastic/discussions\n\nDalší informace naleznete na naší webové stránce - www. meshtastic.org.</string>
|
||||
<string name="you">Vy</string>
|
||||
<string name="analytics_okay">Anonymní hlášení o používání aplikace a jejích chybách.</string>
|
||||
<string name="accept">Přijmout</string>
|
||||
<string name="cancel">Zrušit</string>
|
||||
<string name="new_channel_rcvd">Nová URL kanálu přijata</string>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,6 @@
|
|||
<string name="send">Senden</string>
|
||||
<string name="warning_not_paired">Sie haben noch kein zu Meshtastic kompatibles Funkgerät mit diesem Telefon gekoppelt. Bitte koppeln Sie ein Gerät und legen Sie Ihren Benutzernamen fest.\n\nDiese quelloffene App befindet sich im Test. Wenn Sie Probleme finden, veröffentlichen Sie diese bitte auf unserer Website im Chat.\n\nWeitere Informationen finden Sie auf unserer Webseite - www.meshtastic.org.</string>
|
||||
<string name="you">Du</string>
|
||||
<string name="analytics_okay">Anonyme Nutzungsstatistiken und Absturzberichte.</string>
|
||||
<string name="accept">Akzeptieren</string>
|
||||
<string name="cancel">Abbrechen</string>
|
||||
<string name="clear_changes">Änderungen löschen</string>
|
||||
|
|
@ -739,7 +738,7 @@
|
|||
Berechtigung erteilen. Bitte aktivieren Sie dies in den Benachrichtigungseinstellungen.
|
||||
</string>
|
||||
<string name="configure_critical_alerts">Kritische Warnungen konfigurieren</string>
|
||||
<string name="notification_permissions_description">Meshtastic verwendet Benachrichtigungen, um Sie über neue Nachrichten und andere wichtige Ereignisse auf dem Laufenden zu halten. Sie können Ihre Benachrichtigungsrechte jederzeit in den Einstellungen aktualisieren.</string>
|
||||
<string name="notification_permissions_description">Meshtastic nutzt Benachrichtigungen, um Sie über neue Nachrichten und andere wichtige Ereignisse auf dem Laufenden zu halten. Sie können Ihre Benachrichtigungsrechte jederzeit in den Einstellungen aktualisieren.</string>
|
||||
<string name="next">Weiter</string>
|
||||
<string name="grant_permissions">Berechtigungen erteilen</string>
|
||||
<string name="nodes_queued_for_deletion">%d Knoten in der Warteschlange zum Löschen:</string>
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@
|
|||
<string name="send">Αποστολή</string>
|
||||
<string name="warning_not_paired">Δεν έχετε κάνει ακόμη pair μια συσκευή συμβατή με Meshtastic με το τηλέφωνο. Παρακαλώ κάντε pair μια συσκευή και ορίστε το όνομα χρήστη.\n\nΗ εφαρμογή ανοιχτού κώδικα βρίσκεται σε alpha-testing, αν εντοπίσετε προβλήματα παρακαλώ δημοσιεύστε τα στο forum: https://github.com/orgs/meshtastic/discussions\n\nΠερισσότερες πληροφορίες στην ιστοσελίδα - www.meshtastic.org.</string>
|
||||
<string name="you">Εσύ</string>
|
||||
<string name="analytics_okay">Ανώνυμα στατιστικά στοιχεία χρήσης και αναφορές κατάρρευσης.</string>
|
||||
<string name="accept">Αποδοχή</string>
|
||||
<string name="cancel">Ακύρωση</string>
|
||||
<string name="new_channel_rcvd">Λήψη URL νέου καναλιού</string>
|
||||
|
|
|
|||
|
|
@ -79,7 +79,6 @@
|
|||
<string name="send">Enviar</string>
|
||||
<string name="warning_not_paired">Aún no ha emparejado una radio compatible con Meshtastic con este teléfono. Empareje un dispositivo y configure su nombre de usuario. \n\nEsta aplicación de código abierto es una prueba alfa; si encuentra un problema publiquelo en el foro: https://github.com/orgs/meshtastic/discussions\n\nPara obtener más información visite nuestra página web - www.meshtastic.org.</string>
|
||||
<string name="you">Usted</string>
|
||||
<string name="analytics_okay">Estadísticas de uso anónimo e informes de fallos.</string>
|
||||
<string name="accept">Aceptar</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="clear_changes">Borrar cambios</string>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,6 @@
|
|||
<string name="send">Saada</string>
|
||||
<string name="warning_not_paired">Ei ole veel ühendanud Meshtastic -kokku sobivat raadiot telefoniga. Seo seade selle telefoniga ja määra kasutajanimi.\n\nSee avatud lähtekoodiga programm on alpha-testi staatuses. Kui märkad vigu, saada palun sõnum meie foorumisse: https://github.com/orgs/meshtastic/discussions\n\nLisateave kodulehel - www.meshtastic.org.</string>
|
||||
<string name="you">Sina</string>
|
||||
<string name="analytics_okay">Anonüümne kasutus statistika ja krahhiaruanded.</string>
|
||||
<string name="accept">Nõustu</string>
|
||||
<string name="cancel">Tühista</string>
|
||||
<string name="clear_changes">Võta tagasi</string>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@
|
|||
<string name="send">Lähetä</string>
|
||||
<string name="warning_not_paired">Et ole vielä yhdistänyt Meshtastic -yhteensopivaa radiota tähän puhelimeen. Muodosta laitepari puhelimen kanssa ja aseta käyttäjänimesi.\n\nTämä avoimen lähdekoodin sovellus on vielä kehitysvaiheessa. Jos löydät virheen, lähetä siitä viesti foorumillemme: https://github.com/orgs/meshtastic/discussions\n\nLisätietoja saat verkkosivuiltamme - www.meshtastic.org.</string>
|
||||
<string name="you">Sinä</string>
|
||||
<string name="analytics_okay">Nimettömät käyttötilastot ja kaatumisraportit.</string>
|
||||
<string name="analytics_okay">Salli analytiikka ja virheraportit.</string>
|
||||
<string name="accept">Hyväksy</string>
|
||||
<string name="cancel">Peruuta</string>
|
||||
<string name="clear_changes">Peru muutokset</string>
|
||||
|
|
@ -770,4 +770,5 @@
|
|||
<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>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -69,7 +69,6 @@
|
|||
<string name="send">Voye</string>
|
||||
<string name="warning_not_paired">Ou poko konekte ak yon radyo ki konpatib ak Meshtastic sou telefòn sa a. Tanpri konekte yon aparèy epi mete non itilizatè w lan.\n\nSa a se yon aplikasyon piblik ki nan tès Alpha. Si ou gen pwoblèm, tanpri pataje sou fowòm nou an: https://github.com/orgs/meshtastic/discussions\n\nPou plis enfòmasyon, vizite sit wèb nou an - www.meshtastic.org.</string>
|
||||
<string name="you">Ou</string>
|
||||
<string name="analytics_okay">Statistik itilizasyon anonim ak rapò aksidantèl.</string>
|
||||
<string name="accept">Aksepte</string>
|
||||
<string name="cancel">Anile</string>
|
||||
<string name="new_channel_rcvd">Nouvo kanal URL resevwa</string>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,6 @@
|
|||
<string name="send">Envoyer</string>
|
||||
<string name="warning_not_paired">Aucune radio Meshtastic compatible n\'a été jumelée à ce téléphone. Jumelez un appareil et spécifiez votre nom d\'utilisateur.\n\nL\'application open-source est en test alpha, si vous rencontrez des problèmes postez au chat sur notre site web.\n\nPour plus d\'information visitez notre site web - www.meshtastic.org.</string>
|
||||
<string name="you">Vous</string>
|
||||
<string name="analytics_okay">Statistiques et rapports d\'erreur anonymes.</string>
|
||||
<string name="accept">Accepter</string>
|
||||
<string name="cancel">Annuler</string>
|
||||
<string name="clear_changes">Annuler modifications</string>
|
||||
|
|
@ -625,14 +624,14 @@
|
|||
<string name="time">Heure</string>
|
||||
<string name="date">Date</string>
|
||||
<string name="map_filter">Filtre de carte\n</string>
|
||||
<string name="only_favorites">Seuls les favoris</string>
|
||||
<string name="only_favorites">Juste les favoris</string>
|
||||
<string name="show_waypoints">Afficher les points de repère</string>
|
||||
<string name="show_precision_circle">Afficher les cercles de précision</string>
|
||||
<string name="client_notification">Notification client</string>
|
||||
<string name="compromised_keys">Clés compromises détectées, sélectionnez OK pour régénérer.</string>
|
||||
<string name="regenerate_private_key">Régénérer la clé privée</string>
|
||||
<string name="regenerate_keys_confirmation">Êtes-vous sûr de vouloir régénérer votre clé privée ?\n\nLes nœuds qui peuvent avoir précédemment échangé des clés avec ce nœud devront supprimer ce nœud et ré-échanger des clés afin de reprendre une communication sécurisée.</string>
|
||||
<string name="export_keys">Exporter des clés</string>
|
||||
<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="remote">Distant</string>
|
||||
|
|
@ -664,14 +663,14 @@
|
|||
<string name="clean_node_database_confirmation">Cela supprimera les %1$d nœuds de votre base de données. Cette action ne peut pas être annulée.</string>
|
||||
<string name="security_icon_help_green_lock">Un cadenas vert signifie que le canal est chiffré de façon sécurisée avec une clé AES 128 ou 256 bits.</string>
|
||||
<!-- INSECURE_NO_PRECISE State (Yellow Open Lock) -->
|
||||
<string name="security_icon_insecure_no_precise">Canal non sécurisé, non précisé</string>
|
||||
<string name="security_icon_help_yellow_open_lock">Un cadenas ouvert jaune signifie que le canal n\'est pas crypté de manière sécurisée, n\'est pas utilisé pour des données de localisation précises, et n\'utilise ni une clé du tout, ni une clé connue de 1 octet.</string>
|
||||
<string name="security_icon_insecure_no_precise">Canal non sécurisé, localisation non précise</string>
|
||||
<string name="security_icon_help_yellow_open_lock">Un cadenas ouvert jaune signifie que le canal n\'est pas crypté de manière sécurisée, n\'est pas utilisé pour des données de localisation précises, et n\'utilise aucune clé, ou une clé connue de 1 octet.</string>
|
||||
<!-- INSECURE_PRECISE_ONLY State (Red Open Lock) -->
|
||||
<string name="security_icon_insecure_precise_only">Canal non sécurisé, localisation précise</string>
|
||||
<string name="security_icon_help_red_open_lock">Un cadenas rouge ouvert signifie que le canal n\'est pas crypté de manière sécurisée, est utilisé pour des données de localisation précises, et n\'utilise aucune clé du tout, ou une clé connue de 1 octet.</string>
|
||||
<string name="security_icon_help_red_open_lock">Un cadenas rouge ouvert signifie que le canal n\'est pas crypté de manière sécurisée, est utilisé pour des données de localisation précises, et n\'utilise aucune clé, ou une clé connue de 1 octet.</string>
|
||||
<!-- INSECURE_PRECISE_MQTT_WARNING State (Red Open Lock with Warning Badge) -->
|
||||
<string name="security_icon_warning_precise_mqtt">Attention : Localisation précise & MQTT non sécurisée</string>
|
||||
<string name="security_icon_help_warning_precise_mqtt">Un cadenas rouge ouvert avec un avertissement signifie que le canal n\'est pas crypté de manière sécurisée, est utilisé pour des données de localisation précises qui sont placées sur Internet via MQTT, et n\'utilise aucune clé du tout, ou une clé connue de 1 octet.</string>
|
||||
<string name="security_icon_help_warning_precise_mqtt">Un cadenas rouge ouvert avec un avertissement signifie que le canal n\'est pas crypté de manière sécurisée, est utilisé pour des données de localisation précises qui sont diffusées sur Internet via MQTT, et n\'utilise aucune clé, ou une clé connue de 1 octet.</string>
|
||||
<!-- Security Help Dialog Titles and Buttons (from your existing code structure) -->
|
||||
<string name="security_icon_help_title">Sécurité du canal</string>
|
||||
<string name="security_icon_help_title_all">Signification de la sécurité des canaux</string>
|
||||
|
|
|
|||
|
|
@ -68,7 +68,6 @@
|
|||
<string name="send">Seol</string>
|
||||
<string name="warning_not_paired">Níl raidió comhoiriúnach Meshtastic péireáilte leis an bhfón seo agat fós. Péireáil gléas le do thoil agus socraigh d’ainm úsáideora.\n\nTá an feidhmchlár foinse oscailte seo faoi alfa-thástáil, má aimsíonn tú fadhbanna cuir iad ar ár bhfóram: https://github.com/orgs/meshtastic/discussions\n\nLe haghaidh tuilleadh faisnéise féach ar ár leathanach gréasáin - www.meshtastic.org.</string>
|
||||
<string name="you">Tú</string>
|
||||
<string name="analytics_okay">Staitisticí úsáide gan ainm agus tuairiscí tuairteála.</string>
|
||||
<string name="accept">Glac</string>
|
||||
<string name="cancel">Cealaigh</string>
|
||||
<string name="new_channel_rcvd">URL Cainéal nua faighte</string>
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@
|
|||
<string name="send">Enviar</string>
|
||||
<string name="warning_not_paired">Aínda non enlazaches unha radio compatible con Meshtástic neste teléfono. Por favor enlaza un dispositivo e coloca o teu nome de usuario. \n\n Esta aplicación de código aberto está en desenvolvemento. Se atopas problemas por favor publícaos no noso foro: https://github.com/orgs/meshtastic/discussions\n\nPara máis información visita a nosa páxina - www.meshtastic.org.</string>
|
||||
<string name="you">Ti</string>
|
||||
<string name="analytics_okay">Estadísticas de uso anónimo e informes de fallos.</string>
|
||||
<string name="accept">Aceptar</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="new_channel_rcvd">Novo enlace de canle recibida</string>
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@
|
|||
<string name="send">Potvrdi</string>
|
||||
<string name="warning_not_paired">Još niste povezali Meshtastic radio uređaj s ovim telefonom. Povežite uređaj i postavite svoje korisničko ime.\n\nOva aplikacija otvorenog koda je u razvoju, ako naiđete na probleme, objavite na našem forumu: https://github.com/orgs/meshtastic/discussions\n\nZa više informacija pogledajte našu web stranicu - www.meshtastic.org.</string>
|
||||
<string name="you">Vi</string>
|
||||
<string name="analytics_okay">Anonimni statistički podaci o korištenju i izvješća o rušenju sustava.</string>
|
||||
<string name="accept">Prihvati</string>
|
||||
<string name="cancel">Odustani</string>
|
||||
<string name="new_channel_rcvd">Primljen je URL novog kanala</string>
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@
|
|||
<string name="send">Küldeni</string>
|
||||
<string name="warning_not_paired">Még nem párosított egyetlen Meshtastic rádiót sem ehhez a telefonhoz. Kérem pároztasson egyet és állítsa be a felhasználónevet.\n\nEz a szabad forráskódú alkalmazás fejlesztés alatt áll, ha hibát talál kérem írjon a projekt fórumába: https://github.com/orgs/meshtastic/discussions\n\nBővebb információért látogasson el a projekt weboldalára - www.meshtastic.org.</string>
|
||||
<string name="you">Te</string>
|
||||
<string name="analytics_okay">Névtelen felhasználási statisztikák és hibajelentések.</string>
|
||||
<string name="accept">Elfogadni</string>
|
||||
<string name="cancel">Megszakítani</string>
|
||||
<string name="new_channel_rcvd">Új csatorna URL érkezett</string>
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
<string name="send">Senda</string>
|
||||
<string name="warning_not_paired">Þú hefur ekki parað Meshtastic radíó við þennan síma. Vinsamlegast paraðu búnað og veldu notendnafn.\n\nÞessi opni hugbúnaður er enn í þróun, finnir þú vandamál vinsamlegast búðu til þráð á spjallborðinu okkar: https://github.com/orgs/meshtastic/discussions\n\nFyrir frekari upplýsingar sjá vefsíðu - www.meshtastic.org.</string>
|
||||
<string name="you">Þú</string>
|
||||
<string name="analytics_okay">Ópersónurekjanleg gögn um notkun og villumeldingar.</string>
|
||||
<string name="accept">Samþykkja</string>
|
||||
<string name="cancel">Hætta við</string>
|
||||
<string name="new_channel_rcvd">Ný slóð fyrir rás móttekin</string>
|
||||
|
|
|
|||
|
|
@ -81,7 +81,6 @@
|
|||
<string name="send">Invia</string>
|
||||
<string name="warning_not_paired">Non è ancora stato abbinato un dispositivo radio compatibile Meshtastic a questo telefono. È necessario abbinare un dispositivo e impostare il nome utente.\n\nQuesta applicazione open-source è ancora in via di sviluppo, se si riscontrano problemi, rivolgersi al forum: https://github.com/orgs/meshtastic/discussions\n\nPer maggiori informazioni visitare la pagina web - www.meshtastic.org.</string>
|
||||
<string name="you">Tu</string>
|
||||
<string name="analytics_okay">Invia statistiche di utilizzo anonime e rapporti sugli arresti anomali.</string>
|
||||
<string name="accept">Accetta</string>
|
||||
<string name="cancel">Annulla</string>
|
||||
<string name="new_channel_rcvd">Ricevuta URL del Nuovo Canale</string>
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@
|
|||
<string name="send">שלח</string>
|
||||
<string name="warning_not_paired">עוד לא צימדת מכשיר תומך משטסטיק לטלפון זה. בבקשה צמד מכשיר והגדר שם משתמש.\n\nאפליקציית קוד פתוח זה נמצא בפיתוח, במקשר של בעיות בבקשה גש לפורום: https://github.com/orgs/meshtastic/discussions\n\n למידע נוסף בקרו באתר - www.meshtastic.org.</string>
|
||||
<string name="you">אתה</string>
|
||||
<string name="analytics_okay">שלח סטטיסטיקות שימוש אנונימיות ודוחות קריסה.</string>
|
||||
<string name="accept">אישור</string>
|
||||
<string name="cancel">בטל</string>
|
||||
<string name="new_channel_rcvd">התקבל כתובת ערוץ חדשה</string>
|
||||
|
|
|
|||
|
|
@ -78,7 +78,6 @@
|
|||
<string name="send">送信</string>
|
||||
<string name="warning_not_paired">このスマートフォンはMeshtasticデバイスとペアリングされていません。デバイスとペアリングしてユーザー名を設定してください。\n\nこのオープンソースアプリケーションはアルファテスト中です。問題を発見した場合はBBSに書き込んでください。 https://github.com/orgs/meshtastic/discussions\n\n詳しくはWEBページをご覧ください。 www.meshtastic.org</string>
|
||||
<string name="you">あなた</string>
|
||||
<string name="analytics_okay">匿名の診断情報と不具合報告</string>
|
||||
<string name="accept">同意</string>
|
||||
<string name="cancel">キャンセル</string>
|
||||
<string name="new_channel_rcvd">新しいチャンネルURLを受信しました</string>
|
||||
|
|
|
|||
|
|
@ -81,7 +81,6 @@
|
|||
<string name="send">보내기</string>
|
||||
<string name="warning_not_paired">아직 스마트폰과 Meshtastic 장치와 연결하지 않았습니다. 장치와 연결하고 사용자 이름을 정하세요. \n\n이 오픈소스 응용 프로그램은 개발 중입니다. 문제가 발견되면 포럼: https://github.com/orgs/meshtastic/discussions 을 통해 알려주세요.\n\n 자세한 정보는 웹페이지 - www.meshtastic.org 를 참조하세요.</string>
|
||||
<string name="you">나</string>
|
||||
<string name="analytics_okay">익명의 진단보고와 오류 보고서</string>
|
||||
<string name="accept">수락</string>
|
||||
<string name="cancel">취소</string>
|
||||
<string name="new_channel_rcvd">새로운 채널 URL 수신</string>
|
||||
|
|
|
|||
|
|
@ -69,7 +69,6 @@
|
|||
<string name="send">Siųsti</string>
|
||||
<string name="warning_not_paired">Su šiuo telefonu dar nėra susietas joks Meshtastic įtaisais. Prašome suporuoti įrenginį ir nustatyti savo vartotojo vardą.\n\nŠi atvirojo kodo programa yra kūrimo stadijoje, jei pastebėsite problemas, prašome pranešti mūsų forume: https://github.com/orgs/meshtastic/discussions\n\nDaugiau informacijos rasite mūsų interneto svetainėje - www.meshtastic.org.</string>
|
||||
<string name="you">Tu</string>
|
||||
<string name="analytics_okay">Siųsti anoniminę naudojimo statistika ir klaidų ataskaitas.</string>
|
||||
<string name="accept">Priimti</string>
|
||||
<string name="cancel">Atšaukti</string>
|
||||
<string name="new_channel_rcvd">Gautas naujo kanalo URL</string>
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@
|
|||
<string name="send">Send</string>
|
||||
<string name="warning_not_paired">Du har ikke paret en Meshtastic kompatibel radio med denne telefonen. Vennligst parr en enhet, og sett ditt brukernavn.\n\nDenne åpen kildekode applikasjonen er i alfa-testing, Hvis du finner problemer, vennligst post på vårt forum: https://github.com/orgs/meshtastic/discussions\n\nFor mer informasjon, se vår nettside - www.meshtastic.org.</string>
|
||||
<string name="you">Deg</string>
|
||||
<string name="analytics_okay">Anonym brukerstatistikk og kræsjrapporter.</string>
|
||||
<string name="accept">Godta</string>
|
||||
<string name="cancel">Avbryt</string>
|
||||
<string name="new_channel_rcvd">Ny kanal URL mottatt</string>
|
||||
|
|
|
|||
|
|
@ -77,7 +77,6 @@
|
|||
<string name="send">Verzend</string>
|
||||
<string name="warning_not_paired">Je hebt nog geen Meshtastic compatibele radio met deze telefoon gekoppeld. Paar alstublieft een apparaat en voer je gebruikersnaam in.\n\nDeze open-source applicatie is in alpha-test, indien je een probleem vaststelt, kan je het posten op onze forum: https://github.com/orgs/meshtastic/discussions\n\nVoor meer informatie bezoek onze web pagina - www.meshtastic.org.</string>
|
||||
<string name="you">Jij</string>
|
||||
<string name="analytics_okay">Anonieme gebruiksstatistieken en crashmeldingen.</string>
|
||||
<string name="accept">Accepteer</string>
|
||||
<string name="cancel">Annuleer</string>
|
||||
<string name="new_channel_rcvd">Nieuw kanaal URL ontvangen</string>
|
||||
|
|
|
|||
|
|
@ -78,7 +78,6 @@
|
|||
<string name="send">Wyślij</string>
|
||||
<string name="warning_not_paired">Nie sparowałeś jeszcze urządzenia Meshtastic z tym telefonem. Proszę sparować urządzenie i ustawić swoją nazwę użytkownika.\n\nTa aplikacja open-source jest w fazie rozwoju, jeśli znajdziesz problemy, napisz na naszym forum: https://github.com/orgs/meshtastic/discussions\n\nWięcej informacji znajdziesz na naszej stronie internetowej - www.meshtastic.org.</string>
|
||||
<string name="you">Ty</string>
|
||||
<string name="analytics_okay">Anonimowe statystyki użycia i raporty o błędach.</string>
|
||||
<string name="accept">Akceptuj</string>
|
||||
<string name="cancel">Anuluj</string>
|
||||
<string name="new_channel_rcvd">Otrzymano nowy URL kanału</string>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,6 @@
|
|||
<string name="send">Enviar</string>
|
||||
<string name="warning_not_paired">Você ainda não pareou um rádio compatível ao Meshtastic com este smartphone. Por favor pareie um dispositivo e configure seu nome de usuário.\n\nEste aplicativo open source está em desenvolvimento, caso encontre algum problema por favor publique em nosso fórum: https://github.com/orgs/meshtastic/discussions\n\nPara mais informações acesse nossa página: www.meshtastic.org.</string>
|
||||
<string name="you">Você</string>
|
||||
<string name="analytics_okay">Estatísticas de uso anônimas e relatórios de falhas.</string>
|
||||
<string name="accept">Aceitar</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="clear_changes">Limpar mudanças</string>
|
||||
|
|
|
|||
|
|
@ -79,7 +79,6 @@
|
|||
<string name="send">Enviar</string>
|
||||
<string name="warning_not_paired">Ainda não emparelhou um rádio compatível com Meshtastic com este telefone. Emparelhe um dispositivo e defina seu nome de usuário.\n\nEste aplicativo de código aberto está em teste alfa, se encontrar problemas, por favor reporte através do nosso forum em: https://github.com/orgs/meshtastic/discussions\n\nPara obter mais informações, consulte a nossa página web - www.meshtastic.org.</string>
|
||||
<string name="you">Você</string>
|
||||
<string name="analytics_okay">Estatísticas de uso anônimas e relatórios de falhas.</string>
|
||||
<string name="accept">Aceitar</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="new_channel_rcvd">Novo Link Recebido do Canal</string>
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
<string name="send">Trimite</string>
|
||||
<string name="warning_not_paired">Încă nu ai asociat un radio compatibil cu Meshtastic cu acest telefon. Te rugăm să asociezi un dispozitiv și să îți setezi numele de utilizator.\n\nAceastă aplicaţie open-source este în dezvoltare, dacă întâmpinaţi probleme, vă rugăm să postaţi pe forumul nostru: https://github.com/orgs/meshtastic/discussions\n\nPentru mai multe informații, consultați pagina noastră de internet - www.meshtastic.org.</string>
|
||||
<string name="you">Tu</string>
|
||||
<string name="analytics_okay">Trimite în mod anonim statistici de utilizare și raporturi de crash.</string>
|
||||
<string name="accept">Accept</string>
|
||||
<string name="cancel">Renunta</string>
|
||||
<string name="new_channel_rcvd">Am primit un nou URL de canal</string>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,6 @@
|
|||
<string name="send">Отправить</string>
|
||||
<string name="warning_not_paired">Вы еще не подключили к телефону устройство, совместимое с Meshtastic радио. Пожалуйста, подключите устройство и задайте имя пользователя.\n\nЭто приложение с открытым исходным кодом находится в альфа-тестировании, если вы обнаружите проблемы, пожалуйста, напишите в чате на нашем сайте.\n\nДля получения дополнительной информации посетите нашу веб-страницу - www.meshtastic.org.</string>
|
||||
<string name="you">Вы</string>
|
||||
<string name="analytics_okay">Анонимная статистика использования и отчеты о сбоях.</string>
|
||||
<string name="accept">Принять</string>
|
||||
<string name="cancel">Отмена</string>
|
||||
<string name="clear_changes">Отменить изменения</string>
|
||||
|
|
|
|||
|
|
@ -78,7 +78,6 @@
|
|||
<string name="send">Odoslať</string>
|
||||
<string name="warning_not_paired">K tomuto telefónu ste ešte nespárovali žiadne zariadenie kompatibilné s Meshtastic. Prosím spárujte zariadenie a nastavte svoje užívateľské meno.\n\nTáto open-source aplikácia je v alpha testovacej fáze, ak nájdete chybu, prosím popíšte ju na fóre: https://github.com/orgs/meshtastic/discussions\n\n Pre viac informácií navštívte web stránku - www.meshtastic.org.</string>
|
||||
<string name="you">Vy</string>
|
||||
<string name="analytics_okay">Anonymné štatistiky používania a správy o zlyhaní.</string>
|
||||
<string name="accept">Prijať</string>
|
||||
<string name="cancel">Odmietnuť</string>
|
||||
<string name="new_channel_rcvd">Prijatá nová URL kanálu</string>
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@
|
|||
<string name="send">Pošlji</string>
|
||||
<string name="warning_not_paired">S tem telefonom še niste seznanili združljivega Meshtastic radia. Prosimo povežite napravo in nastavite svoje uporabniško ime. \n\nTa odprtokodna aplikacija je v alfa testiranju, če imate težave, objavite na našem spletnem klepetu.\n\nZa več informacij glejte našo spletno stran - www.meshtastic.org.</string>
|
||||
<string name="you">Jaz</string>
|
||||
<string name="analytics_okay">Anonimna statistika uporabe in poročila o zrušitvah.</string>
|
||||
<string name="accept">Sprejmi</string>
|
||||
<string name="cancel">Prekliči/zavrzi</string>
|
||||
<string name="new_channel_rcvd">Prejet je bil novi URL kanala</string>
|
||||
|
|
|
|||
|
|
@ -69,7 +69,6 @@
|
|||
<string name="send">Dërgo</string>
|
||||
<string name="warning_not_paired">Ju ende nuk keni lidhur një paisje radio Meshtastic me këtë telefon. Ju lutem lidhni një paisje radio dhe vendosni emrin e përdoruesit.\n\nKy aplikacion është software i lire \"open-source\" dhe në variantin Alpha për testim. Nëse hasni probleme, ju lutem shkruani në çatin e faqes tonë të internetit: https://github.com/orgs/meshtastic/discussions\n\nPër më shumë informacione vizitoni faqen tonë në internet - www.meshtastic.org.</string>
|
||||
<string name="you">Ju</string>
|
||||
<string name="analytics_okay">Statistikat e përdorimit dhe raportet e keq funksionimit mblidhen në mënyrë krejtësisht anonime</string>
|
||||
<string name="accept">Prano</string>
|
||||
<string name="cancel">Anullo</string>
|
||||
<string name="new_channel_rcvd">Ju keni një kanal radio të ri URL</string>
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@
|
|||
<string name="send">Пошаљи</string>
|
||||
<string name="warning_not_paired">Још нисте упарили Мештастик компатибилан радио са овим телефоном. Молимо вас да упарите уређај и поставите своје корисничко име.\n\nОва апликација отвореног кода је у развоју, ако нађете проблеме, молимо вас да их објавите на нашем форуму: https://github.com/orgs/meshtastic/discussions\n\nЗа више информација посетите нашу веб страницу - www.meshtastic.org.</string>
|
||||
<string name="you">Ти</string>
|
||||
<string name="analytics_okay">Анонимне статистике коришћења и извештаји о падовима апликације.</string>
|
||||
<string name="accept">Прихвати</string>
|
||||
<string name="cancel">Откажи</string>
|
||||
<string name="new_channel_rcvd">Примљен нови линк канала</string>
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
<string name="node_sort_last_heard">Senast hörd</string>
|
||||
<string name="node_sort_via_mqtt">via MQTT</string>
|
||||
<string name="via_mqtt">via MQTT</string>
|
||||
<string name="node_filter_show_ignored">Ignorerade noder</string>
|
||||
<string name="unrecognized">Okänd</string>
|
||||
<string name="message_status_enroute">Inväntar kvittens</string>
|
||||
<string name="message_status_queued">Kvittens köad</string>
|
||||
|
|
@ -76,7 +77,6 @@
|
|||
<string name="send">Skicka</string>
|
||||
<string name="warning_not_paired">Du har ännu inte parat en Meshtastic-kompatibel radio med den här telefonen. Koppla ihop en enhet och ange ditt användarnamn.\n\nDetta öppna källkodsprogram (open source) är under utveckling, om du hittar problem, vänligen publicera det på vårt forum: https://github.com/orgs/meshtastic/discussions\n\nFör mer information se vår webbsida - www.meshtastic.org.</string>
|
||||
<string name="you">Du</string>
|
||||
<string name="analytics_okay">Anonym användningsstatistik och kraschrapporter.</string>
|
||||
<string name="accept">Acceptera</string>
|
||||
<string name="cancel">Avbryt</string>
|
||||
<string name="new_channel_rcvd">Ny kanal-länk mottagen</string>
|
||||
|
|
|
|||
|
|
@ -78,7 +78,6 @@
|
|||
<string name="send">Gönder</string>
|
||||
<string name="warning_not_paired">Telefonu, Meshtastic uyumlu bir cihaz ile eşleştirmediniz. Bir cihazla eşleştirin ve kullanıcı adınızı belirleyin.\n\nAçık kaynaklı bu uygulama şu an alfa-test aşamasında, problem fark ederseniz forumda lütfen paylaşın: https://github.com/orgs/meshtastic/discussions\n\nDaha fazla bilgi için, sitemiz: www.meshtastic.org.</string>
|
||||
<string name="you">Siz</string>
|
||||
<string name="analytics_okay">Anonim kullanim istatistikleri ve hata raporları.</string>
|
||||
<string name="accept">Kabul et</string>
|
||||
<string name="cancel">İptal</string>
|
||||
<string name="clear_changes">Değişiklikleri Temizle</string>
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@
|
|||
<string name="send">Надіслати</string>
|
||||
<string name="warning_not_paired">Ви ще не підєднали пристрій, сумісний з Meshtastic. Будьласка приєднайте пристрій і введіть ім’я користувача.\n\nЦя програма з відкритим вихідним кодом знаходиться в розробці, якщо ви виявите проблеми, опублікуйте їх на нашому форумі: https://github.com/orgs/meshtastic/discussions\n\nДля отримання додаткової інформації відвідайте нашу веб-сторінку - www.meshtastic.org.</string>
|
||||
<string name="you">Ви</string>
|
||||
<string name="analytics_okay">Анонімна статистика використання та звіти про збої.</string>
|
||||
<string name="accept">Прийняти</string>
|
||||
<string name="cancel">Скасувати</string>
|
||||
<string name="new_channel_rcvd">Отримано URL-адресу нового каналу</string>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,6 @@
|
|||
<string name="send">传送</string>
|
||||
<string name="warning_not_paired">您尚未将手机与 Meshtastic 兼容的装置配对。请先配对装置并设置您的用户名称。\n\n此开源应用程序仍在开发中,如有问题,请在我们的论坛 https://github.com/orgs/meshtastic/discussions 上面发文询问。\n\n 也可参阅我们的网页 - www.meshtastic.org。</string>
|
||||
<string name="you">你</string>
|
||||
<string name="analytics_okay">匿名使用统计信息和故障报告</string>
|
||||
<string name="accept">接受</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="clear_changes">清除更改</string>
|
||||
|
|
|
|||
|
|
@ -16,12 +16,13 @@
|
|||
~ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources>
|
||||
<string name="fallback_node_name">鏈網%s</string>
|
||||
<string name="fallback_node_name">Meshtastic %s</string>
|
||||
<string name="node_filter_placeholder">過濾器</string>
|
||||
<string name="desc_node_filter_clear">清除節點過濾器</string>
|
||||
<string name="node_filter_include_unknown">顯示未知節點</string>
|
||||
<string name="node_filter_only_online">隱藏離線節點</string>
|
||||
<string name="node_filter_only_direct">只顯示直連節點</string>
|
||||
<string name="node_filter_ignored">您正在檢視已忽略的節點\n請返回到節點列表。</string>
|
||||
<string name="node_filter_show_details">顯示詳細資料</string>
|
||||
<string name="node_sort_button">節點排序選項</string>
|
||||
<string name="node_sort_alpha">依名字排序</string>
|
||||
|
|
@ -32,6 +33,7 @@
|
|||
<string name="node_sort_via_mqtt">有節點MQTT排序</string>
|
||||
<string name="via_mqtt">有節點MQTT排序</string>
|
||||
<string name="node_sort_via_favorite">通過喜好</string>
|
||||
<string name="node_filter_show_ignored">已忽略節點</string>
|
||||
<string name="unrecognized">無法識別</string>
|
||||
<string name="message_status_enroute">正在等待確認</string>
|
||||
<string name="message_status_queued">發送佇列中</string>
|
||||
|
|
@ -81,11 +83,12 @@
|
|||
<string name="send">傳送</string>
|
||||
<string name="warning_not_paired">您尚未將手機與 Meshtastic 相容的裝置配對。請先配對裝置並設置您的使用者名稱。\n\n此開源應用程式仍在開發中,如有問題,請在我們的論壇 https://github.com/orgs/meshtastic/discussions 上面發文詢問。\n\n 也可參閱我們的網頁 - www.meshtastic.org。</string>
|
||||
<string name="you">你</string>
|
||||
<string name="analytics_okay">匿名使用統計資訊和故障報告</string>
|
||||
<string name="analytics_okay">允許傳送分析及崩潰報告。</string>
|
||||
<string name="accept">接受</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="clear_changes">清除變更</string>
|
||||
<string name="new_channel_rcvd">收到新的頻道 URL</string>
|
||||
<string name="permission_missing">Meshtastic需要啟用定位及藍芽才能尋找新裝置,可以選擇在不使用時停用。</string>
|
||||
<string name="report_bug">回報BUG</string>
|
||||
<string name="report_a_bug">回報問題</string>
|
||||
<string name="report_bug_text">您確定要報告錯誤嗎?報告後,請在 https://github.com/orgs/meshtastic/discussions 上貼文,以便我們可以將報告與您發現的問題匹配。</string>
|
||||
|
|
@ -94,6 +97,7 @@
|
|||
<string name="pairing_failed_try_again">配對失敗,請重新選擇</string>
|
||||
<string name="location_disabled">位置訪問已關閉,無法向設備提供位置.</string>
|
||||
<string name="share">分享</string>
|
||||
<string name="new_node_seen">發現新節點: %s</string>
|
||||
<string name="disconnected">已中斷連線</string>
|
||||
<string name="device_sleeping">設備休眠中</string>
|
||||
<string name="connected_count">已連接:%1$s 在線</string>
|
||||
|
|
@ -110,21 +114,24 @@
|
|||
<string name="about">關於</string>
|
||||
<string name="channel_invalid">此頻道 URL 無效,無法使用</string>
|
||||
<string name="debug_panel">除錯面板</string>
|
||||
<string name="debug_decoded_payload">解析封包:</string>
|
||||
<string name="debug_logs_export">匯出日誌</string>
|
||||
<string name="debug_filters">篩選</string>
|
||||
<string name="debug_active_filters">啟動篩選功能</string>
|
||||
<string name="debug_default_search">在日誌中搜尋…</string>
|
||||
<string name="debug_search_next">下個符合的</string>
|
||||
<string name="debug_search_prev">上個符合的</string>
|
||||
<string name="debug_search_next">下一個符合的</string>
|
||||
<string name="debug_search_prev">上一個符合的</string>
|
||||
<string name="debug_search_clear">清除搜尋結果</string>
|
||||
<string name="debug_filter_add">增加篩選條件</string>
|
||||
<string name="debug_filter_included">已包含了篩選</string>
|
||||
<string name="debug_filter_included">包含篩選器</string>
|
||||
<string name="debug_filter_clear">清除所有篩選</string>
|
||||
<string name="debug_clear">清除所有日誌</string>
|
||||
<string name="debug_clear_logs_confirm">這將從您的裝置中刪除所有日誌包和資料庫條目 - 這是永久完全重置。</string>
|
||||
<string name="match_any">符合任一條件</string>
|
||||
<string name="match_all">符合全部條件</string>
|
||||
<string name="debug_clear_logs_confirm">這將完全移除裝置上的所有日誌封包與資料庫記錄 - 這是一個完整的重設,且無法復原。</string>
|
||||
<string name="clear">清除</string>
|
||||
<string name="message_delivery_status">訊息傳遞狀態</string>
|
||||
<string name="meshtastic_messages_notifications">直接訊息通知</string>
|
||||
<string name="meshtastic_messages_notifications">私訊通知</string>
|
||||
<string name="meshtastic_broadcast_notifications">廣播訊息通知</string>
|
||||
<string name="meshtastic_alerts_notifications">警告信息</string>
|
||||
<string name="firmware_too_old">需要更新韌體。</string>
|
||||
|
|
@ -152,6 +159,8 @@
|
|||
<string name="delete_for_everyone">也從所有人的聊天紀錄中刪除</string>
|
||||
<string name="delete_for_me">從我的聊天紀錄中刪除</string>
|
||||
<string name="select_all">選擇全部</string>
|
||||
<string name="close_selection">關閉選取</string>
|
||||
<string name="delete_selection">刪除選取項目</string>
|
||||
<string name="map_style_selection">樣式選擇</string>
|
||||
<string name="map_download_region">下載區域</string>
|
||||
<string name="name">名稱</string>
|
||||
|
|
@ -172,7 +181,13 @@
|
|||
<string name="quick_chat_edit">編輯快速聊天</string>
|
||||
<string name="quick_chat_append">附加到訊息</string>
|
||||
<string name="quick_chat_instant">即時發送</string>
|
||||
<string name="quick_chat_show">顯示快速聊天選單</string>
|
||||
<string name="quick_chat_hide">隱藏快速聊天選單</string>
|
||||
<string name="factory_reset">恢復出廠設置</string>
|
||||
<string name="bluetooth_disabled">藍芽已關閉,請至手機設定內開啟藍芽功能。</string>
|
||||
<string name="open_settings">開啟設定</string>
|
||||
<string name="firmware_version">韌體版本: %1$s</string>
|
||||
<string name="permission_missing_31">Meshtastic 應用程式需要啟用「鄰近裝置」權限,才能透過藍牙尋找並連接到裝置,可以選擇在不使用時停用。</string>
|
||||
<string name="direct_message">直接發訊息</string>
|
||||
<string name="nodedb_reset">重設節點資料庫</string>
|
||||
<string name="delivery_confirmed">已確認送達</string>
|
||||
|
|
@ -222,8 +237,11 @@
|
|||
<string name="air_utilization">無線通道利用率</string>
|
||||
<string name="temperature">溫度</string>
|
||||
<string name="humidity">濕度</string>
|
||||
<string name="soil_temperature">環境溫度</string>
|
||||
<string name="soil_moisture">環境濕度</string>
|
||||
<string name="logs">系統記錄</string>
|
||||
<string name="hops_away">節點距</string>
|
||||
<string name="hops_away_template">經過節點數:%1$d</string>
|
||||
<string name="info">資訊</string>
|
||||
<string name="ch_util_definition">目前頻道的使用情況,包括格式正確的傳輸(TX)、接收(RX)和格式錯誤的接收(也稱為雜訊)。</string>
|
||||
<string name="air_util_definition">過去一小時内傳輸所使用的通話時間(airtime)百分比。</string>
|
||||
|
|
@ -245,6 +263,7 @@
|
|||
<string name="device_metrics_log">裝置指標日誌</string>
|
||||
<string name="node_map">節點地圖</string>
|
||||
<string name="position_log">定位日誌</string>
|
||||
<string name="last_position_update">最後位置更新</string>
|
||||
<string name="env_metrics_log">環境監測讀數日誌</string>
|
||||
<string name="sig_metrics_log">訊號指標日誌</string>
|
||||
<string name="administration">管理</string>
|
||||
|
|
@ -284,11 +303,14 @@
|
|||
<string name="are_you_sure">你確定嗎?</string>
|
||||
<string name="router_role_confirmation_text"><![CDATA[我已經閱讀了<a href=“ https://meshtastic.org/docs/configuration/radio/device/#roles “>設備角色檔案</a>和關於<a href=”http://meshtastic.org/blog/choosing-the-right-device-role “>選擇正確的設備角色的博客文章 </a>。]]></string>
|
||||
<string name="i_know_what_i_m_doing">我知道我在做什麼。</string>
|
||||
<string name="low_battery_message">節點 %1$s 電量過低 (%2$d%%)</string>
|
||||
<string name="meshtastic_low_battery_notifications">低電量通知</string>
|
||||
<string name="low_battery_title">低電量:%s</string>
|
||||
<string name="meshtastic_low_battery_temporary_remote_notifications">低電量通知(收藏節點)</string>
|
||||
<string name="baro_pressure">氣壓</string>
|
||||
<string name="mesh_via_udp_enabled">通过 UDP 的Mesh</string>
|
||||
<string name="udp_config">UDP設置</string>
|
||||
<string name="map_node_popup_details"><![CDATA[%1$s<br>最後接收: %2$s<br>最後位置: %3$s<br>電量: %4$s]]></string>
|
||||
<string name="toggle_my_position">切換我的位置</string>
|
||||
<string name="user">用戶</string>
|
||||
<string name="channels">頻道</string>
|
||||
|
|
@ -314,9 +336,12 @@
|
|||
<string name="detection_sensor">檢測傳感器</string>
|
||||
<string name="paxcounter">客流量計數</string>
|
||||
<string name="audio_config">音頻設置</string>
|
||||
<string name="codec_2_enabled">啟動CODEC2</string>
|
||||
<string name="codec_2_enabled">啟用 CODEC2</string>
|
||||
<string name="ptt_pin">PTT針腳</string>
|
||||
<string name="codec2_sample_rate">CODEC2取樣率</string>
|
||||
<string name="codec2_sample_rate">CODEC2 取樣率</string>
|
||||
<string name="i2s_word_select">I2S WS 訊號選擇</string>
|
||||
<string name="i2s_data_in">I2S 數據輸入</string>
|
||||
<string name="i2s_data_out">I2S 數據輸出</string>
|
||||
<string name="i2s_clock">I2S 時鐘</string>
|
||||
<string name="bluetooth_config">藍牙配置</string>
|
||||
<string name="bluetooth_enabled">藍牙已啟用</string>
|
||||
|
|
@ -326,21 +351,47 @@
|
|||
<string name="downlink_enabled">已啓用下行</string>
|
||||
<string name="default_">默認</string>
|
||||
<string name="position_enabled">位置已啟用</string>
|
||||
<string name="precise_location">精確位置</string>
|
||||
<string name="gpio_pin">GPIO 引脚</string>
|
||||
<string name="type">類別</string>
|
||||
<string name="hide_password">隱藏密碼</string>
|
||||
<string name="show_password">顯示密碼</string>
|
||||
<string name="details">詳情</string>
|
||||
<string name="environment">環境</string>
|
||||
<string name="ambient_lighting_config">裝置燈光設定</string>
|
||||
<string name="led_state">LED狀態</string>
|
||||
<string name="red">紅色</string>
|
||||
<string name="green">綠色</string>
|
||||
<string name="blue">藍色</string>
|
||||
<string name="canned_message_config">罐頭訊息設定</string>
|
||||
<string name="canned_message_enabled">啟用罐頭訊息</string>
|
||||
<string name="rotary_encoder_1_enabled">啟用旋轉編碼器#1</string>
|
||||
<string name="gpio_pin_for_rotary_encoder_a_port">旋轉編碼器 A 端 GPIO 腳位</string>
|
||||
<string name="gpio_pin_for_rotary_encoder_b_port">旋轉編碼器 B 端 GPIO 腳位</string>
|
||||
<string name="gpio_pin_for_rotary_encoder_press_port">旋轉編碼器 按鈕 GPIO 腳位</string>
|
||||
<string name="generate_input_event_on_press">按下時產生輸入事件</string>
|
||||
<string name="generate_input_event_on_cw">順時針旋轉時產生輸入事件</string>
|
||||
<string name="generate_input_event_on_ccw">逆時針旋轉時產生輸入事件</string>
|
||||
<string name="up_down_select_input_enabled">啟用上下選擇輸入</string>
|
||||
<string name="allow_input_source">允許輸入來源</string>
|
||||
<string name="send_bell">發送振鈴</string>
|
||||
<string name="messages">訊息</string>
|
||||
<string name="detection_sensor_config">偵測感測器設定</string>
|
||||
<string name="detection_sensor_enabled">啟用偵測感測器</string>
|
||||
<string name="minimum_broadcast_seconds">最短廣播間隔 (秒)</string>
|
||||
<string name="state_broadcast_seconds">狀態廣播間隔 (秒)</string>
|
||||
<string name="send_bell_with_alert_message">告警訊息發送提示音</string>
|
||||
<string name="friendly_name">顯示名稱</string>
|
||||
<string name="gpio_pin_to_monitor">螢幕的 GPIO 腳位</string>
|
||||
<string name="detection_trigger_type">偵測觸發類型</string>
|
||||
<string name="use_input_pullup_mode">使用輸入上拉模式</string>
|
||||
<string name="device_config">設備設置</string>
|
||||
<string name="role">角色</string>
|
||||
<string name="redefine_pin_button">重新定義按鈕腳位</string>
|
||||
<string name="redefine_pin_buzzer">重新定義蜂鳴器腳位</string>
|
||||
<string name="rebroadcast_mode">轉發模式</string>
|
||||
<string name="nodeinfo_broadcast_interval_seconds">節點資訊廣播間隔(秒)</string>
|
||||
<string name="double_tap_as_button_press">雙擊視為按鈕操作</string>
|
||||
<string name="disable_triple_click">禁用三擊</string>
|
||||
<string name="posix_timezone">POSIX時區</string>
|
||||
<string name="disable_led_heartbeat">禁用LED心跳</string>
|
||||
|
|
@ -372,11 +423,25 @@
|
|||
<string name="use_pwm_buzzer">使用PWM調製的蜂鳴</string>
|
||||
<string name="output_vibra_gpio">輸出振動(GPIO)</string>
|
||||
<string name="output_duration_milliseconds">輸出持續時間(毫秒)</string>
|
||||
<string name="nag_timeout_seconds">通知逾時時間(秒)</string>
|
||||
<string name="ringtone">鈴聲</string>
|
||||
<string name="use_i2s_as_buzzer">使用 I2S 控制蜂鳴器</string>
|
||||
<string name="lora_config">LoRa 設定</string>
|
||||
<string name="use_modem_preset">使用 Modem 預設集</string>
|
||||
<string name="modem_preset">Modem 預設集</string>
|
||||
<string name="bandwidth">帶寬</string>
|
||||
<string name="spread_factor">展頻因數 (SF)</string>
|
||||
<string name="coding_rate">編碼率(CR)</string>
|
||||
<string name="frequency_offset_mhz">頻率偏移量 (MHz)</string>
|
||||
<string name="region_frequency_plan">區域(頻段劃分)</string>
|
||||
<string name="hop_limit">最大轉發限制</string>
|
||||
<string name="tx_enabled">TX已啟用</string>
|
||||
<string name="tx_power_dbm">TX功率 (dBm)</string>
|
||||
<string name="frequency_slot">頻率槽位</string>
|
||||
<string name="override_duty_cycle">覆蓋工作週期/佔空比</string>
|
||||
<string name="ignore_incoming">忽略來訊</string>
|
||||
<string name="sx126x_rx_boosted_gain">SX126X 接收增益提升</string>
|
||||
<string name="override_frequency_mhz">複寫頻率(MHz)</string>
|
||||
<string name="pa_fan_disabled">不使用PA风扇</string>
|
||||
<string name="ignore_mqtt">無視MQTT</string>
|
||||
<string name="ok_to_mqtt">將消息轉發至MQTT</string>
|
||||
|
|
@ -414,10 +479,13 @@
|
|||
<string name="position_config">位置設定</string>
|
||||
<string name="position_broadcast_interval_seconds">位置廣播間隔(秒)</string>
|
||||
<string name="smart_position_enabled">啟用智慧位置</string>
|
||||
<string name="smart_broadcast_minimum_distance_meters">智慧廣播最小距離(公尺)</string>
|
||||
<string name="smart_broadcast_minimum_interval_seconds">智慧廣播最小間隔(秒)</string>
|
||||
<string name="use_fixed_position">使用固定位置</string>
|
||||
<string name="latitude">緯度</string>
|
||||
<string name="longitude">經度</string>
|
||||
<string name="altitude_meters">高度(米)</string>
|
||||
<string name="position_config_set_fixed_from_phone">使用手機目前定位</string>
|
||||
<string name="gps_mode">GPS模式</string>
|
||||
<string name="gps_update_interval_seconds">GPS更新間隔(秒)</string>
|
||||
<string name="redefine_gps_rx_pin">重定義 GPS_RX_PIN</string>
|
||||
|
|
@ -429,47 +497,277 @@
|
|||
<string name="shutdown_on_battery_delay_seconds">電池延時關閉(秒)</string>
|
||||
<string name="adc_multiplier_override_ratio">ADC乘數修正比率</string>
|
||||
<string name="wait_for_bluetooth_duration_seconds">等待藍牙持續時間(秒)</string>
|
||||
<string name="super_deep_sleep_duration_seconds">深度睡眠時間(秒)</string>
|
||||
<string name="light_sleep_duration_seconds">輕度睡眠時間(秒)</string>
|
||||
<string name="minimum_wake_time_seconds">最短喚醒時間(秒)</string>
|
||||
<string name="battery_ina_2xx_i2c_address">電池 INA_2XX I2C 地址</string>
|
||||
<string name="range_test_config">範圍測試設定</string>
|
||||
<string name="range_test_enabled">啟用範圍測試</string>
|
||||
<string name="sender_message_interval_seconds">訊息發送間隔(秒)</string>
|
||||
<string name="save_csv_in_storage_esp32_only">將 .CSV 保存到內部儲存空間(僅限ESP32)</string>
|
||||
<string name="remote_hardware_config">遠端硬體設定</string>
|
||||
<string name="remote_hardware_enabled">啟動遠端硬體</string>
|
||||
<string name="allow_undefined_pin_access">允許未定義腳位連接</string>
|
||||
<string name="available_pins">可用腳位</string>
|
||||
<string name="security_config">安全性設定</string>
|
||||
<string name="public_key">公鑰</string>
|
||||
<string name="private_key">私鑰</string>
|
||||
<string name="admin_key">管理員金鑰</string>
|
||||
<string name="managed_mode">託管模式</string>
|
||||
<string name="serial_console">序列控制台</string>
|
||||
<string name="debug_log_api_enabled">啟用調適日誌 API</string>
|
||||
<string name="legacy_admin_channel">舊版管理頻道</string>
|
||||
<string name="serial_config">序列埠設定</string>
|
||||
<string name="serial_enabled">啟用序列埠</string>
|
||||
<string name="echo_enabled">啟用 Echo</string>
|
||||
<string name="serial_baud_rate">序列埠鮑率</string>
|
||||
<string name="timeout">逾時</string>
|
||||
<string name="serial_mode">序列埠模式</string>
|
||||
<string name="override_console_serial_port">覆蓋控制台序列埠</string>
|
||||
<string name="store_forward_enabled"><![CDATA[啟用儲存並轉發]]></string>
|
||||
<string name="heartbeat">心跳</string>
|
||||
<string name="number_of_records">紀錄數目</string>
|
||||
<string name="history_return_max">歴史紀錄最大返回值</string>
|
||||
<string name="history_return_window">歴史紀錄返回視窗</string>
|
||||
<string name="server">伺服器</string>
|
||||
<string name="telemetry_config">遙測設定</string>
|
||||
<string name="device_metrics_update_interval_seconds">裝置資訊更新週期(秒)</string>
|
||||
<string name="environment_metrics_update_interval_seconds">環境資訊更新週期(秒)</string>
|
||||
<string name="environment_metrics_module_enabled">啟用環境資訊模組</string>
|
||||
<string name="environment_metrics_on_screen_enabled">在螢幕上顯示環境資訊</string>
|
||||
<string name="environment_metrics_use_fahrenheit">環境指標以華氏溫度顯示</string>
|
||||
<string name="air_quality_metrics_module_enabled">啟用空氣品質模組</string>
|
||||
<string name="air_quality_metrics_update_interval_seconds">空氣品質更新週期(秒)</string>
|
||||
<string name="air_quality_icon">空氣品質圖示</string>
|
||||
<string name="power_metrics_module_enabled">啟用電池資訊模組</string>
|
||||
<string name="power_metrics_update_interval_seconds">電量資訊更新週期(秒)</string>
|
||||
<string name="power_metrics_on_screen_enabled">在螢幕上顯示電量資訊</string>
|
||||
<string name="user_config">使用者設定</string>
|
||||
<string name="node_id">節點 ID</string>
|
||||
<string name="long_name">節點長名稱</string>
|
||||
<string name="short_name">節點短名稱</string>
|
||||
<string name="hardware_model">硬體型號</string>
|
||||
<string name="licensed_amateur_radio">業餘無線電模式 (HAM)</string>
|
||||
<string name="licensed_amateur_radio_text">啟用此選項將停用訊息加密,並與預設的 Meshtastic 網路不相容。</string>
|
||||
<string name="dew_point">露點</string>
|
||||
<string name="pressure">氣壓</string>
|
||||
<string name="gas_resistance">氣體感測器</string>
|
||||
<string name="distance">距離</string>
|
||||
<string name="lux">照度</string>
|
||||
<string name="wind">風速</string>
|
||||
<string name="weight">重量</string>
|
||||
<string name="radiation">輻射</string>
|
||||
<string name="store_forward_config"><![CDATA[儲存與轉發設定]]></string>
|
||||
<string name="indoor_air_quality_iaq">室內空氣品質 (IAQ)</string>
|
||||
<string name="url">網址</string>
|
||||
<string name="backup_restore"><![CDATA[備份與還原]]></string>
|
||||
<string name="import_configuration">匯入設定</string>
|
||||
<string name="export_configuration">匯出設定</string>
|
||||
<string name="hardware">硬體</string>
|
||||
<string name="supported">已支援</string>
|
||||
<string name="node_number">節點編號</string>
|
||||
<string name="user_id">使用者 ID</string>
|
||||
<string name="uptime">在線時間</string>
|
||||
<string name="uptime">運行時間</string>
|
||||
<string name="load_indexed">負載:%1$d</string>
|
||||
<string name="disk_free_indexed">硬碟可用空間:%1$d</string>
|
||||
<string name="timestamp">時間戳記</string>
|
||||
<string name="heading">航向</string>
|
||||
<string name="speed">速度</string>
|
||||
<string name="sats">衛星數</string>
|
||||
<string name="alt">海拔</string>
|
||||
<string name="freq">頻率</string>
|
||||
<string name="slot">時隙</string>
|
||||
<string name="primary">主要的</string>
|
||||
<string name="primary_channel_feature">定期廣播位置與遙測資料</string>
|
||||
<string name="secondary">次要的</string>
|
||||
<string name="secondary_no_telemetry">停用定期廣播遙測資料</string>
|
||||
<string name="manual_position_request">需要手動定位位置</string>
|
||||
<string name="press_and_drag">長按後可拖曳排列順序</string>
|
||||
<string name="unmute">取消靜音</string>
|
||||
<string name="dynamic">動態</string>
|
||||
<string name="scan_qr_code">掃描 QR Code</string>
|
||||
<string name="share_contact">分享聯絡人</string>
|
||||
<string name="import_shared_contact">是否匯入聯絡人?</string>
|
||||
<string name="unmessageable">不接收訊息</string>
|
||||
<string name="unmonitored_or_infrastructure">無監控裝置或基礎設施</string>
|
||||
<string name="import_known_shared_contact_text">警告:聯絡人已存在,匯入將會覆蓋先前的聯絡人資訊。</string>
|
||||
<string name="public_key_changed">公鑰已變更</string>
|
||||
<string name="import_label">匯入</string>
|
||||
<string name="request_metadata">請求詮釋資料 (Metadata)</string>
|
||||
<string name="actions">動作</string>
|
||||
<string name="firmware">韌體</string>
|
||||
<string name="use_12h_format">使用12小時制</string>
|
||||
<string name="display_time_in_12h_format">啟用後,裝置將在螢幕上以12小時制顯示時間。</string>
|
||||
<string name="host_metrics_log">裝置效能紀錄</string>
|
||||
<string name="host">裝置</string>
|
||||
<string name="free_memory">可用記憶體</string>
|
||||
<string name="disk_free">可用儲存空間</string>
|
||||
<string name="load">載入</string>
|
||||
<string name="user_string">使用者設定</string>
|
||||
<string name="navigate_into_label">導航至</string>
|
||||
<string name="connections">連線</string>
|
||||
<string name="map">Mesh 地圖</string>
|
||||
<string name="conversations">訊息</string>
|
||||
<string name="nodes">節點</string>
|
||||
<string name="bottom_nav_settings">設定</string>
|
||||
<string name="set_your_region">設定你的地區</string>
|
||||
<string name="reply">回復</string>
|
||||
<string name="set_your_region">設定您的地區</string>
|
||||
<string name="reply">回覆</string>
|
||||
<string name="map_reporting_summary">您的節點將定期發送未加密的地圖回報封包至已設定的 MQTT 伺服器,包含 ID、長名稱與短名稱、大約位置、硬體型號、角色、韌體版本、LoRa 區域、數據機預設值以及主要頻道名稱。</string>
|
||||
<string name="map_reporting_consent_header">同意透過 MQTT 分享未加密的節點資料</string>
|
||||
<string name="map_reporting_consent_text">啟用此功能即表示您認知並明確同意透過 MQTT 協議傳輸您裝置的即時地理位置,且不進行加密。此位置資料可能用於即時地圖回報、裝置追蹤及相關遙測功能等用途。</string>
|
||||
<string name="i_agree_to_share_my_location">我已閱讀並理解上述內容。我同意透過 MQTT 傳輸未加密的節點資料</string>
|
||||
<string name="i_agree">我同意。</string>
|
||||
<string name="should_update_firmware">建議更新韌體。</string>
|
||||
<string name="should_update">為享受最新功能及所修復的問題,請更新您的節點韌體。\n\n最新穩定韌體版本為:%1$s</string>
|
||||
<string name="expires">到期時間</string>
|
||||
<string name="time">時間</string>
|
||||
<string name="date">日期</string>
|
||||
<string name="map_filter">地圖選項\n</string>
|
||||
<string name="only_favorites">僅顯示收藏</string>
|
||||
<string name="show_waypoints">顯示路徑</string>
|
||||
<string name="show_precision_circle">顯示定位精準度</string>
|
||||
<string name="client_notification">客户端通知</string>
|
||||
<string name="compromised_keys">偵測到金鑰已洩漏,點選確定後重新產生金鑰。</string>
|
||||
<string name="regenerate_private_key">重新產生私鑰</string>
|
||||
<string name="regenerate_keys_confirmation">您確定要重新產生密鑰嗎?\n\n連線過的其他節點需要刪除並重新交換金鑰後才能恢復加密通訊連線。</string>
|
||||
<string name="export_keys">匯出金鑰</string>
|
||||
<string name="export_keys_confirmation">請將匯出後的私鑰及公鑰妥善保存。</string>
|
||||
<string name="modules_unlocked">模組已解鎖</string>
|
||||
<string name="remote">遠端</string>
|
||||
<string name="node_count_template">(%1$d 個上線 / 共計 %2$d 個)</string>
|
||||
<string name="react">回應</string>
|
||||
<string name="disconnect">中斷連線</string>
|
||||
<string name="scanning_bluetooth">正在尋找藍牙裝置…</string>
|
||||
<string name="no_ble_devices">沒有已配對的藍牙裝置。</string>
|
||||
<string name="no_network_devices">找不到網路裝置。</string>
|
||||
<string name="no_usb_devices">找不到 USB 序列裝置。</string>
|
||||
<string name="scroll_to_bottom">捲動至底部</string>
|
||||
<string name="scroll_to_bottom">移至最底部</string>
|
||||
<string name="meshtastic">Meshtastic</string>
|
||||
<string name="scanning">掃描中</string>
|
||||
<string name="security_icon_description">安全性狀態</string>
|
||||
<string name="security_icon_secure">安全性</string>
|
||||
<string name="security_icon_badge_warning_description">警告標誌</string>
|
||||
<string name="unknown_channel">未知頻道</string>
|
||||
<string name="warning">警告</string>
|
||||
<string name="overflow_menu">溢出選單</string>
|
||||
<string name="uv_lux">紫外線強度 (UV Lux)</string>
|
||||
<string name="unknown">不明</string>
|
||||
<string name="message_device_managed">該裝置已受託管理,並只能由遠端管理員進行變更。</string>
|
||||
<string name="clean_node_database_title">清除節點資料庫</string>
|
||||
<string name="clean_nodes_older_than">清除最後出現時間超過 %1$d 日的節點</string>
|
||||
<string name="clean_unknown_nodes">僅清除不明節點</string>
|
||||
<string name="clean_low_interaction_nodes">清理低互動的節點</string>
|
||||
<string name="clean_ignored_nodes">清除已忽略的節點</string>
|
||||
<string name="clean_now">立即清理</string>
|
||||
<string name="clean_node_database_confirmation">此操作將刪除資料庫內的%1$d個節點,並且無法恢復。</string>
|
||||
<string name="security_icon_help_green_lock">綠色鎖頭表示該頻道已使用 128 位元或 256 位元 AES 金鑰安全加密。</string>
|
||||
<!-- INSECURE_NO_PRECISE State (Yellow Open Lock) -->
|
||||
<string name="security_icon_insecure_no_precise">未加密頻道,模糊定位</string>
|
||||
<string name="security_icon_help_yellow_open_lock">黃色開鎖表示該頻道未進行安全加密,未啟用精確定位資訊,且未使用任何金鑰或使用 1 位元組已知金鑰。</string>
|
||||
<!-- INSECURE_PRECISE_ONLY State (Red Open Lock) -->
|
||||
<string name="security_icon_insecure_precise_only">未加密頻道,精確定位</string>
|
||||
<string name="security_icon_help_red_open_lock">紅色開鎖表示該頻道未進行安全加密,啟用了精確定位資訊,且未使用任何金鑰或使用 1 位元組已知金鑰。</string>
|
||||
<!-- INSECURE_PRECISE_MQTT_WARNING State (Red Open Lock with Warning Badge) -->
|
||||
<string name="security_icon_warning_precise_mqtt">警告:未加密頻道,精確定位 & MQTT Uplink</string>
|
||||
<string name="security_icon_help_warning_precise_mqtt">帶有警告的紅色開鎖表示該頻道未進行安全加密,啟用了精確定位資訊,且正在透過MQTT上傳資料至網路,以及未使用任何金鑰或使用 1 位元組已知金鑰。</string>
|
||||
<!-- Security Help Dialog Titles and Buttons (from your existing code structure) -->
|
||||
<string name="security_icon_help_title">頻道安全性</string>
|
||||
<string name="security_icon_help_title_all">頻道安全性説明</string>
|
||||
<string name="security_icon_help_show_all">顯示全部狀態</string>
|
||||
<string name="security_icon_help_show_less">顯示目前狀態</string>
|
||||
<string name="security_icon_help_dismiss">關閉</string>
|
||||
<string name="confirm_delete_node">您確定要刪除此節點嗎?</string>
|
||||
<string name="replying_to">回覆 %1$s</string>
|
||||
<string name="cancel_reply">取消回覆</string>
|
||||
<string name="delete_messages_title">確認刪除訊息?</string>
|
||||
<string name="clear_selection">清除所選</string>
|
||||
<string name="message_input_label">訊息:</string>
|
||||
<string name="type_a_message">請輸入訊息</string>
|
||||
<string name="pax_metrics_log">PAX 指標日誌</string>
|
||||
<string name="pax">PAX</string>
|
||||
<string name="no_pax_metrics_logs">沒有可用的 PAX 指標日誌。</string>
|
||||
<string name="wifi_devices">WiFi 裝置</string>
|
||||
<string name="ble_devices">藍牙裝置</string>
|
||||
<string name="bluetooth_paired_devices">配對裝置</string>
|
||||
<string name="connected_device">連接裝置</string>
|
||||
<string name="action_go">到</string>
|
||||
<string name="routing_error_rate_limit_exceeded">超過速率限制,請稍後再嘗試。</string>
|
||||
<string name="view_release">查看版本資訊</string>
|
||||
<string name="download">下載</string>
|
||||
<string name="installed_firmware_version">目前已安裝</string>
|
||||
<string name="latest_stable_firmware">最新穩定版韌體</string>
|
||||
<string name="latest_alpha_firmware">最新測試版韌體</string>
|
||||
<string name="supported_by_community">由 Meshtastic 社群協作</string>
|
||||
<string name="firmware_edition">韌體版本</string>
|
||||
<string name="recent_network_devices">最近的網路裝置</string>
|
||||
<string name="discovered_network_devices">發現的網路裝置</string>
|
||||
<string name="get_started">開始使用</string>
|
||||
<string name="intro_welcome">歡迎來到</string>
|
||||
<string name="stay_connected_anywhere">隨時隨地保持連線</string>
|
||||
<string name="communicate_off_the_grid">無需手機訊號,也能與您的朋友和社群離線通訊。</string>
|
||||
<string name="create_your_own_networks">建立您自己的網路</string>
|
||||
<string name="easily_set_up_private_mesh_networks">輕鬆設定私有網狀網絡,以實現偏遠地區安全可靠的通訊。</string>
|
||||
<string name="track_and_share_locations">位置追蹤和分享</string>
|
||||
<string name="share_your_location_in_real_time">透過整合的 GPS 功能,即時分享你的位置,並保持團隊協調一致。</string>
|
||||
<string name="app_notifications">應用程式通知</string>
|
||||
<string name="incoming_messages">收到的訊息</string>
|
||||
<string name="notifications_for_channel_and_direct_messages">頻道訊息與私訊通知。</string>
|
||||
<string name="new_nodes">新的節點</string>
|
||||
<string name="notifications_for_newly_discovered_nodes">發現新節點的通知。</string>
|
||||
<string name="low_battery">電量不足</string>
|
||||
<string name="notifications_for_low_battery_alerts">已連線裝置的低電量通知。</string>
|
||||
<string name="critical_alerts_description">將選取的封包以『關鍵』優先等級送出時,其通知會忽略作業系統通知中心的靜音與『請勿打擾』設定。</string>
|
||||
<string name="configure_notification_permissions">設定通知權限</string>
|
||||
<string name="phone_location">手機定位</string>
|
||||
<string name="phone_location_description">Meshtastic 會使用您手機的定位資訊來啟用多項功能。您隨時可以在設定中修改定位權限。</string>
|
||||
<string name="share_location">分享位置</string>
|
||||
<string name="share_location_description">使用您手機的 GPS 來向節點發送位置,而不是使用節點上的 GPS 模組。</string>
|
||||
<string name="distance_measurements">距離量測</string>
|
||||
<string name="distance_measurements_description">顯示您手機與其他有定位資訊的 Meshtastic 節點之間的距離。</string>
|
||||
<string name="distance_filters">距離篩選器</string>
|
||||
<string name="distance_filters_description">根據您手機的距離,篩選節點列表和 Mesh 網路地圖。</string>
|
||||
<string name="mesh_map_location">Mesh Map 地圖位置</string>
|
||||
<string name="mesh_map_location_description">在 Mesh 地圖上,為您的手機啟用藍色的定位點。</string>
|
||||
<string name="configure_location_permissions">設定定位權限</string>
|
||||
<string name="skip">跳過</string>
|
||||
<string name="settings">設定</string>
|
||||
<string name="critical_alerts">緊急警示</string>
|
||||
<string name="critical_alerts_dnd_request_text">為了確保您能接收緊急警示,例如
|
||||
SOS 警報,即便裝置正處於「請勿打擾」模式亦同,您需要授予
|
||||
特殊權限。請在通知設定中啟用此功能。
|
||||
</string>
|
||||
<string name="configure_critical_alerts">設定緊急警示</string>
|
||||
<string name="notification_permissions_description">Meshtastic 使用通知功能讓您隨時了解新訊息和其他重要事件。您可以隨時在設定中更新通知權限。</string>
|
||||
<string name="next">繼續</string>
|
||||
<string name="grant_permissions">授予權限</string>
|
||||
<string name="nodes_queued_for_deletion">%d 個節點已排定移除:</string>
|
||||
<string name="clean_node_database_description">注意:這會將節點從應用程式和裝置資料庫中移除。\n所選的項目將會加入待處理中。</string>
|
||||
<string name="connecting_to_device">正在連線至裝置</string>
|
||||
<string name="map_type_normal">標準</string>
|
||||
<string name="map_type_satellite">衛星</string>
|
||||
<string name="map_type_terrain">地形</string>
|
||||
<string name="map_type_hybrid">混合</string>
|
||||
<string name="manage_map_layers">管理地圖圖層</string>
|
||||
<string name="map_layer_formats">自定義圖層支援 .kml 或 .kmz 格式檔案。</string>
|
||||
<string name="map_layers_title">地圖圖層</string>
|
||||
<string name="no_map_layers_loaded">未載入自訂圖層。</string>
|
||||
<string name="add_layer_button">添加圖層</string>
|
||||
<string name="hide_layer">隱藏圖層</string>
|
||||
<string name="show_layer">顯示圖層</string>
|
||||
<string name="remove_layer">移除圖層</string>
|
||||
<string name="add_layer">添加圖層</string>
|
||||
<string name="nodes_at_this_location">位於此處的節點</string>
|
||||
<string name="selected_map_type">已選擇的地圖類型</string>
|
||||
<string name="manage_custom_tile_sources">管理自定義圖磚來源</string>
|
||||
<string name="add_custom_tile_source">加入自定義圖磚來源</string>
|
||||
<string name="no_custom_tile_sources_found">沒有自定義圖專來源</string>
|
||||
<string name="edit_custom_tile_source">編輯自定義圖磚來源</string>
|
||||
<string name="delete_custom_tile_source">刪除自定義圖磚來源</string>
|
||||
<string name="name_cannot_be_empty">名稱不得空白。</string>
|
||||
<string name="provider_name_exists">服務供應商名稱已存在。</string>
|
||||
<string name="url_cannot_be_empty">URL 不得空白。</string>
|
||||
<string name="url_must_contain_placeholders">網址必須包含佔位符。</string>
|
||||
<string name="url_template">URL 範本</string>
|
||||
<string name="track_point">軌跡點</string>
|
||||
<string name="phone_settings">手機設定</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@
|
|||
<string name="send">Send</string>
|
||||
<string name="warning_not_paired">You haven\'t yet paired a Meshtastic compatible radio with this phone. Please pair a device and set your username.\n\nThis open-source application is in development, if you find problems please post on our forum: https://github.com/orgs/meshtastic/discussions.\n\nFor more information see our web page - www.meshtastic.org.</string>
|
||||
<string name="you">You</string>
|
||||
<string name="analytics_okay">Anonymous usage statistics and crash reports.</string>
|
||||
<string name="analytics_okay">Allow analytics and crash reporting.</string>
|
||||
<string name="accept">Accept</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="clear_changes">Clear changes</string>
|
||||
|
|
@ -777,6 +777,7 @@
|
|||
<string name="map_type_terrain">Terrain</string>
|
||||
<string name="map_type_hybrid">Hybrid</string>
|
||||
<string name="manage_map_layers">Manage Map Layers</string>
|
||||
<string name="map_layer_formats">Custom layers support .kml or .kmz files.</string>
|
||||
<string name="map_layers_title">Map Layers</string>
|
||||
<string name="no_map_layers_loaded">No custom layers loaded.</string>
|
||||
<string name="add_layer_button">Add Layer</string>
|
||||
|
|
@ -798,4 +799,5 @@
|
|||
<string name="url_template">URL Template</string>
|
||||
<string name="url_template_hint" translatable="false">https://a.tile.openstreetmap.org/{z}/{x}/{y}.png</string>
|
||||
<string name="track_point">track point</string>
|
||||
<string name="phone_settings">Phone Settings</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
#[allow(unused)]
|
||||
[versions]
|
||||
accompanistPermissions = "0.37.3"
|
||||
adaptive = "1.2.0-alpha11"
|
||||
adaptive = "1.2.0-beta01"
|
||||
adaptive-navigation-suite = "1.3.2"
|
||||
agp = "8.12.1"
|
||||
appcompat = "1.7.1"
|
||||
awesome-app-rating = "2.8.0"
|
||||
coil = "3.3.0"
|
||||
compose-bom = "2025.08.00"
|
||||
compose-bom = "2025.08.01"
|
||||
constraintlayout = "2.2.1"
|
||||
core-ktx = "1.17.0"
|
||||
core-location-altitude = "1.0.0-alpha03"
|
||||
core-splashscreen = "1.0.1"
|
||||
crashlytics = "3.0.6"
|
||||
datastore = "1.1.7"
|
||||
dd-sdk-android = "2.25.0"
|
||||
dd-sdk-android = "2.26.0"
|
||||
dd-sdk-android-gradle-plugin = "1.19.0"
|
||||
detekt = "1.23.8"
|
||||
devtools-ksp = "2.2.10-2.0.2"
|
||||
|
|
@ -30,12 +30,12 @@ kotlin = "2.2.10"
|
|||
kotlinx-collections-immutable = "0.4.0"
|
||||
kotlinx-coroutines-android = "1.10.2"
|
||||
kotlinx-serialization-json = "1.9.0"
|
||||
lifecycle = "2.9.2"
|
||||
lifecycle = "2.9.3"
|
||||
location-services = "21.3.0"
|
||||
maps-compose = "6.7.2"
|
||||
markdownRenderer = "0.35.0"
|
||||
material = "1.12.0"
|
||||
material3 = "1.5.0-alpha02"
|
||||
material3 = "1.5.0-alpha03"
|
||||
mgrs = "2.1.3"
|
||||
navigation = "2.9.3"
|
||||
okhttp = "5.1.0"
|
||||
|
|
|
|||
|
|
@ -15,4 +15,6 @@
|
|||
~ You should have received a copy of the GNU General Public License
|
||||
~ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="send_hello_message">Skicka Hej-meddelande</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -16,5 +16,6 @@
|
|||
~ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources>
|
||||
<string name="app_name">Mesh 服務範例</string>
|
||||
<string name="send_hello_message">發送打招呼訊息</string>
|
||||
</resources>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue