Refactor, translation and fixes

This commit is contained in:
2026-09-06 13:26:24 +02:00
parent 9da65e0725
commit 8d398db1cb
11 changed files with 406 additions and 403 deletions
@@ -51,7 +51,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import net.helcel.cowspent.R import net.helcel.cowspent.R
import net.helcel.cowspent.android.helper.AlertDialog import net.helcel.cowspent.android.helper.StatefulAlertDialog
import net.helcel.cowspent.android.helper.formatAmount import net.helcel.cowspent.android.helper.formatAmount
import net.helcel.cowspent.model.DBCurrency import net.helcel.cowspent.model.DBCurrency
import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds
@@ -66,35 +66,10 @@ fun ManageCurrenciesScreen(
onEdit: (DBCurrency) -> Unit, onEdit: (DBCurrency) -> Unit,
onCancelEdit: () -> Unit onCancelEdit: () -> Unit
) { ) {
val dialogState = viewModel.dialogState StatefulAlertDialog(
if (dialogState != null) { state = viewModel.dialogState,
AlertDialog( onDismissRequest = { viewModel.dismissDialog() }
showDialog = true, )
onDismissRequest = { viewModel.dismissDialog() },
title = dialogState.title,
message = dialogState.message,
icon = dialogState.icon,
items = dialogState.items,
positiveText = dialogState.positiveText,
negativeText = dialogState.negativeText,
neutralText = dialogState.neutralText,
onConfirm = {
dialogState.onConfirm?.invoke()
viewModel.dismissDialog()
},
onCancel = {
dialogState.onCancel?.invoke()
viewModel.dismissDialog()
},
onNeutral = {
dialogState.onNeutral?.invoke()
viewModel.dismissDialog()
}
) {
dialogState.onItemSelected?.invoke(it)
viewModel.dismissDialog()
}
}
Scaffold( Scaffold(
topBar = { topBar = {
@@ -1,7 +1,6 @@
package net.helcel.cowspent.android.helper package net.helcel.cowspent.android.helper
import android.graphics.* import android.graphics.Color
import android.graphics.drawable.Drawable
import java.security.MessageDigest import java.security.MessageDigest
import java.security.NoSuchAlgorithmException import java.security.NoSuchAlgorithmException
import java.util.* import java.util.*
@@ -11,209 +10,143 @@ import kotlin.math.round
import kotlin.math.sqrt import kotlin.math.sqrt
/** /**
* A Drawable object that draws text (1 character) on top of a circular/filled background. * The color a member's avatar gets, derived from their name.
*/ */
class TextDrawable private constructor( object TextDrawable {
private val mText: String, private const val INDEX_RED = 0
r: Int, private const val INDEX_GREEN = 1
g: Int, private const val INDEX_BLUE = 2
b: Int, private const val INDEX_HUE = 0
private val mRadius: Float, private const val INDEX_SATURATION = 1
private val mDisabled: Boolean private const val INDEX_LUMINATION = 2
) : Drawable() {
private val mTextPaint: Paint = Paint()
private val mBackground: Paint = Paint()
private val mDisabledCircle: Paint = Paint()
init { fun getColorFromName(name: String): Int {
mBackground.style = Paint.Style.FILL return try {
mBackground.isAntiAlias = true val hsl = calculateHSL(name)
mBackground.color = Color.rgb(r, g, b) val rgb = hslToRgb(hsl[0].toFloat(), hsl[1].toFloat(), hsl[2].toFloat(), 1f)
Color.rgb(rgb[0], rgb[1], rgb[2])
if ((r + g + b) / 3 < 220) { } catch (_: NoSuchAlgorithmException) {
mTextPaint.color = Color.WHITE Color.WHITE
} else {
mTextPaint.color = Color.BLACK
} }
mTextPaint.textSize = mRadius
mTextPaint.isAntiAlias = true
mTextPaint.textAlign = Paint.Align.CENTER
mDisabledCircle.style = Paint.Style.STROKE
mDisabledCircle.strokeWidth = mRadius * 0.2f
mDisabledCircle.isAntiAlias = true
mDisabledCircle.color = Color.DKGRAY
} }
override fun draw(canvas: Canvas) { @Throws(NoSuchAlgorithmException::class)
canvas.drawCircle(mRadius, mRadius, mRadius, mBackground) private fun calculateHSL(name: String): IntArray {
canvas.drawText( val result = arrayOf("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0")
mText, val rgb = doubleArrayOf(0.0, 0.0, 0.0)
mRadius, var sat = 70
mRadius - (mTextPaint.descent() + mTextPaint.ascent()) / 2, val lum = 68
mTextPaint val modulo = 16
var hash = name.lowercase(Locale.ROOT).replace("[^0-9a-f]".toRegex(), "")
if (!hash.matches("^[0-9a-f]{32}$".toRegex())) {
hash = md5(hash)
}
for (i in hash.indices) {
result[i % modulo] = (result[i % modulo].toInt() + hash.substring(i, i + 1).toInt(16)).toString()
}
for (count in 1 until modulo) {
rgb[count % 3] += result[count].toDouble()
}
rgb[INDEX_RED] = rgb[INDEX_RED] % 255
rgb[INDEX_GREEN] = rgb[INDEX_GREEN] % 255
rgb[INDEX_BLUE] = rgb[INDEX_BLUE] % 255
val hsl = rgbToHsl(rgb[INDEX_RED], rgb[INDEX_GREEN], rgb[INDEX_BLUE])
val bright = sqrt(
0.299 * rgb[INDEX_RED].pow(2.0) + 0.587 * rgb[INDEX_GREEN].pow(2.0) + 0.114 * rgb[INDEX_BLUE].pow(2.0)
) )
if (mDisabled) {
canvas.drawCircle(mRadius, mRadius, mRadius * 0.9f, mDisabledCircle) if (bright >= 200) {
canvas.drawLine( sat = 60
mRadius * 0.4f,
mRadius * 1.6f,
mRadius * 1.6f,
mRadius * 0.4f,
mDisabledCircle
)
} }
return intArrayOf((hsl[INDEX_HUE] * 360).toInt(), sat, lum)
} }
override fun setAlpha(alpha: Int) { private fun hslToRgb(hParam: Float, sParam: Float, lParam: Float, alpha: Float): IntArray {
mTextPaint.alpha = alpha var h = hParam
var s = sParam
var l = lParam
if (s !in 0.0f..100.0f) {
throw IllegalArgumentException("Color parameter outside of expected range - Saturation")
}
if (l !in 0.0f..100.0f) {
throw IllegalArgumentException("Color parameter outside of expected range - Luminance")
}
if (alpha !in 0.0f..1.0f) {
throw IllegalArgumentException("Color parameter outside of expected range - Alpha")
}
h %= 360.0f
h /= 360f
s /= 100f
l /= 100f
val q = if (l < 0.5) {
l * (1 + s)
} else {
(l + s) - s * l
}
val p = 2 * l - q
val r = round(max(0f, hueToRgb(p, q, h + 1.0f / 3.0f)) * 256).toInt()
val g = round(max(0f, hueToRgb(p, q, h)) * 256).toInt()
val b = round(max(0f, hueToRgb(p, q, h - 1.0f / 3.0f)) * 256).toInt()
return intArrayOf(r, g, b)
} }
override fun setColorFilter(cf: ColorFilter?) { private fun hueToRgb(p: Float, q: Float, hParam: Float): Float {
mTextPaint.colorFilter = cf var h = hParam
if (h < 0) h += 1f
if (h > 1) h -= 1f
if (6 * h < 1) return p + (q - p) * 6 * h
if (2 * h < 1) return q
if (3 * h < 2) return p + (q - p) * 6 * (2.0f / 3.0f - h)
return p
} }
@Deprecated("Deprecated in Java") private fun rgbToHsl(rUntrimmed: Double, gUntrimmed: Double, bUntrimmed: Double): DoubleArray {
override fun getOpacity(): Int { val r = rUntrimmed / 255
return PixelFormat.TRANSLUCENT val g = gUntrimmed / 255
} val b = bUntrimmed / 255
val max = max(r, max(g, b))
companion object { val min = r.coerceAtMost(g.coerceAtMost(b))
private const val INDEX_RED = 0 var h = (max + min) / 2
private const val INDEX_GREEN = 1 val s: Double
private const val INDEX_BLUE = 2 val l = (max + min) / 2
private const val INDEX_HUE = 0 if (max == min) {
private const val INDEX_SATURATION = 1 s = 0.0
private const val INDEX_LUMINATION = 2 h = s // achromatic
} else {
fun getColorFromName(name: String): Int { val d = max - min
return try { s = if (l > 0.5) d / (2 - max - min) else d / (max + min)
val hsl = calculateHSL(name) when (max) {
val rgb = hslToRgb(hsl[0].toFloat(), hsl[1].toFloat(), hsl[2].toFloat(), 1f) r -> {
Color.rgb(rgb[0], rgb[1], rgb[2]) h = (g - b) / d + (if (g < b) 6 else 0)
} catch (_: NoSuchAlgorithmException) { }
Color.WHITE g -> {
} h = (b - r) / d + 2
} }
b -> {
@Throws(NoSuchAlgorithmException::class) h = (r - g) / d + 4
private fun calculateHSL(name: String): IntArray {
val result = arrayOf("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0")
val rgb = doubleArrayOf(0.0, 0.0, 0.0)
var sat = 70
val lum = 68
val modulo = 16
var hash = name.lowercase(Locale.ROOT).replace("[^0-9a-f]".toRegex(), "")
if (!hash.matches("^[0-9a-f]{32}$".toRegex())) {
hash = md5(hash)
}
for (i in hash.indices) {
result[i % modulo] = (result[i % modulo].toInt() + hash.substring(i, i + 1).toInt(16)).toString()
}
for (count in 1 until modulo) {
rgb[count % 3] += result[count].toDouble()
}
rgb[INDEX_RED] = rgb[INDEX_RED] % 255
rgb[INDEX_GREEN] = rgb[INDEX_GREEN] % 255
rgb[INDEX_BLUE] = rgb[INDEX_BLUE] % 255
val hsl = rgbToHsl(rgb[INDEX_RED], rgb[INDEX_GREEN], rgb[INDEX_BLUE])
val bright = sqrt(
0.299 * rgb[INDEX_RED].pow(2.0) + 0.587 * rgb[INDEX_GREEN].pow(2.0) + 0.114 * rgb[INDEX_BLUE].pow(2.0)
)
if (bright >= 200) {
sat = 60
}
return intArrayOf((hsl[INDEX_HUE] * 360).toInt(), sat, lum)
}
private fun hslToRgb(hParam: Float, sParam: Float, lParam: Float, alpha: Float): IntArray {
var h = hParam
var s = sParam
var l = lParam
if (s !in 0.0f..100.0f) {
throw IllegalArgumentException("Color parameter outside of expected range - Saturation")
}
if (l !in 0.0f..100.0f) {
throw IllegalArgumentException("Color parameter outside of expected range - Luminance")
}
if (alpha !in 0.0f..1.0f) {
throw IllegalArgumentException("Color parameter outside of expected range - Alpha")
}
h %= 360.0f
h /= 360f
s /= 100f
l /= 100f
val q = if (l < 0.5) {
l * (1 + s)
} else {
(l + s) - s * l
}
val p = 2 * l - q
val r = round(max(0f, hueToRgb(p, q, h + 1.0f / 3.0f)) * 256).toInt()
val g = round(max(0f, hueToRgb(p, q, h)) * 256).toInt()
val b = round(max(0f, hueToRgb(p, q, h - 1.0f / 3.0f)) * 256).toInt()
return intArrayOf(r, g, b)
}
private fun hueToRgb(p: Float, q: Float, hParam: Float): Float {
var h = hParam
if (h < 0) h += 1f
if (h > 1) h -= 1f
if (6 * h < 1) return p + (q - p) * 6 * h
if (2 * h < 1) return q
if (3 * h < 2) return p + (q - p) * 6 * (2.0f / 3.0f - h)
return p
}
private fun rgbToHsl(rUntrimmed: Double, gUntrimmed: Double, bUntrimmed: Double): DoubleArray {
val r = rUntrimmed / 255
val g = gUntrimmed / 255
val b = bUntrimmed / 255
val max = max(r, max(g, b))
val min = r.coerceAtMost(g.coerceAtMost(b))
var h = (max + min) / 2
val s: Double
val l = (max + min) / 2
if (max == min) {
s = 0.0
h = s // achromatic
} else {
val d = max - min
s = if (l > 0.5) d / (2 - max - min) else d / (max + min)
when (max) {
r -> {
h = (g - b) / d + (if (g < b) 6 else 0)
}
g -> {
h = (b - r) / d + 2
}
b -> {
h = (r - g) / d + 4
}
} }
h /= 6.0
} }
val hsl = DoubleArray(3) h /= 6.0
hsl[INDEX_HUE] = h
hsl[INDEX_SATURATION] = s
hsl[INDEX_LUMINATION] = l
return hsl
} }
val hsl = DoubleArray(3)
hsl[INDEX_HUE] = h
hsl[INDEX_SATURATION] = s
hsl[INDEX_LUMINATION] = l
return hsl
}
@Throws(NoSuchAlgorithmException::class) @Throws(NoSuchAlgorithmException::class)
private fun md5(string: String): String { private fun md5(string: String): String {
val md5 = MessageDigest.getInstance("MD5").digest(string.toByteArray()) val md5 = MessageDigest.getInstance("MD5").digest(string.toByteArray())
return md5.joinToString("") { "%02x".format(it) } return md5.joinToString("") { "%02x".format(it) }
}
} }
} }
@@ -90,7 +90,7 @@ fun LabelManagementScreenContent(
title = { Text(stringResource(R.string.title_labels)) }, title = { Text(stringResource(R.string.title_labels)) },
navigationIcon = { navigationIcon = {
IconButton(onClick = onBack) { IconButton(onClick = onBack) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(R.string.simple_back))
} }
}, },
backgroundColor = MaterialTheme.colors.primary, backgroundColor = MaterialTheme.colors.primary,
@@ -267,10 +267,10 @@ fun LabelItem(
Spacer(modifier = Modifier.width(32.dp)) Spacer(modifier = Modifier.width(32.dp))
Text(text = name, modifier = Modifier.weight(1f), style = MaterialTheme.typography.subtitle1) Text(text = name, modifier = Modifier.weight(1f), style = MaterialTheme.typography.subtitle1)
IconButton(onClick = onEdit) { IconButton(onClick = onEdit) {
Icon(Icons.Default.Edit, contentDescription = null, tint = MaterialTheme.colors.onSurface.copy(alpha = 0.6f)) Icon(Icons.Default.Edit, contentDescription = stringResource(R.string.action_edit), tint = MaterialTheme.colors.onSurface.copy(alpha = 0.6f))
} }
IconButton(onClick = onDelete) { IconButton(onClick = onDelete) {
Icon(Icons.Default.Delete, contentDescription = null, tint = MaterialTheme.colors.error.copy(alpha = 0.6f)) Icon(Icons.Default.Delete, contentDescription = stringResource(R.string.action_delete), tint = MaterialTheme.colors.error.copy(alpha = 0.6f))
} }
} }
} }
@@ -151,6 +151,9 @@ object ProjectImportHelper {
val memberNameToId = mutableMapOf<String, Long>() val memberNameToId = mutableMapOf<String, Long>()
val pid = db.addProject(DBProject(0, projectRemoteId, "", projectRemoteId, null, null, null, ProjectType.LOCAL, 0L, mainCurrencyName, false, DBProject.ACCESS_LEVEL_UNKNOWN, null)) val pid = db.addProject(DBProject(0, projectRemoteId, "", projectRemoteId, null, null, null, ProjectType.LOCAL, 0L, mainCurrencyName, false, DBProject.ACCESS_LEVEL_UNKNOWN, null))
// addProject only inserts a subset of the row, currency not among it, so the main
// currency the file declared has to be written separately or it is lost.
if (mainCurrencyName != null) db.updateProject(pid, newCurrencyName = mainCurrencyName)
val pmRemoteToLocal = mutableMapOf<Long, Long>() val pmRemoteToLocal = mutableMapOf<Long, Long>()
paymentModes.forEach { paymentModes.forEach {
@@ -838,13 +838,14 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen
} }
/** /**
* Walks back through pages of bills, newest first, stopping at the first page that already * Walks back through pages of bills, newest first, until it has seen a run of
* matches locally and taking everything older on trust. * [UNCHANGED_RUN_TO_SETTLE] consecutive bills that already match locally - at which point
* everything older is taken on trust.
* *
* That only terminates while the server really does reverse the order and honour the * That only terminates while the server really does reverse the order and honour the
* offset. One that does neither returns the same oldest-first page every time, and since * offset. One that does neither returns the same oldest-first page every time, and since
* the walk compares against local rows it never writes, a single unknown bill keeps every * the walk compares against local rows it never writes, a single unknown bill keeps the
* page mismatched and the same page is requested forever. Returns null when the responses * run at zero and the same page is requested forever. Returns null when the responses
* show that happening, so the caller can fall back to the complete fetch. * show that happening, so the caller can fall back to the complete fetch.
*/ */
private fun walkBillPages( private fun walkBillPages(
@@ -857,6 +858,9 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen
var syncTimestamp = project.lastSyncedTimestamp var syncTimestamp = project.lastSyncedTimestamp
var offset = 0 var offset = 0
var previousPageIds: List<Long>? = null var previousPageIds: List<Long>? = null
// Counted across pages, not restarted at each one: a run that begins near the end of
// a page still finishes on the next.
var unchangedRun = 0
while (true) { while (true) {
val response = client!!.getBills(project, offset, limit, true, 0) val response = client!!.getBills(project, offset, limit, true, 0)
@@ -881,13 +885,23 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen
syncTimestamp = response.syncTimestamp syncTimestamp = response.syncTimestamp
} }
val pageAlreadyLocal = page.all { remote -> var settled = false
for (remote in page) {
val local = localBillsByRemoteId[remote.remoteId] val local = localBillsByRemoteId[remote.remoteId]
local != null && !hasChanged(local, remote) if (local != null && !hasChanged(local, remote)) {
unchangedRun++
if (unchangedRun >= UNCHANGED_RUN_TO_SETTLE) {
settled = true
break
}
} else {
unchangedRun = 0
}
} }
// A short page is the end of the collection: there is nothing older to walk back // A short page is the end of the collection: there is nothing older to walk back
// to, so asking for the next offset would only refetch it. // to, so asking for the next offset would only refetch it.
if (pageAlreadyLocal || page.size < limit) break if (settled || page.size < limit) break
offset += limit offset += limit
} }
@@ -1803,6 +1817,16 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen
companion object { companion object {
private val TAG = CowspentServerSyncHelper::class.java.simpleName private val TAG = CowspentServerSyncHelper::class.java.simpleName
/**
* How many consecutive bills, walking newest to oldest, must already match locally before
* the paged walk concludes that every older bill matches too.
*
* A whole page of 50 had to match before, so one edit anywhere in a page forced another
* page to be fetched. A trailing run is the same bet on a smaller sample: it can settle
* part way into a page, and it carries across page boundaries rather than restarting.
*/
private const val UNCHANGED_RUN_TO_SETTLE = 25
private var instance: CowspentServerSyncHelper? = null private var instance: CowspentServerSyncHelper? = null
private val projectIdsToSync: MutableList<Long> = ArrayList() private val projectIdsToSync: MutableList<Long> = ArrayList()
@@ -897,7 +897,9 @@ open class ServerResponse(
memberRemoteIdToId: Map<Long, Long> memberRemoteIdToId: Map<Long, Long>
): List<DBBillOwer> { ): List<DBBillOwer> {
val billOwers: MutableList<DBBillOwer> = ArrayList() val billOwers: MutableList<DBBillOwer> = ArrayList()
if (json.has("owers")) { // As everywhere else here, an explicitly null value is not a value: getJSONArray would
// throw on it, and that exception fails the whole project sync over one bill.
if (json.has("owers") && !json.isNull("owers")) {
val jsonOs = json.getJSONArray("owers") val jsonOs = json.getJSONArray("owers")
for (i in 0 until jsonOs.length()) { for (i in 0 until jsonOs.length()) {
val obj = jsonOs.get(i) val obj = jsonOs.get(i)
+14 -6
View File
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">Cowspent</string>
<!-- Actions --> <!-- Actions -->
<string name="action_new_bill">Neue Rechnung</string> <string name="action_new_bill">Neue Rechnung</string>
@@ -10,7 +9,11 @@
<string name="action_edit">Bearbeiten</string> <string name="action_edit">Bearbeiten</string>
<string name="action_share">Teilen</string> <string name="action_share">Teilen</string>
<string name="action_search">Suchen</string> <string name="action_search">Suchen</string>
<string name="action_open_menu">Menü öffnen</string>
<string name="action_close_search">Suche schließen</string>
<string name="action_clear_search">Suche leeren</string>
<string name="action_delete">Löschen</string> <string name="action_delete">Löschen</string>
<string name="simple_back">Zurück</string>
<string name="action_archive">Archivieren</string> <string name="action_archive">Archivieren</string>
<string name="action_unarchive">Reaktivieren</string> <string name="action_unarchive">Reaktivieren</string>
<string name="action_export">Exportieren</string> <string name="action_export">Exportieren</string>
@@ -37,7 +40,7 @@
<string name="title_add_project">Projekt hinzufügen</string> <string name="title_add_project">Projekt hinzufügen</string>
<string name="title_add_category">Neue Kategorie</string> <string name="title_add_category">Neue Kategorie</string>
<string name="title_add_payment_mode">Zahlungsmethode hinzufügen</string> <string name="title_add_payment_mode">Zahlungsmethode hinzufügen</string>
<string name="title_account">Nextloud-Konto</string> <string name="title_account">Nextcloud-Konto</string>
<string name="title_share_web">Weblink</string> <string name="title_share_web">Weblink</string>
<string name="title_share_qr">Cowspent link</string> <string name="title_share_qr">Cowspent link</string>
<string name="title_confirm">Bist du sicher?</string> <string name="title_confirm">Bist du sicher?</string>
@@ -137,10 +140,17 @@
<string name="settings_show_archived">Archivierte Projekte anzeigen</string> <string name="settings_show_archived">Archivierte Projekte anzeigen</string>
<string name="settings_beta_features">Beta-Funktionen</string> <string name="settings_beta_features">Beta-Funktionen</string>
<string name="settings_beta_features_summary">Experimentelle Funktionen aktivieren. Benutzung auf eigene Gefahr.</string> <string name="settings_beta_features_summary">Experimentelle Funktionen aktivieren. Benutzung auf eigene Gefahr.</string>
<string name="settings_fill_new_bill_from_last">Aus letzter Rechnung vorausfüllen</string>
<string name="settings_fill_new_bill_from_last_summary">Zahler, Kategorie, Zahlungsart und Beteiligte aus der zuletzt erstellten Rechnung des Projekts übernehmen.</string>
<string name="settings_auto_sync_on_open">Synchronisierungsintervall</string>
<string name="settings_auto_sync_on_open_summary">Wie oft Konto und alle Projekte beim Öffnen der App aktualisiert werden.</string>
<string name="pref_value_sync_1m">1 Minute</string>
<string name="pref_value_sync_10m">10 Minuten</string>
<string name="pref_value_sync_1h">1 Stunde</string>
<string name="pref_value_sync_1d">1 Tag</string>
<string name="settings_url_warn_http">WARNUNG: \"http\" ist unsicher. Verwende \"https\".</string> <string name="settings_url_warn_http">WARNUNG: \"http\" ist unsicher. Verwende \"https\".</string>
<string name="settings_colorpicker_title">Farbe wählen</string> <string name="settings_colorpicker_title">Farbe wählen</string>
<string name="pref_value_color_system">System</string> <string name="pref_value_color_system">System</string>
<string name="pref_value_color_server">Nextcloud</string>
<string name="pref_value_color_manual">Manuell</string> <string name="pref_value_color_manual">Manuell</string>
<string name="pref_value_theme_light">Hell</string> <string name="pref_value_theme_light">Hell</string>
<string name="pref_value_theme_dark">Dunkel</string> <string name="pref_value_theme_dark">Dunkel</string>
@@ -158,7 +168,7 @@
<string name="payment_mode_all">Alle</string> <string name="payment_mode_all">Alle</string>
<string name="payment_mode_credit_card">Kreditkarte</string> <string name="payment_mode_credit_card">Kreditkarte</string>
<string name="payment_mode_cash">Bargeld</string> <string name="payment_mode_cash">Bargeld</string>
<string name="payment_mode_check">Prüfen</string> <string name="payment_mode_check">Scheck</string>
<string name="payment_mode_online">Online</string> <string name="payment_mode_online">Online</string>
<string name="payment_mode_transfer">Überweisung</string> <string name="payment_mode_transfer">Überweisung</string>
<string name="category_none">Keine</string> <string name="category_none">Keine</string>
@@ -181,8 +191,6 @@
<string name="new_project_action">Was</string> <string name="new_project_action">Was</string>
<string name="new_project_where">Wo</string> <string name="new_project_where">Wo</string>
<string name="where_local">Nur lokal</string> <string name="where_local">Nur lokal</string>
<string name="where_cospend">Cospend</string>
<string name="where_ihatemoney">IHateMoney</string>
<string name="todo_join">Bestehendem Projekt beitreten</string> <string name="todo_join">Bestehendem Projekt beitreten</string>
<string name="todo_create">Neues Projekt erstellen</string> <string name="todo_create">Neues Projekt erstellen</string>
<string name="import_tooltip">Aus Datei importieren</string> <string name="import_tooltip">Aus Datei importieren</string>
+119 -93
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">Capucha gastada</string>
<!-- Actions --> <!-- Actions -->
<string name="action_new_bill">Nueva factura</string> <string name="action_new_bill">Nueva factura</string>
<string name="action_add_project">Añadir proyecto</string> <string name="action_add_project">Añadir proyecto</string>
@@ -8,154 +8,174 @@
<string name="action_edit">Editar</string> <string name="action_edit">Editar</string>
<string name="action_share">Compartir</string> <string name="action_share">Compartir</string>
<string name="action_search">Buscar</string> <string name="action_search">Buscar</string>
<string name="action_open_menu">Abrir el menú</string>
<string name="action_close_search">Cerrar la búsqueda</string>
<string name="action_clear_search">Borrar la búsqueda</string>
<string name="action_delete">Eliminar</string> <string name="action_delete">Eliminar</string>
<string name="simple_back">Atrás</string>
<string name="action_archive">Archivar</string> <string name="action_archive">Archivar</string>
<string name="action_unarchive">Desarchivar</string> <string name="action_unarchive">Desarchivar</string>
<string name="action_export">Exportar</string> <string name="action_export">Exportar</string>
<string name="action_stats">Estadísticas</string> <string name="action_stats">Estadísticas</string>
<string name="action_settle">Salir</string> <string name="action_settle">Liquidar</string>
<string name="action_scan_qrcode">Scan QR Code</string> <string name="action_scan_qrcode">Escanear código QR</string>
<string name="action_settings">Ajustes</string> <string name="action_settings">Ajustes</string>
<string name="action_label_bills">Categorías faltantes de etiqueta</string> <string name="action_label_bills">Categorizar facturas</string>
<string name="action_logout">Cerrar sesión</string> <string name="action_logout">Cerrar sesión</string>
<string name="action_connect">Conectar</string> <string name="action_connect">Conectar</string>
<string name="action_discard">Descartar</string> <string name="action_discard">Descartar</string>
<string name="action_members">Miembros</string> <string name="action_members">Miembros</string>
<string name="action_labels">Etiquetas</string> <string name="action_labels">Etiquetas</string>
<string name="action_currencies">Monedas</string> <string name="action_currencies">Monedas</string>
<!-- Titles --> <!-- Titles -->
<string name="title_stats">Estadísticas</string> <string name="title_stats">Estadísticas</string>
<string name="title_edit_project">Editar proyecto</string> <string name="title_edit_project">Editar proyecto</string>
<string name="title_label_bills">Facturas de etiqueta</string> <string name="title_label_bills">Categorizar facturas</string>
<string name="title_labels">Administrar etiquetas</string> <string name="title_labels">Gestionar etiquetas</string>
<string name="title_about">Acerca de</string> <string name="title_about">Acerca de</string>
<string name="title_settle">Liquidar Proyecto</string> <string name="title_settle">Liquidar proyecto</string>
<string name="title_share">Compartir proyecto</string> <string name="title_share">Compartir proyecto</string>
<string name="title_add_project">Añadir proyecto</string> <string name="title_add_project">Añadir proyecto</string>
<string name="title_add_category">Añadir categoría</string> <string name="title_add_category">Añadir categoría</string>
<string name="title_add_payment_mode">Añadir modo de pago</string> <string name="title_add_payment_mode">Añadir modo de pago</string>
<string name="title_account">Cuenta Nextcloud</string> <string name="title_account">Cuenta de Nextcloud</string>
<string name="title_share_web">Enlace web</string> <string name="title_share_web">Enlace web</string>
<string name="title_share_qr">Cowspent link</string> <string name="title_share_qr">Enlace de Cowspent</string>
<string name="title_confirm">¿Estás seguro?</string> <string name="title_confirm">¿Estás seguro?</string>
<!-- Labels and Fields --> <!-- Labels and Fields -->
<string name="label_all_bills">Todas las facturas</string> <string name="label_all_bills">Todas las facturas</string>
<string name="label_categories">Categorías</string> <string name="label_categories">Categorías</string>
<string name="label_payment_modes">Modos de pago</string> <string name="label_payment_modes">Modos de pago</string>
<string name="label_name">Nombre</string> <string name="label_name">Nombre</string>
<string name="label_icon">Icon / Emoji</string> <string name="label_icon">Icono / Emoji</string>
<string name="label_color">Color</string> <string name="label_color">Color</string>
<string name="label_weight">Peso</string> <string name="label_weight">Peso</string>
<string name="label_activated">Activado</string> <string name="label_activated">Activado</string>
<string name="label_password">Contraseña</string> <string name="label_password">Contraseña</string>
<string name="label_email">E-mail</string> <string name="label_email">Correo electrónico</string>
<string name="label_url">Dirección del servidor</string> <string name="label_url">Dirección del servidor</string>
<string name="label_username">Usuario</string> <string name="label_username">Nombre de usuario</string>
<string name="label_comment">Comentario</string> <string name="label_comment">Comentario</string>
<string name="label_what">¿Qué?</string> <string name="label_what">¿Qué?</string>
<string name="label_payer">¿Quién pagó?</string> <string name="label_payer">¿Quién pagó?</string>
<string name="label_owers">¿Para quién?</string> <string name="label_owers">¿Para quién?</string>
<string name="label_repeat">Repetir cada</string> <string name="label_repeat">Repetición</string>
<string name="label_mode">Modo</string> <string name="label_mode">Modo</string>
<string name="label_category">Categoría</string> <string name="label_category">Categoría</string>
<string name="label_project_id">ID del proyecto/nombre</string> <string name="label_project_id">ID/nombre del proyecto</string>
<string name="label_project_title">Título del proyecto</string> <string name="label_project_title">Título del proyecto</string>
<string name="label_use_sso">Usar cuenta de la aplicación Nextcloud</string> <string name="label_use_sso">Usar la cuenta de la aplicación Nextcloud</string>
<!-- Dialogs and Messages --> <!-- Dialogs and Messages -->
<string name="dialog_unsaved_changes_title">Cambios sin guardar</string> <string name="dialog_unsaved_changes_title">Cambios sin guardar</string>
<string name="dialog_unsaved_changes_msg">¿Guardar cambios antes de salir?</string> <string name="dialog_unsaved_changes_msg">¿Guardar los cambios antes de salir?</string>
<string name="dialog_confirm_remove_project_msg">El proyecto remoto no se eliminará.</string> <string name="dialog_confirm_remove_project_msg">El proyecto remoto no se eliminará.</string>
<string name="dialog_sync_error_title">Error de sincronización</string> <string name="dialog_sync_error_title">Error de sincronización</string>
<string name="dialog_sync_error_msg">Sincronización fallida para %1$s.\n\n%2$s</string> <string name="dialog_sync_error_msg">Error al sincronizar %1$s.\n\n%2$s</string>
<string name="dialog_balanced_msg">Los gastos ya están equilibrados.</string> <string name="dialog_balanced_msg">Los gastos ya están equilibrados.</string>
<string name="msg_project_added">Proyecto %1$s añadido</string> <string name="msg_project_added">Proyecto %1$s añadido</string>
<string name="msg_bill_labeled_done">Todas las facturas etiquetadas</string> <string name="msg_bill_labeled_done">Todas las facturas están categorizadas</string>
<string name="msg_no_suggestions">No hay sugerencias</string> <string name="msg_no_suggestions">No hay sugerencias</string>
<string name="msg_auth_warning">Requiere Gasto v0.3.4+.</string> <string name="msg_auth_warning">Requiere Cospend v0.3.4+.</string>
<string name="msg_link_copied">Enlace copiado al portapapeles</string> <string name="msg_link_copied">Enlace copiado al portapapeles</string>
<string name="msg_share_qr">Escanea el código QR o comparte el enlace para unirte.</string> <string name="msg_share_qr">Escanea el código QR o comparte el enlace para unirte al proyecto.</string>
<string name="msg_share_web">Enlace para acceso al navegador web.</string> <string name="msg_share_web">Enlace de acceso desde un navegador web.</string>
<string name="msg_share_qr_warn">Comparte este enlace con un usuario de Cowged.</string> <string name="msg_share_qr_warn">Comparte este enlace con un usuario de Cowspent.</string>
<string name="msg_settle_intro">Acuerdo para %1$s:</string> <string name="msg_settle_intro">Liquidación de %1$s:</string>
<string name="msg_settle_sentence">%1$s debe %3$.2f a %2$s</string> <string name="msg_settle_sentence">%1$s debe %3$.2f a %2$s</string>
<string name="msg_stats_intro">Estadísticas de %1$s:</string> <string name="msg_stats_intro">Estadísticas de %1$s:</string>
<string name="msg_stats_header">Miembro Pagado | Gasto | Saldo)</string> <string name="msg_stats_header">Miembro (Pagado | Gastado | Saldo)</string>
<string name="msg_logged_in_as">Logged in as %1$s</string> <string name="msg_logged_in_as">Sesión iniciada como %1$s</string>
<!-- Errors --> <!-- Errors -->
<string name="error_generic">Error</string> <string name="error_generic">Error</string>
<string name="error_loading">Cargando</string> <string name="error_loading">Cargando</string>
<string name="error_no_projects">No se encontraron proyectos</string> <string name="error_no_projects">No se encontraron proyectos</string>
<string name="error_no_members">Ningún miembro encontrado</string> <string name="error_no_members">No se encontraron miembros</string>
<string name="error_no_bills">No se encontraron facturas</string> <string name="error_no_bills">No se encontraron facturas</string>
<string name="error_no_member">Se requiere al menos un miembro</string> <string name="error_no_member">Se requiere al menos un miembro</string>
<string name="error_maintenance_mode">El servidor está en modo mantenimiento</string> <string name="error_maintenance_mode">El servidor está en modo de mantenimiento</string>
<string name="error_400">400 Solicitud errónea</string> <string name="error_400">400 Solicitud incorrecta</string>
<string name="error_401">401 no autorizado</string> <string name="error_401">401 No autorizado</string>
<string name="error_403">403 Prohibida</string> <string name="error_403">403 Prohibido</string>
<string name="error_404">404 no encontrado</string> <string name="error_404">404 No encontrado</string>
<string name="error_sync">Sincronización fallida: %1$s</string> <string name="error_sync">Error de sincronización: %1$s</string>
<string name="error_invalid_login">Inicio de sesión no válido: %1$s</string> <string name="error_invalid_login">Inicio de sesión no válido: %1$s</string>
<string name="error_auth">Nombre de usuario o contraseña incorrectos</string> <string name="error_auth">Nombre de usuario o contraseña incorrectos</string>
<string name="error_json">Respuesta del servidor inválida</string> <string name="error_json">Respuesta del servidor no válida</string>
<string name="error_req_failed">Petición fallida</string> <string name="error_req_failed">La petición ha fallado</string>
<string name="error_invalid_email">E-mail inválido</string> <string name="error_invalid_email">Correo electrónico no válido</string>
<string name="error_invalid_project_id">ID de proyecto inválido</string> <string name="error_invalid_project_id">ID de proyecto no válido</string>
<string name="error_invalid_project_name">Título del proyecto inválido</string> <string name="error_invalid_project_name">Título de proyecto no válido</string>
<string name="error_invalid_bill_name">Nombre de factura no válido</string> <string name="error_invalid_bill_name">Nombre de factura no válido</string>
<string name="error_invalid_bill_date">Fecha de factura inválida</string> <string name="error_invalid_bill_date">Fecha de factura no válida</string>
<string name="error_invalid_bill_payer">Pagador requerido</string> <string name="error_invalid_bill_payer">Pagador requerido</string>
<string name="error_invalid_bill_owers">Propietarios requeridos</string> <string name="error_invalid_bill_owers">Participantes requeridos</string>
<string name="error_no_network">No hay conexión de red</string> <string name="error_no_network">No hay conexión de red</string>
<string name="error_server">Error del servidor</string> <string name="error_server">Error del servidor</string>
<string name="error_io">Conexión con el servidor dañada</string> <string name="error_io">Se ha perdido la conexión con el servidor</string>
<string name="error_share_impossible">No se puede compartir este proyecto</string> <string name="error_share_impossible">No se puede compartir este proyecto</string>
<!-- Drawer / Common UI --> <!-- Drawer / Common UI -->
<string name="drawer_no_account">Conectar a la cuenta de Nextcloud</string> <string name="drawer_no_account">Conectar a una cuenta de Nextcloud</string>
<string name="drawer_last_sync">Última sincronización: %1$02d:%2$02d</string> <string name="drawer_last_sync">Última sincronización: %1$02d:%2$02d</string>
<string name="simple_cancel">Cancelar</string> <string name="simple_cancel">Cancelar</string>
<string name="simple_ok" tools:ignore="ButtonCase,Typos">Ok</string> <string name="simple_ok" tools:ignore="ButtonCase,Typos">Ok</string>
<string name="simple_yes"></string> <string name="simple_yes"></string>
<string name="simple_no">Nu</string> <string name="simple_no">No</string>
<string name="simple_close">Cerrar</string> <string name="simple_close">Cerrar</string>
<!-- Settings --> <!-- Settings -->
<string name="settings_appearance">Apariencia</string> <string name="settings_appearance">Apariencia</string>
<string name="settings_network">Red</string> <string name="settings_network">Red</string>
<string name="settings_other">Otro</string> <string name="settings_other">Otros</string>
<string name="settings_night_mode">Tema</string> <string name="settings_night_mode">Tema</string>
<string name="settings_offline_mode">Modo sin conexión</string> <string name="settings_offline_mode">Modo sin conexión</string>
<string name="settings_offline_mode_summary">Solo sincronizar manualmente.</string> <string name="settings_offline_mode_summary">Sincronizar solo manualmente.</string>
<string name="settings_color_custom">Color personalizado</string> <string name="settings_color_custom">Color personalizado</string>
<string name="settings_color_mode">Selección de color</string> <string name="settings_color_mode">Selección de color</string>
<string name="settings_show_archived">Mostrar proyectos archivados</string> <string name="settings_show_archived">Mostrar los proyectos archivados</string>
<string name="settings_beta_features">Características beta</string> <string name="settings_beta_features">Funciones beta</string>
<string name="settings_beta_features_summary">Activar características experimentales. Úsalo bajo tu propio riesgo.</string> <string name="settings_beta_features_summary">Activar las funciones experimentales. Úsalas bajo tu propia responsabilidad.</string>
<string name="settings_url_warn_http">ADVERTENCIA: \"http\" no es seguro. Use \"https\".</string> <string name="settings_fill_new_bill_from_last">Rellenar desde la última factura</string>
<string name="settings_colorpicker_title">Elegir color</string> <string name="settings_fill_new_bill_from_last_summary">Reutilizar el pagador, la categoría, el modo y los participantes de la última factura creada en el proyecto.</string>
<string name="settings_auto_sync_on_open">Intervalo de sincronización</string>
<string name="settings_auto_sync_on_open_summary">Con qué frecuencia se actualizan la cuenta y todos los proyectos al abrir la aplicación.</string>
<string name="pref_value_sync_1m">1 minuto</string>
<string name="pref_value_sync_10m">10 minutos</string>
<string name="pref_value_sync_1h">1 hora</string>
<string name="pref_value_sync_1d">1 día</string>
<string name="settings_url_warn_http">ADVERTENCIA: \"http\" no es seguro. Usa \"https\".</string>
<string name="settings_colorpicker_title">Elegir un color</string>
<string name="pref_value_color_system">Sistema</string> <string name="pref_value_color_system">Sistema</string>
<string name="pref_value_color_server">Nextcloud</string>
<string name="pref_value_color_manual">Manual</string> <string name="pref_value_color_manual">Manual</string>
<string name="pref_value_theme_light">Claro</string> <string name="pref_value_theme_light">Claro</string>
<string name="pref_value_theme_dark">Oscuro</string> <string name="pref_value_theme_dark">Oscuro</string>
<string name="pref_value_theme_system">Seguir sistema</string> <string name="pref_value_theme_system">Seguir el sistema</string>
<!-- Constants (Do not translate) -->
<!-- Enums and Lists --> <!-- Enums and Lists -->
<string name="repeat_no">No repetir</string> <string name="repeat_no">Sin repetición</string>
<string name="repeat_day">Diario</string> <string name="repeat_day">Diaria</string>
<string name="repeat_week">Semanal</string> <string name="repeat_week">Semanal</string>
<string name="repeat_fortnight">Fortnocturno</string> <string name="repeat_fortnight">Quincenal</string>
<string name="repeat_month">Mensual</string> <string name="repeat_month">Mensual</string>
<string name="repeat_year">Anual</string> <string name="repeat_year">Anual</string>
<string name="payment_mode_none">Ninguna</string>
<string name="payment_mode_none">Ninguno</string>
<string name="payment_mode_all">Todos</string> <string name="payment_mode_all">Todos</string>
<string name="payment_mode_credit_card">Tarjeta de crédito</string> <string name="payment_mode_credit_card">Tarjeta de crédito</string>
<string name="payment_mode_cash">Dinero</string> <string name="payment_mode_cash">Efectivo</string>
<string name="payment_mode_check">Comprobar</string> <string name="payment_mode_check">Cheque</string>
<string name="payment_mode_online">En línea</string> <string name="payment_mode_online">En línea</string>
<string name="payment_mode_transfer">Transferir</string> <string name="payment_mode_transfer">Transferencia</string>
<string name="category_none">Ninguna</string> <string name="category_none">Ninguna</string>
<string name="category_all">Todos</string> <string name="category_all">Todas</string>
<string name="category_all_except_reimbursement">Todos excepto reembolso</string> <string name="category_all_except_reimbursement">Todas excepto reembolso</string>
<string name="category_groceries">Comestible</string> <string name="category_groceries">Supermercado</string>
<string name="category_leisure">Bar/Fiesta</string> <string name="category_leisure">Bar/Fiesta</string>
<string name="category_rent">Alquiler</string> <string name="category_rent">Alquiler</string>
<string name="category_bills">Factura</string> <string name="category_bills">Factura</string>
@@ -167,75 +187,81 @@
<string name="category_accomodation">Alojamiento</string> <string name="category_accomodation">Alojamiento</string>
<string name="category_transport">Transporte</string> <string name="category_transport">Transporte</string>
<string name="category_sport">Deporte</string> <string name="category_sport">Deporte</string>
<!-- Project specific --> <!-- Project specific -->
<string name="new_project_action">Qué</string> <string name="new_project_action">Qué</string>
<string name="new_project_where">Donde</string> <string name="new_project_where">Dónde</string>
<string name="where_local">Solo local</string> <string name="where_local">Solo local</string>
<string name="where_cospend">Gastar</string> <string name="todo_join">Unirse a un proyecto existente</string>
<string name="where_ihatemoney">Dinero IHate</string> <string name="todo_create">Crear un proyecto nuevo</string>
<string name="todo_join">Unirse al proyecto existente</string> <string name="import_tooltip">Importar desde un archivo</string>
<string name="todo_create">Crear nuevo proyecto</string> <string name="choose_account_project_dialog_title">Elegir un proyecto</string>
<string name="import_tooltip">Importar desde archivo</string>
<string name="choose_account_project_dialog_title">Elegir proyecto</string>
<string name="choose_account_project_dialog_impossible">No se encontraron proyectos en esta cuenta.</string> <string name="choose_account_project_dialog_impossible">No se encontraron proyectos en esta cuenta.</string>
<string name="choose_project_management_action">Projekt</string> <string name="choose_project_management_action">Proyecto</string>
<string name="project_added_success">Proyecto añadido correctamente.</string> <string name="project_added_success">Proyecto añadido correctamente.</string>
<string name="no_projects_text">Aún no tienes proyectos.</string> <string name="no_projects_text">Aún no tienes proyectos.</string>
<string name="configure_account_choice">Configurar cuenta Nextcloud</string> <string name="configure_account_choice">Configurar una cuenta de Nextcloud</string>
<string name="add_project_choice">Añadir proyecto manualmente</string> <string name="add_project_choice">Añadir un proyecto manualmente</string>
<string name="no_members_text">No hay miembros en este proyecto.</string> <string name="no_members_text">No hay miembros en este proyecto.</string>
<string name="no_bills_text">No se encontraron facturas.</string> <string name="no_bills_text">No se encontraron facturas.</string>
<string name="member_already_exists">El miembro ya existe.</string> <string name="member_already_exists">El miembro ya existe.</string>
<string name="activity_dialog_title">Proyecto: %1$s</string> <string name="activity_dialog_title">Proyecto: %1$s</string>
<string name="remove_project_confirmation">Proyecto %1$s eliminado.</string> <string name="remove_project_confirmation">Proyecto %1$s eliminado.</string>
<string name="file_saved_success">Archivo guardado: %1$s</string> <string name="file_saved_success">Archivo guardado: %1$s</string>
<string name="import_error_header">Error al importar en la fila %d</string> <string name="import_error_header">Error de importación en la fila %d</string>
<string name="import_error_date">Formato de fecha no válido en la fila %d</string> <string name="import_error_date">Formato de fecha no válido en la fila %d</string>
<string name="import_error_owers">Dueños no válidos en la fila %d</string> <string name="import_error_owers">Participantes no válidos en la fila %d</string>
<string name="add_member_dialog_title">Añadir miembro</string> <string name="add_member_dialog_title">Añadir miembro</string>
<string name="edit_member_dialog_title">Editar miembro</string> <string name="edit_member_dialog_title">Editar miembro</string>
<string name="member_edit_delete">Eliminar</string> <string name="member_edit_delete">Eliminar</string>
<string name="project_edition_no_change">No hay cambios para guardar.</string> <string name="project_edition_no_change">No hay cambios que guardar.</string>
<!-- Settlement --> <!-- Settlement -->
<string name="center_none">Ninguno (óptimo)</string> <string name="center_none">Ninguno (óptimo)</string>
<string name="settle_who">Quién paga</string> <string name="settle_who">Quién paga</string>
<string name="settle_to_whom">A quien</string> <string name="settle_to_whom">A quién</string>
<string name="settle_how_much">Cantidad</string> <string name="settle_how_much">Importe</string>
<string name="simple_settle_share">Compartir</string> <string name="simple_settle_share">Compartir</string>
<string name="simple_create_bills">Crear facturas</string> <string name="simple_create_bills">Crear las facturas</string>
<string name="settle_bill_what">Acuerdo</string> <string name="settle_bill_what">Liquidación</string>
<!-- Currencies --> <!-- Currencies -->
<string name="currency_dialog_title">Elija la moneda (%s)</string> <string name="currency_dialog_title">Elegir moneda (%s)</string>
<string name="setting_none">Ninguna</string> <string name="setting_none">Ninguna</string>
<string name="setting_all">Todos</string> <string name="setting_all">Todas</string>
<string name="currency_saved_success">Ajustes de moneda guardados.</string> <string name="currency_saved_success">Ajustes de moneda guardados.</string>
<string name="main_currency">Moneda principal</string> <string name="main_currency">Moneda principal</string>
<!-- Statistics --> <!-- Statistics -->
<string name="label_bills_suggested">Categorías sugeridas</string> <string name="label_bills_suggested">Categorías sugeridas</string>
<string name="label_bills_skip">Saltar</string> <string name="label_bills_skip">Omitir</string>
<string name="stats_date_min">De</string> <string name="stats_date_min">Desde</string>
<string name="stats_date_max">A</string> <string name="stats_date_max">Hasta</string>
<string name="stats_who">Miembro</string> <string name="stats_who">Miembro</string>
<string name="stats_paid">Pagado</string> <string name="stats_paid">Pagado</string>
<string name="stats_spent">Escrito</string> <string name="stats_spent">Gastado</string>
<string name="stats_balance">Saldo</string> <string name="stats_balance">Saldo</string>
<string name="total">Total: %1$s</string> <string name="total">Total: %1$s</string>
<!-- Errors Extra --> <!-- Errors Extra -->
<string name="error_project_connect_check">Conexión fallida: %1$s</string> <string name="error_project_connect_check">Error de conexión: %1$s</string>
<string name="error_create_remote_project_helper">Creación fallida: %1$s</string> <string name="error_create_remote_project_helper">Error al crear: %1$s</string>
<string name="error_edit_remote_project_helper">Error al actualizar proyecto remoto: %1$s</string> <string name="error_edit_remote_project_helper">Error al actualizar el proyecto remoto: %1$s</string>
<string name="remote_project_operation_no_network">Red no disponible para operaciones remotas.</string> <string name="remote_project_operation_no_network">Red no disponible para esta operación remota.</string>
<string name="error_scanning_bill_qr_code">Error al analizar el código QR.</string> <string name="error_scanning_bill_qr_code">No se ha podido leer el código QR.</string>
<string name="error_token_mismatch">El token de autenticación no coincide. Por favor, inicia sesión de nuevo.</string> <string name="error_token_mismatch">El token de autenticación no coincide. Vuelve a iniciar sesión.</string>
<string name="insufficient_access_level">No tienes permiso para realizar esta acción.</string> <string name="insufficient_access_level">No tienes permiso para realizar esta acción.</string>
<string name="delete_label_confirmation_title">Eliminar Etiqueta</string> <string name="delete_label_confirmation_title">Eliminar etiqueta</string>
<string name="delete_label_confirmation_message">¿Está seguro que desea eliminar esta etiqueta?</string> <string name="delete_label_confirmation_message">¿Seguro que quieres eliminar esta etiqueta?</string>
<!-- About --> <!-- About -->
<string name="about_version">Versión %1$s</string> <string name="about_version">Versión %1$s</string>
<string name="about_maintainer_title">Mantenedor</string> <string name="about_maintainer_title">Mantenedor</string>
<string name="about_license_title">Licencia</string> <string name="about_license_title">Licencia</string>
<string name="about_source_title">Código fuente</string> <string name="about_source_title">Código fuente</string>
<!-- New constants for backward compatibility or shared use --> <!-- New constants for backward compatibility or shared use -->
<string name="share_intent_title">Proyecto %1$s</string> <string name="share_intent_title">Proyecto %1$s</string>
<string name="share_chooser_title">Compartir %1$s</string> <string name="share_chooser_title">Compartir %1$s</string>
</resources> </resources>
+98 -69
View File
@@ -1,34 +1,40 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">Vache dépensée</string>
<!-- Actions --> <!-- Actions -->
<string name="action_new_bill">Nouvelle facture</string> <string name="action_new_bill">Nouvelle facture</string>
<string name="action_add_project">Ajouter un projet</string> <string name="action_add_project">Ajouter un projet</string>
<string name="action_save">Enregistrer</string> <string name="action_save">Enregistrer</string>
<string name="action_edit">Editer</string> <string name="action_edit">Modifier</string>
<string name="action_share">Partager</string> <string name="action_share">Partager</string>
<string name="action_search">Chercher</string> <string name="action_search">Rechercher</string>
<string name="action_delete">Supprimez</string> <string name="action_open_menu">Ouvrir le menu</string>
<string name="action_archive">Archive</string> <string name="action_close_search">Fermer la recherche</string>
<string name="action_clear_search">Effacer la recherche</string>
<string name="action_delete">Supprimer</string>
<string name="simple_back">Retour</string>
<string name="action_archive">Archiver</string>
<string name="action_unarchive">Désarchiver</string> <string name="action_unarchive">Désarchiver</string>
<string name="action_export">Exportation</string> <string name="action_export">Exporter</string>
<string name="action_stats">Stats</string> <string name="action_stats">Stats</string>
<string name="action_settle">Régler</string> <string name="action_settle">Régler</string>
<string name="action_scan_qrcode">Scan QR Code</string> <string name="action_scan_qrcode">Scanner un QR code</string>
<string name="action_settings">Réglages</string> <string name="action_settings">Réglages</string>
<string name="action_label_bills">Catégories manquantes</string> <string name="action_label_bills">Catégoriser les factures</string>
<string name="action_logout">Déconnexion</string> <string name="action_logout">Déconnecter</string>
<string name="action_connect">Connecter</string> <string name="action_connect">Connecter</string>
<string name="action_discard">Abandonner</string> <string name="action_discard">Abandonner</string>
<string name="action_members">Membres</string> <string name="action_members">Membres</string>
<string name="action_labels">Étiquettes</string> <string name="action_labels">Étiquettes</string>
<string name="action_currencies">Devises</string> <string name="action_currencies">Devises</string>
<!-- Titles --> <!-- Titles -->
<string name="title_stats">Statistiques</string> <string name="title_stats">Statistiques</string>
<string name="title_edit_project">Modifier le projet</string> <string name="title_edit_project">Modifier le projet</string>
<string name="title_label_bills">Étiquettes de factures</string> <string name="title_label_bills">Catégoriser les factures</string>
<string name="title_labels">Gérer les étiquettes</string> <string name="title_labels">Gérer les étiquettes</string>
<string name="title_about">À propos de</string> <string name="title_about">À propos</string>
<string name="title_settle">Régler le projet</string> <string name="title_settle">Régler le projet</string>
<string name="title_share">Partager le projet</string> <string name="title_share">Partager le projet</string>
<string name="title_add_project">Ajouter un projet</string> <string name="title_add_project">Ajouter un projet</string>
@@ -36,14 +42,15 @@
<string name="title_add_payment_mode">Ajouter un mode de paiement</string> <string name="title_add_payment_mode">Ajouter un mode de paiement</string>
<string name="title_account">Compte Nextcloud</string> <string name="title_account">Compte Nextcloud</string>
<string name="title_share_web">Lien web</string> <string name="title_share_web">Lien web</string>
<string name="title_share_qr">Cowspent link</string> <string name="title_share_qr">Lien Cowspent</string>
<string name="title_confirm">Êtes-vous sûr(e) ?</string> <string name="title_confirm">Êtes-vous sûr(e) ?</string>
<!-- Labels and Fields --> <!-- Labels and Fields -->
<string name="label_all_bills">Toutes les factures</string> <string name="label_all_bills">Toutes les factures</string>
<string name="label_categories">Catégories</string> <string name="label_categories">Catégories</string>
<string name="label_payment_modes">Modes de paiement</string> <string name="label_payment_modes">Modes de paiement</string>
<string name="label_name">Nom</string> <string name="label_name">Nom</string>
<string name="label_icon">Icon / Emoji</string> <string name="label_icon">Icône / Emoji</string>
<string name="label_color">Couleur</string> <string name="label_color">Couleur</string>
<string name="label_weight">Poids</string> <string name="label_weight">Poids</string>
<string name="label_activated">Activé</string> <string name="label_activated">Activé</string>
@@ -51,48 +58,50 @@
<string name="label_email">Courriel</string> <string name="label_email">Courriel</string>
<string name="label_url">Adresse du serveur</string> <string name="label_url">Adresse du serveur</string>
<string name="label_username">Nom d\'utilisateur</string> <string name="label_username">Nom d\'utilisateur</string>
<string name="label_comment">Commenter</string> <string name="label_comment">Commentaire</string>
<string name="label_what">Quoi?</string> <string name="label_what">Quoi ?</string>
<string name="label_payer">Qui a payé ?</string> <string name="label_payer">Qui a payé ?</string>
<string name="label_owers">Pour qui?</string> <string name="label_owers">Pour qui ?</string>
<string name="label_repeat">Répéter toutes les</string> <string name="label_repeat">Répétition</string>
<string name="label_mode">Mode</string> <string name="label_mode">Mode</string>
<string name="label_category">Catégorie</string> <string name="label_category">Catégorie</string>
<string name="label_project_id">ID/nom du projet</string> <string name="label_project_id">ID/nom du projet</string>
<string name="label_project_title">Titre du projet</string> <string name="label_project_title">Titre du projet</string>
<string name="label_use_sso">Utiliser le compte Nextcloud App</string> <string name="label_use_sso">Utiliser le compte de l\'application Nextcloud</string>
<!-- Dialogs and Messages --> <!-- Dialogs and Messages -->
<string name="dialog_unsaved_changes_title">Modifications non enregistrées</string> <string name="dialog_unsaved_changes_title">Modifications non enregistrées</string>
<string name="dialog_unsaved_changes_msg">Enregistrer les modifications avant de partir?</string> <string name="dialog_unsaved_changes_msg">Enregistrer les modifications avant de quitter ?</string>
<string name="dialog_confirm_remove_project_msg">Le projet distant ne sera pas supprimé.</string> <string name="dialog_confirm_remove_project_msg">Le projet distant ne sera pas supprimé.</string>
<string name="dialog_sync_error_title">Erreur de synchronisation</string> <string name="dialog_sync_error_title">Erreur de synchronisation</string>
<string name="dialog_sync_error_msg">Échec de la synchronisation pour %1$s.\n\n%2$s</string> <string name="dialog_sync_error_msg">Échec de la synchronisation pour %1$s.\n\n%2$s</string>
<string name="dialog_balanced_msg">Les dépenses sont déjà équilibrées.</string> <string name="dialog_balanced_msg">Les dépenses sont déjà équilibrées.</string>
<string name="msg_project_added">Projet %1$s ajouté</string> <string name="msg_project_added">Projet %1$s ajouté</string>
<string name="msg_bill_labeled_done">Toutes les factures étiquetées</string> <string name="msg_bill_labeled_done">Toutes les factures sont catégorisées</string>
<string name="msg_no_suggestions">Aucune suggestion</string> <string name="msg_no_suggestions">Aucune suggestion</string>
<string name="msg_auth_warning">Nécessite Cospend v0.3.4+.</string> <string name="msg_auth_warning">Nécessite Cospend v0.3.4+.</string>
<string name="msg_link_copied">Lien copié dans le presse-papiers</string> <string name="msg_link_copied">Lien copié dans le presse-papiers</string>
<string name="msg_share_qr">Scannez le code QR ou partagez le lien pour vous inscrire.</string> <string name="msg_share_qr">Scannez le QR code ou partagez le lien pour rejoindre le projet.</string>
<string name="msg_share_web">Lien pour accéder au navigateur Web.</string> <string name="msg_share_web">Lien d\'accès depuis un navigateur web.</string>
<string name="msg_share_qr_warn">Partagez ce lien avec un utilisateur Cowspent</string> <string name="msg_share_qr_warn">Partagez ce lien avec un utilisateur de Cowspent.</string>
<string name="msg_settle_intro">Réglage pour %1$s:</string> <string name="msg_settle_intro">Règlement pour %1$s :</string>
<string name="msg_settle_sentence">%1$s doit %3$.2f à %2$s</string> <string name="msg_settle_sentence">%1$s doit %3$.2f à %2$s</string>
<string name="msg_stats_intro">Statistiques pour %1$s:</string> <string name="msg_stats_intro">Statistiques pour %1$s :</string>
<string name="msg_stats_header">Membre (payé | Dépensé | Solde)</string> <string name="msg_stats_header">Membre (Payé | Dépensé | Solde)</string>
<string name="msg_logged_in_as">Connecté en tant que %1$s</string> <string name="msg_logged_in_as">Connecté en tant que %1$s</string>
<!-- Errors --> <!-- Errors -->
<string name="error_generic">Erreur</string> <string name="error_generic">Erreur</string>
<string name="error_loading">En cours de chargement</string> <string name="error_loading">Chargement</string>
<string name="error_no_projects">Aucun projet trouvé</string> <string name="error_no_projects">Aucun projet trouvé</string>
<string name="error_no_members">Aucun membre trouvé</string> <string name="error_no_members">Aucun membre trouvé</string>
<string name="error_no_bills">Aucune facture trouvée</string> <string name="error_no_bills">Aucune facture trouvée</string>
<string name="error_no_member">Au moins un membre est requis</string> <string name="error_no_member">Au moins un membre est requis</string>
<string name="error_maintenance_mode">Le serveur est en mode maintenance</string> <string name="error_maintenance_mode">Le serveur est en mode maintenance</string>
<string name="error_400">400 Mauvaise requête</string> <string name="error_400">400 Requête incorrecte</string>
<string name="error_401">401 Non autorisé</string> <string name="error_401">401 Non autorisé</string>
<string name="error_403">403 Interdit</string> <string name="error_403">403 Interdit</string>
<string name="error_404">404 introuvable</string> <string name="error_404">404 Introuvable</string>
<string name="error_sync">Échec de la synchronisation : %1$s</string> <string name="error_sync">Échec de la synchronisation : %1$s</string>
<string name="error_invalid_login">Identifiant invalide : %1$s</string> <string name="error_invalid_login">Identifiant invalide : %1$s</string>
<string name="error_auth">Mauvais nom d\'utilisateur ou mot de passe</string> <string name="error_auth">Mauvais nom d\'utilisateur ou mot de passe</string>
@@ -100,64 +109,78 @@
<string name="error_req_failed">La requête a échoué</string> <string name="error_req_failed">La requête a échoué</string>
<string name="error_invalid_email">Adresse e-mail invalide</string> <string name="error_invalid_email">Adresse e-mail invalide</string>
<string name="error_invalid_project_id">ID de projet invalide</string> <string name="error_invalid_project_id">ID de projet invalide</string>
<string name="error_invalid_project_name">Titre du projet non valide</string> <string name="error_invalid_project_name">Titre de projet invalide</string>
<string name="error_invalid_bill_name">Nom de facture invalide</string> <string name="error_invalid_bill_name">Nom de facture invalide</string>
<string name="error_invalid_bill_date">Date de facture invalide</string> <string name="error_invalid_bill_date">Date de facture invalide</string>
<string name="error_invalid_bill_payer">Payeur requis</string> <string name="error_invalid_bill_payer">Payeur requis</string>
<string name="error_invalid_bill_owers">Propriétaires requis</string> <string name="error_invalid_bill_owers">Participants requis</string>
<string name="error_no_network">Aucune connexion réseau</string> <string name="error_no_network">Aucune connexion réseau</string>
<string name="error_server">Erreur serveur</string> <string name="error_server">Erreur serveur</string>
<string name="error_io">La connexion au serveur a échoué</string> <string name="error_io">La connexion au serveur a échoué</string>
<string name="error_share_impossible">Impossible de partager ce projet</string> <string name="error_share_impossible">Impossible de partager ce projet</string>
<!-- Drawer / Common UI --> <!-- Drawer / Common UI -->
<string name="drawer_no_account">Se connecter au compte Nextcloud</string> <string name="drawer_no_account">Se connecter au compte Nextcloud</string>
<string name="drawer_last_sync">Dernière synchronisation : %1$02d:%2$02d</string> <string name="drawer_last_sync">Dernière synchronisation : %1$02d:%2$02d</string>
<string name="simple_cancel">Abandonner</string> <string name="simple_cancel">Annuler</string>
<string name="simple_ok" tools:ignore="ButtonCase,Typos">Ok</string> <string name="simple_ok" tools:ignore="ButtonCase,Typos">Ok</string>
<string name="simple_yes">Oui</string> <string name="simple_yes">Oui</string>
<string name="simple_no">Non</string> <string name="simple_no">Non</string>
<string name="simple_close">Fermer</string> <string name="simple_close">Fermer</string>
<!-- Settings --> <!-- Settings -->
<string name="settings_appearance">Apparence</string> <string name="settings_appearance">Apparence</string>
<string name="settings_network">Réseau</string> <string name="settings_network">Réseau</string>
<string name="settings_other">Autres</string> <string name="settings_other">Autres</string>
<string name="settings_night_mode">Thème</string> <string name="settings_night_mode">Thème</string>
<string name="settings_offline_mode">Mode hors-ligne</string> <string name="settings_offline_mode">Mode hors ligne</string>
<string name="settings_offline_mode_summary">Synchroniser uniquement manuellement.</string> <string name="settings_offline_mode_summary">Synchroniser uniquement manuellement.</string>
<string name="settings_color_custom">Couleur personnalisée</string> <string name="settings_color_custom">Couleur personnalisée</string>
<string name="settings_color_mode">Sélection de la couleur</string> <string name="settings_color_mode">Sélection de la couleur</string>
<string name="settings_show_archived">Afficher les projets archivés</string> <string name="settings_show_archived">Afficher les projets archivés</string>
<string name="settings_beta_features">Fonctionnalités bêta</string> <string name="settings_beta_features">Fonctionnalités bêta</string>
<string name="settings_beta_features_summary">Activer les fonctionnalités expérimentales. Utiliser à vos propres risques.</string> <string name="settings_beta_features_summary">Activer les fonctionnalités expérimentales. À utiliser à vos risques et périls.</string>
<string name="settings_fill_new_bill_from_last">Pré-remplir depuis la dernière facture</string>
<string name="settings_fill_new_bill_from_last_summary">Reprendre le payeur, la catégorie, le mode et les participants de la dernière facture créée dans le projet.</string>
<string name="settings_auto_sync_on_open">Intervalle de synchronisation</string>
<string name="settings_auto_sync_on_open_summary">Fréquence de rafraîchissement du compte et de tous les projets à l\'ouverture de l\'application.</string>
<string name="pref_value_sync_1m">1 minute</string>
<string name="pref_value_sync_10m">10 minutes</string>
<string name="pref_value_sync_1h">1 heure</string>
<string name="pref_value_sync_1d">1 jour</string>
<string name="settings_url_warn_http">AVERTISSEMENT : \"http\" n\'est pas sûr. Utilisez \"https\".</string> <string name="settings_url_warn_http">AVERTISSEMENT : \"http\" n\'est pas sûr. Utilisez \"https\".</string>
<string name="settings_colorpicker_title">Choisir une couleur</string> <string name="settings_colorpicker_title">Choisir une couleur</string>
<string name="pref_value_color_system">Système</string> <string name="pref_value_color_system">Système</string>
<string name="pref_value_color_server">Nuage suivant</string>
<string name="pref_value_color_manual">Manuelle</string> <string name="pref_value_color_manual">Manuelle</string>
<string name="pref_value_theme_light">Lumière</string> <string name="pref_value_theme_light">Clair</string>
<string name="pref_value_theme_dark">Sombre</string> <string name="pref_value_theme_dark">Sombre</string>
<string name="pref_value_theme_system">Suivre le système</string> <string name="pref_value_theme_system">Suivre le système</string>
<!-- Constants (Do not translate) --> <!-- Constants (Do not translate) -->
<!-- Enums and Lists --> <!-- Enums and Lists -->
<string name="repeat_no">Pas de répétition</string> <string name="repeat_no">Pas de répétition</string>
<string name="repeat_day">Tous les jours</string> <string name="repeat_day">Quotidienne</string>
<string name="repeat_week">Hebdomadaire</string> <string name="repeat_week">Hebdomadaire</string>
<string name="repeat_fortnight">Tous les quinze jours</string> <string name="repeat_fortnight">Toutes les deux semaines</string>
<string name="repeat_month">Mensuel</string> <string name="repeat_month">Mensuelle</string>
<string name="repeat_year">Annuel</string> <string name="repeat_year">Annuelle</string>
<string name="payment_mode_none">Aucun</string> <string name="payment_mode_none">Aucun</string>
<string name="payment_mode_all">Tous</string> <string name="payment_mode_all">Tous</string>
<string name="payment_mode_credit_card">Carte de crédit</string> <string name="payment_mode_credit_card">Carte bancaire</string>
<string name="payment_mode_cash">Espèces</string> <string name="payment_mode_cash">Espèces</string>
<string name="payment_mode_check">Contrôler</string> <string name="payment_mode_check">Chèque</string>
<string name="payment_mode_online">En ligne</string> <string name="payment_mode_online">En ligne</string>
<string name="payment_mode_transfer">Transférer</string> <string name="payment_mode_transfer">Virement</string>
<string name="category_none">Aucun</string>
<string name="category_all">Tous</string> <string name="category_none">Aucune</string>
<string name="category_all_except_reimbursement">Tout sauf remboursement</string> <string name="category_all">Toutes</string>
<string name="category_groceries">Épicerie</string> <string name="category_all_except_reimbursement">Toutes sauf remboursement</string>
<string name="category_leisure">Barre/Fête</string> <string name="category_groceries">Courses</string>
<string name="category_rent">Louer</string> <string name="category_leisure">Bar/Fête</string>
<string name="category_rent">Loyer</string>
<string name="category_bills">Facture</string> <string name="category_bills">Facture</string>
<string name="category_excursion">Excursion/Culture</string> <string name="category_excursion">Excursion/Culture</string>
<string name="category_health">Santé</string> <string name="category_health">Santé</string>
@@ -167,12 +190,11 @@
<string name="category_accomodation">Hébergement</string> <string name="category_accomodation">Hébergement</string>
<string name="category_transport">Transport</string> <string name="category_transport">Transport</string>
<string name="category_sport">Sport</string> <string name="category_sport">Sport</string>
<!-- Project specific --> <!-- Project specific -->
<string name="new_project_action">Qu\'est-ce que</string> <string name="new_project_action">Quoi</string>
<string name="new_project_where"> se trouve</string> <string name="new_project_where"></string>
<string name="where_local">Seulement en local</string> <string name="where_local">Local uniquement</string>
<string name="where_cospend">Codépense</string>
<string name="where_ihatemoney">format@@0 IHateMoney</string>
<string name="todo_join">Rejoindre un projet existant</string> <string name="todo_join">Rejoindre un projet existant</string>
<string name="todo_create">Créer un nouveau projet</string> <string name="todo_create">Créer un nouveau projet</string>
<string name="import_tooltip">Importer depuis un fichier</string> <string name="import_tooltip">Importer depuis un fichier</string>
@@ -180,62 +202,69 @@
<string name="choose_account_project_dialog_impossible">Aucun projet trouvé sur ce compte.</string> <string name="choose_account_project_dialog_impossible">Aucun projet trouvé sur ce compte.</string>
<string name="choose_project_management_action">Projet</string> <string name="choose_project_management_action">Projet</string>
<string name="project_added_success">Le projet a été ajouté avec succès.</string> <string name="project_added_success">Le projet a été ajouté avec succès.</string>
<string name="no_projects_text">Vous n\'avez pas encore de projets.</string> <string name="no_projects_text">Vous n\'avez pas encore de projet.</string>
<string name="configure_account_choice">Configurer le compte Nextcloud</string> <string name="configure_account_choice">Configurer le compte Nextcloud</string>
<string name="add_project_choice">Ajouter un projet manuellement</string> <string name="add_project_choice">Ajouter un projet manuellement</string>
<string name="no_members_text">Aucun membre dans ce projet.</string> <string name="no_members_text">Aucun membre dans ce projet.</string>
<string name="no_bills_text">Aucune facture trouvée.</string> <string name="no_bills_text">Aucune facture trouvée.</string>
<string name="member_already_exists">Ce membre existe déjà.</string> <string name="member_already_exists">Ce membre existe déjà.</string>
<string name="activity_dialog_title">Projet: %1$s</string> <string name="activity_dialog_title">Projet : %1$s</string>
<string name="remove_project_confirmation">Projet %1$s supprimé.</string> <string name="remove_project_confirmation">Projet %1$s supprimé.</string>
<string name="file_saved_success">Fichier enregistré : %1$s</string> <string name="file_saved_success">Fichier enregistré : %1$s</string>
<string name="import_error_header">Échec de l\'importation à la ligne %d</string> <string name="import_error_header">Échec de l\'importation à la ligne %d</string>
<string name="import_error_date">Format de date invalide à la ligne %d</string> <string name="import_error_date">Format de date invalide à la ligne %d</string>
<string name="import_error_owers">Propriétés non valides à la ligne %d</string> <string name="import_error_owers">Participants invalides à la ligne %d</string>
<string name="add_member_dialog_title">Ajouter un membre</string> <string name="add_member_dialog_title">Ajouter un membre</string>
<string name="edit_member_dialog_title">Modifier le membre</string> <string name="edit_member_dialog_title">Modifier le membre</string>
<string name="member_edit_delete">Supprimez</string> <string name="member_edit_delete">Supprimer</string>
<string name="project_edition_no_change">Aucune modification à enregistrer.</string> <string name="project_edition_no_change">Aucune modification à enregistrer.</string>
<!-- Settlement --> <!-- Settlement -->
<string name="center_none">Aucun (optimiste)</string> <string name="center_none">Aucun (optimal)</string>
<string name="settle_who">Qui paie</string> <string name="settle_who">Qui paie</string>
<string name="settle_to_whom">À qui</string> <string name="settle_to_whom">À qui</string>
<string name="settle_how_much">Montant</string> <string name="settle_how_much">Montant</string>
<string name="simple_settle_share">Partager</string> <string name="simple_settle_share">Partager</string>
<string name="simple_create_bills">Créer des factures</string> <string name="simple_create_bills">Créer les factures</string>
<string name="settle_bill_what">Réglement</string> <string name="settle_bill_what">Règlement</string>
<!-- Currencies --> <!-- Currencies -->
<string name="currency_dialog_title">Choisir la devise (%s)</string> <string name="currency_dialog_title">Choisir la devise (%s)</string>
<string name="setting_none">Aucun</string> <string name="setting_none">Aucune</string>
<string name="setting_all">Tous</string> <string name="setting_all">Toutes</string>
<string name="currency_saved_success">Paramètres des devises enregistrés.</string> <string name="currency_saved_success">Paramètres des devises enregistrés.</string>
<string name="main_currency">Devise principale</string> <string name="main_currency">Devise principale</string>
<!-- Statistics --> <!-- Statistics -->
<string name="label_bills_suggested">Catégories suggérées</string> <string name="label_bills_suggested">Catégories suggérées</string>
<string name="label_bills_skip">Ignorer</string> <string name="label_bills_skip">Ignorer</string>
<string name="stats_date_min">A partir de</string> <string name="stats_date_min">Du</string>
<string name="stats_date_max">À</string> <string name="stats_date_max">Au</string>
<string name="stats_who">Membre</string> <string name="stats_who">Membre</string>
<string name="stats_paid">Payé</string> <string name="stats_paid">Payé</string>
<string name="stats_spent">Dépensé</string> <string name="stats_spent">Dépensé</string>
<string name="stats_balance">Solde</string> <string name="stats_balance">Solde</string>
<string name="total">Total : %1$s</string> <string name="total">Total : %1$s</string>
<!-- Errors Extra --> <!-- Errors Extra -->
<string name="error_project_connect_check">Échec de la connexion : %1$s</string> <string name="error_project_connect_check">Échec de la connexion : %1$s</string>
<string name="error_create_remote_project_helper">Échec de la création : %1$s</string> <string name="error_create_remote_project_helper">Échec de la création : %1$s</string>
<string name="error_edit_remote_project_helper">Erreur lors de la mise à jour du projet distant : %1$s</string> <string name="error_edit_remote_project_helper">Erreur lors de la mise à jour du projet distant : %1$s</string>
<string name="remote_project_operation_no_network">Réseau indisponible pour le fonctionnement à distance.</string> <string name="remote_project_operation_no_network">Réseau indisponible pour cette opération distante.</string>
<string name="error_scanning_bill_qr_code">Impossible d\'analyser le code QR.</string> <string name="error_scanning_bill_qr_code">Impossible de lire le QR code.</string>
<string name="error_token_mismatch">Incompatibilité du jeton d\'authentification. Veuillez vous reconnecter.</string> <string name="error_token_mismatch">Jeton d\'authentification invalide. Veuillez vous reconnecter.</string>
<string name="insufficient_access_level">Vous n\'avez pas la permission d\'effectuer cette action.</string> <string name="insufficient_access_level">Vous n\'avez pas la permission d\'effectuer cette action.</string>
<string name="delete_label_confirmation_title">Supprimer l\'étiquette</string> <string name="delete_label_confirmation_title">Supprimer l\'étiquette</string>
<string name="delete_label_confirmation_message">Êtes-vous sûr de vouloir supprimer ce label ?</string> <string name="delete_label_confirmation_message">Voulez-vous vraiment supprimer cette étiquette ?</string>
<!-- About --> <!-- About -->
<string name="about_version">Version %1$s</string> <string name="about_version">Version %1$s</string>
<string name="about_maintainer_title">Mainteneur</string> <string name="about_maintainer_title">Mainteneur</string>
<string name="about_license_title">Licence</string> <string name="about_license_title">Licence</string>
<string name="about_source_title">Code source</string> <string name="about_source_title">Code source</string>
<!-- New constants for backward compatibility or shared use --> <!-- New constants for backward compatibility or shared use -->
<string name="share_intent_title">Projet %1$s</string> <string name="share_intent_title">Projet %1$s</string>
<string name="share_chooser_title">Partager %1$s</string> <string name="share_chooser_title">Partager %1$s</string>
</resources> </resources>
+5 -4
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">Cowspent</string> <string name="app_name" translatable="false">Cowspent</string>
<!-- Actions --> <!-- Actions -->
<string name="action_new_bill">New bill</string> <string name="action_new_bill">New bill</string>
@@ -14,6 +14,7 @@
<string name="action_close_search">Close search</string> <string name="action_close_search">Close search</string>
<string name="action_clear_search">Clear search</string> <string name="action_clear_search">Clear search</string>
<string name="action_delete">Delete</string> <string name="action_delete">Delete</string>
<string name="simple_back">Back</string>
<string name="action_archive">Archive</string> <string name="action_archive">Archive</string>
<string name="action_unarchive">Unarchive</string> <string name="action_unarchive">Unarchive</string>
<string name="action_export">Export</string> <string name="action_export">Export</string>
@@ -152,7 +153,7 @@
<string name="settings_colorpicker_title">Choose Color</string> <string name="settings_colorpicker_title">Choose Color</string>
<string name="pref_value_color_system">System</string> <string name="pref_value_color_system">System</string>
<string name="pref_value_color_server">Nextcloud</string> <string name="pref_value_color_server" translatable="false">Nextcloud</string>
<string name="pref_value_color_manual">Manual</string> <string name="pref_value_color_manual">Manual</string>
<string name="pref_value_theme_light">Light</string> <string name="pref_value_theme_light">Light</string>
<string name="pref_value_theme_dark">Dark</string> <string name="pref_value_theme_dark">Dark</string>
@@ -212,8 +213,8 @@
<string name="new_project_action">What</string> <string name="new_project_action">What</string>
<string name="new_project_where">Where</string> <string name="new_project_where">Where</string>
<string name="where_local">Local only</string> <string name="where_local">Local only</string>
<string name="where_cospend">Cospend</string> <string name="where_cospend" translatable="false">Cospend</string>
<string name="where_ihatemoney">IHateMoney</string> <string name="where_ihatemoney" translatable="false">IHateMoney</string>
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
+3 -1
View File
@@ -25,4 +25,6 @@ android.nonTransitiveRClass=false
org.gradle.warning.mode=all org.gradle.warning.mode=all
android.uniquePackageNames=false android.uniquePackageNames=false
android.dependency.useConstraints=false android.dependency.useConstraints=false
android.r8.strictFullModeForKeepRules=false android.r8.strictFullModeForKeepRules=false
# Enabled parallel sync for Gradle 9.4+
org.gradle.tooling.parallel=true