Compare commits

...

14 Commits

Author SHA1 Message Date
d7d61dc8b0 chore(deps): update kotlin to v2.4.10
Some checks failed
Translations / check (pull_request) Successful in 27s
CI / ci (pull_request) Failing after 4m13s
2026-07-20 05:01:56 +00:00
b90f07a816 ci(release): push tag to Codeberg before creating the release
All checks were successful
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) Successful in 1m13s
The Codeberg publish step (added but not yet exercised by a release)
would 500 the same way agendula's did: the tag is created via the Gitea
API, which the push mirror doesn't propagate promptly, so a release POST
with target_commitish outruns the mirror and fails on an unknown commit.

Push the tag straight to Codeberg from the runner, then create the
release against that existing tag with no target_commitish. Race-free.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 22:48:30 +02:00
53d42341c0 Merge pull request 'Translations update from Weblate' (!80) from weblate-bot/calendula:weblate-calendula-strings into main
All checks were successful
Release — F-Droid repo + Gitea/Codeberg release / detect (push) Successful in 6s
Release — F-Droid repo + Gitea/Codeberg release / release (push) Has been skipped
Reviewed-on: #80
2026-07-19 09:42:15 +00:00
55ffaad94f Translated using Weblate (German)
All checks were successful
Translations / check (pull_request) Successful in 5s
CI / ci (pull_request) Successful in 4m37s
Currently translated at 97.4% (426 of 437 strings)

Translation: Calendula/Strings
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/calendula/strings/de/
2026-07-19 09:37:33 +00:00
Weblate
5bdde146c1 Translated using Weblate (German)
Currently translated at 97.4% (426 of 437 strings)

Translation: Calendula/Strings
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/calendula/strings/de/
2026-07-19 09:37:33 +00:00
Weblate
97f87fb927 Translated using Weblate (French)
Currently translated at 52.8% (231 of 437 strings)

Translation: Calendula/Strings
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/calendula/strings/fr/
2026-07-19 09:37:33 +00:00
augustin64
469166c0bb Translated using Weblate (French)
Currently translated at 52.8% (231 of 437 strings)

Translation: Calendula/Strings
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/calendula/strings/fr/
2026-07-19 09:37:33 +00:00
Pablo
b10965babe Translated using Weblate (Russian)
Currently translated at 14.1% (62 of 437 strings)

Translation: Calendula/Strings
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/calendula/strings/ru/
2026-07-19 09:37:33 +00:00
Weblate
e5c122a2ee Translated using Weblate (Polish)
Currently translated at 100.0% (437 of 437 strings)

Translation: Calendula/Strings
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/calendula/strings/pl/
2026-07-19 09:37:33 +00:00
Bazyli Cyran
3aefc5c8f8 Translated using Weblate (Polish)
Currently translated at 100.0% (437 of 437 strings)

Translation: Calendula/Strings
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/calendula/strings/pl/
2026-07-19 09:37:33 +00:00
Bazyli Cyran
ecc643ac81 Translated using Weblate (Polish)
Currently translated at 97.2% (417 of 429 strings)

Translation: Calendula/Strings
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/calendula/strings/pl/
2026-07-19 09:37:33 +00:00
8e4d0defa2 Merge pull request 'ci(release): mirror releases to Codeberg (APK + checksum)' (!81) from feat/codeberg-release-publish 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) Has been skipped
Reviewed-on: #81
2026-07-19 09:37:29 +00:00
f459f7d39c ci(release): use CODEBERG_RELEASE_TOKEN secret name
All checks were successful
Translations / check (pull_request) Successful in 6s
CI / ci (pull_request) Successful in 4m29s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 11:23:49 +02:00
6a49539ae5 ci(release): mirror each release to Codeberg with APK + checksum
Publish the signed release APK and a SHA-256 checksum as a Codeberg
release, a direct-download channel for users who don't want F-Droid.
Gitea already push-mirrors branches and tags to Codeberg, but releases
aren't git objects and don't sync, so the pipeline creates the release
over the Codeberg API and attaches calendula_v<version>.apk + .sha256.

Same app-signed APK the F-Droid repo serves, so no added trust surface.
Best-effort (continue-on-error) so a Codeberg outage never fails an
already-published F-Droid release; skips cleanly when CODEBERG_TOKEN is
unset. Upsert + same-name asset replacement keep re-runs safe.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 10:56:13 +02:00
7 changed files with 531 additions and 24 deletions

View File

