refine language picker for iOS parity

This commit is contained in:
a1denvalu3 2026-07-28 16:24:11 +02:00
parent 8f2585d8eb
commit 525ba27e3b
36 changed files with 113 additions and 102 deletions

View File

@ -20,6 +20,7 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
@ -35,12 +36,13 @@ import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.filled.ChevronRight
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.CloudDownload
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Language
import androidx.compose.material.icons.filled.Lock
import androidx.compose.material.icons.filled.Public
import androidx.compose.material.icons.filled.Share
import androidx.compose.material.icons.filled.UnfoldMore
import androidx.compose.material.icons.filled.Warning
import androidx.compose.material.icons.filled.Wifi
import androidx.compose.material.icons.outlined.Info
@ -122,71 +124,6 @@ private fun ThemeChip(
}
}
@Composable
private fun LanguagePickerDialog(
languages: List<AppLanguage>,
selectedLanguageTag: String,
onLanguageSelected: (String) -> Unit,
onDismiss: () -> Unit,
) {
AlertDialog(
onDismissRequest = onDismiss,
title = { Text(stringResource(R.string.about_select_language)) },
text = {
LazyColumn(modifier = Modifier.fillMaxWidth()) {
item(key = "system") {
LanguageOptionRow(
label = stringResource(R.string.about_system_default),
selected = selectedLanguageTag.isEmpty(),
onClick = { onLanguageSelected("") },
)
}
items(
count = languages.size,
key = { index -> languages[index].languageTag },
) { index ->
val language = languages[index]
LanguageOptionRow(
label = language.endonym,
selected = selectedLanguageTag == language.languageTag,
onClick = { onLanguageSelected(language.languageTag) },
)
}
}
},
confirmButton = {
TextButton(onClick = onDismiss) {
Text(stringResource(android.R.string.cancel))
}
},
)
}
@Composable
private fun LanguageOptionRow(
label: String,
selected: Boolean,
onClick: () -> Unit,
) {
Row(
modifier = Modifier
.fillMaxWidth()
.clickable(onClick = onClick)
.padding(vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
RadioButton(
selected = selected,
onClick = null,
)
Spacer(modifier = Modifier.width(12.dp))
Text(
text = label,
style = MaterialTheme.typography.bodyLarge,
)
}
}
@Composable
private fun LanguageSettingsRow(
selectedLanguageName: String,
@ -196,40 +133,59 @@ private fun LanguageSettingsRow(
modifier = Modifier
.fillMaxWidth()
.clickable(onClick = onClick)
.padding(horizontal = 16.dp, vertical = 13.dp),
.padding(horizontal = 16.dp, vertical = 15.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
imageVector = Icons.Filled.Language,
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(22.dp),
)
Spacer(modifier = Modifier.width(16.dp))
Text(
text = stringResource(R.string.about_language),
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Medium,
text = stringResource(R.string.about_app_language),
style = MaterialTheme.typography.labelLarge,
fontWeight = FontWeight.SemiBold,
modifier = Modifier.weight(1f),
)
Text(
text = selectedLanguageName,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
color = MaterialTheme.colorScheme.primary,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.weight(1f, fill = false),
)
Spacer(modifier = Modifier.width(8.dp))
Icon(
imageVector = Icons.Filled.ChevronRight,
imageVector = Icons.Filled.UnfoldMore,
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.size(20.dp),
modifier = Modifier.size(18.dp),
)
}
}
@Composable
private fun LanguageMenuItem(
label: String,
selected: Boolean,
onClick: () -> Unit,
) {
DropdownMenuItem(
text = {
Text(
text = label,
style = MaterialTheme.typography.bodyMedium,
)
},
onClick = onClick,
trailingIcon = {
if (selected) {
Icon(
imageVector = Icons.Filled.Check,
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
)
}
},
)
}
/**
* Unified settings toggle row with icon, title, subtitle, and switch
* Apple-like design with proper spacing
@ -377,21 +333,6 @@ fun AboutSheet(
}
var showLanguagePicker by remember { mutableStateOf(false) }
if (showLanguagePicker) {
LanguagePickerDialog(
languages = supportedLanguages,
selectedLanguageTag = selectedLanguageTag,
onLanguageSelected = { languageTag ->
showLanguagePicker = false
if (languageTag != selectedLanguageTag) {
selectedLanguageTag = languageTag
LanguagePreferenceManager.setLanguage(languageTag)
}
},
onDismiss = { showLanguagePicker = false },
)
}
if (isPresented) {
BitchatBottomSheet(
modifier = modifier,
@ -482,17 +423,52 @@ fun AboutSheet(
Column {
AboutSectionLabel(text = stringResource(R.string.about_language))
Surface(
BoxWithConstraints(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = AboutHorizontalPadding),
color = colorScheme.surface,
shape = AboutCardShape,
) {
LanguageSettingsRow(
selectedLanguageName = selectedLanguageName,
onClick = { showLanguagePicker = true },
)
Surface(
modifier = Modifier.fillMaxWidth(),
color = colorScheme.surface,
shape = AboutCardShape,
) {
LanguageSettingsRow(
selectedLanguageName = selectedLanguageName,
onClick = { showLanguagePicker = true },
)
}
DropdownMenu(
expanded = showLanguagePicker,
onDismissRequest = { showLanguagePicker = false },
modifier = Modifier.width(maxWidth),
) {
LanguageMenuItem(
label = stringResource(R.string.about_system_default),
selected = selectedLanguageTag.isEmpty(),
onClick = {
showLanguagePicker = false
if (selectedLanguageTag.isNotEmpty()) {
selectedLanguageTag = ""
LanguagePreferenceManager.setLanguage("")
}
},
)
HorizontalDivider()
supportedLanguages.forEach { language ->
LanguageMenuItem(
label = language.endonym,
selected = selectedLanguageTag == language.languageTag,
onClick = {
showLanguagePicker = false
if (language.languageTag != selectedLanguageTag) {
selectedLanguageTag = language.languageTag
LanguagePreferenceManager.setLanguage(language.languageTag)
}
},
)
}
}
}
}
}

View File

@ -390,6 +390,7 @@
<string name="nearby_notes_one">تُركت ملاحظة واحدة هنا — انقر للقراءة</string>
<string name="nearby_notes_many">تُركت %d ملاحظات هنا — انقر للقراءة</string>
<string name="about_language">اللغة</string>
<string name="about_app_language">لغة التطبيق</string>
<string name="about_system_default">إعداد النظام الافتراضي</string>
<string name="about_select_language">اختر اللغة</string>
</resources>

View File

@ -377,6 +377,7 @@
<string name="nearby_notes_one">এখানে 1টি নোট রাখা আছে — পড়তে ট্যাপ করুন</string>
<string name="nearby_notes_many">এখানে %dটি নোট রাখা আছে — পড়তে ট্যাপ করুন</string>
<string name="about_language">ভাষা</string>
<string name="about_app_language">অ্যাপের ভাষা</string>
<string name="about_system_default">সিস্টেম ডিফল্ট</string>
<string name="about_select_language">ভাষা নির্বাচন করুন</string>
</resources>

View File

@ -391,6 +391,7 @@
<string name="nearby_notes_one">1 notiz hier hinterlassen — tippen zum lesen</string>
<string name="nearby_notes_many">%d notizen hier hinterlassen — tippen zum lesen</string>
<string name="about_language">Sprache</string>
<string name="about_app_language">App-Sprache</string>
<string name="about_system_default">Systemstandard</string>
<string name="about_select_language">Sprache auswählen</string>
</resources>

View File

@ -390,6 +390,7 @@
<string name="nearby_notes_one">1 nota dejada aquí — toca para leer</string>
<string name="nearby_notes_many">%d notas dejadas aquí — toca para leer</string>
<string name="about_language">Idioma</string>
<string name="about_app_language">Idioma de la app</string>
<string name="about_system_default">Predeterminado del sistema</string>
<string name="about_select_language">Seleccionar idioma</string>
</resources>

View File

@ -377,6 +377,7 @@
<string name="nearby_notes_one">۱ یادداشت اینجا باقی مانده — برای خواندن ضربه بزنید</string>
<string name="nearby_notes_many">%d یادداشت اینجا باقی مانده — برای خواندن ضربه بزنید</string>
<string name="about_language">زبان</string>
<string name="about_app_language">زبان برنامه</string>
<string name="about_system_default">پیش‌فرض سیستم</string>
<string name="about_select_language">انتخاب زبان</string>
</resources>

View File

@ -394,6 +394,7 @@
<string name="nearby_notes_one">1 note ang naiwan dito — i-tap para basahin</string>
<string name="nearby_notes_many">%d note ang naiwan dito — i-tap para basahin</string>
<string name="about_language">Wika</string>
<string name="about_app_language">Wika ng app</string>
<string name="about_system_default">Default ng system</string>
<string name="about_select_language">Pumili ng wika</string>
</resources>

View File

@ -408,6 +408,7 @@
<string name="nearby_notes_one">1 note laissée ici — appuyez pour lire</string>
<string name="nearby_notes_many">%d notes laissées ici — appuyez pour lire</string>
<string name="about_language">Langue</string>
<string name="about_app_language">Langue de lappli</string>
<string name="about_system_default">Langue du système</string>
<string name="about_select_language">Choisir la langue</string>
</resources>

View File

@ -58,6 +58,7 @@
<string name="nearby_notes_one">פתק אחד הושאר כאן — הקש לקריאה</string>
<string name="nearby_notes_many">%d פתקים הושארו כאן — הקש לקריאה</string>
<string name="about_language">שפה</string>
<string name="about_app_language">שפת האפליקציה</string>
<string name="about_system_default">ברירת המחדל של המערכת</string>
<string name="about_select_language">בחירת שפה</string>
</resources>

View File

@ -390,6 +390,7 @@
<string name="nearby_notes_one">यहाँ 1 नोट छोड़ा गया है — पढ़ने के लिए टैप करें</string>
<string name="nearby_notes_many">यहाँ %d नोट छोड़े गए हैं — पढ़ने के लिए टैप करें</string>
<string name="about_language">भाषा</string>
<string name="about_app_language">ऐप की भाषा</string>
<string name="about_system_default">सिस्टम डिफ़ॉल्ट</string>
<string name="about_select_language">भाषा चुनें</string>
</resources>

View File

@ -390,6 +390,7 @@
<string name="nearby_notes_one">1 catatan ditinggalkan di sini — ketuk untuk membaca</string>
<string name="nearby_notes_many">%d catatan ditinggalkan di sini — ketuk untuk membaca</string>
<string name="about_language">Bahasa</string>
<string name="about_app_language">Bahasa aplikasi</string>
<string name="about_system_default">Default sistem</string>
<string name="about_select_language">Pilih bahasa</string>
</resources>

View File

@ -423,6 +423,7 @@
<string name="nearby_notes_one">1 nota lasciata qui — tocca per leggere</string>
<string name="nearby_notes_many">%d note lasciate qui — tocca per leggere</string>
<string name="about_language">Lingua</string>
<string name="about_app_language">Lingua dellapp</string>
<string name="about_system_default">Predefinita di sistema</string>
<string name="about_select_language">Seleziona lingua</string>
</resources>

View File

@ -390,6 +390,7 @@
<string name="nearby_notes_one">ここに1件のメモがあります — タップして読む</string>
<string name="nearby_notes_many">ここに%d件のメモがあります — タップして読む</string>
<string name="about_language">言語</string>
<string name="about_app_language">アプリの言語</string>
<string name="about_system_default">システムのデフォルト</string>
<string name="about_select_language">言語を選択</string>
</resources>

View File

@ -377,6 +377,7 @@
<string name="nearby_notes_one">აქ 1 ჩანაწერია დატოვებული — წასაკითხად შეეხეთ</string>
<string name="nearby_notes_many">აქ %d ჩანაწერია დატოვებული — წასაკითხად შეეხეთ</string>
<string name="about_language">ენა</string>
<string name="about_app_language">აპის ენა</string>
<string name="about_system_default">სისტემის ნაგულისხმევი</string>
<string name="about_select_language">ენის არჩევა</string>
</resources>

View File

@ -390,6 +390,7 @@
<string name="nearby_notes_one">여기 남겨진 쪽지 1개 — 탭하여 읽기</string>
<string name="nearby_notes_many">여기 남겨진 쪽지 %d개 — 탭하여 읽기</string>
<string name="about_language">언어</string>
<string name="about_app_language">앱 언어</string>
<string name="about_system_default">시스템 기본값</string>
<string name="about_select_language">언어 선택</string>
</resources>

View File

@ -403,6 +403,7 @@
<string name="nearby_notes_one">naoty 1 no navela teto — tsindrio raha hamaky</string>
<string name="nearby_notes_many">naoty %d no navela teto — tsindrio raha hamaky</string>
<string name="about_language">Fiteny</string>
<string name="about_app_language">Fiteninny app</string>
<string name="about_system_default">Fiteninny rafitra</string>
<string name="about_select_language">Safidio ny fiteny</string>
</resources>

View File

@ -45,6 +45,7 @@
<string name="nearby_notes_one">1 nota ditinggalkan di sini — ketik untuk baca</string>
<string name="nearby_notes_many">%d nota ditinggalkan di sini — ketik untuk baca</string>
<string name="about_language">Bahasa</string>
<string name="about_app_language">Bahasa aplikasi</string>
<string name="about_system_default">Lalai sistem</string>
<string name="about_select_language">Pilih bahasa</string>
</resources>

View File

@ -394,6 +394,7 @@
<string name="nearby_notes_one">यहाँ 1 नोट छोडिएको छ — पढ्न ट्याप गर्नुहोस्</string>
<string name="nearby_notes_many">यहाँ %d नोटहरू छोडिएका छन् — पढ्न ट्याप गर्नुहोस्</string>
<string name="about_language">भाषा</string>
<string name="about_app_language">एपको भाषा</string>
<string name="about_system_default">प्रणालीको पूर्वनिर्धारित</string>
<string name="about_select_language">भाषा छान्नुहोस्</string>
</resources>

View File

@ -421,6 +421,7 @@
<string name="nearby_notes_one">1 notitie hier achtergelaten — tik om te lezen</string>
<string name="nearby_notes_many">%d notities hier achtergelaten — tik om te lezen</string>
<string name="about_language">Taal</string>
<string name="about_app_language">App-taal</string>
<string name="about_system_default">Systeemstandaard</string>
<string name="about_select_language">Taal selecteren</string>
</resources>

View File

@ -377,6 +377,7 @@
<string name="nearby_notes_one">ایتھے 1 نوٹ چھڈیا گیا — پڑھݨ لئی ٹیپ کرو</string>
<string name="nearby_notes_many">ایتھے %d نوٹس چھڈے گئے — پڑھݨ لئی ٹیپ کرو</string>
<string name="about_language">بولی</string>
<string name="about_app_language">ایپ دی بولی</string>
<string name="about_system_default">سسٹم دی ڈیفالٹ</string>
<string name="about_select_language">بولی چݨو</string>
</resources>

View File

@ -58,6 +58,7 @@
<string name="nearby_notes_one">1 notatka zostawiona tutaj — stuknij, aby przeczytać</string>
<string name="nearby_notes_many">%d notatek zostawionych tutaj — stuknij, aby przeczytać</string>
<string name="about_language">Język</string>
<string name="about_app_language">Język aplikacji</string>
<string name="about_system_default">Domyślny systemu</string>
<string name="about_select_language">Wybierz język</string>
</resources>

View File

@ -389,6 +389,7 @@
<string name="nearby_notes_one">1 nota deixada aqui — toque para ler</string>
<string name="nearby_notes_many">%d notas deixadas aqui — toque para ler</string>
<string name="about_language">Idioma</string>
<string name="about_app_language">Idioma do app</string>
<string name="about_system_default">Padrão do sistema</string>
<string name="about_select_language">Selecionar idioma</string>
</resources>

View File

@ -390,6 +390,7 @@
<string name="nearby_notes_one">1 nota deixada aqui — toque para ler</string>
<string name="nearby_notes_many">%d notas deixadas aqui — toque para ler</string>
<string name="about_language">Idioma</string>
<string name="about_app_language">Idioma da aplicação</string>
<string name="about_system_default">Predefinição do sistema</string>
<string name="about_select_language">Selecionar idioma</string>
</resources>

View File

@ -384,6 +384,7 @@
<string name="nearby_notes_one">здесь оставлена 1 заметка — нажмите, чтобы прочитать</string>
<string name="nearby_notes_many">здесь оставлено заметок: %d — нажмите, чтобы прочитать</string>
<string name="about_language">Язык</string>
<string name="about_app_language">Язык приложения</string>
<string name="about_system_default">Системный язык</string>
<string name="about_select_language">Выбрать язык</string>
</resources>

View File

@ -382,6 +382,7 @@
<string name="nearby_notes_one">1 anteckning lämnad här — tryck för att läsa</string>
<string name="nearby_notes_many">%d anteckningar lämnade här — tryck för att läsa</string>
<string name="about_language">Språk</string>
<string name="about_app_language">Appspråk</string>
<string name="about_system_default">Systemstandard</string>
<string name="about_select_language">Välj språk</string>
</resources>

View File

@ -45,6 +45,7 @@
<string name="nearby_notes_one">இங்கே 1 குறிப்பு விடப்பட்டுள்ளது — படிக்க தட்டவும்</string>
<string name="nearby_notes_many">இங்கே %d குறிப்புகள் விடப்பட்டுள்ளன — படிக்க தட்டவும்</string>
<string name="about_language">மொழி</string>
<string name="about_app_language">பயன்பாட்டு மொழி</string>
<string name="about_system_default">கணினி இயல்புநிலை</string>
<string name="about_select_language">மொழியைத் தேர்ந்தெடுக்கவும்</string>
</resources>

View File

@ -377,6 +377,7 @@
<string name="nearby_notes_one">มี 1 โน้ตทิ้งไว้ที่นี่ — แตะเพื่ออ่าน</string>
<string name="nearby_notes_many">มี %d โน้ตทิ้งไว้ที่นี่ — แตะเพื่ออ่าน</string>
<string name="about_language">ภาษา</string>
<string name="about_app_language">ภาษาของแอป</string>
<string name="about_system_default">ค่าเริ่มต้นของระบบ</string>
<string name="about_select_language">เลือกภาษา</string>
</resources>

View File

@ -382,6 +382,7 @@
<string name="nearby_notes_one">buraya 1 not bırakıldı — okumak için dokun</string>
<string name="nearby_notes_many">buraya %d not bırakıldı — okumak için dokun</string>
<string name="about_language">Dil</string>
<string name="about_app_language">Uygulama dili</string>
<string name="about_system_default">Sistem varsayılanı</string>
<string name="about_select_language">Dil seçin</string>
</resources>

View File

@ -45,6 +45,7 @@
<string name="nearby_notes_one">тут залишено 1 нотатку — торкніться, щоб прочитати</string>
<string name="nearby_notes_many">тут залишено %d нотаток — торкніться, щоб прочитати</string>
<string name="about_language">Мова</string>
<string name="about_app_language">Мова застосунку</string>
<string name="about_system_default">Системна мова</string>
<string name="about_select_language">Вибрати мову</string>
</resources>

View File

@ -390,6 +390,7 @@
<string name="nearby_notes_one">یہاں 1 نوٹ چھوڑا گیا ہے — پڑھنے کے لیے تھپتھپائیں</string>
<string name="nearby_notes_many">یہاں %d نوٹ چھوڑے گئے ہیں — پڑھنے کے لیے تھپتھپائیں</string>
<string name="about_language">زبان</string>
<string name="about_app_language">ایپ کی زبان</string>
<string name="about_system_default">سسٹم ڈیفالٹ</string>
<string name="about_select_language">زبان منتخب کریں</string>
</resources>

View File

@ -377,6 +377,7 @@
<string name="nearby_notes_one">có 1 ghi chú để lại ở đây — chạm để đọc</string>
<string name="nearby_notes_many">có %d ghi chú để lại ở đây — chạm để đọc</string>
<string name="about_language">Ngôn ngữ</string>
<string name="about_app_language">Ngôn ngữ ứng dụng</string>
<string name="about_system_default">Mặc định hệ thống</string>
<string name="about_select_language">Chọn ngôn ngữ</string>
</resources>

View File

@ -57,6 +57,7 @@
<string name="nearby_notes_one">这里留有 1 条留言 — 点按阅读</string>
<string name="nearby_notes_many">这里留有 %d 条留言 — 点按阅读</string>
<string name="about_language">语言</string>
<string name="about_app_language">应用语言</string>
<string name="about_system_default">跟随系统</string>
<string name="about_select_language">选择语言</string>
</resources>

View File

@ -57,6 +57,7 @@
<string name="nearby_notes_one">這裡留有 1 則留言 — 點按閱讀</string>
<string name="nearby_notes_many">這裡留有 %d 則留言 — 點按閱讀</string>
<string name="about_language">語言</string>
<string name="about_app_language">應用程式語言</string>
<string name="about_system_default">跟隨系統</string>
<string name="about_select_language">選擇語言</string>
</resources>

View File

@ -407,6 +407,7 @@
<string name="nearby_notes_one">这里留有 1 条留言 — 点按阅读</string>
<string name="nearby_notes_many">这里留有 %d 条留言 — 点按阅读</string>
<string name="about_language">语言</string>
<string name="about_app_language">应用语言</string>
<string name="about_system_default">跟随系统</string>
<string name="about_select_language">选择语言</string>
</resources>

View File

@ -568,6 +568,7 @@
<string name="bluetooth_recommended">Bluetooth Recommended</string>
<string name="about_language">Language</string>
<string name="about_app_language">App language</string>
<string name="about_system_default">System default</string>
<string name="about_select_language">Select language</string>
</resources>

View File

@ -34,6 +34,7 @@ class LanguageCatalogContractTest {
fun `language picker strings exist in every locale pack`() {
val requiredKeys = setOf(
"about_language",
"about_app_language",
"about_system_default",
"about_select_language",
)