From 0d174f155069c4f64d7234028435510e826caeb6 Mon Sep 17 00:00:00 2001 From: jeffersoncarlospedroso Date: Wed, 10 Dec 2025 23:06:37 +0000 Subject: [PATCH] Add multilanguage support (i18n) initial implementation --- .../navigation/BottomNavigationBar.kt | 6 +- .../vbhelper/navigation/NavigationItems.kt | 114 +++++++++++++++--- .../adventureScreen/AdventureScreen.kt | 6 +- .../screens/homeScreens/BetaWarning.kt | 12 +- .../screens/homeScreens/HomeScreen.kt | 10 +- .../screens/itemsScreen/ItemsScreen.kt | 3 +- .../scanScreen/ChooseConnectionScreen.kt | 8 +- .../vbhelper/screens/scanScreen/ScanScreen.kt | 9 +- .../scanScreen/ScanScreenControllerImpl.kt | 15 +-- .../screens/settingsScreen/SettingsScreen.kt | 60 ++++++--- app/src/main/res/values-pt-rBR/strings.xml | 92 ++++++++++++++ app/src/main/res/values/strings.xml | 94 +++++++++++++++ 12 files changed, 364 insertions(+), 65 deletions(-) create mode 100644 app/src/main/res/values-pt-rBR/strings.xml diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt index 52560c1798dfcdd17becc6fe1df88ebaa184f31c..96f427570a2e5cfabba0603aa939522d4dcd2cfe 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt @@ -8,7 +8,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.painterResource import androidx.navigation.NavController import androidx.navigation.compose.currentBackStackEntryAsState - +import androidx.compose.ui.res.stringResource @Composable fun BottomNavigationBar(navController: NavController) { @@ -26,8 +26,8 @@ fun BottomNavigationBar(navController: NavController) { items.forEach { item -> NavigationBarItem ( - icon = { Icon(painter = painterResource(item.icon), contentDescription = item.label) }, - label = { Text(item.label) }, + icon = { Icon(painter = painterResource(item.icon), contentDescription = stringResource(item.label)) }, + label = { Text(text = stringResource(item.label)) }, selected = currentRoute == item.route, onClick = { navController.navigate(item.route) { diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt index ca187ea447f05cf5f04a19a4a473d907acb8fcea..77b9b9122d0dbe963eb633ff186ad295273cf071 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt @@ -1,25 +1,101 @@ package com.github.nacabaro.vbhelper.navigation import com.github.nacabaro.vbhelper.R +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes -sealed class NavigationItems ( - var route: String, - var icon: Int, - var label: String +sealed class NavigationItems( + val route: String, + @DrawableRes val icon: Int, + @StringRes val label: Int ) { - object Scan : NavigationItems("Scan/{characterId}", R.drawable.baseline_nfc_24, "Scan") - object Battles : NavigationItems("Battle", R.drawable.baseline_swords_24, "Battle") - object Home : NavigationItems("Home", R.drawable.baseline_cottage_24, "Home") - object Dex : NavigationItems("Dex", R.drawable.baseline_menu_book_24, "Dex") - object CardAdventure : NavigationItems("CardAdventure/{cardId}", R.drawable.baseline_fort_24, "Card adventure") - object Storage : NavigationItems("Storage", R.drawable.baseline_catching_pokemon_24, "Storage") - object Settings : NavigationItems("Settings", R.drawable.baseline_settings_24, "Settings") - object Viewer : NavigationItems("Viewer", R.drawable.baseline_image_24, "Viewer") - object CardView : NavigationItems("Card/{cardId}", R.drawable.baseline_image_24, "Card") - object Items : NavigationItems("Items", R.drawable.baseline_data_24, "Items") - object MyItems : NavigationItems("MyItems", R.drawable.baseline_data_24, "My items") - object ItemsStore : NavigationItems("ItemsStore", R.drawable.baseline_data_24, "Items store") - object ApplyItem : NavigationItems("ApplyItem/{itemId}", R.drawable.baseline_data_24, "Apply item") - object Adventure : NavigationItems("Adventure", R.drawable.baseline_fort_24, "Adventure") - object Credits : NavigationItems("Credits", R.drawable.baseline_data_24, "Credits") + object Scan : NavigationItems( + "Scan/{characterId}", + R.drawable.baseline_nfc_24, + R.string.nav_scan + ) + + object Battles : NavigationItems( + "Battle", + R.drawable.baseline_swords_24, + R.string.nav_battle + ) + + object Home : NavigationItems( + "Home", + R.drawable.baseline_cottage_24, + R.string.nav_home + ) + + object Dex : NavigationItems( + "Dex", + R.drawable.baseline_menu_book_24, + R.string.nav_dex + ) + + object CardAdventure : NavigationItems( + "CardAdventure/{cardId}", + R.drawable.baseline_fort_24, + R.string.nav_card_adventure + ) + + object Storage : NavigationItems( + "Storage", + R.drawable.baseline_catching_pokemon_24, + R.string.nav_storage + ) + + object Settings : NavigationItems( + "Settings", + R.drawable.baseline_settings_24, + R.string.nav_settings + ) + + object Viewer : NavigationItems( + "Viewer", + R.drawable.baseline_image_24, + R.string.nav_viewer + ) + + object CardView : NavigationItems( + "Card/{cardId}", + R.drawable.baseline_image_24, + R.string.nav_card + ) + + object Items : NavigationItems( + "Items", + R.drawable.baseline_data_24, + R.string.nav_items + ) + + object MyItems : NavigationItems( + "MyItems", + R.drawable.baseline_data_24, + R.string.nav_my_items + ) + + object ItemsStore : NavigationItems( + "ItemsStore", + R.drawable.baseline_data_24, + R.string.nav_items_store + ) + + object ApplyItem : NavigationItems( + "ApplyItem/{itemId}", + R.drawable.baseline_data_24, + R.string.nav_apply_item + ) + + object Adventure : NavigationItems( + "Adventure", + R.drawable.baseline_fort_24, + R.string.nav_adventure + ) + + object Credits : NavigationItems( + "Credits", + R.drawable.baseline_data_24, + R.string.nav_credits + ) } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreen.kt index d7511ae079f7471847cb53d970bf75ac92fdea68..28fe0e95d1948e6dd2b56c22dd8d3eabf434259a 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.navigation.NavController import com.github.nacabaro.vbhelper.screens.itemsScreen.ObtainedItemDialog import com.github.nacabaro.vbhelper.components.TopBanner @@ -29,6 +30,7 @@ import com.github.nacabaro.vbhelper.source.StorageRepository import com.github.nacabaro.vbhelper.utils.BitmapData import kotlinx.coroutines.delay import java.time.Instant +import com.github.nacabaro.vbhelper.R @Composable fun AdventureScreen( @@ -61,7 +63,7 @@ fun AdventureScreen( Scaffold( topBar = { TopBanner( - text = "Adventure", + text = stringResource(R.string.adventure_title), onBackClick = { navController.popBackStack() } @@ -76,7 +78,7 @@ fun AdventureScreen( .padding(top = contentPadding.calculateTopPadding()) .fillMaxSize() ) { - Text(text = "Nothing to see here") + Text(text = stringResource(R.string.adventure_empty_state)) } } else { LazyColumn( diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt index fb9a567e271c44a650c868a5d0de56c0d236ad30..77e08828b1058cfffc125335c39a0b5010d14192 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt @@ -8,8 +8,10 @@ import androidx.compose.material3.Card import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog +import com.github.nacabaro.vbhelper.R @Composable fun BetaWarning( @@ -19,26 +21,26 @@ fun BetaWarning( onDismissRequest = onDismissRequest ) { Card { - Column ( + Column( modifier = Modifier .padding(16.dp) ) { Text( - text = "This application is currently in alpha and it is not complete. Do not use to store important characters for you, as any future updates might delete all your characters. Sorry for the inconvenience!" + text = stringResource(R.string.beta_warning_message_main) ) Spacer(modifier = Modifier.padding(8.dp)) Text( - text = "Application should work now with the original VB and the VH." + text = stringResource(R.string.beta_warning_message_compatibility) ) Spacer(modifier = Modifier.padding(8.dp)) Text( - text = "Thank you for your understanding and patience. Sincerely, the dev team." + text = stringResource(R.string.beta_warning_message_thanks) ) Spacer(modifier = Modifier.padding(8.dp)) Button( onClick = onDismissRequest ) { - Text(text = "Dismiss") + Text(text = stringResource(R.string.beta_warning_button_dismiss)) } } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt index 7cd45151ee98e046db283018c363996b321ee010..7036fb825b9aab11f55b4f57160e571b62d81555 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog @@ -39,6 +40,7 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ObtainedItemDialog import com.github.nacabaro.vbhelper.source.StorageRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import com.github.nacabaro.vbhelper.R @Composable fun HomeScreen( @@ -81,7 +83,7 @@ fun HomeScreen( Scaffold ( topBar = { TopBanner( - text = "VB Helper", + text = stringResource(R.string.home_title), onScanClick = { navController.navigate(NavigationItems.Scan.route) }, @@ -99,7 +101,7 @@ fun HomeScreen( .fillMaxSize() .padding(top = contentPadding.calculateTopPadding()) ) { - Text(text = "Nothing to see here") + Text(text = stringResource(R.string.adventure_empty_state)) } } else { if (activeMon.value!!.isBemCard) { @@ -154,7 +156,7 @@ fun HomeScreen( .padding(16.dp) ) { Text( - text = "One of your characters has finished their adventure mission!", + text = stringResource(R.string.home_adventure_mission_finished), textAlign = TextAlign.Center ) Button( @@ -165,7 +167,7 @@ fun HomeScreen( .padding(8.dp) .fillMaxWidth() ) { - Text(text = "Dismiss") + Text(text = stringResource(R.string.beta_warning_button_dismiss)) } } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreen.kt index 8bbcbc31432bef51ee412c305f00b1dda1d3c275..4b78f991e767be014b2138c998767400491411aa 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.Modifier import androidx.navigation.NavController import com.github.nacabaro.vbhelper.components.TopBanner import com.github.nacabaro.vbhelper.navigation.NavigationItems +import androidx.compose.ui.res.stringResource @Composable fun ItemsScreen( @@ -37,7 +38,7 @@ fun ItemsScreen( ) { items.forEachIndexed { index, item -> Tab( - text = { Text(item.label) }, + text = { Text(text = stringResource(item.label)) }, selected = selectedTabItem == index, onClick = { selectedTabItem = index } ) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ChooseConnectionScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ChooseConnectionScreen.kt index 34180bab577bf958a21e32514cf1ea6df33782de..d2025aa611a44ec2c45a8ab0dde2dfc83b9f1182 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ChooseConnectionScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ChooseConnectionScreen.kt @@ -12,10 +12,12 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.github.nacabaro.vbhelper.components.TopBanner +import com.github.nacabaro.vbhelper.R @Composable fun ChooseConnectOption( @@ -26,7 +28,7 @@ fun ChooseConnectOption( Scaffold( topBar = { TopBanner( - text = "Scan a Vital Bracelet", + text = stringResource(R.string.scan_title), onBackClick = { navController.popBackStack() } @@ -41,13 +43,13 @@ fun ChooseConnectOption( .padding(contentPadding) ) { ScanButton( - text = "Vital Bracelet to App", + text = stringResource(R.string.scan_vb_to_app), disabled = onClickRead == null, onClick = onClickRead?: { }, ) Spacer(modifier = Modifier.height(16.dp)) ScanButton( - text = "App to Vital Bracelet", + text = stringResource(R.string.scan_app_to_vb), disabled = onClickWrite == null, onClick = onClickWrite?: { }, ) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt index 8dec3b6c4b83a5c7f862b79e4ab71796dc686720..72fc520d4f2f363d7ec7a226da97945a7b0a8ece 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt @@ -25,6 +25,7 @@ import com.github.nacabaro.vbhelper.source.proto.Secrets import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.withContext +import com.github.nacabaro.vbhelper.R const val SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER = "SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER" @@ -93,9 +94,9 @@ fun ScanScreen( else -> { { if(secrets == null) { - Toast.makeText(context, "Secrets is not yet initialized. Try again.", Toast.LENGTH_SHORT).show() + Toast.makeText(context, context.getString(R.string.scan_secrets_not_initialized), Toast.LENGTH_SHORT).show() } else if(secrets?.isMissingSecrets() == true) { - Toast.makeText(context, "Secrets not yet imported. Go to Settings and Import APK", Toast.LENGTH_SHORT).show() + Toast.makeText(context, context.getString(R.string.scan_secrets_not_imported), Toast.LENGTH_SHORT).show() } else { readingScreen = true // kicks off nfc adapter in DisposableEffect } @@ -107,9 +108,9 @@ fun ScanScreen( else -> { { if(secrets == null) { - Toast.makeText(context, "Secrets is not yet initialized. Try again.", Toast.LENGTH_SHORT).show() + Toast.makeText(context, context.getString(R.string.scan_secrets_not_initialized), Toast.LENGTH_SHORT).show() } else if(secrets?.isMissingSecrets() == true) { - Toast.makeText(context, "Secrets not yet imported. Go to Settings and Import APK", Toast.LENGTH_SHORT).show() + Toast.makeText(context, context.getString(R.string.scan_secrets_not_imported), Toast.LENGTH_SHORT).show() } else { writingScreen = true // kicks off nfc adapter in DisposableEffect } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt index 9ce42bc96e617bba06f2290a060b68c46df713bd..487ab2dab395357aafd4128554d33ee19ff501ce 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt @@ -25,6 +25,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import com.github.nacabaro.vbhelper.R class ScanScreenControllerImpl( override val secretsFlow: Flow, @@ -38,7 +39,7 @@ class ScanScreenControllerImpl( init { val maybeNfcAdapter = NfcAdapter.getDefaultAdapter(componentActivity) if (maybeNfcAdapter == null) { - Toast.makeText(componentActivity, "No NFC on device!", Toast.LENGTH_SHORT).show() + Toast.makeText(componentActivity, componentActivity.getString(R.string.scan_no_nfc_on_device), Toast.LENGTH_SHORT).show() } nfcAdapter = maybeNfcAdapter checkSecrets() @@ -94,7 +95,7 @@ class ScanScreenControllerImpl( val nfcData = NfcA.get(tag) if (nfcData == null) { componentActivity.runOnUiThread { - Toast.makeText(componentActivity, "Tag detected is not VB", Toast.LENGTH_SHORT).show() + Toast.makeText(componentActivity, componentActivity.getString(R.string.scan_tag_not_vb), Toast.LENGTH_SHORT).show() } } nfcData.connect() @@ -112,7 +113,7 @@ class ScanScreenControllerImpl( componentActivity.lifecycleScope.launch(Dispatchers.IO) { if(secretsFlow.stateIn(componentActivity.lifecycleScope).value.isMissingSecrets()) { componentActivity.runOnUiThread { - Toast.makeText(componentActivity, "Missing Secrets. Go to settings and import Vital Arena APK", Toast.LENGTH_SHORT).show() + Toast.makeText(componentActivity, componentActivity.getString(R.string.scan_missing_secrets), Toast.LENGTH_SHORT).show() } } } @@ -135,10 +136,10 @@ class ScanScreenControllerImpl( tagCommunicator.sendCharacter(castNfcCharacter) } onComplete.invoke() - "Sent character successfully!" + componentActivity.getString(R.string.scan_sent_character_success) } catch (e: Throwable) { Log.e("TAG", e.stackTraceToString()) - "Whoops" + componentActivity.getString(R.string.scan_error_generic) } } } @@ -151,13 +152,13 @@ class ScanScreenControllerImpl( handleTag(secrets) { tagCommunicator -> tagCommunicator.prepareDIMForCharacter(nfcCharacter.dimId) onComplete.invoke() - "Sent DIM successfully!" + componentActivity.getString(R.string.scan_sent_dim_success) } } // EXTRACTED DIRECTLY FROM EXAMPLE APP private fun showWirelessSettings() { - Toast.makeText(componentActivity, "NFC must be enabled", Toast.LENGTH_SHORT).show() + Toast.makeText(componentActivity, componentActivity.getString(R.string.scan_nfc_must_be_enabled), Toast.LENGTH_SHORT).show() componentActivity.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS)) } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt index 691e61096e9138cbfacea1d21e01bbc09e8b740e..6a717652075341951d5687e09d54403fcde660e5 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt @@ -16,12 +16,15 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.github.nacabaro.vbhelper.components.TopBanner import com.github.nacabaro.vbhelper.navigation.NavigationItems +import com.github.nacabaro.vbhelper.R + @Composable fun SettingsScreen( @@ -30,10 +33,10 @@ fun SettingsScreen( ) { val context = LocalContext.current - Scaffold ( + Scaffold( topBar = { TopBanner( - text = "Settings", + text = stringResource(R.string.settings_title), onBackClick = { navController.popBackStack() } @@ -42,34 +45,57 @@ fun SettingsScreen( modifier = Modifier .fillMaxSize() ) { contentPadding -> - Column ( + Column( modifier = Modifier .padding(top = contentPadding.calculateTopPadding()) .fillMaxSize() .verticalScroll(rememberScrollState()) ) { - SettingsSection("NFC Communication") - SettingsEntry(title = "Import APK", description = "Import Secrets From Vital Arena 2.1.0 APK") { + SettingsSection(title = stringResource(R.string.settings_section_nfc)) + SettingsEntry( + title = stringResource(R.string.settings_import_apk_title), + description = stringResource(R.string.settings_import_apk_desc) + ) { settingsScreenController.onClickImportApk() } - SettingsSection("DiM/BEm management") - SettingsEntry(title = "Import card", description = "Import DiM/BEm card file") { + + SettingsSection(title = stringResource(R.string.settings_section_dim_bem)) + SettingsEntry( + title = stringResource(R.string.settings_import_card_title), + description = stringResource(R.string.settings_import_card_desc) + ) { settingsScreenController.onClickImportCard() } - SettingsSection("About and credits") - SettingsEntry(title = "Credits", description = "Credits") { + + SettingsSection(title = stringResource(R.string.settings_section_about)) + SettingsEntry( + title = stringResource(R.string.settings_credits_title), + description = stringResource(R.string.settings_credits_desc) + ) { navController.navigate(NavigationItems.Credits.route) } - SettingsEntry(title = "About", description = "About") { + SettingsEntry( + title = stringResource(R.string.settings_about_title), + description = stringResource(R.string.settings_about_desc) + ) { val browserIntent = Intent( - Intent.ACTION_VIEW, Uri.parse("https://github.com/nacabaro/vbhelper/")) + Intent.ACTION_VIEW, + Uri.parse("https://github.com/nacabaro/vbhelper/") + ) context.startActivity(browserIntent) } - SettingsSection("Data management") - SettingsEntry(title = "Export data", description = "Export application database") { + + SettingsSection(title = stringResource(R.string.settings_section_data)) + SettingsEntry( + title = stringResource(R.string.settings_export_data_title), + description = stringResource(R.string.settings_export_data_desc) + ) { settingsScreenController.onClickOpenDirectory() } - SettingsEntry(title = "Import data", description = "Import application database") { + SettingsEntry( + title = stringResource(R.string.settings_import_data_title), + description = stringResource(R.string.settings_import_data_desc) + ) { settingsScreenController.onClickImportDatabase() } } @@ -101,9 +127,9 @@ fun SettingsEntry( fun SettingsSection( title: String ) { - Box ( + Box( modifier = Modifier - .padding(start = 16.dp) + .padding(start = 16.dp, top = 16.dp, bottom = 4.dp) ) { Text( text = title, @@ -112,4 +138,4 @@ fun SettingsSection( color = MaterialTheme.colorScheme.primary ) } -} \ No newline at end of file +} diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..a0ea0f726c682da440d4310de2d3f74cfba6a53a --- /dev/null +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,92 @@ + + VBHelper + + Este aplicativo ainda está em versão alfa e não está completo. Não o use para armazenar personagens importantes para você, pois futuras atualizações podem apagar todos os seus personagens. Desculpe pelo transtorno! + + + O aplicativo agora deve funcionar com o VB original e com o VH. + + + Obrigado pela compreensão e pela paciência. Atenciosamente, a equipe de desenvolvimento. + + Fechar + + + Escanear + Batalhas + Início + Dex + Aventura do card + Armazenamento + Configurações + Visualizador + Card + Itens + Meus itens + Loja de itens + Aplicar item + Aventura + Créditos + + Aventura + Nada para ver aqui + + VB Helper + + Um dos seus personagens terminou a missão de aventura! + + + + Os segredos ainda não foram inicializados. Tente novamente. + + + Os segredos ainda não foram importados. Vá em Configurações e importe o APK. + + + Escanear um Vital Bracelet + Vital Bracelet para o app + App para o Vital Bracelet + + O dispositivo não possui NFC! + A tag detectada não é do Vital Bracelet. + + Segredos ausentes. Vá em Configurações e importe o APK do Vital Arena. + + Personagem enviado com sucesso! + Ops! + DIM enviado com sucesso! + O NFC precisa estar ativado. + + Configurações + + Comunicação NFC + Gerenciamento de DiM/BEm + Sobre e créditos + Gerenciamento de dados + + Importar APK + + Importar segredos do APK do Vital Arena 2.1.0 + + + Importar card + + Importar arquivo de card DiM/BEm + + + Créditos + Créditos + + Sobre + Sobre + + Exportar dados + + Exportar banco de dados do aplicativo + + + Importar dados + + Importar banco de dados do aplicativo + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9dbd1367b8cad06dd9f8be648df8d40a313e8eb4..46d70d88e92971292e570c772234f0801c72b747 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,97 @@ VBHelper + + This application is currently in alpha and it is not complete. Do not use it to store important characters for you, as any future updates might delete all your characters. Sorry for the inconvenience! + + + + The application should now work with the original VB and the VH. + + + + Thank you for your understanding and patience. Sincerely, the dev team. + + + + Dismiss + + + Scan + Battle + Home + Dex + Card adventure + Storage + Settings + Viewer + Card + Items + My items + Items store + Apply item + Adventure + Credits + + Adventure + Nothing to see here + + VB Helper + + One of your characters has finished their adventure mission! + + + + Secrets is not yet initialized. Try again. + + + Secrets not yet imported. Go to Settings and Import APK. + + + Scan a Vital Bracelet + Vital Bracelet to App + App to Vital Bracelet + + No NFC on device! + Tag detected is not VB + + Missing Secrets. Go to settings and import Vital Arena APK. + + Sent character successfully! + Whoops + Sent DIM successfully! + NFC must be enabled + + + Settings + + NFC Communication + DiM/BEm management + About and credits + Data management + + Import APK + + Import Secrets From Vital Arena 2.1.0 APK + + + Import card + + Import DiM/BEm card file + + + Credits + Credits + + About + About + + Export data + + Export application database + + + Import data + + Import application database + \ No newline at end of file