@@ -1,11 +1,13 @@
name: Release — F-Droid repo + Gitea release
name: Release — F-Droid repo + Gitea/Codeberg release
# A release is cut by merging a release branch into main with a bumped
# versionName (see docs/RELEASING.md). This workflow reads that versionName and,
# if no matching tag exists yet, runs tests, builds + signs the APK, publishes
# it to the F-Droid repo, and only then creates the vX.Y.Z tag + Gitea release
# itself — the tag is an output of the pipeline, not its trigger. Ordinary
# merges (no version bump) fall through `detect` and do nothing.
# it to the F-Droid repo, creates the vX.Y.Z tag + Gitea release, and mirrors
# that release to Codeberg with the signed APK + a SHA-256 checksum as a
# direct-download channel — the tag is an output of the pipeline, not its
# trigger. Ordinary merges (no version bump) fall through `detect` and do
# nothing.
#
# A manual workflow_dispatch (from a branch) runs the re-sign-only recovery
# path: it re-signs the existing F-Droid index with the repo key and re-uploads,
@@ -350,3 +352,88 @@ jobs:
curl -s -X POST -H "Authorization: token $TOKEN" \
-F "attachment=@/tmp/$ASSET" \
"$API/releases/$ID/assets?name=$ASSET" -o /dev/null -w "asset upload HTTP %{http_code}\n"
# Mirror the release to the Codeberg mirror as a direct-download channel
# for users who don't want F-Droid. Gitea already push-mirrors branches +
# tags to Codeberg, but releases aren't git objects so they don't sync —
# we create the release there over the API and attach the signed APK plus
# a SHA-256 checksum. The APK is identical to the F-Droid one (same app
# key), so this adds no trust surface. Best-effort: a Codeberg outage
# (it 504s under load) must never fail an already-published F-Droid
# release. Needs the CODEBERG_RELEASE_TOKEN secret; skips cleanly if unset.
- name: Publish release to Codeberg
if: env.IS_RELEASE == 'true'
continue-on-error: true
env:
TOKEN: ${{ secrets.CODEBERG_RELEASE_TOKEN }}
API: https://codeberg.org/api/v1/repos/jlmakiola/calendula
SHA: ${{ github.sha }}
run: |
set -e
if [ -z "${TOKEN:-}" ]; then
echo "CODEBERG_RELEASE_TOKEN not set — skipping Codeberg publish."
exit 0
fi
TAG="v$VERSION"
APK="app/build/outputs/apk/release/app-release.apk"
if [ ! -f "$APK" ]; then echo "No release APK found — skipping." >&2; exit 1; fi
ASSET_APK="calendula_v${VERSION}.apk"
ASSET_SUM="${ASSET_APK}.sha256"
cp "$APK" "/tmp/$ASSET_APK"
( cd /tmp && sha256sum "$ASSET_APK" > "$ASSET_SUM" )
# Release notes: reuse the section extracted for the Gitea release,
# fall back to the CHANGELOG entry if that step's file is gone.
if [ ! -s release-notes.md ]; then
awk -v ver="$VERSION" '
$0 ~ "^## \\[" ver "\\]" { flag = 1; next }
/^## \[/ { flag = 0 }
flag' CHANGELOG.md > release-notes.md
sed -i -e '/./,$!d' release-notes.md
fi
[ -s release-notes.md ] || echo "_See CHANGELOG.md for ${VERSION}._" > release-notes.md
# The pipeline creates the tag via the Gitea API, which the push mirror
# (sync_on_commit only fires on real git pushes) doesn't propagate
# promptly — so a release POST that carries a target_commitish can
# outrun the mirror and 500 on a commit/tag Codeberg hasn't received.
# Push the tag straight to Codeberg so it's guaranteed present, then
# attach the release to that existing tag with NO target_commitish
# (which is what triggered the 500).
git tag -f "$TAG" "$SHA"
git push -f "https://jlmakiola:${TOKEN}@codeberg.org/jlmakiola/calendula.git" \
"refs/tags/$TAG"
python3 - "$TAG" <<'PY' > cb-payload.json
import json, sys
print(json.dumps({
"tag_name": sys.argv[1],
"name": sys.argv[1],
"body": open("release-notes.md").read(),
"draft": False,
"prerelease": False,
}))
PY
# Upsert (re-run safe). POST also creates the tag at target_commitish
# if the push mirror hasn't synced it yet.
ID=$(curl -s -H "Authorization: token $TOKEN" "$API/releases/tags/$TAG" | jq -r '.id // empty')
if [ -n "$ID" ]; then
curl -s -o /dev/null -w "release PATCH HTTP %{http_code}\n" -X PATCH \
-H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
-d @cb-payload.json "$API/releases/$ID"
else
curl -s -o cb-response.json -w "release POST HTTP %{http_code}\n" -X POST \
-H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
-d @cb-payload.json "$API/releases"
ID=$(jq -r '.id // empty' cb-response.json 2>/dev/null || true)
fi
if [ -z "$ID" ]; then echo "Could not resolve Codeberg release id." >&2; exit 1; fi
# Attach APK + checksum, replacing any prior asset of the same name.
for A in "$ASSET_APK" "$ASSET_SUM"; do
OLD=$(curl -s -H "Authorization: token $TOKEN" "$API/releases/$ID/assets" \
| jq -r --arg n "$A" '.[] | select(.name==$n) | .id')
[ -n "$OLD" ] && curl -s -X DELETE -H "Authorization: token $TOKEN" "$API/releases/$ID/assets/$OLD" >/dev/null || true
curl -s -X POST -H "Authorization: token $TOKEN" \
-F "attachment=@/tmp/$A" \
"$API/releases/$ID/assets?name=$A" -o /dev/null -w "asset $A HTTP %{http_code}\n"
done
echo "Published $TAG to Codeberg."

View File

@@ -475,19 +475,21 @@
<string name="special_dates_default_title_anniversary">Jahrestag von {name} ({year})</string>
<string name="special_dates_default_title_custom">{name}</string>
<string name="settings_week_numbers">Kalenderwochen</string>
<string name="settings_week_numbers_summary">Kalenderwochen der Monatsansicht anzeigen</string>
<string name="settings_week_numbers_summary">Kalenderwochen in Monatsansicht zeigen</string>
<string name="calendars_export_title">Kalender exportieren</string>
<string name="calendars_export_hint">Wähle aus, welche Kalender in die .ics-Datei aufgenommen werden sollen.</string>
<string name="calendars_export_action">Exportieren</string>
<string name="calendars_restore_header">Wiederherstellen</string>
<string name="calendars_restore_action">Aus .ics-Datei wiederherstellen</string>
<string name="calendars_restore_hint">Importiere Ereignisse aus einem Backup oder einer anderen Kalender-App.</string>
<string name="calendars_restore_hint">Einträge von einem Backup oder einer anderen Kalender App importieren.</string>
<string name="import_done_dedup_note">Bereits im Kalender vorhandene Ereignisse wurden übersprungen.</string>
<string name="import_done_added_label">Hinzugefügt</string>
<string name="import_done_skipped_label">Duplikate</string>
<string name="import_done_skipped_label">Dopplungen</string>
<string name="import_button">Importieren</string>
<plurals name="import_title_count">
<item quantity="one">%d Ereignis wird importiert</item>
<item quantity="other">%d Ereignisse werden importiert</item>
</plurals>
<string name="event_detail_duplicate">Duplikate</string>
<string name="reminder_day_tomorrow">Morgen</string>
</resources>

View File

