15 Commits

Author SHA1 Message Date
Jean-Luc Makiola
d7131087cb Merge pull request 'release: cut 0.4.0 — ship German and Brazilian Portuguese' (#9) from release/v0.4.0 into main
All checks were successful
Release — F-Droid repo + Gitea/Codeberg release / detect (push) Successful in 5s
Release — F-Droid repo + Gitea/Codeberg release / release (push) Successful in 12m30s
2026-08-31 19:02:24 +02:00
dfb0a694de release: cut 0.4.0 — the first translated release
Ships the first community translations: German (98%) and Brazilian
Portuguese (100%), both from Weblate, plus the translation infrastructure
and the Codeberg forge move that had accumulated under Unreleased.

A minor bump rather than a patch: two new user-facing languages is a
feature, the way 0.3.0 was cut for Reminders.

versionCode is the derived 400 (MAJOR*10000 + MINOR*100 + PATCH), and
scripts/sync_changelog_to_fastlane.sh generated changelogs/400.txt so the
official F-Droid listing shows this version's "What's New". At 908 chars
it exceeds the script's 500-char advisory and may be truncated in-client
— consistent with past feature releases (0.2.0 ran 1811, 0.3.0 692).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146mhMLZ5AqJSZkADDc92Jz
2026-08-31 18:27:25 +02:00
79970b5c65 l10n: make German and Brazilian Portuguese selectable
The Weblate merge (#8) landed values-de and values-pt-rBR, but
locales_config.xml still listed only `en`. That file is the single source
of truth for which languages the app ships: AppLanguage parses it for the
in-app picker (Settings -> App language) and android:localeConfig points
the system per-app language settings at it. So both translations were
compiled into the APK and reachable by nothing — you could not pick either
one, and only a device already set to de/pt-BR would ever have seen them.

Adds the two BCP-47 tags. Note the tags are `de` and `pt-BR` while the
resource folders are values-de and values-pt-rBR; the `r` is an Android
resource-qualifier artefact and must not appear here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146mhMLZ5AqJSZkADDc92Jz
2026-08-31 18:27:14 +02:00
Jean-Luc Makiola
5b31067e43 Translations update from Weblate (#8)
Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/8
2026-08-31 18:19:53 +02:00
Bernardo Krzysczak
c69ff049a0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (182 of 182 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/pt_BR/
2026-08-21 07:41:09 +00:00
Bernardo Krzysczak
81220d53d1 Added translation using Weblate (Portuguese (Brazil)) 2026-08-20 13:18:29 +00:00
b3091a5aa3 Translated using Weblate (German)
Currently translated at 98.9% (180 of 182 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/de/
2026-08-18 01:04:09 +00:00
Weblate
b1bde2fab5 Translated using Weblate (German)
Currently translated at 98.9% (180 of 182 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/de/
2026-08-18 01:04:09 +00:00
abc381ca24 Translated using Weblate (German)
Currently translated at 98.8% (177 of 179 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/de/
2026-08-14 13:22:24 +00:00
Weblate
1fbd91fe82 Translated using Weblate (German)
Currently translated at 98.8% (177 of 179 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/de/
2026-08-14 13:22:24 +00:00
c2087de639 Added translation using Weblate (German) 2026-08-14 13:22:24 +00:00
Jean-Luc Makiola
c47653c9cb Merge pull request 'Use floret-kit's shared snack chip' (#6) from feat/shared-snack-chip into main
Some checks failed
Release — F-Droid repo + Gitea/Codeberg release / detect (push) Successful in 7s
Release — F-Droid repo + Gitea/Codeberg release / release (push) Has been skipped
Renovate / renovate (push) Failing after 43s
2026-08-02 20:46:11 +02:00
e639e250b7 Use floret-kit's shared snack chip
The undo chip moves into the kit so Calendula's reschedule confirmation is
the same component. Re-pins the kit onto the branch that carries it.
2026-08-02 20:45:39 +02:00
Jean-Luc Makiola
58a50512bf docs: settle the storage and sync direction (#5)
Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/5
2026-08-02 17:58:13 +02:00
Jean-Luc Makiola
1add1fcadb chore: re-pin floret-kit and pass allDay at the date call sites (#4)
Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/4
2026-08-02 17:57:58 +02:00
10 changed files with 438 additions and 55 deletions

View File

@@ -7,7 +7,14 @@ All notable changes to this project are documented here. The format follows
## [Unreleased]
## [0.4.0] - 2026-08-31
### Added
- Agendula now speaks **German** and **Brazilian Portuguese**, the first
community translations. Pick one under **Settings → App language**, or in
Android's own per-app language settings; leave it on *System default* and
Agendula follows your phone. Anything not yet translated falls back to
English.
- Agendula can now be translated. Pick or request a language on Weblate and
translate in the browser — the link sits at the top of the language picker in
**Settings → App language**. Partial translations are fine; anything

View File

@@ -29,8 +29,8 @@ android {
// release itself (versionCode is pinned to MAJOR*10000 + MINOR*100 +
// PATCH from versionName, e.g. 0.2.0 -> 200). The Gitea release is marked
// as a pre-release while MAJOR is 0. See docs/RELEASING.md.
versionCode = 302
versionName = "0.3.2"
versionCode = 400
versionName = "0.4.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

View File

@@ -501,13 +501,17 @@ private fun taskWhenLines(task: Task): Pair<String, String?>? {
val due = task.due
return when {
start != null && due != null -> {
val sameDay = start.formatDate() == due.formatDate()
val primary = if (sameDay) due.formatDate() else "${start.formatDate()} ${due.formatDate()}"
val secondary = if (task.isAllDay) null else "${start.formatTime()} ${due.formatTime()}"
val allDay = task.isAllDay
val sameDay = start.formatDate(allDay) == due.formatDate(allDay)
val primary =
if (sameDay) due.formatDate(allDay)
else "${start.formatDate(allDay)} ${due.formatDate(allDay)}"
val secondary = if (allDay) null else "${start.formatTime()} ${due.formatTime()}"
primary to secondary
}
due != null -> due.formatDate() to if (task.isAllDay) null else due.formatTime()
start != null -> start.formatDate() to if (task.isAllDay) null else start.formatTime()
due != null -> due.formatDate(task.isAllDay) to if (task.isAllDay) null else due.formatTime()
start != null ->
start.formatDate(task.isAllDay) to if (task.isAllDay) null else start.formatTime()
else -> null
}
}

View File

@@ -653,7 +653,7 @@ private fun ScheduleRow(
)
} else {
Text(
text = value.formatDate(),
text = value.formatDate(allDay),
style = MaterialTheme.typography.titleMedium,
color = valueColor,
modifier = Modifier.clickable(onClick = onPick).padding(vertical = 8.dp, horizontal = 6.dp),
@@ -865,7 +865,7 @@ private fun ParentPickerSheet(
GroupedRow(
title = task.title.ifBlank { stringResource(R.string.task_untitled) },
position = positionOf(index, section.tasks.size),
summary = task.due?.formatDate(),
summary = task.due?.formatDate(task.isAllDay),
selected = task.taskId == selectedId,
minHeight = 56.dp,
onClick = { choose(task.taskId) },

View File

@@ -98,6 +98,9 @@ import de.jeanlucmakiola.agendula.domain.TaskSection
import de.jeanlucmakiola.agendula.domain.TaskSections
import de.jeanlucmakiola.agendula.ui.common.priorityAccent
import de.jeanlucmakiola.floret.components.Position
import de.jeanlucmakiola.floret.components.SnackChip
import de.jeanlucmakiola.floret.components.SnackChipHeight
import de.jeanlucmakiola.floret.components.SnackChipMargin
import de.jeanlucmakiola.floret.time.formatDateTimeCompact
import de.jeanlucmakiola.floret.components.pastelize
import de.jeanlucmakiola.floret.components.positionOf
@@ -189,13 +192,18 @@ fun TaskListScreen(
Box(
modifier = Modifier
.align(Alignment.BottomStart)
.padding(start = 16.dp, bottom = inner.calculateBottomPadding() + 16.dp)
.height(56.dp),
.padding(
start = SnackChipMargin,
bottom = inner.calculateBottomPadding() + SnackChipMargin,
)
.height(SnackChipHeight),
contentAlignment = Alignment.CenterStart,
) {
UndoChip(
SnackChip(
visible = undoTarget != null,
onUndo = {
message = stringResource(R.string.task_deleted),
actionLabel = stringResource(R.string.undo),
onAction = {
undoTarget?.let { viewModel.undoDelete(it.taskId) }
undoTarget = null
},
@@ -205,47 +213,6 @@ fun TaskListScreen(
}
}
/**
* A compact floating "snackchip" for an undoable delete — a rounded pill (not a
* full-width snackbar) sized to its content, sliding up from the bottom centre.
*/
@Composable
private fun UndoChip(visible: Boolean, onUndo: () -> Unit, modifier: Modifier = Modifier) {
AnimatedVisibility(
visible = visible,
enter = slideInVertically { it } + fadeIn(),
exit = slideOutVertically { it } + fadeOut(),
modifier = modifier,
) {
Surface(
color = MaterialTheme.colorScheme.surfaceContainerHighest,
contentColor = MaterialTheme.colorScheme.onSurface,
shape = RoundedCornerShape(50),
shadowElevation = 6.dp,
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(start = 20.dp, end = 8.dp, top = 6.dp, bottom = 6.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp),
) {
Text(
text = stringResource(R.string.task_deleted),
style = MaterialTheme.typography.bodyMedium,
)
TextButton(
onClick = onUndo,
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 6.dp),
) {
Text(
text = stringResource(R.string.undo),
style = MaterialTheme.typography.labelLarge,
)
}
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
@Composable
private fun TaskListBody(

View File

@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="back">Zurück</string>
<string name="save">Speichern</string>
<string name="delete">Löschen</string>
<string name="edit">Bearbeiten</string>
<string name="field_description">Beschreibung</string>
<string name="task_deleted">Gelöscht</string>
<string name="app_name">Agendula</string>
<string name="task_untitled">Unbenannte Aufgabe</string>
<string name="tasks_title">Aufgaben</string>
<string name="task_list_empty">Keine Aufgaben bisher.</string>
<string name="task_list_failure">Aufgaben konnten nicht geladen werden.</string>
<string name="smart_no_date">Kein Datum</string>
<string name="smart_completed">Abgeschlossen</string>
<string name="task_detail_title">Aufgabe</string>
<string name="task_detail_not_found">Diese Aufgabe ist nicht mehr verfügbar.</string>
<string name="edit_task_title">Aufgabe bearbeiten</string>
<string name="new_task_title">Neue Aufgabe</string>
<string name="field_title">Titel</string>
<string name="edit_save_failed">Konnte nicht gespeichert werden. Versuche es erneut.</string>
<string name="add_task_hint">Aufgabe hinzufügen</string>
<string name="add_subtask_hint">Unteraufgabe hinzufügen</string>
<string name="cd_add_task">Aufgabe hinzufügen</string>
<string name="cd_complete">Abgeschlossen</string>
<string name="cd_reopen">Erneut öffnen</string>
<string name="undo">Rückgängig</string>
<string name="section_today">Heute</string>
<string name="cd_expand_subtasks">Unteraufgaben anzeigen</string>
<string name="cd_collapse_subtasks">Unteraufgaben ausblenden</string>
<string name="section_overdue">Überfällig</string>
<string name="section_upcoming">Anstehend</string>
<string name="section_no_date">Kein Datum</string>
<string name="section_completed">Abgeschlossen</string>
<string name="priority_none">Keine</string>
<string name="priority_low">Niedrig</string>
<string name="priority_medium">Mittel</string>
<string name="priority_high">Hoch</string>
<string name="detail_mark_complete">Als abgeschlossen markieren</string>
<string name="detail_mark_incomplete">Als nicht abgeschlossen markieren</string>
<string name="detail_list">Liste</string>
<string name="detail_due">Fällig</string>
<string name="detail_start">Beginn</string>
<string name="detail_priority">Priorität</string>
<string name="detail_progress">Fortschritt</string>
<string name="detail_subtasks">Unteraufgaben</string>
<string name="detail_parent">Hauptaufgabe</string>
<string name="detail_part_of">Teil von</string>
<string name="edit_list_label">Liste</string>
<string name="edit_start_label">Beginn</string>
<string name="edit_due_label">Fällig</string>
<string name="edit_all_day">Ganzer Tag</string>
<string name="edit_priority_label">Priorität</string>
<string name="edit_progress_label">Fortschritt</string>
<string name="edit_parent_label">Hauptaufgabe</string>
<string name="edit_parent_none">Keine (Hauptebene)</string>
<string name="edit_parent_search">Aufgaben suchen</string>
<string name="edit_parent_empty">Keine passenden Aufgaben in der Liste gefunden.</string>
<string name="edit_reminder_label">Erinnerungen</string>
<string name="edit_set">Übernehmen</string>
<string name="edit_clear">Leeren</string>
<string name="edit_title_hint">Aufgaben-Titel</string>
<string name="edit_when">Wann</string>
<string name="edit_more_fields">Weitere Felder</string>
<string name="close">Schließen</string>
<string name="dialog_cancel">Abbrechen</string>
<string name="edit_conflict_title">Termin wurde extern geändert</string>
<string name="edit_conflict_body">Die Aufgabe wurde seit der Öffnung wo anders geändert (über Sync oder einer anderen App). Möchtest die Änderungen überschreiben?</string>
<string name="edit_conflict_overwrite">Überschreiben</string>
<string name="reminder_none">Keine</string>
<string name="reminder_at_due">Zum Start der Aufgabe</string>
<string name="reminder_5_min">5 Minuten vorher</string>
<string name="reminder_10_min">10 Minuten vorher</string>
<string name="reminder_30_min">30 Minuten vorher</string>
<string name="reminder_1_hour">1 Stunde vorher</string>
<string name="reminder_1_day">1 Tag vorher</string>
<string name="reminder_custom">Benutzerdefiniert</string>
<string name="reminder_custom_with_value">Benutzerdefiniert (%1$s)</string>
<string name="reminder_custom_set">Übernehmen</string>
<string name="reminder_custom_amount">Anzahl eingeben</string>
<string name="reminder_use_default">Standard verwenden</string>
<string name="reminder_unit_minutes">Minuten</string>
<string name="reminder_unit_hours">Stunden</string>
<string name="reminder_unit_days">Tage</string>
<string name="reminder_unit_weeks">Woche</string>
<string name="settings_list_reminders_title">Erinnerungen (Pro Liste)</string>
<string name="settings_list_reminders_hint">Überschreibe die Standard-Erinnerungen für individuelle Listen</string>
<string name="settings_list_reminder_inherits">Standard (%1$s)</string>
<string name="error_blank_title">Gebe einen Titel ein.</string>
<string name="error_no_list">Wähle eine Liste.</string>
<string name="error_due_before_start">Fälligkeit darf nicht vor dem Start liegen.</string>
<string name="error_reminder_without_due">Setze ein Fälligkeits-Datum für Erinnerungen.</string>
<string name="lists_header">Listen</string>
<string name="new_task">Neue Aufgabe</string>
<string name="lists_failure">Deine Aufgaben konnten nicht gelesen werden.</string>
<string name="lists_empty">Keine Aufgaben-Listen bisher. Füge eine in deiner Aufgaben-App hinzu oder mit der + Schaltfläche.</string>
<string name="smart_today">Heute</string>
<string name="smart_overdue">Überfällig</string>
<string name="smart_upcoming">Anstehend</string>
<string name="smart_all">Alle</string>
<string name="open_count">%1$d offen</string>
<string name="home_today_progress">%1$d von %2$d erledigt</string>
<string name="home_today_remaining">%1$d übrig</string>
<string name="home_today_all_done">Alles erledigt 🎉</string>
<string name="home_today_empty">Heute keine Fälligkeiten 🎉</string>
<string name="home_upcoming_view_all">Alle anzeigen</string>
<string name="home_due_today">Heute</string>
<string name="home_due_tomorrow">Morgen</string>
<string name="home_search_hint">Aufgaben suchen</string>
<string name="home_search_clear">Suche zurücksetzen</string>
<string name="home_search_close">Suche schließen</string>
<string name="home_search_empty">Keine Aufgaben passen zu „%1$s“</string>
<string name="reminder_due_at">Fälligkeiten %1$s</string>
<string name="reminder_channel_name">Aufgaben Erinnerungen</string>
<string name="reminder_channel_desc">Benachrichtigungen für fällige Aufgaben.</string>
<string name="onboarding_no_provider_title">Eine Task-App wird benötigt</string>
<string name="onboarding_no_provider_body">Agendula zeigt und bearbeitet die Aufgaben, die in OpenTasks oder tasks.org gespeichert sind und per DAVx5 synchronisiert werden. Installiere eine davon, um zu starten.</string>
<string name="onboarding_permission_title">Erlaube Zugriff auf deine Aufgaben</string>
<string name="onboarding_permission_body">Agendula benötigt die Berechtigung, deine Aufgaben zu lesen und zu schreiben. Das ist die einzige Berechtigung, die es jemals anfragt.</string>
<string name="onboarding_permission_button">Zugriff gewähren</string>
<string name="onboarding_install_opentasks">Installiere OpenTasks</string>
<string name="onboarding_install_tasksorg">Installiere tasks.org</string>
<string name="reminder_onboarding_title">Verpasse nichts, was fällig ist</string>
<string name="reminder_onboarding_body">Aufgaben-Apps senden selbst keine Erinnerungen, daher liefert Agendula sie für dich. Schalte sie ein, um eine Benachrichtigung zu erhalten, wenn eine Aufgabe fällig ist.</string>
<string name="reminder_onboarding_enable_button">Erinnerungen aktivieren</string>
<string name="reminder_onboarding_skip_button">Nicht jetzt</string>
<string name="reminder_benefit_delivery_title">Agendula erinnert dich</string>
<string name="reminder_benefit_delivery_body">Es plant eine Benachrichtigung für jede Aufgabe mit einem Fälligkeitsdatum.</string>
<string name="reminder_benefit_timing_title">Auf deinem Zeitplan</string>
<string name="reminder_benefit_timing_body">Wähle in den Einstellungen, wie weit im Voraus du erinnert werden möchtest.</string>
<string name="reminder_benefit_reversible_title">Jederzeit änderbar</string>
<string name="reminder_benefit_reversible_body">Schalte Erinnerungen aus, wann immer du willst — es ist nur ein Schalter.</string>
<string name="settings_title">Einstellungen</string>
<string name="settings_section_appearance">Darstellung</string>
<string name="settings_appearance_subtitle">Theme und Farbe</string>
<string name="settings_section_task_form">Aufgaben-Formular</string>
<string name="settings_task_form_subtitle">Standard Felder, Liste und Unter-Aufgaben</string>
<string name="settings_reminders_subtitle">Benachrichtigungen für fällige Aufgaben</string>
<string name="settings_form_fields_hint">Standardmäßig angezeigte Felder — alles Weitere liegt hinter „Weitere Felder“.</string>
<string name="settings_dynamic_color_unavailable">Verfügbar für Android 12 und höher</string>
<string name="settings_about_author">von Jean-Luc Makiola</string>
<string name="settings_about_source">Quellcode</string>
<string name="settings_license">Lizenz</string>
<string name="settings_about_support">Entwicklung unterstützen</string>
<string name="settings_about_version">Version %1$s</string>
<string name="settings_about_logo_desc">Calendula-App-Symbol</string>
<string name="settings_language">App-Sprache</string>
<string name="settings_language_auto">Systemstandard</string>
<string name="settings_report_problem">Problem melden</string>
<string name="settings_report_problem_hint">Öffne den Issue-Tracker</string>
<string name="crash_report_issue_title">Absturzbericht</string>
<string name="settings_theme">Design</string>
<string name="settings_theme_system">System folgen</string>
<string name="settings_theme_light">Hell</string>
<string name="settings_theme_dark">Dunkel</string>
<string name="settings_dynamic_color">Dynamische Farben</string>
<string name="settings_dynamic_color_hint">Verwende Farben aus dem Hintergrundbild</string>
<string name="settings_section_reminders">Erinnerungen</string>
<string name="settings_reminders">Fälligkeits-Erinnerungen</string>
<string name="settings_reminders_hint">Benachrichtige mich wenn eine Aufgabe fällig ist</string>
<string name="settings_default_reminder">Wann erinnern</string>
<string name="settings_exact_alarms">Exakter Zeitpunkt</string>
<string name="settings_exact_alarms_allowed">Die Erinnerungen erfolgen zum exakten Zeitpunkt</string>
<string name="settings_exact_alarms_blocked">Blockiert tippe, um exakte Erinnerungen zu erlauben</string>
<string name="settings_section_tasks">Aufgaben</string>
<string name="settings_default_list">Standard-Liste</string>
<string name="settings_default_list_first">Erste verfügbare Felder</string>
<string name="settings_add_subtask_row">Zeile \"Unteraufgaben hinzufügen\" anzeigen</string>
<string name="settings_add_subtask_row_hint">Ein Eingabefeld am Ende der Unteraufgaben einer aufgeklappten Aufgabe</string>
<string name="settings_bottom_add_bar">Untere Schnellhinzufüge-Leiste</string>
<string name="settings_bottom_add_bar_hint">Füge Aufgaben hinzu, über eine Leiste, die unten an einer Liste angepinnt ist, statt über die schwebende Schaltfläche</string>
<plurals name="reminder_minutes">
<item quantity="one">%1$d Minute vorher</item>
<item quantity="other">%1$d Minuten vorher</item>
</plurals>
<plurals name="reminder_hours">
<item quantity="one">%1$d Stunde vorher</item>
<item quantity="other">%1$d Stunden vorher</item>
</plurals>
<plurals name="reminder_days">
<item quantity="one">%1$d Tag vorher</item>
<item quantity="other">%1$d Tage vorher</item>
</plurals>
<plurals name="reminder_weeks">
<item quantity="one">%1$d Woche vorher</item>
<item quantity="other">%1$d Wochen vorher</item>
</plurals>
<string name="settings_translate">Hilf beim Übersetzen</string>
<string name="settings_translate_hint">Füge eine Sprache auf Weblate hinzu oder verbessere sie</string>
</resources>

View File

@@ -0,0 +1,196 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Agendula</string>
<string name="app_tagline">Um app de tarefas em Material 3 Expressive. \nFlorescendo.</string>
<string name="task_untitled">Tarefa sem título</string>
<string name="back">Voltar</string>
<string name="save">Salvar</string>
<string name="delete">Deletar</string>
<string name="tasks_title">Tarefas</string>
<string name="task_list_empty">Nenhuma tarefa aqui ainda.</string>
<string name="task_list_failure">Não foi possível carregar estas tarefas.</string>
<string name="smart_no_date">Sem data</string>
<string name="smart_completed">Completo</string>
<string name="task_detail_title">Tarefa</string>
<string name="task_detail_not_found">Esta tarefa não existe mais.</string>
<string name="edit">Editar</string>
<string name="edit_task_title">Editar tarefa</string>
<string name="new_task_title">Nova tarefa</string>
<string name="field_title">Título</string>
<string name="field_description">Descrição</string>
<string name="edit_save_failed">Não foi possível salvar. Tente novamente.</string>
<string name="add_task_hint">Adicionar tarefa</string>
<string name="add_subtask_hint">Adicionar subtarefa</string>
<string name="cd_add_task">Adicionar tarefa</string>
<string name="cd_complete">Concluído</string>
<string name="cd_reopen">Reabrir</string>
<string name="task_deleted">Deletado</string>
<string name="undo">Desfazer</string>
<string name="cd_expand_subtasks">Mostrar subtarefas</string>
<string name="cd_collapse_subtasks">Esconder subtarefas</string>
<string name="section_overdue">Prazo expirado</string>
<string name="section_today">Hoje</string>
<string name="section_upcoming">A seguir</string>
<string name="section_no_date">Sem data</string>
<string name="section_completed">Concluído</string>
<string name="priority_none">Nenhuma</string>
<string name="priority_low">Baixa</string>
<string name="priority_medium">Média</string>
<string name="priority_high">Alta</string>
<string name="detail_mark_complete">Marcar como concluído</string>
<string name="detail_mark_incomplete">Marcar como não concluído</string>
<string name="detail_list">Lista</string>
<string name="detail_due">Prazo</string>
<string name="detail_start">Inicia</string>
<string name="detail_priority">Prioridade</string>
<string name="detail_progress">Progresso</string>
<string name="detail_subtasks">Subtarefas</string>
<string name="detail_parent">Tarefa pai</string>
<string name="detail_part_of">Parte de</string>
<string name="percent_complete">%1$d%%</string>
<string name="edit_list_label">Lista</string>
<string name="edit_start_label">Inicia</string>
<string name="edit_due_label">Prazo</string>
<string name="edit_all_day">O dia todo</string>
<string name="edit_priority_label">Prioridade</string>
<string name="edit_progress_label">Progresso</string>
<string name="edit_parent_label">Tarefa pai</string>
<string name="edit_parent_none">Nenhum (primeiro nível)</string>
<string name="edit_parent_search">Buscar tarefas</string>
<string name="edit_parent_empty">Nenhuma tarefa correspondente nesta lista.</string>
<string name="edit_reminder_label">Lembrete</string>
<string name="edit_set">Ajustar</string>
<string name="edit_clear">Limpar</string>
<string name="edit_title_hint">Título da tarefa</string>
<string name="edit_when">Quando</string>
<string name="edit_more_fields">Mais campos</string>
<string name="close">Fechar</string>
<string name="dialog_cancel">Cancelar</string>
<string name="edit_conflict_title">A tarefa foi alterada em outro lugar</string>
<string name="edit_conflict_body">Esta tarefa foi atualizada em outro local (uma sincronização ou outro app) desde que você a abriu. Sobrescrever estas mudanças com suas edições?</string>
<string name="edit_conflict_overwrite">Sobrescrever</string>
<string name="reminder_none">Nenhum</string>
<string name="reminder_at_due">Na hora da tarefa</string>
<string name="reminder_5_min">5 minutos antes</string>
<string name="reminder_10_min">10 minutos antes</string>
<string name="reminder_30_min">30 minutos antes</string>
<string name="reminder_1_hour">1 hora antes</string>
<string name="reminder_1_day">1 dia antes</string>
<string name="reminder_custom">Personalizado</string>
<string name="reminder_custom_with_value">Personalizado (%1$s)</string>
<string name="reminder_custom_set">Ajustar</string>
<string name="reminder_custom_amount">Insira uma quantidade</string>
<string name="reminder_use_default">Usar padrão</string>
<string name="reminder_unit_minutes">Minutos</string>
<string name="reminder_unit_hours">Horas</string>
<string name="reminder_unit_days">Dias</string>
<string name="reminder_unit_weeks">Semanas</string>
<string name="settings_list_reminders_title">Lembretes por lista</string>
<string name="settings_list_reminders_hint">Alterar o lembrete padrão para listas individuais</string>
<string name="settings_list_reminder_inherits">Padrão (%1$s)</string>
<string name="error_blank_title">Insira um título.</string>
<string name="error_no_list">Escolha uma lista.</string>
<string name="error_due_before_start">Prazo não pode ser antes do início.</string>
<string name="error_reminder_without_due">Ajuste um prazo para usar um lembrete.</string>
<string name="lists_header">Listas</string>
<string name="new_task">Nova tarefa</string>
<string name="lists_failure">Não foi possível ler suas tarefas.</string>
<string name="lists_empty">Nenhuma lista de tarefas ainda. Adicione uma no seu app de tarefas ou com o botão +.</string>
<string name="smart_today">Hoje</string>
<string name="smart_overdue">Prazo expirado</string>
<string name="smart_upcoming">A seguir</string>
<string name="smart_all">Tudo</string>
<string name="open_count">%1$d abertos</string>
<string name="home_today_progress">%1$d de %2$d concluídos</string>
<string name="home_today_remaining">%1$d restantes</string>
<string name="home_today_all_done">Tudo pronto 🎉</string>
<string name="home_today_empty">Nada terminando hoje 🎉</string>
<string name="home_upcoming_view_all">Ver tudo</string>
<string name="home_due_today">Hoje</string>
<string name="home_due_tomorrow">Amanhã</string>
<string name="home_search_hint">Buscar tarefas</string>
<string name="home_search_clear">Limpar buscas</string>
<string name="home_search_close">Fechar busca</string>
<string name="home_search_empty">Nenhuma tarefa corresponde a \"%1$s\"</string>
<string name="reminder_due_at">Termina em %1$s</string>
<string name="reminder_channel_name">Lembretes de tarefas</string>
<string name="reminder_channel_desc">Notificações para tarefas com prazo.</string>
<string name="onboarding_no_provider_title">Um app de tarefas é necessário</string>
<string name="onboarding_no_provider_body">O Agendula mostra e edita as tarefas armazenadas no OpenTasks ou tasks.org, sincronizadas pelo DAVx5. Instale um para começar.</string>
<string name="onboarding_permission_title">Permitir acesso às suas tarefas</string>
<string name="onboarding_permission_body">O Agendula precisa de permissão para ler e salvar suas tarefas. É tudo o que ele pede.</string>
<string name="onboarding_permission_button">Conceder acesso às tarefas</string>
<string name="onboarding_install_opentasks">Instalar OpenTasks</string>
<string name="onboarding_install_tasksorg">Instalar tasks.org</string>
<string name="reminder_onboarding_title">Nunca perca seus prazos</string>
<string name="reminder_onboarding_body">Apps de tarefas não enviam lembretes sozinhos, então o Agendula os entrega para você. Ative para receber uma notificação de quando uma tarefa estiver no prazo.</string>
<string name="reminder_onboarding_enable_button">Ativar lembretes</string>
<string name="reminder_onboarding_skip_button">Agora não</string>
<string name="reminder_benefit_delivery_title">O Agendula lembra você</string>
<string name="reminder_benefit_delivery_body">Ele agenda uma notificação para cada tarefa com prazo.</string>
<string name="reminder_benefit_timing_title">Na sua rotina</string>
<string name="reminder_benefit_timing_body">Escolha o quão à frente quer ser lembrado em Ajustes.</string>
<string name="reminder_benefit_reversible_title">Altere a qualquer momento</string>
<string name="reminder_benefit_reversible_body">Desative os lembretes quando quiser — é só um botão.</string>
<string name="settings_title">Ajustes</string>
<string name="settings_section_appearance">Aparência</string>
<string name="settings_appearance_subtitle">Tema e cor</string>
<string name="settings_section_task_form">Formulário de tarefa</string>
<string name="settings_task_form_subtitle">Campos, listas e subtarefas padrão</string>
<string name="settings_reminders_subtitle">Notificações para tarefas com prazo acabando</string>
<string name="settings_form_fields_hint">Campos mostrados por padrão em uma nova tarefa. O resto está atrás de \"Mais campos\".</string>
<string name="settings_dynamic_color_unavailable">Disponível no Android 12 e mais recente</string>
<string name="settings_about_author">por Jean-Luc Makiola</string>
<string name="settings_about_source">Código-fonte</string>
<string name="settings_license">Licença</string>
<string name="settings_about_support">Apoie o desenvolvimento</string>
<string name="settings_about_version">Versão %1$s</string>
<string name="settings_about_logo_desc">Ícone de app do Agendula</string>
<string name="settings_language">Idioma do app</string>
<string name="settings_language_auto">Padrão do sistema</string>
<string name="settings_translate">Ajude a traduzir</string>
<string name="settings_translate_hint">Adicione ou melhore um idioma no Weblate</string>
<string name="settings_report_problem">Relate um problema</string>
<string name="settings_report_problem_hint">Abrir o rastreador de problemas</string>
<string name="crash_report_issue_title">Relatório de quebra</string>
<string name="settings_theme">Tema</string>
<string name="settings_theme_system">Seguir o sistema</string>
<string name="settings_theme_light">Claro</string>
<string name="settings_theme_dark">Escuro</string>
<string name="settings_dynamic_color">Cor dinâmica</string>
<string name="settings_dynamic_color_hint">Usar cores do papel de parede</string>
<string name="settings_section_reminders">Lembretes</string>
<string name="settings_reminders">Lembretes no prazo</string>
<string name="settings_reminders_hint">Me notifique quando uma tarefa estiver no prazo</string>
<string name="settings_default_reminder">Quando lembrar</string>
<string name="settings_exact_alarms">Na hora</string>
<string name="settings_exact_alarms_allowed">Lembretes disparam na mesma hora</string>
<string name="settings_exact_alarms_blocked">Bloqueado — toque para permitir lembretes na hora</string>
<string name="settings_section_tasks">Tarefas</string>
<string name="settings_default_list">Lista padrão</string>
<string name="settings_default_list_first">Primeira lista disponível</string>
<string name="settings_add_subtask_row">Mostrar uma linha \"adicionar subtarefa\"</string>
<string name="settings_add_subtask_row_hint">Um campo Adicionar no fim das subtarefas de uma tarefa expandida</string>
<string name="settings_bottom_add_bar">Barra adicionar-rápido abaixo</string>
<string name="settings_bottom_add_bar_hint">Adicione tarefas de uma barra presa abaixo de uma lista, em vez do botão flutuante</string>
<plurals name="reminder_minutes">
<item quantity="one">%1$d minuto antes</item>
<item quantity="many">%1$d minutos antes</item>
<item quantity="other">%1$d minutos antes</item>
</plurals>
<plurals name="reminder_hours">
<item quantity="one">%1$d hora antes</item>
<item quantity="many">%1$d horas antes</item>
<item quantity="other">%1$d horas antes</item>
</plurals>
<plurals name="reminder_days">
<item quantity="one">%1$d dia antes</item>
<item quantity="many">%1$d dias antes</item>
<item quantity="other">%1$d dias antes</item>
</plurals>
<plurals name="reminder_weeks">
<item quantity="one">%1$d semana antes</item>
<item quantity="many">%1$d semanas antes</item>
<item quantity="other">%1$d semanas antes</item>
</plurals>
</resources>

View File

@@ -8,4 +8,6 @@
-->
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="en" />
<locale android:name="de" />
<locale android:name="pt-BR" />
</locale-config>

View File

@@ -0,0 +1,17 @@
### Added
- Agendula now speaks **German** and **Brazilian Portuguese**, the first
community translations. Pick one under **Settings → App language**, or in
Android's own per-app language settings; leave it on *System default* and
Agendula follows your phone. Anything not yet translated falls back to
English.
- Agendula can now be translated. Pick or request a language on Weblate and
translate in the browser — the link sits at the top of the language picker in
**Settings → App language**. Partial translations are fine; anything
untranslated falls back to English.
### Changed
- Agendula's home is now **Codeberg** (`jlmakiola/agendula`) — that's where the
source, issues, pull requests and releases live. The Source and License links
in Settings, the issue-reporting link and the F-Droid metadata all point there
now. The self-hosted Gitea instance stays as build infrastructure.