diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt
new file mode 100644
index 0000000000..fb935b1d04
--- /dev/null
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt
@@ -0,0 +1,196 @@
+package com.infomaniak.swisstransfer.ui.icons.illu
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.PathFillType.Companion.NonZero
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.StrokeCap.Companion.Butt
+import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.group
+import androidx.compose.ui.graphics.vector.path
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.infomaniak.swisstransfer.ui.icons.AppIcons
+
+val AppIcons.EnglishFlag: ImageVector
+ get() {
+ if (_englishFlag != null) {
+ return _englishFlag!!
+ }
+ _englishFlag = Builder(
+ name = "EnglishFlag",
+ defaultWidth = 24.0.dp,
+ defaultHeight = 24.0.dp,
+ viewportWidth = 24.0f,
+ viewportHeight = 24.0f
+ ).apply {
+ group {
+ path(
+ fill = SolidColor(Color(0xFF0B5394)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(1.333f, 3.0f)
+ horizontalLineToRelative(21.334f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f)
+ verticalLineToRelative(15.334f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f)
+ horizontalLineTo(1.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f)
+ verticalLineTo(4.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(12.0f, 11.667f)
+ lineTo(24.0f, 3.0f)
+ verticalLineToRelative(3.333f)
+ lineToRelative(-6.667f, 4.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(14.667f, 10.334f)
+ lineTo(24.0f, 3.667f)
+ verticalLineTo(5.0f)
+ lineToRelative(-8.0f, 5.334f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(12.0f, 13.667f)
+ lineTo(0.0f, 22.334f)
+ verticalLineToRelative(-3.333f)
+ lineToRelative(6.667f, -4.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(9.333f, 15.0f)
+ lineTo(0.0f, 21.667f)
+ verticalLineToRelative(-1.333f)
+ lineTo(8.0f, 15.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(12.0f, 11.667f)
+ lineTo(0.0f, 3.0f)
+ verticalLineToRelative(3.333f)
+ lineToRelative(6.667f, 4.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(9.333f, 10.334f)
+ lineTo(0.0f, 3.667f)
+ verticalLineTo(5.0f)
+ lineToRelative(8.0f, 5.334f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(12.0f, 13.667f)
+ lineToRelative(12.0f, 8.667f)
+ verticalLineToRelative(-3.333f)
+ lineToRelative(-6.667f, -4.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(14.667f, 15.0f)
+ lineTo(24.0f, 21.667f)
+ verticalLineToRelative(-1.333f)
+ lineTo(16.0f, 15.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(0.0f, 15.0f)
+ verticalLineTo(9.667f)
+ horizontalLineToRelative(24.0f)
+ verticalLineTo(15.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(9.333f, 3.0f)
+ horizontalLineToRelative(5.333f)
+ verticalLineToRelative(18.667f)
+ horizontalLineTo(9.333f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(10.667f, 3.0f)
+ horizontalLineToRelative(2.667f)
+ verticalLineToRelative(18.667f)
+ horizontalLineToRelative(-2.667f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(0.0f, 13.667f)
+ verticalLineTo(11.0f)
+ horizontalLineToRelative(24.0f)
+ verticalLineToRelative(2.667f)
+ close()
+ }
+ }
+ }
+ .build()
+ return _englishFlag!!
+ }
+
+private var _englishFlag: ImageVector? = null
+
+@Preview
+@Composable
+private fun Preview() {
+ Box(modifier = Modifier.padding(12.dp)) {
+ Image(imageVector = AppIcons.EnglishFlag, contentDescription = "")
+ }
+}
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt
new file mode 100644
index 0000000000..860625789b
--- /dev/null
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt
@@ -0,0 +1,104 @@
+package com.infomaniak.swisstransfer.ui.icons.illu
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.PathFillType.Companion.NonZero
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.StrokeCap.Companion.Butt
+import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.group
+import androidx.compose.ui.graphics.vector.path
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.infomaniak.swisstransfer.ui.icons.AppIcons
+
+val AppIcons.FrenchFlag: ImageVector
+ get() {
+ if (_frenchFlag != null) {
+ return _frenchFlag!!
+ }
+ _frenchFlag = Builder(
+ name = "FrenchFlag",
+ defaultWidth = 24.0.dp,
+ defaultHeight = 24.0.dp,
+ viewportWidth = 24.0f,
+ viewportHeight = 24.0f
+ ).apply {
+ group {
+ path(
+ fill = SolidColor(Color(0xFF0B5394)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(1.333f, 3.0f)
+ horizontalLineToRelative(21.334f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f)
+ verticalLineToRelative(15.334f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f)
+ horizontalLineTo(1.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f)
+ verticalLineTo(4.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFE70E0E)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(1.333f, 3.0f)
+ horizontalLineToRelative(21.334f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f)
+ verticalLineToRelative(16.001f)
+ arcToRelative(1.333f, 1.333f, 0.0f, false, true, -1.333f, 1.333f)
+ horizontalLineTo(1.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 20.334f)
+ verticalLineTo(4.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFF0B5394)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(0.0f, 4.333f)
+ curveTo(0.0f, 3.597f, 0.597f, 3.0f, 1.333f, 3.0f)
+ horizontalLineTo(8.0f)
+ verticalLineToRelative(18.667f)
+ horizontalLineTo(1.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 20.333f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(8.0f, 3.0f)
+ horizontalLineToRelative(8.0f)
+ verticalLineToRelative(18.667f)
+ horizontalLineTo(8.0f)
+ close()
+ }
+ }
+ }
+ .build()
+ return _frenchFlag!!
+ }
+
+private var _frenchFlag: ImageVector? = null
+
+@Preview
+@Composable
+private fun Preview() {
+ Box(modifier = Modifier.padding(12.dp)) {
+ Image(imageVector = AppIcons.FrenchFlag, contentDescription = "")
+ }
+}
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt
new file mode 100644
index 0000000000..90ca661a88
--- /dev/null
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt
@@ -0,0 +1,86 @@
+package com.infomaniak.swisstransfer.ui.icons.illu
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.PathFillType.Companion.NonZero
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.StrokeCap.Companion.Butt
+import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.group
+import androidx.compose.ui.graphics.vector.path
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.infomaniak.swisstransfer.ui.icons.AppIcons
+
+val AppIcons.GermanFlag: ImageVector
+ get() {
+ if (_germanFlag != null) {
+ return _germanFlag!!
+ }
+ _germanFlag = Builder(
+ name = "GermanFlag",
+ defaultWidth = 24.0.dp,
+ defaultHeight = 24.0.dp,
+ viewportWidth = 24.0f,
+ viewportHeight = 24.0f
+ ).apply {
+ group {
+ path(
+ fill = SolidColor(Color(0xFFE70E0E)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(1.333f, 3.0f)
+ horizontalLineToRelative(21.334f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f)
+ verticalLineToRelative(15.334f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f)
+ horizontalLineTo(1.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f)
+ verticalLineTo(4.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(0.0f, 3.0f)
+ horizontalLineToRelative(24.0f)
+ verticalLineToRelative(6.0f)
+ horizontalLineTo(0.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFFDDA25)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(0.0f, 15.667f)
+ horizontalLineToRelative(24.0f)
+ verticalLineToRelative(6.0f)
+ horizontalLineTo(0.0f)
+ close()
+ }
+ }
+ }
+ .build()
+ return _germanFlag!!
+ }
+
+private var _germanFlag: ImageVector? = null
+
+@Preview
+@Composable
+private fun Preview() {
+ Box(modifier = Modifier.padding(12.dp)) {
+ Image(imageVector = AppIcons.GermanFlag, contentDescription = "")
+ }
+}
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt
new file mode 100644
index 0000000000..37dca29be0
--- /dev/null
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt
@@ -0,0 +1,88 @@
+package com.infomaniak.swisstransfer.ui.icons.illu
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.PathFillType.Companion.NonZero
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.StrokeCap.Companion.Butt
+import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.group
+import androidx.compose.ui.graphics.vector.path
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.infomaniak.swisstransfer.ui.icons.AppIcons
+
+val AppIcons.ItalianFlag: ImageVector
+ get() {
+ if (_italianFlag != null) {
+ return _italianFlag!!
+ }
+ _italianFlag = Builder(
+ name = "ItalianFlag",
+ defaultWidth = 24.0.dp,
+ defaultHeight = 24.0.dp,
+ viewportWidth = 24.0f,
+ viewportHeight = 24.0f
+ ).apply {
+ group {
+ path(
+ fill = SolidColor(Color(0xFFE70E0E)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(1.333f, 3.0f)
+ horizontalLineToRelative(21.334f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f)
+ verticalLineToRelative(15.334f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f)
+ horizontalLineTo(1.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f)
+ verticalLineTo(4.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFF128D4E)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(0.0f, 4.333f)
+ curveTo(0.0f, 3.597f, 0.597f, 3.0f, 1.333f, 3.0f)
+ horizontalLineTo(8.0f)
+ verticalLineToRelative(18.667f)
+ horizontalLineTo(1.333f)
+ arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 20.333f)
+ close()
+ }
+ path(
+ fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth =
+ 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter =
+ 4.0f, pathFillType = NonZero
+ ) {
+ moveTo(8.0f, 3.0f)
+ horizontalLineToRelative(8.0f)
+ verticalLineToRelative(18.667f)
+ horizontalLineTo(8.0f)
+ close()
+ }
+ }
+ }
+ .build()
+ return _italianFlag!!
+ }
+
+private var _italianFlag: ImageVector? = null
+
+@Preview
+@Composable
+private fun Preview() {
+ Box(modifier = Modifier.padding(12.dp)) {
+ Image(imageVector = AppIcons.ItalianFlag, contentDescription = "")
+ }
+}
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt
index f61d89bc64..f2cedc9516 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt
@@ -48,7 +48,8 @@ fun SettingsValidityPeriodScreen() {
enum class ValidityPeriod(
override val title: @Composable () -> String,
- override val icon: ImageVector? = null
+ override val imageVector: ImageVector? = null,
+ override val imageVectorResId: Int? = null,
) : SettingOption {
THIRTY({ pluralStringResource(R.plurals.settingsValidityPeriodValue, 30, 30) }),
FIFTEEN({ pluralStringResource(R.plurals.settingsValidityPeriodValue, 15, 15) }),
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt
new file mode 100644
index 0000000000..daaa1b6ee9
--- /dev/null
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt
@@ -0,0 +1,75 @@
+/*
+ * Infomaniak SwissTransfer - Android
+ * Copyright (C) 2024 Infomaniak Network SA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.infomaniak.swisstransfer.ui.screen.main.settings
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material3.Surface
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.res.stringResource
+import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.icons.AppIcons
+import com.infomaniak.swisstransfer.ui.icons.illu.EnglishFlag
+import com.infomaniak.swisstransfer.ui.icons.illu.FrenchFlag
+import com.infomaniak.swisstransfer.ui.icons.illu.GermanFlag
+import com.infomaniak.swisstransfer.ui.icons.illu.ItalianFlag
+import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingOption
+import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingTitle
+import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SingleSelectOptions
+import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
+import com.infomaniak.swisstransfer.ui.utils.PreviewMobile
+import com.infomaniak.swisstransfer.ui.utils.PreviewTablet
+
+@Composable
+fun SettingsEmailLanguageScreen() {
+ Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
+ SettingTitle(titleRes = R.string.settingsEmailLanguageTitle)
+
+ val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm
+ SingleSelectOptions(EmailLanguage.entries, { selectedItem }, setSelectedItem)
+ }
+}
+
+enum class EmailLanguage(
+ override val title: @Composable () -> String,
+ override val imageVector: ImageVector? = null,
+ override val imageVectorResId: Int? = null
+) : SettingOption {
+ ENGLISH({ stringResource(R.string.settingsEmailLanguageValueEnglish) }, imageVector = AppIcons.EnglishFlag),
+ FRENCH({ stringResource(R.string.settingsEmailLanguageValueFrench) }, imageVector = AppIcons.FrenchFlag),
+ GERMAN({ stringResource(R.string.settingsEmailLanguageValueGerman) }, imageVector = AppIcons.GermanFlag),
+ ITALIAN({ stringResource(R.string.settingsEmailLanguageValueItalian) }, imageVector = AppIcons.ItalianFlag),
+ SPANISH({ stringResource(R.string.settingsEmailLanguageValueSpanish) }, imageVectorResId = R.drawable.flag_es),
+}
+
+@PreviewMobile
+@PreviewTablet
+@Composable
+private fun SettingsThemeScreenPreview() {
+ SwissTransferTheme {
+ Surface {
+ SettingsEmailLanguageScreen()
+ }
+ }
+}
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt
index 75345524ca..4c55c83659 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt
@@ -117,7 +117,7 @@ private fun DetailPane(navigator: ThreePaneScaffoldNavigator SettingsThemeScreen()
VALIDITY_PERIOD -> SettingsValidityPeriodScreen()
DOWNLOAD_LIMIT -> Unit
- EMAIL_LANGUAGE -> Unit
+ EMAIL_LANGUAGE -> SettingsEmailLanguageScreen()
NOTIFICATIONS,
DISCOVER_INFOMANIAK,
SHARE_IDEAS,
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt
index f34ba7d3ab..66759eb8b3 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt
@@ -52,7 +52,11 @@ fun SettingsThemeScreen() {
}
}
-enum class ThemeOption(override val title: @Composable () -> String, override val icon: ImageVector) : SettingOption {
+enum class ThemeOption(
+ override val title: @Composable () -> String,
+ override val imageVector: ImageVector,
+ override val imageVectorResId: Int? = null
+) : SettingOption {
SYSTEM({ stringResource(R.string.settingsOptionThemeSystem) }, AppIcons.BlackAndWhiteCircle),
LIGHT({ stringResource(R.string.settingsOptionThemeLight) }, AppIcons.WhiteCircle),
DARK({ stringResource(R.string.settingsOptionThemeDark) }, AppIcons.BlackCircle),
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/SingleSelectOptions.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/SingleSelectOptions.kt
index 8f77bfc4a6..6518bc512f 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/SingleSelectOptions.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/SingleSelectOptions.kt
@@ -35,6 +35,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.Preview
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.components.SharpRippleButton
@@ -91,7 +92,11 @@ private fun SettingOptionItem(item: SettingOption, isSelected: Boolean, onClick:
interface SettingOption {
val title: @Composable () -> String
+ val imageVector: ImageVector?
+ val imageVectorResId: Int?
+
val icon: ImageVector?
+ @Composable get() = imageVector ?: imageVectorResId?.let { ImageVector.vectorResource(it) }
}
@Preview(name = "Light")
@@ -103,7 +108,8 @@ private fun SettingOptionItemPreview() {
Column {
val item = object : SettingOption {
override val title: @Composable () -> String = { stringResource(R.string.appName) }
- override val icon: ImageVector = AppIcons.Add
+ override val imageVector: ImageVector = AppIcons.Add
+ override val imageVectorResId = null
}
SettingOptionItem(item, true) {}
SettingOptionItem(item, false) {}
diff --git a/app/src/main/res/drawable/flag_es.xml b/app/src/main/res/drawable/flag_es.xml
new file mode 100644
index 0000000000..43f3bf4213
--- /dev/null
+++ b/app/src/main/res/drawable/flag_es.xml
@@ -0,0 +1,2213 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 99b6685b6f..643f11f3a8 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -31,6 +31,12 @@
General
Wähle Sie eine Präferenz
Entdecken Sie Infomaniak
+ Legt eine Standardsprache für Ihre Weiterleitungen per E-Mail fest
+ Englisch
+ Deutsch
+ Deutsch
+ Italienisch
+ Spanisch
Limit für Downloads
Sprache der E-Mail
Gib deine Meinung ab
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 892c963128..312c740cea 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -29,6 +29,12 @@
Quiénes somos
Ajustes por defecto
General
+ Establecer un idioma por defecto para las transferencias de correo electrónico
+ Inglés
+ Francés
+ Alemán
+ Italiano
+ Español
Seleccione una preferencia
Descubrir Infomaniak
Límite de descarga
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index fdb9f01ed7..b03708575d 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -29,6 +29,12 @@
A propos
Paramètres par défaut
Général
+ Défini une langue par défaut pour vos transferts par e-mail
+ Anglais
+ Francais
+ Allemand
+ Italien
+ Espagnol
Sélectionne une préférence
Découvrir Infomaniak
Limite de téléchargements
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 1dcdc54d5b..5c0093fa6a 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -30,6 +30,12 @@
Impostazioni predefinite
Generale
Selezionare una preferenza
+ Impostare una lingua predefinita per i trasferimenti di e-mail
+ Inglese
+ Francese
+ Tedesco
+ Italiano
+ Spagnolo
Scoprire Infomaniak
Limite di download
Lingua della posta elettronica
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9292bcec97..7cca020796 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -32,6 +32,12 @@
About
Default settings
Général
+ Set a default language for your email transfers
+ English
+ French
+ German
+ Italian
+ Spanish
Select a preference
Discover Infomaniak
Download limit