@@ -10,24 +10,24 @@
<string name="app_tagline">Un calendrier moderne.</string>
<string name="state_loading">Chargement…</string>
<string name="state_retry">Réessayer</string>
<string name="state_failure_unknown">Une erreur s\'est produit.</string>
<string name="state_failure_unknown">Une erreur s\'est produite.</string>
<string name="state_failure_permission">Un accès au Calendrier est nécessaire.</string>
<string name="state_failure_permission_action">Autoriser l\'accès</string>
<string name="state_failure_permission_action">Accorder l\'accès</string>
<string name="state_failure_no_calendars">Aucun calendrier configuré.</string>
<string name="state_failure_no_calendars_action">Ouvrir les paramètres du calendrier.</string>
<string name="state_failure_provider">Ne peut pas lire le calendrier.</string>
<string name="permission_rationale_title">Tous les évènements ont été trouvés.</string>
<string name="permission_rationale_body">Calendula a besoin d\'avoir accès à votre calendrier pour afficher et accéder aux événements. C\'est tout ce dont nous avons besoin, aucune données ne sort de votre appareil.</string>
<string name="state_failure_no_calendars_action">Ouvrir les paramètres systèmes du calendrier</string>
<string name="state_failure_provider">Impossible de lire le calendrier.</string>
<string name="permission_rationale_title">Accédez à tous vos évènements, en beauté</string>
<string name="permission_rationale_body">Calendula a besoin d\'accéder à votre calendrier pour afficher et gérer vos évènements. C\'est tout ce qu\'il demande — et rien ne quitte votre appareil.</string>
<string name="permission_request_button">Autoriser l\'accès au calendrier</string>
<string name="permission_denied_title">Accès au calendrier refusé.</string>
<string name="permission_denied_title">Accès au calendrier refusé</string>
<string name="permission_denied_body">Calendula ne peut pas afficher les évènements si elle ne peut pas accéder au calendrier. Vous pouvez l\'autoriser à tout moment dans les paramètres.</string>
<string name="permission_open_settings_button">Ouvrir les paramètres.</string>
<string name="permission_open_settings_button">Ouvrir les paramètres système</string>
<string name="permission_retry_button">Essayer à nouveau</string>
<string name="permission_benefit_private_title">Reste sur votre appareil</string>
<string name="permission_benefit_private_title">Ne quitte pas votre appareil</string>
<string name="permission_benefit_private_body">Vos calendriers sont lus localement et ne quittent jamais le téléphone.</string>
<string name="permission_benefit_sync_title">Tous vos calendriers, réunis</string>
<string name="permission_benefit_privacy_title">Aucun suivi, jamais</string>
<string name="permission_benefit_privacy_body">Aucune collecte de données, aucune analyse, pas de pubs</string>
<string name="permission_benefit_privacy_body">Aucune collecte de données, aucune analyse, pas de pubs.</string>
<string name="permission_privacy_footnote">Reste sur votre appareil - Pas d\'utilisation d\'Internet</string>
<string name="month_prev">Mois précédent</string>
<string name="month_next">Prochain mois</string>
@@ -153,4 +153,130 @@
<string name="event_attendee_needs_action">Aucune réponse</string>
<string name="event_attendee_unknown"></string>
<string name="event_detail_reminders">Rappels</string>
<string name="permission_benefit_sync_body">Google, CalDAV, local - Tout ce qui est synchronisé sur l\'appareil s\'affiche tout simplement.</string>
<string name="event_status_cancelled">Annulé</string>
<plurals name="duration_minutes">
<item quantity="one">%d minute</item>
<item quantity="many">%d minutes</item>
<item quantity="other">%d minutes</item>
</plurals>
<string name="widget_new_event">Nouvel évènement</string>
<string name="widget_next_month">Mois suivant</string>
<string name="filter_title">Calendriers</string>
<string name="agenda_range_custom">Personnaliser…</string>
<string name="settings_section_calendars">Calendriers</string>
<string name="calendars_title">Calendriers</string>
<string name="calendars_backup_header">Sauvegarde</string>
<string name="calendars_auto_backup_every">Chaque %1$s</string>
<string name="backup_channel_name">Sauvegarde</string>
<string name="shortcut_new_event_short">Nouvel évènement</string>
<string name="qs_tile_new_event_label">Nouvel évènement</string>
<string name="event_detail_duplicate">Dupliquer</string>
<string name="event_detail_timezone">Fuseau horaire</string>
<string name="event_availability_free">Disponible</string>
<string name="event_access_private">Privé</string>
<string name="event_access_confidential">Confidentiel</string>
<string name="event_attendee_organizer">Organisateur</string>
<string name="event_attendee_resource">Ressource</string>
<string name="event_detail_self_response">Votre réponse : %1$s</string>
<string name="reminder_default">Rappel par défaut</string>
<plurals name="reminder_minutes">
<item quantity="one">%d minute avant</item>
<item quantity="many">%d minutes avant</item>
<item quantity="other">%d minutes avant</item>
</plurals>
<plurals name="reminder_hours">
<item quantity="one">%d heure avant</item>
<item quantity="many">%d heures avant</item>
<item quantity="other">%d heures avant</item>
</plurals>
<plurals name="reminder_days">
<item quantity="one">%d jour avant</item>
<item quantity="many">%d jours avant</item>
<item quantity="other">%d jours avant</item>
</plurals>
<plurals name="reminder_weeks">
<item quantity="one">%d semaine avant</item>
<item quantity="many">%d semaines avant</item>
<item quantity="other">%d semaines avant</item>
</plurals>
<plurals name="duration_hours">
<item quantity="one">%d heure</item>
<item quantity="many">%d heures</item>
<item quantity="other">%d heures</item>
</plurals>
<plurals name="duration_days">
<item quantity="one">%d jour</item>
<item quantity="many">%d jours</item>
<item quantity="other">%d jours</item>
</plurals>
<plurals name="duration_weeks">
<item quantity="one">%d semaine</item>
<item quantity="many">%d semaines</item>
<item quantity="other">%d semaines</item>
</plurals>
<string name="event_untitled">(Pas de titre)</string>
<string name="reminder_channel_name">Rappels d\'évènement</string>
<string name="reminder_channel_description">Notifications au moment des rappels de vos évènements</string>
<string name="reminder_onboarding_title">Ne manquez jamais un évènement</string>
<string name="reminder_benefit_delivery_title">Vos rappels, libérés</string>
<string name="reminder_benefit_delivery_body">Chaque rappel à vos évènements vous délivre une notification, ponctuelle.</string>
<string name="reminder_onboarding_enable_button">Activer les rappels</string>
<string name="reminder_onboarding_skip_button">Plus tard</string>
<string name="reminder_day_tomorrow">Demain</string>
<string name="reminder_day_yesterday">Hier</string>
<string name="view_month">Mois</string>
<string name="view_week">Semaine</string>
<string name="view_day">Jour</string>
<string name="view_agenda">Agenda</string>
<string name="view_section">Vue</string>
<string name="drawer_jump_to_date">Aller à...</string>
<string name="agenda_header_tomorrow">Demain</string>
<string name="agenda_empty_title">Vous êtes à jour</string>
<string name="agenda_no_more_today">Plus d\'évènements aujourd\'hui</string>
<string name="search_action">Rechercher</string>
<string name="search_hint">Rechercher des évènements</string>
<string name="search_idle_hint">Rechercher parmi vos évènements par titre, lieu, ou notes.</string>
<string name="search_empty">Pas d\'évènements correspondant à “%1$s”.</string>
<string name="widget_agenda_title">À venir</string>
<string name="widget_agenda_label">Agenda Calendula</string>
<string name="widget_month_label">Calendula Mois</string>
<string name="widget_refresh">Actualiser</string>
<string name="settings_section_appearance">Apparence</string>
<string name="settings_theme">Thème</string>
<string name="settings_theme_system">Système</string>
<string name="settings_theme_light">Clair</string>
<string name="settings_theme_dark">Sombre</string>
<string name="settings_default_view">Vue par défaut</string>
<string name="settings_dynamic_color">Couleurs dynamiques</string>
<string name="settings_dynamic_color_unavailable">Nécessite Android 12 ou plus récent</string>
<string name="settings_soften_colors">Adoucir les couleurs du calendrier</string>
<string name="settings_soften_colors_summary">Ajuster les couleurs du calendrier et des évènements au thème. Désactiver pour voir les couleurs brutes issues du calendrier.</string>
<string name="settings_font_headings">Police des titres</string>
<string name="settings_font_body">Police du corps</string>
<string name="settings_font_system">Valeur par défaut du système</string>
<string name="font_atkinson_hyperlegible">Atkinson Hyperlegible</string>
<string name="font_lora">Lora</string>
<string name="settings_font_choose_file">Sélectionner un fichier…</string>
<string name="settings_font_custom_selected">Police personnalisée</string>
<string name="settings_font_import_failed">Impossible d\'interpréter ce fichier comme police</string>
<string name="settings_week_start_auto">Automatique</string>
<string name="settings_week_numbers">Numéros de semaine</string>
<string name="settings_week_numbers_summary">Afficher les numéros de semaine dans la vue par mois</string>
<string name="event_attendee_optional">Optionnel</string>
<string name="agenda_today_action">Aujourd\'hui</string>
<string name="agenda_header_today">Aujourd\'hui</string>
<string name="search_back">Retour</string>
<string name="widget_prev_month">Mois précédent</string>
<string name="widget_today">Aujourd\'hui</string>
<string name="settings_title">Paramètres</string>
<string name="settings_back">Retour</string>
<string name="agenda_range_day">Aujourd\'hui</string>
<string name="agenda_range_this_week">Cette semaine</string>
<string name="back">Retour</string>
<string name="settings_special_dates_reminders">Rappels</string>
<string name="settings_special_dates_grant">Autoriser l\'accès</string>
<string name="dialog_save">Sauvegarder</string>
<string name="calendars_color_label">Couleur</string>
<string name="import_close">Fermer</string>
</resources>

