mirror of
https://github.com/wismna/DoNext.git
synced 2025-12-06 00:02:40 -05:00
Update packages
Add french translation Migrate VM strings resources
This commit is contained in:
24
.idea/caches/deviceStreaming.xml
generated
24
.idea/caches/deviceStreaming.xml
generated
@@ -342,6 +342,18 @@
|
||||
<option name="screenX" value="2220" />
|
||||
<option name="screenY" value="1080" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="35" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="dm1q" />
|
||||
<option name="id" value="dm1q" />
|
||||
<option name="labId" value="google" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="S23" />
|
||||
<option name="screenDensity" value="480" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2340" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="34" />
|
||||
<option name="brand" value="samsung" />
|
||||
@@ -765,6 +777,18 @@
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2400" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="35" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="psq" />
|
||||
<option name="id" value="psq" />
|
||||
<option name="labId" value="google" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="Galaxy S25 Edge" />
|
||||
<option name="screenDensity" value="450" />
|
||||
<option name="screenX" value="1440" />
|
||||
<option name="screenY" value="3120" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="34" />
|
||||
<option name="brand" value="samsung" />
|
||||
|
||||
1
.idea/dictionaries/project.xml
generated
1
.idea/dictionaries/project.xml
generated
@@ -2,6 +2,7 @@
|
||||
<dictionary name="project">
|
||||
<words>
|
||||
<w>donext</w>
|
||||
<w>snackbar</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
</component>
|
||||
@@ -51,7 +51,7 @@ android {
|
||||
dependencies {
|
||||
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.4")
|
||||
implementation("androidx.activity:activity-compose:1.11.0")
|
||||
implementation(platform("androidx.compose:compose-bom:2025.10.00"))
|
||||
implementation(platform("androidx.compose:compose-bom:2025.10.01"))
|
||||
implementation("androidx.compose.ui:ui")
|
||||
implementation("androidx.compose.ui:ui-graphics")
|
||||
implementation("androidx.compose.ui:ui-tooling-preview")
|
||||
@@ -62,12 +62,12 @@ dependencies {
|
||||
implementation("androidx.hilt:hilt-navigation-compose:1.3.0")
|
||||
implementation("androidx.test.ext:junit-ktx:1.3.0")
|
||||
implementation("sh.calvin.reorderable:reorderable:3.0.0")
|
||||
androidTestImplementation(platform("androidx.compose:compose-bom:2025.10.00"))
|
||||
androidTestImplementation(platform("androidx.compose:compose-bom:2025.10.01"))
|
||||
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
|
||||
debugImplementation("androidx.compose.ui:ui-tooling")
|
||||
debugImplementation("androidx.compose.ui:ui-test-manifest")
|
||||
|
||||
val roomVersion = "2.8.2"
|
||||
val roomVersion = "2.8.3"
|
||||
implementation("androidx.room:room-runtime:$roomVersion")
|
||||
ksp("androidx.room:room-compiler:$roomVersion")
|
||||
|
||||
|
||||
@@ -13,16 +13,13 @@ sealed class AppDestination(
|
||||
object DueTodayList : AppDestination(
|
||||
route = "todayList",
|
||||
title = "Due Today",
|
||||
showBackButton = false,
|
||||
)
|
||||
object ManageLists : AppDestination(
|
||||
route = "manageLists",
|
||||
title = "Manage Lists",
|
||||
showBackButton = false,
|
||||
)
|
||||
object RecycleBin : AppDestination(
|
||||
route = "recycleBin",
|
||||
title = "Recycle Bin",
|
||||
showBackButton = false,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalConfiguration
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.Dialog
|
||||
@@ -199,7 +200,7 @@ fun AppContent(
|
||||
) {
|
||||
val scope = rememberCoroutineScope()
|
||||
val snackbarHostState = remember { SnackbarHostState() }
|
||||
val snackbarActionLabel = stringResource(R.string.snackbar_action)
|
||||
val context = LocalContext.current
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
viewModel.uiEventBus.events.collectLatest { event ->
|
||||
@@ -211,8 +212,8 @@ fun AppContent(
|
||||
is UiEvent.NavigateBack -> navController.popBackStack()
|
||||
is UiEvent.ShowUndoSnackbar -> {
|
||||
val result = snackbarHostState.showSnackbar(
|
||||
message = event.message,
|
||||
actionLabel = snackbarActionLabel,
|
||||
message = context.getString(event.message),
|
||||
actionLabel = context.getString(R.string.snackbar_action),
|
||||
duration = SnackbarDuration.Short
|
||||
)
|
||||
if (result == SnackbarResult.ActionPerformed) {
|
||||
@@ -238,7 +239,14 @@ fun AppContent(
|
||||
snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
|
||||
topBar = {
|
||||
TopAppBar(
|
||||
title = { Text(viewModel.currentDestination.title) },
|
||||
title = { Text(
|
||||
when (viewModel.currentDestination) {
|
||||
is AppDestination.DueTodayList -> stringResource(R.string.navigation_due_today)
|
||||
is AppDestination.ManageLists -> stringResource(R.string.navigation_edit_lists)
|
||||
is AppDestination.RecycleBin -> stringResource(R.string.navigation_recycle_bin)
|
||||
else -> viewModel.currentDestination.title
|
||||
}
|
||||
)},
|
||||
colors = TopAppBarDefaults.topAppBarColors(
|
||||
containerColor = MaterialTheme.colorScheme.primaryContainer,
|
||||
titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer,
|
||||
|
||||
@@ -63,7 +63,11 @@ fun TaskScreen(
|
||||
|
||||
Column(Modifier.padding(16.dp)) {
|
||||
Text(
|
||||
viewModel.screenTitle(),
|
||||
stringResource(
|
||||
if (viewModel.isDeleted) R.string.task_title_deleted
|
||||
else
|
||||
if (viewModel.isEditing()) R.string.task_title_edit
|
||||
else R.string.task_title_new),
|
||||
style = MaterialTheme.typography.titleLarge
|
||||
)
|
||||
Spacer(Modifier.height(8.dp))
|
||||
|
||||
@@ -9,7 +9,7 @@ sealed class UiEvent {
|
||||
data class CreateNewTask(val taskListId: Long) : UiEvent()
|
||||
data object CloseTask : UiEvent()
|
||||
data class ShowUndoSnackbar(
|
||||
val message: String,
|
||||
val message: Int,
|
||||
val undoAction: () -> Unit
|
||||
) : UiEvent()
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.wismna.geoffroy.donext.R
|
||||
import com.wismna.geoffroy.donext.domain.model.Task
|
||||
import com.wismna.geoffroy.donext.domain.usecase.GetDueTodayTasksUseCase
|
||||
import com.wismna.geoffroy.donext.domain.usecase.ToggleTaskDeletedUseCase
|
||||
@@ -48,7 +49,7 @@ class DueTodayViewModel @Inject constructor(
|
||||
|
||||
uiEventBus.send(
|
||||
UiEvent.ShowUndoSnackbar(
|
||||
message = "Task done",
|
||||
message = R.string.snackbar_message_task_done,
|
||||
undoAction = {
|
||||
viewModelScope.launch {
|
||||
toggleTaskDoneUseCase(taskId, false)
|
||||
@@ -65,7 +66,7 @@ class DueTodayViewModel @Inject constructor(
|
||||
|
||||
uiEventBus.send(
|
||||
UiEvent.ShowUndoSnackbar(
|
||||
message = "Task moved to recycle bin",
|
||||
message = R.string.snackbar_message_task_recycle,
|
||||
undoAction = {
|
||||
viewModelScope.launch {
|
||||
toggleTaskDeletedUseCase(taskId, false)
|
||||
|
||||
@@ -6,6 +6,7 @@ import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.wismna.geoffroy.donext.R
|
||||
import com.wismna.geoffroy.donext.domain.model.TaskList
|
||||
import com.wismna.geoffroy.donext.domain.usecase.AddTaskListUseCase
|
||||
import com.wismna.geoffroy.donext.domain.usecase.DeleteTaskListUseCase
|
||||
@@ -58,7 +59,7 @@ class ManageListsViewModel @Inject constructor(
|
||||
|
||||
uiEventBus.send(
|
||||
UiEvent.ShowUndoSnackbar(
|
||||
message = "Task list moved to recycle bin",
|
||||
message = R.string.snackbar_message_task_list_recycle,
|
||||
undoAction = {
|
||||
viewModelScope.launch {
|
||||
deleteTaskListUseCase(taskListId, false)
|
||||
|
||||
@@ -6,6 +6,7 @@ import androidx.compose.runtime.setValue
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.wismna.geoffroy.donext.R
|
||||
import com.wismna.geoffroy.donext.domain.model.Task
|
||||
import com.wismna.geoffroy.donext.domain.model.TaskWithListName
|
||||
import com.wismna.geoffroy.donext.domain.usecase.EmptyRecycleBinUseCase
|
||||
@@ -64,7 +65,7 @@ class RecycleBinViewModel @Inject constructor(
|
||||
|
||||
uiEventBus.send(
|
||||
UiEvent.ShowUndoSnackbar(
|
||||
message = "Task restored",
|
||||
message = R.string.snackbar_message_task_restore,
|
||||
undoAction = {
|
||||
viewModelScope.launch {
|
||||
toggleTaskDeletedUseCase(taskId, true)
|
||||
|
||||
@@ -6,6 +6,7 @@ import androidx.compose.runtime.setValue
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.wismna.geoffroy.donext.R
|
||||
import com.wismna.geoffroy.donext.domain.model.Task
|
||||
import com.wismna.geoffroy.donext.domain.usecase.GetTasksForListUseCase
|
||||
import com.wismna.geoffroy.donext.domain.usecase.ToggleTaskDeletedUseCase
|
||||
@@ -55,7 +56,7 @@ class TaskListViewModel @Inject constructor(
|
||||
|
||||
uiEventBus.send(
|
||||
UiEvent.ShowUndoSnackbar(
|
||||
message = "Task done",
|
||||
message = if (isDone) R.string.snackbar_message_task_done else R.string.snackbar_message_task_undone,
|
||||
undoAction = {
|
||||
viewModelScope.launch {
|
||||
toggleTaskDoneUseCase(taskId, !isDone)
|
||||
@@ -71,7 +72,7 @@ class TaskListViewModel @Inject constructor(
|
||||
|
||||
uiEventBus.send(
|
||||
UiEvent.ShowUndoSnackbar(
|
||||
message = "Task moved to recycle bin",
|
||||
message = R.string.snackbar_message_task_recycle,
|
||||
undoAction = {
|
||||
viewModelScope.launch {
|
||||
toggleTaskDeletedUseCase(taskId, false)
|
||||
|
||||
@@ -55,7 +55,6 @@ class TaskViewModel @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun screenTitle(): String = if (isDeleted) "Task details" else if (isEditing()) "Edit Task" else "New Task"
|
||||
fun isEditing(): Boolean = editingTaskId != null
|
||||
fun onTitleChanged(value: String) { title = value }
|
||||
fun onDescriptionChanged(value: String) { description = value }
|
||||
|
||||
50
donextv2/src/main/res/values-fr/strings.xml
Normal file
50
donextv2/src/main/res/values-fr/strings.xml
Normal file
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="navigation_edit_lists">Edition des listes</string>
|
||||
<string name="navigation_recycle_bin">Corbeille</string>
|
||||
<string name="navigation_due_today">À faire aujourd\'hui</string>
|
||||
<string name="action_create_list">Créer une tâche</string>
|
||||
<string name="tasklist_no_tasks">Cliquez sur + pour créer un nouvelle tâche.</string>
|
||||
<string name="recycle_bin_no_tasks">La corbeille est vide</string>
|
||||
<string name="today_no_tasks">Rien à faire aujourd\'hui !</string>
|
||||
<string name="task_title_new">Nouvelle tâche</string>
|
||||
<string name="task_title_edit">Edition de tâche</string>
|
||||
<string name="task_title_deleted">Détails de la tâche</string>
|
||||
<string name="task_name">Titre</string>
|
||||
<string name="task_description">Description</string>
|
||||
<string name="task_priority">Priorité</string>
|
||||
<string name="task_priority_low">Basse</string>
|
||||
<string name="task_priority_normal">Normale</string>
|
||||
<string name="task_priority_high">Haute</string>
|
||||
<string name="task_due_date">Echéance</string>
|
||||
<string name="task_save_new">Créer</string>
|
||||
<string name="task_save_edit">Sauvegarder</string>
|
||||
<string name="task_cancel">Annuler</string>
|
||||
<string name="due_date_yesterday">Hier</string>
|
||||
<string name="due_date_today">Aujourd\'hui</string>
|
||||
<string name="due_date_tomorrow">Demain</string>
|
||||
<string name="task_action_recycle">Mettre à la corbeille</string>
|
||||
<string name="task_action_delete">Supprimer</string>
|
||||
<string name="task_action_restore">Restaurer</string>
|
||||
<string name="task_action_done">Terminée</string>
|
||||
<string name="task_action_undone">En cours</string>
|
||||
<string name="dialog_due_date_ok">OK</string>
|
||||
<string name="dialog_due_date_cancel">Annuler</string>
|
||||
<string name="dialog_delete_task_title">Supprimer la tâche</string>
|
||||
<string name="dialog_delete_task_description">Êtes-vous sûr de vouloir supprimer cette tâche ? Cette action ne peut être annulée.</string>
|
||||
<string name="dialog_delete_task_cancel">Annuler</string>
|
||||
<string name="dialog_delete_task_delete">Supprimer</string>
|
||||
<string name="dialog_empty_task_title">Vider la corbeille</string>
|
||||
<string name="dialog_empty_task_description">Êtes-vous sûr de vider la corbeille ? Cette action ne peut être annulée.</string>
|
||||
<string name="dialog_empty_task_cancel">Annuler</string>
|
||||
<string name="dialog_empty_task_delete">Vider</string>
|
||||
<string name="tasklist_new_title">Nouvelle liste</string>
|
||||
<string name="tasklist_new_name">Titre</string>
|
||||
<string name="tasklist_new_create">Créer</string>
|
||||
<string name="snackbar_message_task_done">Tâche terminée.</string>
|
||||
<string name="snackbar_message_task_undone">Tâche active.</string>
|
||||
<string name="snackbar_message_task_recycle">Tâche placée dans la corbeille.</string>
|
||||
<string name="snackbar_message_task_list_recycle">Liste de tâches déplacée dans la corbeille.</string>
|
||||
<string name="snackbar_message_task_restore">Tâche restaurée</string>
|
||||
<string name="snackbar_action">Annuler</string>
|
||||
</resources>
|
||||
@@ -1,8 +1,8 @@
|
||||
<resources>
|
||||
<string name="app_name">DoNext</string>
|
||||
<string name="title_activity_main">MainActivity</string>
|
||||
<string name="app_name" translatable="false">DoNext</string>
|
||||
<string name="title_activity_main" translatable="false">MainActivity</string>
|
||||
|
||||
<string name="navigation_title">DoNext v2</string>
|
||||
<string name="navigation_title" translatable="false">DoNext v2</string>
|
||||
<string name="navigation_edit_lists">Edit lists</string>
|
||||
<string name="navigation_recycle_bin">Recycle Bin</string>
|
||||
<string name="navigation_due_today">Due Today</string>
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<string name="task_title_new">New Task</string>
|
||||
<string name="task_title_edit">Edit Task</string>
|
||||
<string name="task_title_deleted">Task Details</string>
|
||||
<string name="task_name">Title</string>
|
||||
<string name="task_description">Description</string>
|
||||
<string name="task_priority">Priority</string>
|
||||
@@ -53,9 +54,10 @@
|
||||
<string name="tasklist_new_name">Title</string>
|
||||
<string name="tasklist_new_create">Create</string>
|
||||
|
||||
<string name="snackbar_message_done">Task done</string>
|
||||
<string name="snackbar_message_undone">Task undone</string>
|
||||
<string name="snackbar_message_recycle">Task moved to recycle bin</string>
|
||||
<string name="snackbar_message_restore">Task restored</string>
|
||||
<string name="snackbar_message_task_done">Task done</string>
|
||||
<string name="snackbar_message_task_undone">Task undone</string>
|
||||
<string name="snackbar_message_task_recycle">Task moved to recycle bin</string>
|
||||
<string name="snackbar_message_task_list_recycle">Task list moved to recycle bin</string>
|
||||
<string name="snackbar_message_task_restore">Task restored</string>
|
||||
<string name="snackbar_action">Undo</string>
|
||||
</resources>
|
||||
Reference in New Issue
Block a user