Settings has a Language row, for choosing Gearslip's language

Android 13 and later already let you pick it, but only from the
system's app settings, which few people find (#51).
This commit is contained in:
Seb3thehacker committed 2026-11-02 16:53:14 -08:00
1 parent a1a7eca5cb
commit 3f25122fb6
21 files changed
+79

No files matched your search

@@ -1,6 +1,7 @@
package app.seb3thehacker.gearslip.ui
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import app.seb3thehacker.gearslip.R
import androidx.compose.runtime.withFrameNanos
import android.net.Uri
@@ -136,6 +137,7 @@ fun SettingsScreen(
icon = Icons.Filled.Star,
trailing = { Arrow() },
)
LanguageRow()
}
SettingsSection(
stringResource(R.string.settings_support),
@@ -167,6 +169,35 @@ private fun Arrow() = Icon(
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
/**
* Android 13 and later choose an app's language in their own settings, from the languages
* Gearslip declares; this opens that page, which few people find on their own (issue #51).
*/
@Composable
private fun LanguageRow() {
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.TIRAMISU) return
val context = LocalContext.current
// A new choice arrives as a configuration change, since the manifest keeps the activity.
val chosen = remember(androidx.compose.ui.platform.LocalConfiguration.current) {
context.getSystemService(android.app.LocaleManager::class.java)?.applicationLocales?.get(0)
}
SettingsDivider()
SettingsRow(
stringResource(R.string.settings_language),
Modifier.clickable {
runCatching {
context.startActivity(
android.content.Intent(android.provider.Settings.ACTION_APP_LOCALE_SETTINGS, Uri.fromParts("package", context.packageName, null)),
)
}
},
subtitle = chosen?.let { it.getDisplayName(it).replaceFirstChar { c -> c.titlecase(it) } }
?: stringResource(R.string.settings_language_phone),
icon = androidx.compose.ui.graphics.vector.ImageVector.vectorResource(R.drawable.ic_language),
trailing = { Arrow() },
)
}
/** The setup guide replay, and where Gearslip lives outside the app. */
@Composable
private fun AboutSection(onReplayTutorial: () -> Unit) {
@@ -0,0 +1,10 @@
<!-- Material Icons "language" (Apache 2.0). -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z" />
</vector>
@@ -863,4 +863,6 @@
<string name="places_finding">جارٍ البحث…</string>
<string name="places_not_found">لم يعثر Gearslip على موقعك. تأكد من تشغيل الموقع.</string>
<string name="places_clear">مسح</string>
<string name="settings_language">اللغة</string>
<string name="settings_language_phone">مثل لغة الهاتف</string>
</resources>
@@ -847,4 +847,6 @@
<string name="places_finding">Hledám…</string>
<string name="places_not_found">Gearslip nenašel vaši polohu. Zkontrolujte, že je poloha zapnutá.</string>
<string name="places_clear">Vymazat</string>
<string name="settings_language">Jazyk</string>
<string name="settings_language_phone">Stejný jako v telefonu</string>
</resources>
@@ -1,3 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_language">Sprog</string>
<string name="settings_language_phone">Samme som telefonen</string>
</resources>
@@ -713,4 +713,6 @@
<string name="cert_downloaded_footer">Auto verbindet sich nicht? Manche Autos ab etwa 2020 lehnen das aasdk-Zertifikat ab, dann importieren Sie Ihr eigenes. Änderungen gelten ab der nächsten Verbindung.</string>
<string name="car_cluster_video">Abbiegekarte im Kombiinstrument</string>
<string name="car_cluster_video_note">Für Autos mit einem zweiten Bildschirm im Kombiinstrument: Gearslip zeigt dort das nächste Abbiegen. Gilt ab der nächsten Verbindung.</string>
<string name="settings_language">Sprache</string>
<string name="settings_language_phone">Wie auf dem Telefon</string>
</resources>
@@ -713,4 +713,6 @@
<string name="cert_downloaded_footer">¿El coche no se conecta? Algunos coches de 2020 en adelante rechazan el certificado de aasdk, así que importa el tuyo. Los cambios se aplican en la próxima conexión.</string>
<string name="car_cluster_video">Tarjeta de giro en la pantalla del cuadro</string>
<string name="car_cluster_video_note">Para coches con una segunda pantalla en el cuadro de instrumentos: Gearslip muestra ahí el próximo giro. Se aplica en la próxima conexión.</string>
<string name="settings_language">Idioma</string>
<string name="settings_language_phone">El mismo que el teléfono</string>
</resources>
@@ -839,4 +839,6 @@
<string name="places_finding">Recherche…</string>
<string name="places_not_found">Gearslip n’a pas trouvé votre position. Vérifiez que la localisation est activée.</string>
<string name="places_clear">Effacer</string>
<string name="settings_language">Langue</string>
<string name="settings_language_phone">Comme le téléphone</string>
</resources>
@@ -839,4 +839,6 @@
<string name="places_finding">Ricerca…</string>
<string name="places_not_found">Gearslip non ha trovato la tua posizione. Controlla che la localizzazione sia attiva.</string>
<string name="places_clear">Cancella</string>
<string name="settings_language">Lingua</string>
<string name="settings_language_phone">Come il telefono</string>
</resources>
@@ -823,4 +823,6 @@
<string name="places_finding">検索中…</string>
<string name="places_not_found">現在地が見つかりませんでした。位置情報がオンになっているか確認してください。</string>
<string name="places_clear">消去</string>
<string name="settings_language">言語</string>
<string name="settings_language_phone">スマートフォンと同じ</string>
</resources>
@@ -823,4 +823,6 @@
<string name="places_finding">찾는 중…</string>
<string name="places_not_found">Gearslip이 현재 위치를 찾지 못했습니다. 위치가 켜져 있는지 확인하세요.</string>
<string name="places_clear">지우기</string>
<string name="settings_language">언어</string>
<string name="settings_language_phone">휴대전화와 동일</string>
</resources>
@@ -831,4 +831,6 @@
<string name="places_finding">Zoeken…</string>
<string name="places_not_found">Gearslip kon je locatie niet vinden. Staat locatie aan?</string>
<string name="places_clear">Wissen</string>
<string name="settings_language">Taal</string>
<string name="settings_language_phone">Zelfde als de telefoon</string>
</resources>
@@ -847,4 +847,6 @@
<string name="places_finding">Szukam…</string>
<string name="places_not_found">Gearslip nie znalazł Twojej lokalizacji. Sprawdź, czy lokalizacja jest włączona.</string>
<string name="places_clear">Wyczyść</string>
<string name="settings_language">Język</string>
<string name="settings_language_phone">Taki sam jak w telefonie</string>
</resources>
@@ -839,4 +839,6 @@
<string name="places_finding">Procurando…</string>
<string name="places_not_found">O Gearslip não encontrou onde você está. Veja se a localização está ligada.</string>
<string name="places_clear">Limpar</string>
<string name="settings_language">Idioma</string>
<string name="settings_language_phone">O mesmo do celular</string>
</resources>
@@ -1,3 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_language">Limbă</string>
<string name="settings_language_phone">La fel ca pe telefon</string>
</resources>
@@ -847,4 +847,6 @@
<string name="places_finding">Ищу…</string>
<string name="places_not_found">Gearslip не нашёл, где вы. Проверьте, что геолокация включена.</string>
<string name="places_clear">Очистить</string>
<string name="settings_language">Язык</string>
<string name="settings_language_phone">Как на телефоне</string>
</resources>
@@ -831,4 +831,6 @@
<string name="places_finding">Söker…</string>
<string name="places_not_found">Gearslip hittade inte var du är. Kontrollera att platstjänster är på.</string>
<string name="places_clear">Rensa</string>
<string name="settings_language">Språk</string>
<string name="settings_language_phone">Samma som telefonen</string>
</resources>
@@ -831,4 +831,6 @@
<string name="places_finding">Aranıyor…</string>
<string name="places_not_found">Gearslip konumunuzu bulamadı. Konumun açık olduğundan emin olun.</string>
<string name="places_clear">Temizle</string>
<string name="settings_language">Dil</string>
<string name="settings_language_phone">Telefonla aynı</string>
</resources>
@@ -847,4 +847,6 @@
<string name="places_finding">Шукаю…</string>
<string name="places_not_found">Gearslip не знайшов, де ви. Перевірте, чи увімкнено геолокацію.</string>
<string name="places_clear">Очистити</string>
<string name="settings_language">Мова</string>
<string name="settings_language_phone">Як на телефоні</string>
</resources>
@@ -823,4 +823,6 @@
<string name="places_finding">正在定位…</string>
<string name="places_not_found">Gearslip 找不到你的位置。请检查定位是否已开启。</string>
<string name="places_clear">清除</string>
<string name="settings_language">语言</string>
<string name="settings_language_phone">与手机相同</string>
</resources>
+2
View File
@@ -875,4 +875,6 @@
<string name="places_finding">Finding you…</string>
<string name="places_not_found">Gearslip couldn’t find where you are. Check that location is on.</string>
<string name="places_clear">Clear</string>
<string name="settings_language">Language</string>
<string name="settings_language_phone">Same as the phone</string>
</resources>