View File

@@ -47,11 +47,11 @@
<string name="event_share_failed">Nie udało się udostępnić tego wydarzenia.</string>
<string name="event_delete_title">Usunąć wydarzenie?</string>
<string name="event_delete_body">Usunięto wydarzenie z Twojego kalendarza i wszystkich zsynchronizowanych urządzeń.</string>
<string name="event_delete_recurring_title">Usuń powtarzające się wydarzenie</string>
<string name="event_delete_recurring_title">Usuń wydarzenie cykliczne</string>
<string name="event_delete_option_occurrence">Tylko to wystąpienie</string>
<string name="event_delete_option_following">To i wszystkie następne wystąpienia</string>
<string name="event_delete_option_series">Wszystkie wystąpienia w serii</string>
<string name="event_edit_recurring_title">Edytuj powtarzające się wydarzenie</string>
<string name="event_edit_recurring_title">Edytuj wydarzenie cykliczne</string>
<string name="event_delete_failed">Nie udało się usunąć tego wydarzenia</string>
<string name="event_delete_write_denied">Calendula wymaga uprawnień do zapisu, aby móc usuwać wydarzenia</string>
<string name="dialog_cancel">Anuluj</string>
@@ -136,7 +136,7 @@
<string name="event_detail_description">Opis</string>
<string name="event_detail_attendees">Uczestnicy</string>
<string name="event_detail_recurrence">Powtarzanie</string>
<string name="event_detail_recurring">Powtarzające się wydarzenie</string>
<string name="event_detail_recurring">Wydarzenie cykliczne</string>
<string name="recurrence_daily">Codziennie</string>
<string name="recurrence_weekly">Co tydzień</string>
<string name="recurrence_monthly">Co miesiąc</string>
@@ -297,4 +297,224 @@
<string name="settings_agenda_range">Zakres agendy</string>
<string name="settings_agenda_range_hint">Jak daleko w przód wyświetlane są wydarzenia na ekranie Agendy.</string>
<string name="settings_agenda_widget_range">Zakres widżetu agendy</string>
<string name="settings_agenda_widget_range_hint">Jak daleko w przód wyświetlane są wydarzenia w widżecie agendy na ekranie domowym.</string>
<string name="settings_agenda_range_bar">Pasek zakresu</string>
<string name="settings_agenda_range_bar_hint">Wyświetl u góry agendy pasek z zakresem widocznych dat oraz przyciskiem umożliwiającym zmianę zakresu na czas trwania sesji</string>
<string name="agenda_range_day">Dzisiaj</string>
<string name="agenda_range_this_week">Bieżący tydzień</string>
<string name="agenda_range_this_month">Bieżący miesiąc</string>
<string name="agenda_range_week">Następne 7 dni</string>
<string name="agenda_range_month">Następne 30 dni</string>
<string name="agenda_range_custom">Niestandardowy…</string>
<string name="agenda_range_custom_hint">Dni</string>
<string name="agenda_range_override_hint">Ustawienie tymczasowe — po ponownym otwarciu aplikacji Calendula przywrócony zostanie zapisany zakres.</string>
<string name="agenda_range_showing_label">Wyświetlanie wszystkich nadchodzących wydarzeń dla</string>
<plurals name="agenda_range_days">
<item quantity="one">%d dzień</item>
<item quantity="few">%d dni</item>
<item quantity="many">%d dni</item>
<item quantity="other">%d dni</item>
</plurals>
<string name="settings_section_views">Widoki</string>
<string name="settings_quick_switch_header">Przycisk szybkiego przełączania</string>
<string name="settings_quick_switch_hint">Wybierz widoki, między którymi można przełączać się przyciskiem w prawym górnym rogu, i przeciągnij je, aby zmienić ich kolejność. Wyłączone widoki pozostaną dostępne w menu nawigacyjnym.</string>
<string name="settings_drawer_order_header">Menu nawigacyjne</string>
<string name="settings_drawer_order_hint">Przeciągnij aby zmienić kolejność widoków w menu nawigacyjnym.</string>
<string name="reorder_drag_handle">Przeciągnij by zmienić kolejność</string>
<string name="settings_section_event_form">Formularz nowego wydarzenia</string>
<string name="settings_form_fields_hint">Pola wyświetlane domyślnie — cała reszta znajduje się pod przyciskiem „Więcej pól”</string>
<string name="settings_autofocus_title">Ustaw kursor na tytule nowego wydarzenia</string>
<string name="settings_autofocus_title_hint">Kiedy tworzysz nowe wydarzenie, umieść kursor w polu tytułu i od razu otwórz klawiaturę.</string>
<string name="settings_color_unsupported">Zezwalaj na kolory w nieobsługiwanych kalendarzach</string>
<string name="settings_color_unsupported_hint">Niektóre kalendarze (np. niektóre CalDAV) nie udostępniają zestawu kolorów; niestandardowy kolor wydarzenia może zostać utracony lub nadpisany przy następnej synchronizacji. Jest to ograniczenie tych kalendarzy, a nie coś, co Calendula może naprawić.</string>
<string name="settings_section_notifications">Powiadomienia</string>
<string name="settings_reminders">Przypomnienia o wydarzeniach</string>
<string name="settings_reminders_hint">Widzisz podwójne przypomnienia? Inna aplikacja kalendarza również je wyświetla — wyłącz je w jednej z nich.</string>
<string name="settings_default_reminder">Domyślne przypomnienie</string>
<string name="settings_default_reminder_allday">Wydarzenia całodniowe</string>
<string name="settings_allday_reminder_time">Godzina przypomnienia o wydarzeniach całodniowych</string>
<string name="settings_allday_reminder_time_hint">Przypomnienia o wydarzeniach całodniowych zostaną pojawiają się o %1$s</string>
<string name="reminder_none">Brak</string>
<string name="reminder_use_default">Użyj domyślnego przypomnienia</string>
<string name="reminder_custom_amount">jednostek</string>
<string name="reminder_custom_set">Ustaw</string>
<string name="settings_calendar_reminders_title">Przypomnienia dla poszczególnych kalendarzy</string>
<string name="settings_calendar_reminders_hint">Zastąp ustawienia domyślne dla wybranych kalendarzy — oddzielnie dla wydarzeń terminowych i całodniowych. Kalendarz może zachować ustawienie domyślne, odrzucić je lub ustawić własne.</string>
<string name="settings_calendar_reminder_inherits">Domyślne (%1$s)</string>
<string name="settings_reliable_delivery">Niezawodne dostarczanie</string>
<string name="settings_reliable_delivery_hint">Android może opóźniać przypomnienia, aby oszczędzać baterię. Dodaj Calendula do wyjątków, żeby przychodziły na czas.</string>
<string name="settings_reliable_delivery_exempt">Wyłączono optymalizację baterii — przypomnienia przychodzą na czas.</string>
<string name="settings_snooze_duration">Długość drzemki</string>
<string name="settings_section_calendars">Kalendarze</string>
<string name="settings_manage_calendars">Zarządzaj kalendarzami</string>
<string name="settings_manage_calendars_hint">Twórz lokalne kalendarze; zarządzaj synchronizowanymi</string>
<string name="settings_section_language">Język</string>
<string name="settings_language">Język aplikacji</string>
<string name="settings_language_auto">Domyślny systemu</string>
<string name="settings_translate">Pomóż w tłumaczeniu</string>
<string name="settings_translate_hint">Dodaj lub ulepsz tłumaczenie w Weblate</string>
<string name="settings_appearance_subtitle">Motyw, domyślny widok, pierwszy dzień tygodnia</string>
<string name="settings_views_subtitle">Kolejność przycisku szybkiego przełączania oraz menu</string>
<string name="settings_event_form_subtitle">Domyślne pola dla nowych wydarzeń</string>
<string name="settings_notifications_subtitle">Przypomnienia o wydarzeniach</string>
<string name="settings_special_dates_subtitle">Urodziny i rocznice kontaktów</string>
<string name="settings_section_special_dates">Szczególne daty kontaktów</string>
<string name="settings_special_dates_enable">Pokaż daty kontaktów</string>
<string name="settings_special_dates_enable_hint">Zsynchronizuj urodziny i inne daty z kontaktów z lokalnymi kalendarzami. Odczytuje kontakty wyłącznie z tego urządzenia — nic nie jest przesyłane, a Twoje kontakty nigdy nie ulegają zmianie.</string>
<string name="settings_special_dates_type_birthday">Urodziny</string>
<string name="settings_special_dates_type_anniversary">Rocznice</string>
<string name="settings_special_dates_type_custom">Inne daty</string>
<string name="settings_special_dates_template">Format tytułu</string>
<string name="settings_special_dates_template_hint">Użyj {name} dla nazwy kontaktu i {year} dla roku (rok urodzenia lub rok rozpoczęcia rocznicy; ukryty, gdy jest nieznany).</string>
<string name="settings_special_dates_reminders">Przypomnienia</string>
<string name="settings_special_dates_show_year">Pokaż rok</string>
<string name="settings_special_dates_show_year_hint">Uwzględniaj {year} w tytułach, jeśli jest znany</string>
<string name="settings_special_dates_sync_now">Synchronizuj teraz</string>
<string name="settings_special_dates_never_synced">Jeszcze nie zsynchronizowano</string>
<string name="settings_special_dates_last_synced">Ostatnio zsynchronizowano %1$s</string>
<string name="settings_special_dates_calendar_hint">Ustaw kolor i widoczność każdego kalendarza w sekcji Kalendarze.</string>
<string name="settings_calendar_reminders_managed_hint">Ustaw w sekcji Szczególne daty kontaktów</string>
<string name="settings_special_dates_paused_title">Wstrzymano</string>
<string name="settings_special_dates_paused_hint">Aplikacja Calendula nie ma już dostępu do Twoich kontaktów, więc te kalendarze nie są aktualizowane.</string>
<string name="settings_special_dates_grant">Przyznaj dostęp</string>
<string name="settings_special_dates_disable_title">Wyłączyć daty kontaktów?</string>
<string name="settings_special_dates_disable_all_message">To spowoduje usunięcie kalendarzy ze szczególnymi datami kontaktów oraz ich wydarzeń. Wszelkie dodane do nich przypomnienia lub notatki zostaną utracone.</string>
<string name="settings_special_dates_disable_type_message">To spowoduje usunięcie kalendarza „%1$s” wraz z jego wydarzeniami. Wszelkie dodane do nich przypomnienia lub notatki zostaną utracone.</string>
<string name="settings_special_dates_disable_confirm">Wyłącz</string>
<string name="dialog_save">Zapisz</string>
<string name="settings_section_about">O aplikacji</string>
<string name="settings_license">Licencja</string>
<string name="settings_license_value">MIT</string>
<string name="settings_about_author">autorstwa Jean-Luc Makiola</string>
<string name="settings_about_source">Kod źródłowy</string>
<string name="settings_about_support">Wesprzyj rozwój</string>
<string name="settings_about_version">Wersja %1$s</string>
<string name="settings_about_logo_desc">Ikona aplikacji Calendula</string>
<string name="settings_report_problem">Zgłoś problem</string>
<string name="settings_report_problem_hint">Wyślij raport o awarii lub otwórz system zgłoszeń</string>
<string name="calendars_title">Kalendarze</string>
<string name="calendars_local_header">Twoje kalendarze</string>
<string name="calendars_local_empty">Brak lokalnych kalendarzy. Utwórz kalendarz, aby zapisywać wydarzenia tylko na tym urządzeniu.</string>
<string name="calendars_add">Dodaj kalendarz</string>
<string name="calendars_disable_hint">Wyłącz kalendarz, aby ukryć go w aplikacji — wraz z jego wydarzeniami, filtrami i selektorami. Nic nie zostanie usunięte, a w każdej chwili możesz go tutaj ponownie włączyć.</string>
<string name="calendars_show_in_app_a11y">Pokaż „%1$s” w aplikacji</string>
<string name="calendars_synced_header">Synchronizowane kalendarze</string>
<string name="calendars_synced_hint">Pochodzą z kont na Twoim urządzeniu. Możesz je tworzyć i edytować w powiązanych z nimi aplikacjach.</string>
<string name="calendars_manage_in_app">Zarządzaj w aplikacji</string>
<string name="calendars_account_menu_a11y">Więcej opcji dla %1$s</string>
<string name="calendars_enable_all">Włącz wszystkie</string>
<string name="calendars_disable_all">Wyłącz wszystkie</string>
<string name="calendars_add_account">Dodaj konto</string>
<string name="calendars_new_title">Nowy kalendarz</string>
<string name="calendars_edit_title">Edytuj kalendarz</string>
<string name="calendars_name_label">Nazwa</string>
<string name="calendars_color_label">Kolor</string>
<string name="calendars_description_hint">Dodaj opis</string>
<string name="calendars_delete_confirm_title">Usunąć kalendarz?</string>
<string name="calendars_delete_confirm_message">„%1$s” oraz wszystkie powiązane z nim wydarzenia zostaną trwale usunięte z tego urządzenia.</string>
<string name="calendars_write_error">Nie udało się zapisać zmiany.</string>
<string name="calendars_backup_header">Kopia zapasowa</string>
<string name="calendars_backup_hint">Kalendarze lokalne nie są nigdzie synchronizowane, więc wyeksportuj je do pliku .ics, aby zachować kopię.</string>
<string name="calendars_backup_action">Eksportuj jako plik .ics</string>
<string name="calendars_export_title">Eksportuj kalendarze</string>
<string name="calendars_export_hint">Wybierz kalendarze, które mają zostać uwzględnione w pliku .ics.</string>
<string name="calendars_export_action">Eksportuj</string>
<string name="calendars_restore_header">Przywróć</string>
<string name="calendars_restore_action">Przywróć z pliku .ics</string>
<string name="calendars_restore_hint">Importuj wydarzenia z kopii zapasowej lub innej aplikacji kalendarza.</string>
<string name="calendars_auto_backup">Automatyczna kopia zapasowa</string>
<string name="calendars_auto_backup_hint">Okresowo eksportuj swoje lokalne kalendarze do folderu jako plik .ics.</string>
<string name="calendars_auto_backup_folder">Folder kopii zapasowej</string>
<string name="calendars_auto_backup_folder_unset">Dotknij by wybrać folder</string>
<string name="calendars_auto_backup_interval">Okres</string>
<string name="calendars_auto_backup_every">Co %1$s</string>
<string name="calendars_auto_backup_interval_min">Minimum 30 minut.</string>
<string name="calendars_auto_backup_status_never">Nie ma jeszcze automatycznych kopii zapasowych</string>
<string name="calendars_auto_backup_status_ok">Ostatnia kopia zapasowa: %1$s</string>
<string name="calendars_auto_backup_status_failed">Ostatnia nieudana kopia zapasowa: %1$s</string>
<string name="backup_channel_name">Kopia zapasowa</string>
<string name="backup_channel_description">Ostrzega, jeśli automatyczne kopie zapasowe wielokrotnie się nie powiodą.</string>
<string name="backup_failed_title">Automatyczna kopia zapasowa nie powiodła się</string>
<string name="backup_failed_text">Calendula nie mogła zapisać pliku kopii zapasowej. Sprawdź folder kopii zapasowej w Ustawieniach.</string>
<string name="calendars_backup_failed">Nie udało się wyeksportować kopii zapasowej.</string>
<plurals name="calendars_backup_done">
<item quantity="one">Wyeksportowano %d wydarzenie.</item>
<item quantity="few">Wyeksportowano %d wydarzenia.</item>
<item quantity="many">Wyeksportowano %d wydarzeń.</item>
<item quantity="other">Wyeksportowano %d wydarzeń.</item>
</plurals>
<string name="import_title">Importuj wydarzenia</string>
<string name="import_target_header">Dodaj do kalendarza</string>
<string name="import_empty">Nie znaleziono wydarzeń w tym w pliku.</string>
<string name="import_failed">Nie udało się odczytać tego pliku.</string>
<string name="import_no_calendar">Brak kalendarza z możliwością zapisu, do którego można zaimportować dane. Najpierw utwórz kalendarz lokalny.</string>
<string name="import_done_title">Import zakończony</string>
<string name="import_done_dedup_note">Wydarzenia znajdujące się już w kalendarzu zostały pominięte.</string>
<string name="import_done_added_label">Dodano</string>
<string name="import_done_skipped_label">Duplikaty</string>
<string name="import_close">Zamknij</string>
<string name="import_warning_recurrence">Niektóre zmienione wystąpienia zdarzeń cyklicznych zostały pominięte.</string>
<string name="import_warning_no_start">Wydarzenie bez określonej godziny rozpoczęcia zostało pominięte.</string>
<string name="import_warning_attendees">Listy gości nie zostały zaimportowane.</string>
<string name="import_warning_timezone">Nieznana strefa czasowa została zastąpiona strefą ustawioną na Twoim urządzeniu.</string>
<string name="import_button">Importuj</string>
<plurals name="import_title_count">
<item quantity="one">Importowanie %d wydarzenia</item>
<item quantity="few">Importowanie %d wydarzeń</item>
<item quantity="many">Importowanie %d wydarzeń</item>
<item quantity="other">Importowanie %d wydarzeń</item>
</plurals>
<plurals name="import_event_count">
<item quantity="one">%d wydarzenie w tym pliku.</item>
<item quantity="few">%d wydarzenia w tym pliku.</item>
<item quantity="many">%d wydarzeń w tym pliku.</item>
<item quantity="other">%d wydarzeń w tym pliku.</item>
</plurals>
<plurals name="import_action">
<item quantity="one">Importuj %d wydarzenie</item>
<item quantity="few">Importuj %d wydarzenia</item>
<item quantity="many">Importuj %d wydarzeń</item>
<item quantity="other">Importuj %d wydarzeń</item>
</plurals>
<plurals name="import_done_imported">
<item quantity="one">Zaimportowano %d wydarzenie.</item>
<item quantity="few">Zaimportowano %d wydarzenia.</item>
<item quantity="many">Zaimportowano %d wydarzeń.</item>
<item quantity="other">Zaimportowano %d wydarzeń.</item>
</plurals>
<plurals name="import_done_skipped">
<item quantity="one">Pominięto %d wydarzenie znajdujące się już w tym kalendarzu.</item>
<item quantity="few">Pominięto %d wydarzenia znajdujące się już w tym kalendarzu.</item>
<item quantity="many">Pominięto %d wydarzeń znajdujących się już w tym kalendarzu.</item>
<item quantity="other">Pominięto %d wydarzeń znajdujących się już w tym kalendarzu.</item>
</plurals>
<string name="shortcut_new_event_short">Nowe wydarzenie</string>
<string name="shortcut_new_event_long">Utwórz nowe wydarzenie</string>
<string name="qs_tile_new_event_label">Nowe wydarzenie</string>
<string name="settings_qs_tile">Dodaj kafelek Szybkich ustawień</string>
<string name="settings_qs_tile_hint">Dodaj kafelek „Nowe wydarzenie” do panelu Szybkich ustawień.</string>
<string name="crash_dialog_title">Aplikacja %1$s uległa awarii</string>
<string name="crash_dialog_message">Aplikacja %1$s została nieoczekiwanie zamknięta przy ostatnim uruchomieniu. Możesz pomóc nam to naprawić, wysyłając zgłoszenie o błędzie. Pozostanie ono na Twoim urządzeniu, dopóki nie zdecydujesz się go udostępnić, i nie zawiera żadnych danych osobowych ani treści z kalendarza — jedynie poniższe szczegóły techniczne.</string>
<string name="crash_dialog_report">Zgłoś</string>
<string name="crash_dialog_dismiss">Nie teraz</string>
<string name="crash_report_issue_title">Raport o awarii</string>
<string name="crash_report_clip_label">Raport o awarii %1$s</string>
<string name="crash_report_copied">Raport skopiowany do schowka</string>
<string name="crash_report_open_failed">Nie udało się otworzyć systemu zgłoszeń. Raport znajduje się w Twoim schowku.</string>
<string name="crash_report_body_template">Dziękujemy za zgłoszenie awarii w aplikacji %1$s. Prosimy o dodanie wszelkich zapamiętanych szczegółów na temat wykonywanych czynności, a następnie przesłanie zgłoszenia.\n\n### Co się wydarzyło\n\n\n### Raport o awarii\n%2$s\n</string>
<string name="crash_report_body_paste">_(Raport był zbyt długi dla tego linku — wklej go tutaj ze schowka)._</string>
<string name="special_dates_calendar_custom">Szczególne daty</string>
<string name="special_dates_default_title_birthday">Urodziny {name} ({year})</string>
<string name="special_dates_default_title_anniversary">Rocznica {name} ({year})</string>
<string name="special_dates_default_title_custom">{name}</string>
<string name="event_detail_duplicate">Duplikuj</string>
<string name="reminder_day_tomorrow">Jutro</string>
<string name="reminder_day_yesterday">Wczoraj</string>
<string name="agenda_no_more_today">Brak zaplanowanych wydarzeń</string>
<string name="settings_soften_colors">Zredukuj intensywność kolorów kalendarza</string>
<string name="settings_soften_colors_summary">Dopasuj intensywność kolorów kalendarza i wydarzeń do motywu. Wyłącz tę opcję, aby wyświetlać oryginalne kolory ze źródła kalendarza.</string>
<string name="settings_agenda_show_today">Zawsze pokazuj dzisiejszy dzień</string>
<string name="settings_agenda_show_today_hint">Zachowaj dzisiejszy dzień na górze agendy i widżetu, nawet gdy nie ma już na dziś żadnych zadań.</string>
<string name="special_dates_calendar_birthday">Urodziny</string>
<string name="special_dates_calendar_anniversary">Rocznice</string>
</resources>

