From 796056a5820d2bca6447f6e2cd533198202be5e5 Mon Sep 17 00:00:00 2001
From: TianhengZhuang <39034691+TianHengZhuang@users.noreply.github.com>
Date: Wed, 2 Sep 2026 16:08:37 +0800
Subject: [PATCH] Extracted hardcoded UI strings to resources (en/zh) (#247)
---
.../java/com/rtbishop/look4sat/MainScreen.kt | 2 +-
.../src/main/res/values-zh/strings.xml | 27 +++++++++++++++++++
.../src/main/res/values/strings.xml | 27 +++++++++++++++++++
.../look4sat/feature/radar/SstvPage.kt | 13 ++++-----
.../feature/radar/TransceiversPage.kt | 12 ++++-----
.../feature/settings/SettingsDialog.kt | 4 +--
.../feature/settings/SettingsScreen.kt | 6 ++---
7 files changed, 73 insertions(+), 18 deletions(-)
diff --git a/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt b/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt
index 48e36371..8ed09a78 100644
--- a/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt
@@ -252,7 +252,7 @@ private fun TrackingBanner(state: RadioTrackingState, onClick: () -> Unit) {
)
Spacer(modifier = Modifier.width(8.dp))
Text(
- text = "Tracking: ${state.currentPass?.name ?: ""}",
+ text = stringResource(R.string.tracking_format, state.currentPass?.name ?: ""),
fontSize = 13.sp,
fontWeight = FontWeight.Medium,
color = MaterialTheme.colorScheme.onPrimaryContainer,
diff --git a/core/presentation/src/main/res/values-zh/strings.xml b/core/presentation/src/main/res/values-zh/strings.xml
index bc7536e3..0bafcc45 100644
--- a/core/presentation/src/main/res/values-zh/strings.xml
+++ b/core/presentation/src/main/res/values-zh/strings.xml
@@ -83,6 +83,24 @@
输入下行频率 (MHz)
偏移 (kHz)
+
+ 连接
+ 断开连接
+ 关
+ 停止
+ 跟踪
+ TX 基频:
+
+
+ 授予权限
+ 正在监听…
+ 需要麦克风权限
+ 模式:%s
+ SSTV 模式
+ 无信号
+ 未选择收发器
+ RX:%s Hz
+
上一个
下一个
@@ -103,6 +121,12 @@
支持
隐私政策
+ 已配对的蓝牙设备:
+ 分频模式(仅 IC-705)
+ 纬度:%s°
+ 经度:%s°
+ QTH:%s
+
更新:%s
yyyy MMM d - HH:mm:ss
@@ -195,4 +219,7 @@
\n• Libre Space Foundation (SatNOGS)
该应用程序不提供任何保修.
+
+ 跟踪:%s
+
diff --git a/core/presentation/src/main/res/values/strings.xml b/core/presentation/src/main/res/values/strings.xml
index 24d1ca25..12d170c0 100644
--- a/core/presentation/src/main/res/values/strings.xml
+++ b/core/presentation/src/main/res/values/strings.xml
@@ -113,6 +113,24 @@
Enter RX freq (MHz)
Offset (kHz)
+
+ Connect
+ Disconnect
+ Off
+ Stop
+ Track
+ TX Base:
+
+
+ Grant permission
+ Listening…
+ Microphone access needed
+ Mode: %s
+ SSTV Mode
+ No signal
+ No transceiver selected
+ RX: %s Hz
+
Prev
Next
@@ -145,6 +163,12 @@
Privacy Policy
https://sites.google.com/view/look4sat-privacy-policy/home
+ Paired Bluetooth Devices:
+ Split mode (IC-705 only)
+ Lat: %s°
+ Lon: %s°
+ Qth: %s
+
Updated: %s
d MMM yyyy - HH:mm:ss
@@ -239,4 +263,7 @@
The app comes with no warranty
+
+ Tracking: %s
+
diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/SstvPage.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/SstvPage.kt
index 0144c504..6e0bf2c7 100644
--- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/SstvPage.kt
+++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/SstvPage.kt
@@ -49,6 +49,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@@ -78,12 +79,12 @@ internal fun SstvPage(
) {
Text(text = "🎙️", fontSize = 48.sp)
Text(
- text = "Microphone access needed",
+ text = stringResource(R.string.sstv_mic_permission),
fontSize = 16.sp,
color = MaterialTheme.colorScheme.onSurface
)
Button(onClick = requestMicPermission) {
- Text("Grant permission")
+ Text(stringResource(R.string.sstv_grant_permission))
}
}
}
@@ -97,7 +98,7 @@ internal fun SstvPage(
val allModes = remember(sstv.supportedModes) { listOf("Auto") + sstv.supportedModes }
val dismiss = { showModeDialog.value = false }
ConfirmDialog(
- title = "SSTV Mode",
+ title = stringResource(R.string.sstv_mode_title),
onAccept = dismiss,
onCancel = dismiss
) {
@@ -167,7 +168,7 @@ internal fun SstvPage(
)
} else {
Text(
- text = if (sstv.status == SstvStatus.Recording) "Listening…" else "No signal",
+ text = if (sstv.status == SstvStatus.Recording) stringResource(R.string.sstv_listening) else stringResource(R.string.sstv_no_signal),
color = MaterialTheme.colorScheme.onSurface,
fontSize = 16.sp,
modifier = Modifier.align(Alignment.Center)
@@ -196,7 +197,7 @@ internal fun SstvPage(
) {
// Doppler-corrected downlink frequency hint
OutlinedText(
- text = dopplerFrequency?.let { "RX: $it Hz" } ?: "No transceiver selected",
+ text = dopplerFrequency?.let { stringResource(R.string.sstv_rx_format, it) } ?: stringResource(R.string.sstv_no_transceiver),
fontSize = 18.sp,
fontWeight = FontWeight.Bold,
fillColor = MaterialTheme.colorScheme.primary,
@@ -227,7 +228,7 @@ internal fun SstvPage(
) {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
Text(
- text = "Mode: ${sstv.selectedMode}",
+ text = stringResource(R.string.sstv_mode_format, sstv.selectedMode),
fontSize = 14.sp,
maxLines = 1,
color = MaterialTheme.colorScheme.onSurface,
diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/TransceiversPage.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/TransceiversPage.kt
index 81969568..78af38a4 100644
--- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/TransceiversPage.kt
+++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/TransceiversPage.kt
@@ -403,7 +403,7 @@ private fun ExpandedRadioControl(
modifier = Modifier.fillMaxWidth()
) {
Text(
- text = "TX Base: ",
+ text = stringResource(R.string.radar_tx_base),
fontSize = 14.sp,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
@@ -460,7 +460,7 @@ private fun ExpandedRadioControl(
onClick = { onAction(RadarAction.SetCtcssTone(null)) },
label = {
Text(
- text = "Off",
+ text = stringResource(R.string.radar_off),
fontSize = 12.sp,
textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth()
@@ -492,19 +492,19 @@ private fun ExpandedRadioControl(
if (!radioControl.txPanel.isConnected && !radioControl.rxPanel.isConnected) {
CardButton(
onClick = { onAction(RadarAction.ConnectRadios) },
- text = "Connect",
+ text = stringResource(R.string.radar_connect),
modifier = Modifier.weight(1f)
)
} else {
CardButton(
onClick = { onAction(RadarAction.DisconnectRadios) },
- text = "Disconnect",
+ text = stringResource(R.string.radar_disconnect),
modifier = Modifier.weight(1f)
)
}
CardButton(
onClick = { onAction(RadarAction.ToggleTracking) },
- text = if (radioControl.isTracking) "Stop" else "Track",
+ text = if (radioControl.isTracking) stringResource(R.string.radar_stop) else stringResource(R.string.radar_track),
modifier = Modifier.weight(1f)
)
}
@@ -726,7 +726,7 @@ private fun DopplerFrequencyCalculator(
decorationBox = { innerTextField ->
if (offsetKHz.isEmpty()) {
Text(
- text = "Offset (kHz)",
+ text = stringResource(R.string.radar_doppler_offset_hint),
fontSize = 16.sp,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
diff --git a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsDialog.kt b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsDialog.kt
index 1d5de355..68b9e7ae 100644
--- a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsDialog.kt
+++ b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsDialog.kt
@@ -980,7 +980,7 @@ fun RadioControlDialog(
modifier = Modifier.fillMaxWidth()
) {
Text(
- text = "Split mode (IC-705 only)",
+ text = stringResource(R.string.settings_split_mode),
fontWeight = FontWeight.Medium,
color = splitModeLabelColor
)
@@ -1020,7 +1020,7 @@ fun RadioControlDialog(
if (selectingFor.value.isNotBlank()) {
Text(
- text = "Paired Bluetooth Devices:",
+ text = stringResource(R.string.settings_paired_devices),
fontWeight = FontWeight.Medium,
color = MaterialTheme.colorScheme.primary
)
diff --git a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt
index e0fccc7b..f1569bd6 100644
--- a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt
+++ b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt
@@ -342,9 +342,9 @@ private fun LocationCard(
Text(text = formatUpdateTime(updateTime = settings.stationPos.timestamp))
Spacer(modifier = Modifier.height(2.dp))
Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) {
- Text(text = "Lat: ${settings.stationPos.latitude}°")
- Text(text = "Lon: ${settings.stationPos.longitude}°")
- Text(text = "Qth: ${settings.stationPos.qthLocator}")
+ Text(text = stringResource(R.string.prefs_lat_prefix, settings.stationPos.latitude))
+ Text(text = stringResource(R.string.prefs_lon_prefix, settings.stationPos.longitude))
+ Text(text = stringResource(R.string.prefs_qth_prefix, settings.stationPos.qthLocator))
}
Spacer(modifier = Modifier.height(1.dp))
Row(horizontalArrangement = Arrangement.SpaceEvenly) {