View File

@@ -6,4 +6,60 @@
<item>Days</item>
<item>Weeks</item>
</string-array>
<string name="app_name">Calendula</string>
<string name="app_tagline">Современный календарь.</string>
<string name="state_loading">Загрузка…</string>
<string name="state_retry">Попробовать ещё раз</string>
<string name="state_failure_unknown">Что-то пошло не так.</string>
<string name="state_failure_permission">Требуется доступ к календарю.</string>
<string name="state_failure_permission_action">Предоставить доступ</string>
<string name="state_failure_no_calendars">Нет настроенных календарей.</string>
<string name="state_failure_no_calendars_action">Перейти в системные настройки календаря</string>
<string name="state_failure_provider">Не удалось просмотреть календарь.</string>
<string name="permission_rationale_title">Следите за всеми своими событиями. С красотой</string>
<string name="permission_rationale_body">Calendula требуется доступ к вашему календарю, чтобы показывать и управлять вашими событиями. Это всё, что приложение требует с самого начала и никакая информация не покидает ваш девайс.</string>
<string name="permission_request_button">Дать доступ к календарю</string>
<string name="permission_denied_title">В доступе к календарю отказано</string>
<string name="permission_denied_body">Calendula не может показать события без доступа к календарю. Предоставьте его снова в настройках телефона.</string>
<string name="permission_open_settings_button">Открыть настройки телефона</string>
<string name="permission_retry_button">Попытайтесь снова</string>
<string name="permission_benefit_private_title">Остаётся на вашем устройстве</string>
<string name="permission_benefit_private_body">Ваши календари просматриваются локально и информация никогда не покидает устройство.</string>
<string name="permission_benefit_sync_title">Все ваши календари. Вместе</string>
<string name="permission_benefit_sync_body">Google, CalDAV, локальный календарь всё синхронизированное с устройством просто подключается.</string>
<string name="permission_benefit_privacy_title">Никакого отслеживания. Никогда</string>
<string name="permission_benefit_privacy_body">Ноль телеметрии. ноль аналитики, без рекламы.</string>
<string name="permission_privacy_footnote">Остаётся на устройстве · не требует доступа к интернету</string>
<string name="month_prev">Предыдущий месяц</string>
<string name="month_next">Следующий месяц</string>
<string name="month_today_action">Сегодня</string>
<string name="month_more_actions">Больше действий</string>
<string name="month_open_menu">Открыть меню</string>
<string name="month_action_settings">Настройки</string>
<string name="month_a11y_today_prefix">Сегодня</string>
<string name="week_today_action">Эта неделя</string>
<string name="week_number_label">Нед</string>
<string name="day_today_action">Сегодня</string>
<string name="event_detail_back">Назад</string>
<string name="event_detail_edit">Редактировать</string>
<string name="event_detail_delete">Удалить</string>
<string name="event_detail_share">Поделиться</string>
<string name="event_detail_duplicate">Дублировать</string>
<string name="event_share_chooser_title">Поделиться событием</string>
<string name="event_share_failed">Не удалось поделиться этим событием.</string>
<string name="event_delete_title">Удалить событие?</string>
<string name="event_delete_body">Это событие удалено из вашего календаря и всех устройств с которыми он синхронизирован.</string>
<string name="event_delete_recurring_title">Удалить повторяющееся событие</string>
<string name="event_delete_option_occurrence">Только это событие</string>
<string name="event_delete_option_following">Это и все следующие события</string>
<string name="event_delete_option_series">Все события в последовательности</string>
<string name="event_edit_recurring_title">Редактировать повторяющееся событие</string>
<string name="event_delete_failed">Не удалось удалить событие</string>
<string name="event_delete_write_denied">Calendula требуется доступ для удаления событий</string>
<string name="dialog_cancel">Отмена</string>
<string name="dialog_ok">ОК</string>
<string name="event_edit_new_title">Новое событие</string>
<string name="event_edit_close">Закрыть</string>
<string name="event_edit_save">Сохранить</string>
<string name="event_edit_title_hint">Добавить имя</string>
</resources>

View File

@@ -82,9 +82,24 @@ release work when a merge actually cuts a release:
merged commit, build & sign the release APK with the **app key**, copy it into
the F-Droid repo, generate the per-version changelog, re-sign the index with
the **repo key**, upload `repo/` + `metadata/`, then create the `vX.Y.Z` tag +
Gitea release (CHANGELOG section as notes) and attach the R8 `mapping.txt`
(best-effort). Ordinary merges with no version bump fall through `detect` and
do nothing.
Gitea release (CHANGELOG section as notes), attach the R8 `mapping.txt`, and
mirror the release to **Codeberg** with the signed APK + a SHA-256 checksum
(both best-effort). Ordinary merges with no version bump fall through `detect`
and do nothing.
### Codeberg direct-download channel
Alongside F-Droid, each release is mirrored to the Codeberg repo
(`jlmakiola/calendula`) as a plain download for users who don't want F-Droid.
Gitea already **push-mirrors** branches and tags to Codeberg, but releases
aren't git objects and don't sync, so the pipeline creates the release over the
Codeberg API and attaches `calendula_v<version>.apk` + its `.sha256`. It's the
same APK the F-Droid repo serves (same **app key**), so it adds no trust
surface. The step is best-effort: a Codeberg outage never fails an
already-published F-Droid release, and it skips cleanly if `CODEBERG_RELEASE_TOKEN` is
unset. One-time setup: the repo's **Releases** unit must be enabled and a
`CODEBERG_RELEASE_TOKEN` secret (Codeberg access token, `write:repository` scope) added
to Gitea Actions.
### Manual re-sign / recovery
@@ -103,6 +118,7 @@ for key rotation or repo recovery without publishing a new app version.
| `FDROID_CONFIG_BASE64` | F-Droid `config.yml` (base64) — repo metadata + keystore passwords. |
| `HETZNER_HOST`, `HETZNER_USER`, `HETZNER_PASS` | Upload target for the F-Droid repo. |
| `GITHUB_TOKEN` | Provided by Gitea Actions; used to create the release + attach assets. |
| `CODEBERG_RELEASE_TOKEN` | Codeberg access token (`write:repository` scope) — creates the mirrored Codeberg release + uploads the APK/checksum. Best-effort; if unset the Codeberg step skips. |
The two keys are independent: the **app key** signs APKs; the **repo key**
signs the index (its fingerprint is what users pin). Neither key nor the

View File

@@ -1,6 +1,6 @@
[versions]
agp = "9.2.1"
kotlin = "2.3.21"
kotlin = "2.4.10"
ksp = "2.3.9"
hilt = "2.59.2"
coreKtx = "1.19.0"