diff --git a/.forgejo/ISSUE_TEMPLATE/bug_report.md b/.forgejo/ISSUE_TEMPLATE/bug_report.md index 6a4e08a..16bac83 100644 --- a/.forgejo/ISSUE_TEMPLATE/bug_report.md +++ b/.forgejo/ISSUE_TEMPLATE/bug_report.md @@ -21,9 +21,9 @@ labels: - Calendula version: - Android version: - Device: -- Installed from: +- Installed from: - Affected calendar: - Time zone: diff --git a/.forgejo/ISSUE_TEMPLATE/config.yml b/.forgejo/ISSUE_TEMPLATE/config.yml index 2fc3df8..d0159e0 100644 --- a/.forgejo/ISSUE_TEMPLATE/config.yml +++ b/.forgejo/ISSUE_TEMPLATE/config.yml @@ -6,8 +6,8 @@ contact_links: - name: Translate Calendula url: https://weblate.dev.jeanlucmakiola.de/engage/calendula/ about: >- - Translations are managed on Weblate, not here — it owns every values-* - file, so a hand-edited translation gets overwritten on the next sync. + Translations are managed on Weblate. It owns every values-* file, so a + hand-edited translation gets overwritten on the next sync. No coding needed: pick or request a language and translate in the browser. - name: Contributing guide diff --git a/.forgejo/ISSUE_TEMPLATE/crash_report.md b/.forgejo/ISSUE_TEMPLATE/crash_report.md index 4626077..4cd9dee 100644 --- a/.forgejo/ISSUE_TEMPLATE/crash_report.md +++ b/.forgejo/ISSUE_TEMPLATE/crash_report.md @@ -1,6 +1,6 @@ --- name: Crash report -about: Report a crash. Calendula can capture this for you (Settings → Report a problem, or the prompt after a crash) — it copies the report to your clipboard and prefills this form. +about: Report a crash. Calendula can capture this for you (Settings → Report a problem, or the prompt after a crash). It copies the report to your clipboard and prefills this form. title: "Crash: " labels: - bug @@ -11,10 +11,10 @@ labels: ### What happened diff --git a/.forgejo/ISSUE_TEMPLATE/feature_request.md b/.forgejo/ISSUE_TEMPLATE/feature_request.md index 342118d..ef33df4 100644 --- a/.forgejo/ISSUE_TEMPLATE/feature_request.md +++ b/.forgejo/ISSUE_TEMPLATE/feature_request.md @@ -9,7 +9,7 @@ labels: ### What would you like Calendula to do? -### Why — what problem does it solve? +### What problem does it solve? ### Anything else diff --git a/.forgejo/PULL_REQUEST_TEMPLATE.md b/.forgejo/PULL_REQUEST_TEMPLATE.md index 48026ec..ab2714c 100644 --- a/.forgejo/PULL_REQUEST_TEMPLATE.md +++ b/.forgejo/PULL_REQUEST_TEMPLATE.md @@ -5,7 +5,7 @@ Please skim CONTRIBUTING.md if you haven't: https://codeberg.org/jlmakiola/calendula/src/branch/main/CONTRIBUTING.md Two things it's easy to get wrong: - • Features need a discussed issue first — an undiscussed feature PR may be + • Features need a discussed issue first. An undiscussed feature PR may be closed unmerged even when the code is good. • Target the release branch for your issue's milestone (milestone 2.18.0 → release/v2.18.0), not main. If you targeted main, just say so below and it @@ -17,7 +17,7 @@ Two things it's easy to get wrong: ### Why - + ### How it was tested @@ -34,7 +34,7 @@ are especially useful for UI changes. ### Checklist - [ ] There's an issue for this, and (for a feature) it got a go-ahead -- [ ] Targeting the release branch for that issue's milestone — or `main`, noted above +- [ ] Targeting the release branch for that issue's milestone (or `main`, noted above) - [ ] `./gradlew lint test assembleDebug` passes locally - [ ] No `values-*/strings.xml` touched (Weblate owns those; new English strings in `values/` are fine) - [ ] `CHANGELOG.md` updated under `## [Unreleased]`, if the change is user-visible diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index 29ef449..bbd018a 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -43,6 +43,19 @@ jobs: - name: Changelog length invariant run: bash scripts/check_changelog_lengths.sh + # The whole listing goes to Play with every release; a field over its cap + # or an image Play rejects would fail that upload. + - name: Store listing invariant + run: | + if ! command -v python3 >/dev/null 2>&1; then + if command -v apt-get >/dev/null 2>&1; then + apt-get update && apt-get install -y python3 + elif command -v apk >/dev/null 2>&1; then + apk add --no-cache python3 + fi + fi + python3 scripts/check_store_listing.py + # Decide whether anything that affects the app build changed. Docs, store # metadata, licence texts and forge housekeeping don't, so those PRs skip # the SDK + Gradle work below but still report a green `ci`. diff --git a/CHANGELOG.md b/CHANGELOG.md index 20fd1a2..d9e1416 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - **Split view opens with the month's agenda.** It starts at today in the current month; tapping a day filters the list, and the filter chip restores the full month. Swiping the list moves by day when filtered and by month otherwise ([#142]). - **Today stands out in the month grid.** Its whole cell has a distinct background; tapping Today briefly expands that cell and nudges its neighbours aside ([#241]). +- **Store listing in every app language.** Google Play and F-Droid show the description in all 16 languages the app ships, and each release publishes the Play listing from the repository ([#285]). ### Fixed - **Multi-day events stay above shorter events.** Month and Week bars, Split day lists, and Agenda now place multi-day events before one-day all-day events, then timed events; declined events remain last ([#291]). @@ -1787,3 +1788,4 @@ automatically, with zero telemetry and no internet permission. [#304]: https://codeberg.org/jlmakiola/calendula/issues/304 [#321]: https://codeberg.org/jlmakiola/calendula/issues/321 [#329]: https://codeberg.org/jlmakiola/calendula/issues/329 +[#285]: https://codeberg.org/jlmakiola/calendula/issues/285 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5948114..651401b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,13 +1,13 @@ # Contributing to Calendula Calendula is a Material 3 Expressive calendar app that lives strictly on top of -Android's `CalendarContract` — no app database, no sync stack, no network access. -That constraint shapes most review comments, so -[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) is worth skimming before you write -code. This file is the practical how. +Android's `CalendarContract`, with no app database, sync stack or network access. +That constraint shapes most review comments, so skim +[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) before you write code. This file +covers the practical side. -**[Codeberg](https://codeberg.org/jlmakiola/calendula) is the canonical home** — -issues, pull requests, releases. The self-hosted Gitea instance referenced in the +[Codeberg](https://codeberg.org/jlmakiola/calendula) is the canonical home for +issues, pull requests and releases. The self-hosted Gitea instance referenced in the release docs is build infrastructure only; there is nothing to contribute there. Be decent to the people you meet in the tracker. @@ -18,20 +18,20 @@ Be decent to the people you meet in the tracker. | Add a feature | **Open an issue first** and wait for a go-ahead | | Fix a bug | Open an issue, then a pull request | | Fix a typo, a comment, or docs | Just open the pull request | -| Add or fix a translation | **Don't** — [use Weblate](#translations) | +| Add or fix a translation | Use [Weblate](#translations), not a pull request | Features get an opinion before they get code: whether Calendula should do a thing at all is the one decision a patch can't make. A feature PR that arrives -without a discussed issue may be closed unmerged even when the code is good — +without a discussed issue may be closed unmerged even when the code is good, so please don't spend a weekend on one first. Bugs are more straightforward, but still start with an issue: it's what carries the milestone and gives the changelog something to link. Issue templates cover bug, crash, feature and question. For a crash, let the app -do the work — **Settings → Report a problem**, or the prompt shown after a crash, +do the work: *Settings → Report a problem*, or the prompt shown after a crash, captures the stack trace and prefills the form. The report contains app, Android -and device versions plus the trace; no calendar content, no personal data. +and device versions plus the trace, and no calendar content or personal data. ## Which branch to target @@ -45,20 +45,20 @@ Once your issue has a milestone, that milestone names your branch: | `2.18.0` | `release/v2.18.0` | Every milestone has a matching branch. If it's somehow missing, target `main` and -mention it in the PR — it will be retargeted. Don't pick an older release branch: +mention it in the PR, and it will be retargeted. Don't pick an older release branch: they're kept after shipping, so the newest one isn't necessarily yours. ## Translations -**Never edit a `values-*/strings.xml` file in a pull request** — German included. +**Never edit a `values-*/strings.xml` file in a pull request**, German included. Translations are owned by a self-hosted Weblate that writes to this repository directly, and a hand-edit is overwritten on the next sync. -→ **[Translate Calendula on Weblate](https://weblate.dev.jeanlucmakiola.de/engage/calendula/)** +[Translate Calendula on Weblate](https://weblate.dev.jeanlucmakiola.de/engage/calendula/) Adding a *new* English string to `values/strings.xml` is normal PR work; Weblate picks it up and offers it to translators. Partial translations are expected and -fine — missing keys are informational. Stale and orphaned keys are not, so run +fine; missing keys are informational. Stale and orphaned keys are not, so run ```sh python3 scripts/check_translations.py @@ -67,7 +67,7 @@ python3 scripts/check_translations.py before pushing. It reports those more clearly than lint's `MissingTranslation` does. -## Build & test +## Build and test ```sh git clone --recurse-submodules https://codeberg.org/jlmakiola/calendula.git @@ -77,11 +77,11 @@ The `floret-kit` submodule is a composite build compiled from source. An existing clone needs `git submodule update --init --recursive`, or nothing resolves. -- **JDK 17** — not newer; the Android Gradle Plugin requires exactly 17. Set +- **JDK 17**, not newer: the Android Gradle Plugin requires exactly 17. Set `JAVA_HOME` if your default differs. -- **Android SDK** — platform 37 (`compileSdk`) and build-tools 36.0.0, located +- **Android SDK**: platform 37 (`compileSdk`) and build-tools 36.0.0, located via `ANDROID_HOME` or a gitignored `local.properties` with `sdk.dir`. If you - go the `local.properties` route the included build needs its own copy at + go the `local.properties` route, the included build needs its own copy at `floret-kit/local.properties`; `ANDROID_HOME` covers both at once and is the easier path. @@ -109,21 +109,21 @@ These are the ones that turn into review comments. 1. **No network.** Calendula holds no `INTERNET` permission, and that's a feature rather than an oversight. Anything that would need one is a product - decision before it's a patch — the crash reporter deliberately opens a - prefilled web issue instead of posting anything itself. + decision before it's a patch. The crash reporter opens a prefilled web issue + on purpose instead of posting anything itself. 2. **The provider is the only database.** No Room, no cache, no local mirror of events. `CalendarContract` is the single source of truth, which is also why externally synced changes work for free. 3. **Don't patch UI state after a write.** A `ContentObserver` re-queries and views recompose from fresh provider state. Hand-patching a list after saving - appears to work, then quietly diverges from what the provider actually stored. + appears to work, then drifts away from what the provider stored. 4. **`domain/` has no Android imports.** Models, validation, recurrence rendering, conflict snapshots and the `.ics` codec stay pure Kotlin so they remain JVM-testable. 5. **Tests run on the JVM.** JUnit 5 + Truth + Turbine. The seams exist for you: fake the data source (`FakeCalendarDataSource`), and feed mappers plain maps through `ColumnReader` instead of cursors. Instrumented tests are a last - resort, not a default. + resort. 6. **Read before touching the subtle pipelines.** Recurring writes (UNTIL vs DURATION, exception URIs, series splits), save-conflict detection and reminder delivery (post-before-mark) follow provider-driven rules that are documented @@ -138,14 +138,14 @@ These are the ones that turn into review comments. ## UI conventions Material 3 Expressive throughout, built from the system's own tokens and -components — colour-scheme tokens rather than hardcoded colours, `ListItem` for +components: colour-scheme tokens rather than hardcoded colours, `ListItem` for settings rows. **Selection pickers are full-screen.** Every browse-style "choose one" surface uses floret-kit's `FullScreenPicker` / `OptionPicker`; one that needs a commit or extra action passes it through the picker's `actions` slot. The exception is the recurring-scope chooser (*this / this and following / all*), which stays a -compact dialog — a two- or three-option decision reads better as a popup than as +compact dialog, because a two- or three-option decision reads better as a popup than as a nearly empty screen. `AlertDialog` is for plain confirmations only, and radio- or text-list dialogs aren't used at all. @@ -154,7 +154,7 @@ Shared UI machinery lives in the `floret-kit` submodule and has changing it means a pull request against that repository plus a submodule bump here. -## Commits & pull requests +## Commits and pull requests Conventional commits, scoped to the area you touched: @@ -165,13 +165,13 @@ docs(architecture): record what the second review pass changed ``` Types in use: `feat` `fix` `docs` `refactor` `style` `chore` `ci` `build` -`revert`. Reference the issue in the subject or the body. Keep commits small — -small commits revert cleanly, which matters more here than a tidy history. +`revert`. Reference the issue in the subject or the body. Keep commits small. +Small commits revert cleanly, which matters more here than a tidy history. If your change is user-visible, add an entry under `## [Unreleased]` in [`CHANGELOG.md`](CHANGELOG.md). Match the surrounding voice: entries describe -what changed *for the person using the app*, and why, not what changed in the -code. Link the issue and add its reference at the bottom of the file. It may get +what changed *for the person using the app*, and why. Code changes don't go +there. Link the issue and add its reference at the bottom of the file. It may get reworded when the release is cut, so don't agonise over it. Please don't commit planning or design documents. Code, tests, architecture notes diff --git a/README.md b/README.md index 88157f8..a09d840 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@
A modern Material 3 Expressive calendar for Android.
-Reads, writes, and reminds — on top of the system calendar, with zero network access.
A Material 3 Expressive calendar for Android.
+It works on top of the system calendar and has no network access.
@@ -26,84 +26,89 @@ Reads, writes, and reminds — on top of the system calendar, with zero network
-
-
-
-
-
-
+
+
+
+
+
+
+
` if the track holds
+more than one release).
-**Screenshots and graphics are skipped**, because the committed assets satisfy
-F-Droid but not Play:
+The listing tree is guarded by `scripts/check_store_listing.py`, which CI runs
+on every pull request:
-| Asset | Committed | Play requires |
-| --- | --- | --- |
-| `phoneScreenshots/*.png` | 1280×2856, 32-bit RGBA | long edge ≤ 2× short edge (so ≤ 2560), 24-bit PNG, no alpha |
-| `icon.png` | 512×512, 24-bit RGB | 512×512, 32-bit PNG |
-| `featureGraphic.png` | *missing* | required, exactly 1024×500 |
+| Rule | Play limit |
+| --- | --- |
+| `title.txt` / `short_description.txt` / `full_description.txt` | 30 / 80 / 4000 chars, all three present in every locale |
+| `full_description.txt` | one line per paragraph — Play renders every newline |
+| `images/icon.png` | 512×512, 32-bit PNG |
+| `images/featureGraphic.png` | 1024×500, JPEG or 24-bit PNG |
+| `images/*Screenshots/*` | JPEG or 24-bit PNG (no alpha), sides 320–3840, long edge ≤ 2× short, 2–8 per type |
+| locale directories | exactly the ones in `fastlane/store-locales.txt`, which maps every app `values-*` to a Play locale code |
-Until those are fixed, Play's graphics are managed by hand in the console. Then
-pass `images:true` to the `listing` lane.
+A locale without its own images falls back to en-US in both stores, so graphics
+only need to exist there. Adding an app language means adding its line to
+`fastlane/store-locales.txt` and its listing directory — CI fails until both
+exist. Store text is not on Weblate; it is edited here.
**Track.** Uploads go straight to `production` at a full rollout
(`PLAY_RELEASE_STATUS=completed`). The merge to `main` is already the human
diff --git a/fastlane/Fastfile b/fastlane/Fastfile
index afdde8a..e6be773 100644
--- a/fastlane/Fastfile
+++ b/fastlane/Fastfile
@@ -8,9 +8,9 @@
# the one build whose byte-for-byte output is verified by a third party.
#
# What fastlane IS here for is `supply` — the Play Developer API client — because
-# the store listing already lives in fastlane/metadata/android, which the
-# official F-Droid repo harvests from the tagged source tree. One metadata tree,
-# two stores.
+# the store listing lives in fastlane/metadata/android, which the official
+# F-Droid repo harvests from the tagged source tree. One metadata tree, two
+# stores; nothing about the Play listing is edited in the console.
default_platform(:android)
@@ -21,8 +21,18 @@ def project_path(path)
File.expand_path(path, File.expand_path("..", FastlaneCore::FastlaneFolder.path || "."))
end
+# Listing text, graphics and screenshots all come from fastlane/metadata/android;
+# scripts/check_store_listing.py keeps the tree within Play's rules on every PR.
+LISTING = {
+ skip_upload_metadata: false,
+ skip_upload_images: false,
+ skip_upload_screenshots: false,
+ # Only re-upload graphics whose content changed.
+ sync_image_upload: true,
+}.freeze
+
platform :android do
- desc "Upload an already-built, already-signed AAB to Play"
+ desc "Upload an already-built, already-signed AAB to Play, with the store listing"
lane :deploy do |options|
aab = project_path(options[:aab] || "app/build/outputs/bundle/release/app-release.aab")
UI.user_error!("AAB not found at #{aab}") unless File.exist?(aab)
@@ -36,52 +46,29 @@ platform :android do
# gets the bundle. Never let the uploader reach for the other artifact.
skip_upload_apk: true,
- # Listing text is synced deliberately via the `listing` lane, not on every
- # release. Overwriting a live listing by accident triggers a Play policy
- # review, which is not a quick revert.
- skip_upload_metadata: true,
-
- # "What's New" DOES track every release.
- # scripts/sync_changelog_to_fastlane.sh writes
- # fastlane/metadata/android/en-US/changelogs/.txt from
- # CHANGELOG.md, so Play shows exactly the text F-Droid does.
+ # "What's New" tracks every release: changelogs/.txt, the
+ # same file F-Droid shows.
skip_upload_changelogs: false,
- # See the `listing` lane for why the committed images can't go to Play yet.
- skip_upload_images: true,
- skip_upload_screenshots: true,
-
# Dry run: validate the edit against the API and roll it back instead of
# committing it. Used for the first end-to-end rehearsal.
validate_only: options[:dry_run].to_s == "true",
+ **LISTING,
)
end
- desc "Sync the store listing text (and, once the assets qualify, the images)"
+ desc "Push only the store listing, e.g. a listing fix between releases"
lane :listing do |options|
- # Deliberate and manual: `bundle exec fastlane listing`. Not wired into the
- # release pipeline.
- #
- # Images stay off by default because the committed assets do not satisfy
- # Play today, even though F-Droid accepts all of them:
- #
- # * phoneScreenshots are 1280x2856. Play caps the long edge at twice the
- # short edge (2560 here), so every screenshot is rejected.
- # * those PNGs are 32-bit RGBA. Play wants 24-bit PNG, no alpha.
- # * icon.png is 512x512 but 24-bit RGB. Play's icon wants 32-bit PNG.
- # * there is no featureGraphic.png. Play requires one, exactly 1024x500.
- #
- # Until that is fixed, the Play listing's graphics are managed by hand in the
- # console. Pass images:true once the assets qualify.
- upload_images = options[:images].to_s == "true"
-
+ # supply still anchors the edit on a release: pass version_code: when the
+ # track holds more than one.
supply(
+ track: options[:track] || "production",
+ version_code: options[:version_code],
skip_upload_aab: true,
skip_upload_apk: true,
- skip_upload_metadata: false,
skip_upload_changelogs: true,
- skip_upload_images: !upload_images,
- skip_upload_screenshots: !upload_images,
+ validate_only: options[:dry_run].to_s == "true",
+ **LISTING,
)
end
end
diff --git a/fastlane/metadata/android/ar/full_description.txt b/fastlane/metadata/android/ar/full_description.txt
new file mode 100644
index 0000000..3935f80
--- /dev/null
+++ b/fastlane/metadata/android/ar/full_description.txt
@@ -0,0 +1,11 @@
+Calendula تطبيق تقويم مفتوح المصدر لنظام أندرويد. يعمل مباشرةً على مزوّد التقويم في النظام، لذا يظهر في Calendula كل ما يُزامَن مع جهازك (Nextcloud عبر DAVx5، وGoogle، والتقويمات المحلية، واشتراكات WebCal)، وتُزامَن التغييرات التي تجريها بالطريقة نفسها.
+
+يوفّر عرض الشهر والأسبوع واليوم وجدول الأعمال. يمكنك إنشاء الأحداث وتعديلها وحذفها، بما فيها الأحداث المتكررة، وضبط التكرار من خيارات جاهزة أو بقواعدك الخاصة. عند تعديل حدث متكرر تختار إن كان التعديل يخص هذا الحدث وحده، أو هذا الحدث وكل ما يليه، أو السلسلة كاملة.
+
+يعرض Calendula تذكيرات أحداثك كإشعارات. المس الإشعار لفتح الحدث.
+
+إذا فعّلت ذلك، يعرض Calendula أيضًا أعياد ميلاد جهات اتصالك وذكرياتهم السنوية وتواريخ أخرى. تُقرأ جهات الاتصال على جهازك ولا تُرفع أو تُعدَّل أبدًا. ينسخ Calendula التواريخ إلى تقويمات محلية تتحكم فيها أنت.
+
+التصميم Material 3 Expressive في كل مكان، مع ألوان ديناميكية وحركة وأشكال معبّرة.
+
+لا يحتوي Calendula على أي قياس عن بُعد أو تحليلات أو وصول إلى الشبكة. بياناتك لا تغادر جهازك أبدًا.
diff --git a/fastlane/metadata/android/ar/short_description.txt b/fastlane/metadata/android/ar/short_description.txt
new file mode 100644
index 0000000..9ad49ff
--- /dev/null
+++ b/fastlane/metadata/android/ar/short_description.txt
@@ -0,0 +1 @@
+تقويم بتصميم Material 3 Expressive لنظام أندرويد دون أي وصول إلى الشبكة.
diff --git a/fastlane/metadata/android/ar/title.txt b/fastlane/metadata/android/ar/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/ar/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/be/full_description.txt b/fastlane/metadata/android/be/full_description.txt
new file mode 100644
index 0000000..0a2ea27
--- /dev/null
+++ b/fastlane/metadata/android/be/full_description.txt
@@ -0,0 +1,11 @@
+Calendula — праграма-каляндар з адкрытым зыходным кодам для Android. Яна працуе непасрэдна з сістэмным пастаўшчыком календароў, таму ўсё, што сінхранізуецца з вашай прыладай (Nextcloud праз DAVx5, Google, лакальныя календары, падпіскі WebCal), з'яўляецца ў Calendula, а вашы змены сінхранізуюцца назад тым жа шляхам.
+
+Ёсць віды «Месяц», «Тыдзень», «Дзень» і «Парадак дня». Вы можаце ствараць, змяняць і выдаляць падзеі, у тым ліку паўтаральныя, і задаваць паўтор з гатовых варыянтаў або сваімі правіламі. Пры змене паўтаральнай падзеі вы выбіраеце, ці датычыцца змена толькі гэтай падзеі, яе і ўсіх наступных або ўсёй серыі.
+
+Calendula паказвае напаміны пра падзеі ў выглядзе апавяшчэнняў. Націсніце на апавяшчэнне, каб адкрыць падзею.
+
+Калі ўключыць гэту функцыю, Calendula пакажа і дні нараджэння, гадавіны ды іншыя даты вашых кантактаў. Кантакты чытаюцца на прыладзе, нікуды не адпраўляюцца і не змяняюцца. Calendula капіюе даты ў лакальныя календары, якімі кіруеце вы.
+
+Дызайн усюды выкананы ў Material 3 Expressive: дынамічныя колеры, выразная анімацыя і формы.
+
+У Calendula няма тэлеметрыі, аналітыкі і доступу да сеткі. Вашы даныя не пакідаюць прыладу.
diff --git a/fastlane/metadata/android/be/short_description.txt b/fastlane/metadata/android/be/short_description.txt
new file mode 100644
index 0000000..4136b00
--- /dev/null
+++ b/fastlane/metadata/android/be/short_description.txt
@@ -0,0 +1 @@
+Каляндар у стылі Material 3 Expressive для Android без доступу да сеткі.
diff --git a/fastlane/metadata/android/be/title.txt b/fastlane/metadata/android/be/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/be/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/cs-CZ/full_description.txt b/fastlane/metadata/android/cs-CZ/full_description.txt
new file mode 100644
index 0000000..0a26ea2
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/full_description.txt
@@ -0,0 +1,11 @@
+Calendula je open-source kalendář pro Android. Pracuje přímo se systémovým poskytovatelem kalendáře, takže vše, co se synchronizuje do vašeho zařízení (Nextcloud přes DAVx5, Google, místní kalendáře, odběry WebCal), se objeví v Calendule a vaše změny se stejnou cestou synchronizují zpět.
+
+Nabízí zobrazení měsíce, týdne, dne a agendy. Události můžete vytvářet, upravovat a mazat, včetně opakovaných, a opakování nastavit z předvoleb nebo vlastních pravidel. Při změně opakované události zvolíte, zda se změna týká jen této události, této a všech následujících, nebo celé série.
+
+Calendula zobrazuje připomínky událostí jako oznámení. Klepnutím na oznámení otevřete událost.
+
+Když to zapnete, Calendula zobrazí i narozeniny, výročí a další data vašich kontaktů. Kontakty se čtou v zařízení a nikdy se neodesílají ani nemění. Calendula kopíruje data do místních kalendářů, které máte pod kontrolou.
+
+Design je všude Material 3 Expressive, s dynamickými barvami a výrazným pohybem a tvary.
+
+Calendula nemá telemetrii, analytiku ani přístup k síti. Vaše data nikdy neopustí zařízení.
diff --git a/fastlane/metadata/android/cs-CZ/short_description.txt b/fastlane/metadata/android/cs-CZ/short_description.txt
new file mode 100644
index 0000000..6814190
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/short_description.txt
@@ -0,0 +1 @@
+Kalendář v Material 3 Expressive pro Android bez přístupu k síti.
diff --git a/fastlane/metadata/android/cs-CZ/title.txt b/fastlane/metadata/android/cs-CZ/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt
index 96ec0e3..be8e918 100644
--- a/fastlane/metadata/android/de-DE/full_description.txt
+++ b/fastlane/metadata/android/de-DE/full_description.txt
@@ -1,23 +1,11 @@
-Calendula ist eine moderne, quelloffene Kalender-App für Android. Sie
-arbeitet direkt auf dem System-Kalender-Provider — jede Quelle, die mit
-deinem Gerät synchronisiert ist (Nextcloud über DAVx5, Google, lokal,
-WebCal-Subscriptions), erscheint automatisch, und deine Änderungen
-synchronisieren auf demselben Weg zurück.
+Calendula ist eine quelloffene Kalender-App für Android. Sie arbeitet direkt mit dem Kalender-Provider des Systems. Alles, was mit deinem Gerät synchronisiert wird (Nextcloud über DAVx5, Google, lokale Kalender, WebCal-Abos), erscheint in Calendula, und deine Änderungen synchronisieren auf demselben Weg zurück.
-Termine erstellen, bearbeiten und löschen — auch wiederkehrende, mit
-wählbarer Reichweite (nur dieser Termin / dieser und alle folgenden / ganze
-Serie) und einem einfachen Wiederholungs-Picker. Erinnerungen stellt
-Calendula selbst als Benachrichtigung zu — ein Tipp darauf öffnet den
-Termin.
+Es gibt Monats-, Wochen-, Tages- und Agenda-Ansicht. Du kannst Termine erstellen, bearbeiten und löschen, auch wiederkehrende, und Wiederholungen aus Vorlagen oder eigenen Regeln festlegen. Änderst du einen wiederkehrenden Termin, wählst du, ob die Änderung nur für diesen Termin, für diesen und alle folgenden oder für die ganze Serie gilt.
-Optional lassen sich Geburtstage, Jahrestage und weitere besondere Tage
-deiner Kontakte im Kalender anzeigen. Du schaltest das selbst ein; Kontakte
-werden nur auf deinem Gerät gelesen, nie hochgeladen und nie verändert —
-Calendula spiegelt die Daten lediglich in lokale Kalender, die du voll
-kontrollierst.
+Calendula zeigt deine Terminerinnerungen als Benachrichtigungen. Ein Tipp darauf öffnet den Termin.
-Der Unterschied liegt im Design: echtes Material 3 Expressive durchgehend,
-mit Dynamic Color, expressiven Animationen und neuen Shape-Sprachen.
+Wenn du es einschaltest, zeigt Calendula auch Geburtstage, Jahrestage und andere Daten deiner Kontakte. Die Kontakte werden auf deinem Gerät gelesen und nie hochgeladen oder verändert. Calendula kopiert die Daten in lokale Kalender, über die du bestimmst.
-Datenschutz: keinerlei Telemetrie, kein Tracking, kein Netzwerkzugriff —
-deine Daten bleiben auf dem Gerät.
+Das Design ist durchgehend Material 3 Expressive, mit dynamischen Farben und ausdrucksstarken Animationen und Formen.
+
+Calendula hat keine Telemetrie, keine Analyse und keinen Netzwerkzugriff. Deine Daten verlassen das Gerät nie.
diff --git a/fastlane/metadata/android/de-DE/images/icon.png b/fastlane/metadata/android/de-DE/images/icon.png
deleted file mode 100644
index b4be2db..0000000
Binary files a/fastlane/metadata/android/de-DE/images/icon.png and /dev/null differ
diff --git a/fastlane/metadata/android/de-DE/images/phoneScreenshots/01-week.png b/fastlane/metadata/android/de-DE/images/phoneScreenshots/01-week.png
deleted file mode 100644
index 1fcb988..0000000
Binary files a/fastlane/metadata/android/de-DE/images/phoneScreenshots/01-week.png and /dev/null differ
diff --git a/fastlane/metadata/android/de-DE/images/phoneScreenshots/02-month.png b/fastlane/metadata/android/de-DE/images/phoneScreenshots/02-month.png
deleted file mode 100644
index 327fd7a..0000000
Binary files a/fastlane/metadata/android/de-DE/images/phoneScreenshots/02-month.png and /dev/null differ
diff --git a/fastlane/metadata/android/de-DE/images/phoneScreenshots/03-day.png b/fastlane/metadata/android/de-DE/images/phoneScreenshots/03-day.png
deleted file mode 100644
index f8a8f52..0000000
Binary files a/fastlane/metadata/android/de-DE/images/phoneScreenshots/03-day.png and /dev/null differ
diff --git a/fastlane/metadata/android/de-DE/images/phoneScreenshots/04-detail.png b/fastlane/metadata/android/de-DE/images/phoneScreenshots/04-detail.png
deleted file mode 100644
index f47e4aa..0000000
Binary files a/fastlane/metadata/android/de-DE/images/phoneScreenshots/04-detail.png and /dev/null differ
diff --git a/fastlane/metadata/android/de-DE/images/phoneScreenshots/05-agenda.png b/fastlane/metadata/android/de-DE/images/phoneScreenshots/05-agenda.png
deleted file mode 100644
index 0ee8e8a..0000000
Binary files a/fastlane/metadata/android/de-DE/images/phoneScreenshots/05-agenda.png and /dev/null differ
diff --git a/fastlane/metadata/android/de-DE/images/phoneScreenshots/06-onboarding.png b/fastlane/metadata/android/de-DE/images/phoneScreenshots/06-onboarding.png
deleted file mode 100644
index b0ae4ba..0000000
Binary files a/fastlane/metadata/android/de-DE/images/phoneScreenshots/06-onboarding.png and /dev/null differ
diff --git a/fastlane/metadata/android/de-DE/short_description.txt b/fastlane/metadata/android/de-DE/short_description.txt
index ffe532c..2aa6fbe 100644
--- a/fastlane/metadata/android/de-DE/short_description.txt
+++ b/fastlane/metadata/android/de-DE/short_description.txt
@@ -1 +1 @@
-Ein moderner Material-3-Expressive-Kalender für Android.
+Ein Material-3-Expressive-Kalender für Android ohne Netzwerkzugriff.
diff --git a/fastlane/metadata/android/en-GB/changelogs/21801.txt b/fastlane/metadata/android/en-GB/changelogs/21801.txt
deleted file mode 100644
index e8f6b85..0000000
--- a/fastlane/metadata/android/en-GB/changelogs/21801.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Fixed
-• Week and day view: tapping an empty slot now creates the event at the hour you tapped, even after zooming the timeline or changing the hour height.
diff --git a/fastlane/metadata/android/en-GB/changelogs/21900.txt b/fastlane/metadata/android/en-GB/changelogs/21900.txt
deleted file mode 100644
index ffd61af..0000000
--- a/fastlane/metadata/android/en-GB/changelogs/21900.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-New
-• Drag an event to reschedule it — press and hold it in month, week or day view and drop it on another time or day. Recurring events ask what the move applies to.
-• Delete several search results at once: long-press a hit to start selecting, then delete them in one action.
-
-Changed
-• First launch is now a short wizard. It can also set up automatic backup and let you pick the view Calendula opens on, both with previews.
diff --git a/fastlane/metadata/android/en-GB/changelogs/21901.txt b/fastlane/metadata/android/en-GB/changelogs/21901.txt
deleted file mode 100644
index 02611ec..0000000
--- a/fastlane/metadata/android/en-GB/changelogs/21901.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Added
-• Drag to reschedule can now be turned off: Settings → Views → “Drag to reschedule”. It stays on by default; switched off, events can no longer be picked up in the month, week or day view.
-• Calendula now speaks Brazilian Portuguese, thanks to a community translation. Pick it under Settings → Language.
diff --git a/fastlane/metadata/android/en-GB/changelogs/21902.txt b/fastlane/metadata/android/en-GB/changelogs/21902.txt
deleted file mode 100644
index 7d9cd37..0000000
--- a/fastlane/metadata/android/en-GB/changelogs/21902.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Fixed
-• Tapping an event in month view now opens the event instead of its day.
-• An edit shows straight away when you re-open the event.
-• The month widget's arrows no longer die after a few taps — an oversized update was killing the launcher's widget host.
-• Jump-to-today in seamless weeks lands on the current week, and day/week view no longer run flush against the right edge.
-
-Changed
-• A meeting you declined is struck through everywhere and no longer reminds you.
diff --git a/fastlane/metadata/android/en-GB/changelogs/22003.txt b/fastlane/metadata/android/en-GB/changelogs/22003.txt
deleted file mode 100644
index ec1e81c..0000000
--- a/fastlane/metadata/android/en-GB/changelogs/22003.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Fixed
-• A custom Agenda range no longer crashes the app in French. Choosing a custom range — or just typing a number into that field — closed the app on any phone set to French, and only a range of exactly one day escaped it. Other languages were never affected.
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
index 2ebf536..091f0a2 100644
--- a/fastlane/metadata/android/en-US/full_description.txt
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -1,20 +1,11 @@
-Calendula is a modern, open-source calendar app for Android. It works
-directly on the system calendar provider, so any source synced to your
-device — Nextcloud via DAVx5, Google, local, WebCal subscriptions — shows up
-automatically, and changes you make sync back the same way.
+Calendula is an open-source calendar app for Android. It works directly on the system calendar provider, so anything synced to your device (Nextcloud via DAVx5, Google, local calendars, WebCal subscriptions) shows up in Calendula, and changes you make sync back the same way.
-Create, edit and delete events, including recurring events with scoped
-changes (only this event / this and all following / the whole series) and a
-simple repeat picker. Calendula also delivers your event reminders as
-notifications — tap one and you're on the event.
+It has month, week, day and agenda views. You can create, edit and delete events, including recurring ones, and set repeats from presets or your own rules. When you change a recurring event, you choose whether the change applies to that one event, to it and all following ones, or to the whole series.
-Optionally, show your contacts' birthdays, anniversaries and other special
-dates in your calendar. You turn this on yourself; contacts are read only on
-your device, are never uploaded, and are never changed — Calendula only
-mirrors the dates into local calendars you fully control.
+Calendula shows your event reminders as notifications. Tap one to open the event.
-The differentiator is the design: real Material 3 Expressive throughout,
-with dynamic color, expressive motion, and expressive shapes.
+If you turn it on, Calendula also shows your contacts' birthdays, anniversaries and other dates. Contacts are read on your device and are never uploaded or changed. Calendula copies the dates into local calendars that you control.
-Privacy: zero telemetry, no analytics, no network access — your data never
-leaves the device.
+The design is Material 3 Expressive throughout, with dynamic color and expressive motion and shapes.
+
+Calendula has no telemetry, no analytics and no network access. Your data never leaves the device.
diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png
new file mode 100644
index 0000000..69d349e
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/featureGraphic.png differ
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
index b4be2db..17d1e24 100644
Binary files a/fastlane/metadata/android/en-US/images/icon.png and b/fastlane/metadata/android/en-US/images/icon.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/01-week.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/01-week.png
index 79bfee1..8a4f5d1 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/01-week.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/01-week.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/02-month.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/02-month.png
index 987d7d2..8ee22a2 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/02-month.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/02-month.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/03-agenda.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/03-agenda.png
new file mode 100644
index 0000000..c1709f9
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/03-agenda.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/03-day.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/03-day.png
deleted file mode 100644
index 5d1cce5..0000000
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/03-day.png and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/04-detail.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/04-detail.png
index 4417a69..df27e5a 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/04-detail.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/04-detail.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/05-agenda.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/05-agenda.png
deleted file mode 100644
index 59586c7..0000000
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/05-agenda.png and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/05-recurring.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/05-recurring.png
new file mode 100644
index 0000000..ac002f9
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/05-recurring.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/06-calendars.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/06-calendars.png
new file mode 100644
index 0000000..2611104
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/06-calendars.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/06-onboarding.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/06-onboarding.png
deleted file mode 100644
index d8540e6..0000000
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/06-onboarding.png and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/07-dark.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/07-dark.png
new file mode 100644
index 0000000..cf95fdb
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/07-dark.png differ
diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/01-week.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/01-week.png
new file mode 100644
index 0000000..f86825d
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/01-week.png differ
diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/02-month.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/02-month.png
new file mode 100644
index 0000000..490c9fe
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/02-month.png differ
diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/03-agenda.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/03-agenda.png
new file mode 100644
index 0000000..4d4b079
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/03-agenda.png differ
diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/04-detail.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/04-detail.png
new file mode 100644
index 0000000..c723c29
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/04-detail.png differ
diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/05-recurring.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/05-recurring.png
new file mode 100644
index 0000000..52d1b21
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/05-recurring.png differ
diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/06-calendars.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/06-calendars.png
new file mode 100644
index 0000000..9dfa0e7
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/06-calendars.png differ
diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/07-dark.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/07-dark.png
new file mode 100644
index 0000000..81ec3cb
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/07-dark.png differ
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
index 658239d..c7f2965 100644
--- a/fastlane/metadata/android/en-US/short_description.txt
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -1 +1 @@
-A modern Material 3 Expressive calendar for Android.
+A Material 3 Expressive calendar for Android with no network access.
diff --git a/fastlane/metadata/android/es-ES/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt
index 96d23d1..e859260 100644
--- a/fastlane/metadata/android/es-ES/full_description.txt
+++ b/fastlane/metadata/android/es-ES/full_description.txt
@@ -1,25 +1,11 @@
-Calendula es una aplicación de calendario moderna y de código abierto
-para Android. Funciona directamente sobre el proveedor de calendario del
-sistema: cualquier origen sincronizado en tu dispositivo — Nextcloud
-mediante DAVx5, Google, calendarios locales, suscripciones WebCal —
-aparece automáticamente, y los cambios que hagas se sincronizan de vuelta
-del mismo modo.
+Calendula es una aplicación de calendario de código abierto para Android. Funciona directamente sobre el proveedor de calendario del sistema, así que todo lo que se sincroniza con tu dispositivo (Nextcloud mediante DAVx5, Google, calendarios locales, suscripciones WebCal) aparece en Calendula, y los cambios que hagas se sincronizan de vuelta por el mismo camino.
-Crea, edita y elimina eventos, incluidos los recurrentes con cambios
-acotados (solo este evento / este y todos los siguientes / toda la serie)
-y un sencillo selector de repetición. Calendula también entrega los
-recordatorios de tus eventos como notificaciones: toca una y estarás en
-el evento.
+Tiene vistas de mes, semana, día y agenda. Puedes crear, editar y eliminar eventos, también los periódicos, y definir repeticiones con ajustes predefinidos o reglas propias. Al cambiar un evento periódico, eliges si el cambio se aplica solo a ese evento, a ese y todos los siguientes, o a toda la serie.
-Si quieres, muestra en tu calendario los cumpleaños, aniversarios y otras
-fechas especiales de tus contactos. Tú mismo lo activas; los contactos se
-leen solo en tu dispositivo, nunca se suben y nunca se modifican —
-Calendula solo refleja las fechas en calendarios locales que controlas
-por completo.
+Calendula muestra los recordatorios de tus eventos como notificaciones. Toca uno para abrir el evento.
-El factor diferenciador es el diseño: auténtico Material 3 Expressive en
-toda la aplicación, con Dynamic Color, movimiento expresivo y formas
-expresivas.
+Si lo activas, Calendula muestra también los cumpleaños, aniversarios y otras fechas de tus contactos. Los contactos se leen en tu dispositivo y nunca se suben ni se modifican. Calendula copia las fechas en calendarios locales que tú controlas.
-Privacidad: cero telemetría, sin analíticas, sin acceso a la red — tus
-datos nunca salen del dispositivo.
+El diseño es Material 3 Expressive en todo momento, con color dinámico y movimiento y formas expresivos.
+
+Calendula no tiene telemetría, ni analíticas, ni acceso a la red. Tus datos nunca salen del dispositivo.
diff --git a/fastlane/metadata/android/es-ES/images/icon.png b/fastlane/metadata/android/es-ES/images/icon.png
deleted file mode 100644
index b4be2db..0000000
Binary files a/fastlane/metadata/android/es-ES/images/icon.png and /dev/null differ
diff --git a/fastlane/metadata/android/es-ES/images/phoneScreenshots/01-week.png b/fastlane/metadata/android/es-ES/images/phoneScreenshots/01-week.png
deleted file mode 100644
index b494bd3..0000000
Binary files a/fastlane/metadata/android/es-ES/images/phoneScreenshots/01-week.png and /dev/null differ
diff --git a/fastlane/metadata/android/es-ES/images/phoneScreenshots/02-month.png b/fastlane/metadata/android/es-ES/images/phoneScreenshots/02-month.png
deleted file mode 100644
index 3291ee7..0000000
Binary files a/fastlane/metadata/android/es-ES/images/phoneScreenshots/02-month.png and /dev/null differ
diff --git a/fastlane/metadata/android/es-ES/images/phoneScreenshots/03-day.png b/fastlane/metadata/android/es-ES/images/phoneScreenshots/03-day.png
deleted file mode 100644
index b6475cb..0000000
Binary files a/fastlane/metadata/android/es-ES/images/phoneScreenshots/03-day.png and /dev/null differ
diff --git a/fastlane/metadata/android/es-ES/images/phoneScreenshots/04-detail.png b/fastlane/metadata/android/es-ES/images/phoneScreenshots/04-detail.png
deleted file mode 100644
index cf52dc5..0000000
Binary files a/fastlane/metadata/android/es-ES/images/phoneScreenshots/04-detail.png and /dev/null differ
diff --git a/fastlane/metadata/android/es-ES/images/phoneScreenshots/05-agenda.png b/fastlane/metadata/android/es-ES/images/phoneScreenshots/05-agenda.png
deleted file mode 100644
index ee94ae2..0000000
Binary files a/fastlane/metadata/android/es-ES/images/phoneScreenshots/05-agenda.png and /dev/null differ
diff --git a/fastlane/metadata/android/es-ES/images/phoneScreenshots/06-onboarding.png b/fastlane/metadata/android/es-ES/images/phoneScreenshots/06-onboarding.png
deleted file mode 100644
index 5a1acec..0000000
Binary files a/fastlane/metadata/android/es-ES/images/phoneScreenshots/06-onboarding.png and /dev/null differ
diff --git a/fastlane/metadata/android/es-ES/short_description.txt b/fastlane/metadata/android/es-ES/short_description.txt
index cce9919..37579bf 100644
--- a/fastlane/metadata/android/es-ES/short_description.txt
+++ b/fastlane/metadata/android/es-ES/short_description.txt
@@ -1 +1 @@
-Un calendario moderno con Material 3 Expressive para Android.
+Un calendario Material 3 Expressive para Android sin acceso a la red.
diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt
new file mode 100644
index 0000000..7558828
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/full_description.txt
@@ -0,0 +1,11 @@
+Calendula est une application de calendrier open source pour Android. Elle fonctionne directement sur le fournisseur de calendrier du système : tout ce qui est synchronisé sur votre appareil (Nextcloud via DAVx5, Google, calendriers locaux, abonnements WebCal) apparaît dans Calendula, et vos modifications sont synchronisées en retour de la même façon.
+
+Elle propose des vues mois, semaine, jour et agenda. Vous pouvez créer, modifier et supprimer des événements, y compris récurrents, et définir les répétitions à partir de modèles ou de vos propres règles. Quand vous modifiez un événement récurrent, vous choisissez si la modification s'applique à cet événement seul, à celui-ci et aux suivants, ou à toute la série.
+
+Calendula affiche les rappels de vos événements sous forme de notifications. Touchez-en une pour ouvrir l'événement.
+
+Si vous l'activez, Calendula affiche aussi les anniversaires, fêtes et autres dates de vos contacts. Les contacts sont lus sur votre appareil et ne sont jamais envoyés ni modifiés. Calendula copie les dates dans des calendriers locaux que vous contrôlez.
+
+Le design suit Material 3 Expressive partout, avec des couleurs dynamiques et des animations et formes expressives.
+
+Calendula n'a ni télémétrie, ni statistiques d'usage, ni accès au réseau. Vos données ne quittent jamais l'appareil.
diff --git a/fastlane/metadata/android/fr-FR/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt
new file mode 100644
index 0000000..17c4cca
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/short_description.txt
@@ -0,0 +1 @@
+Un calendrier Material 3 Expressive pour Android, sans accès au réseau.
diff --git a/fastlane/metadata/android/fr-FR/title.txt b/fastlane/metadata/android/fr-FR/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/hu-HU/full_description.txt b/fastlane/metadata/android/hu-HU/full_description.txt
new file mode 100644
index 0000000..c4626b2
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/full_description.txt
@@ -0,0 +1,11 @@
+A Calendula nyílt forráskódú naptáralkalmazás Androidra. Közvetlenül a rendszer naptárszolgáltatójával dolgozik, így minden, ami az eszközödre szinkronizálódik (Nextcloud a DAVx5-ön keresztül, Google, helyi naptárak, WebCal-előfizetések), megjelenik a Calendulában, a módosításaid pedig ugyanígy szinkronizálódnak vissza.
+
+Van havi, heti, napi és napirend nézete. Eseményeket hozhatsz létre, szerkeszthetsz és törölhetsz, ismétlődőket is, az ismétlést pedig sablonból vagy saját szabállyal állíthatod be. Ismétlődő esemény módosításakor kiválasztod, hogy a változás csak erre az eseményre, erre és az összes következőre, vagy a teljes sorozatra vonatkozzon.
+
+A Calendula értesítésként jeleníti meg az események emlékeztetőit. Koppints egyre, és megnyílik az esemény.
+
+Ha bekapcsolod, a Calendula a névjegyeid születésnapjait, évfordulóit és más dátumait is megmutatja. A névjegyeket az eszközön olvassa, soha nem tölti fel és nem módosítja őket. A Calendula a dátumokat az általad kezelt helyi naptárakba másolja.
+
+A dizájn mindenhol Material 3 Expressive, dinamikus színekkel, kifejező mozgással és formákkal.
+
+A Calendulában nincs telemetria, analitika és hálózati hozzáférés. Az adataid soha nem hagyják el az eszközt.
diff --git a/fastlane/metadata/android/hu-HU/short_description.txt b/fastlane/metadata/android/hu-HU/short_description.txt
new file mode 100644
index 0000000..715f2f2
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/short_description.txt
@@ -0,0 +1 @@
+Material 3 Expressive naptár Androidra, hálózati hozzáférés nélkül.
diff --git a/fastlane/metadata/android/hu-HU/title.txt b/fastlane/metadata/android/hu-HU/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt
index 6845c92..3c905b8 100644
--- a/fastlane/metadata/android/it-IT/full_description.txt
+++ b/fastlane/metadata/android/it-IT/full_description.txt
@@ -1,24 +1,11 @@
-Calendula è un'app di calendario moderna e open source per Android.
-Funziona direttamente sul provider di calendario di sistema: qualsiasi
-origine sincronizzata sul tuo dispositivo — Nextcloud tramite DAVx5,
-Google, calendari locali, iscrizioni WebCal — compare automaticamente, e
-le modifiche che apporti vengono sincronizzate a ritroso allo stesso
-modo.
+Calendula è un'app di calendario open source per Android. Funziona direttamente sul provider di calendario di sistema, quindi tutto ciò che è sincronizzato sul tuo dispositivo (Nextcloud tramite DAVx5, Google, calendari locali, iscrizioni WebCal) compare in Calendula, e le modifiche che fai vengono sincronizzate allo stesso modo.
-Crea, modifica ed elimina eventi, compresi quelli ricorrenti con
-modifiche mirate (solo questo evento / questo e tutti i successivi /
-l'intera serie) e un semplice selettore di ripetizione. Calendula
-recapita anche i promemoria dei tuoi eventi come notifiche: ne tocchi una
-e sei subito sull'evento.
+Ha le viste mese, settimana, giorno e agenda. Puoi creare, modificare ed eliminare eventi, anche ricorrenti, e impostare le ripetizioni da modelli o regole personalizzate. Quando modifichi un evento ricorrente, scegli se la modifica vale solo per quell'evento, per quello e tutti i successivi o per l'intera serie.
-Se vuoi, mostra nel calendario i compleanni, gli anniversari e le altre
-date speciali dei tuoi contatti. Sei tu ad attivarlo; i contatti vengono
-letti solo sul tuo dispositivo, non vengono mai caricati e non vengono
-mai modificati — Calendula si limita a rispecchiare le date in calendari
-locali che controlli completamente.
+Calendula mostra i promemoria degli eventi come notifiche. Toccane una per aprire l'evento.
-La differenza sta nel design: vero Material 3 Expressive ovunque, con
-Dynamic Color, animazioni espressive e forme espressive.
+Se lo attivi, Calendula mostra anche compleanni, anniversari e altre date dei tuoi contatti. I contatti vengono letti sul dispositivo e non vengono mai caricati né modificati. Calendula copia le date in calendari locali che controlli tu.
-Privacy: zero telemetria, nessuna analisi, nessun accesso alla rete — i
-tuoi dati non lasciano mai il dispositivo.
+Il design è Material 3 Expressive in ogni schermata, con colori dinamici e animazioni e forme espressive.
+
+Calendula non ha telemetria, analisi o accesso alla rete. I tuoi dati non lasciano mai il dispositivo.
diff --git a/fastlane/metadata/android/it-IT/images/icon.png b/fastlane/metadata/android/it-IT/images/icon.png
deleted file mode 100644
index b4be2db..0000000
Binary files a/fastlane/metadata/android/it-IT/images/icon.png and /dev/null differ
diff --git a/fastlane/metadata/android/it-IT/images/phoneScreenshots/01-week.png b/fastlane/metadata/android/it-IT/images/phoneScreenshots/01-week.png
deleted file mode 100644
index 2c7ee62..0000000
Binary files a/fastlane/metadata/android/it-IT/images/phoneScreenshots/01-week.png and /dev/null differ
diff --git a/fastlane/metadata/android/it-IT/images/phoneScreenshots/02-month.png b/fastlane/metadata/android/it-IT/images/phoneScreenshots/02-month.png
deleted file mode 100644
index 9ef2933..0000000
Binary files a/fastlane/metadata/android/it-IT/images/phoneScreenshots/02-month.png and /dev/null differ
diff --git a/fastlane/metadata/android/it-IT/images/phoneScreenshots/03-day.png b/fastlane/metadata/android/it-IT/images/phoneScreenshots/03-day.png
deleted file mode 100644
index d3ad829..0000000
Binary files a/fastlane/metadata/android/it-IT/images/phoneScreenshots/03-day.png and /dev/null differ
diff --git a/fastlane/metadata/android/it-IT/images/phoneScreenshots/04-detail.png b/fastlane/metadata/android/it-IT/images/phoneScreenshots/04-detail.png
deleted file mode 100644
index 0a5a378..0000000
Binary files a/fastlane/metadata/android/it-IT/images/phoneScreenshots/04-detail.png and /dev/null differ
diff --git a/fastlane/metadata/android/it-IT/images/phoneScreenshots/05-agenda.png b/fastlane/metadata/android/it-IT/images/phoneScreenshots/05-agenda.png
deleted file mode 100644
index 96de82b..0000000
Binary files a/fastlane/metadata/android/it-IT/images/phoneScreenshots/05-agenda.png and /dev/null differ
diff --git a/fastlane/metadata/android/it-IT/images/phoneScreenshots/06-onboarding.png b/fastlane/metadata/android/it-IT/images/phoneScreenshots/06-onboarding.png
deleted file mode 100644
index 9a6282f..0000000
Binary files a/fastlane/metadata/android/it-IT/images/phoneScreenshots/06-onboarding.png and /dev/null differ
diff --git a/fastlane/metadata/android/it-IT/short_description.txt b/fastlane/metadata/android/it-IT/short_description.txt
index 763e256..4c3076c 100644
--- a/fastlane/metadata/android/it-IT/short_description.txt
+++ b/fastlane/metadata/android/it-IT/short_description.txt
@@ -1 +1 @@
-Un moderno calendario Material 3 Expressive per Android.
+Un calendario Material 3 Expressive per Android senza accesso alla rete.
diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt
new file mode 100644
index 0000000..7e4dbf1
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/full_description.txt
@@ -0,0 +1,11 @@
+Calendula は Android 向けのオープンソースのカレンダーアプリです。システムのカレンダープロバイダ上で直接動作するので、端末に同期されているもの(DAVx5 経由の Nextcloud、Google、ローカルカレンダー、WebCal の購読)はそのまま Calendula に表示され、加えた変更も同じ経路で同期されます。
+
+月・週・日・予定リストの各表示があります。予定の作成・編集・削除ができ、繰り返しの予定も作れます。繰り返しはプリセットか独自のルールで設定できます。繰り返しの予定を変更するときは、この予定のみ、この予定以降すべて、シリーズ全体のどれに適用するかを選べます。
+
+予定のリマインダーは通知として届きます。通知をタップするとその予定が開きます。
+
+オンにすると、連絡先の誕生日や記念日などの日付もカレンダーに表示されます。連絡先は端末上で読み取るだけで、アップロードや変更は行いません。日付は、あなたが管理するローカルカレンダーにコピーされます。
+
+デザインはすべて Material 3 Expressive で、ダイナミックカラーと表情豊かなモーションやシェイプを備えています。
+
+テレメトリ、解析、ネットワークアクセスはありません。データが端末の外に出ることはありません。
diff --git a/fastlane/metadata/android/ja-JP/short_description.txt b/fastlane/metadata/android/ja-JP/short_description.txt
new file mode 100644
index 0000000..579d900
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/short_description.txt
@@ -0,0 +1 @@
+ネットワークにアクセスしない、Material 3 Expressive の Android カレンダー。
diff --git a/fastlane/metadata/android/ja-JP/title.txt b/fastlane/metadata/android/ja-JP/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/pl-PL/full_description.txt b/fastlane/metadata/android/pl-PL/full_description.txt
new file mode 100644
index 0000000..39501da
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/full_description.txt
@@ -0,0 +1,11 @@
+Calendula to kalendarz open source na Androida. Działa bezpośrednio na systemowym dostawcy kalendarza, więc wszystko, co synchronizuje się z urządzeniem (Nextcloud przez DAVx5, Google, kalendarze lokalne, subskrypcje WebCal), pojawia się w Calendula, a Twoje zmiany synchronizują się z powrotem tą samą drogą.
+
+Ma widok miesiąca, tygodnia, dnia i agendy. Możesz tworzyć, edytować i usuwać wydarzenia, także cykliczne, a powtarzanie ustawić z gotowych opcji lub własnych reguł. Przy zmianie wydarzenia cyklicznego wybierasz, czy zmiana dotyczy tylko tego wydarzenia, tego i wszystkich następnych, czy całej serii.
+
+Calendula pokazuje przypomnienia o wydarzeniach jako powiadomienia. Dotknij powiadomienia, aby otworzyć wydarzenie.
+
+Jeśli to włączysz, Calendula pokaże też urodziny, rocznice i inne daty Twoich kontaktów. Kontakty są odczytywane na urządzeniu i nigdy nie są wysyłane ani zmieniane. Calendula kopiuje daty do lokalnych kalendarzy, nad którymi masz kontrolę.
+
+Wygląd to Material 3 Expressive w całej aplikacji, z dynamicznymi kolorami oraz ekspresyjnym ruchem i kształtami.
+
+Calendula nie ma telemetrii, analityki ani dostępu do sieci. Twoje dane nigdy nie opuszczają urządzenia.
diff --git a/fastlane/metadata/android/pl-PL/short_description.txt b/fastlane/metadata/android/pl-PL/short_description.txt
new file mode 100644
index 0000000..ddccf1f
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/short_description.txt
@@ -0,0 +1 @@
+Kalendarz Material 3 Expressive na Androida bez dostępu do sieci.
diff --git a/fastlane/metadata/android/pl-PL/title.txt b/fastlane/metadata/android/pl-PL/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt
new file mode 100644
index 0000000..f211226
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/full_description.txt
@@ -0,0 +1,11 @@
+Calendula é um app de calendário de código aberto para Android. Ele funciona direto no provedor de calendário do sistema, então tudo o que é sincronizado no seu aparelho (Nextcloud via DAVx5, Google, calendários locais, assinaturas WebCal) aparece no Calendula, e as alterações que você faz voltam pelo mesmo caminho.
+
+Tem visualizações de mês, semana, dia e agenda. Você pode criar, editar e excluir eventos, inclusive recorrentes, e definir repetições por predefinições ou regras próprias. Ao alterar um evento recorrente, você escolhe se a mudança vale só para esse evento, para ele e os seguintes, ou para a série inteira.
+
+O Calendula mostra os lembretes dos seus eventos como notificações. Toque em uma para abrir o evento.
+
+Se você ativar, o Calendula também mostra aniversários, datas comemorativas e outras datas dos seus contatos. Os contatos são lidos no seu aparelho e nunca são enviados nem alterados. O Calendula copia as datas para calendários locais que você controla.
+
+O design é Material 3 Expressive em todo o app, com cores dinâmicas e movimentos e formas expressivos.
+
+O Calendula não tem telemetria, análises nem acesso à rede. Seus dados nunca saem do aparelho.
diff --git a/fastlane/metadata/android/pt-BR/short_description.txt b/fastlane/metadata/android/pt-BR/short_description.txt
new file mode 100644
index 0000000..eb21c22
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/short_description.txt
@@ -0,0 +1 @@
+Um calendário Material 3 Expressive para Android sem acesso à rede.
diff --git a/fastlane/metadata/android/pt-BR/title.txt b/fastlane/metadata/android/pt-BR/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/pt-PT/full_description.txt b/fastlane/metadata/android/pt-PT/full_description.txt
new file mode 100644
index 0000000..0539f55
--- /dev/null
+++ b/fastlane/metadata/android/pt-PT/full_description.txt
@@ -0,0 +1,11 @@
+O Calendula é uma aplicação de calendário de código aberto para Android. Funciona diretamente sobre o fornecedor de calendário do sistema, pelo que tudo o que é sincronizado no seu dispositivo (Nextcloud através do DAVx5, Google, calendários locais, subscrições WebCal) aparece no Calendula, e as alterações que fizer são sincronizadas de volta da mesma forma.
+
+Tem vistas de mês, semana, dia e agenda. Pode criar, editar e eliminar eventos, incluindo recorrentes, e definir repetições a partir de predefinições ou das suas próprias regras. Ao alterar um evento recorrente, escolhe se a alteração se aplica apenas a esse evento, a esse e aos seguintes, ou a toda a série.
+
+O Calendula mostra os lembretes dos seus eventos como notificações. Toque numa para abrir o evento.
+
+Se ativar esta opção, o Calendula mostra também os aniversários, datas comemorativas e outras datas dos seus contactos. Os contactos são lidos no dispositivo e nunca são enviados nem alterados. O Calendula copia as datas para calendários locais que controla.
+
+O design é Material 3 Expressive em toda a aplicação, com cores dinâmicas e movimentos e formas expressivos.
+
+O Calendula não tem telemetria, análises nem acesso à rede. Os seus dados nunca saem do dispositivo.
diff --git a/fastlane/metadata/android/pt-PT/short_description.txt b/fastlane/metadata/android/pt-PT/short_description.txt
new file mode 100644
index 0000000..eb21c22
--- /dev/null
+++ b/fastlane/metadata/android/pt-PT/short_description.txt
@@ -0,0 +1 @@
+Um calendário Material 3 Expressive para Android sem acesso à rede.
diff --git a/fastlane/metadata/android/pt-PT/title.txt b/fastlane/metadata/android/pt-PT/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/pt-PT/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/ru-RU/full_description.txt b/fastlane/metadata/android/ru-RU/full_description.txt
new file mode 100644
index 0000000..62797ba
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/full_description.txt
@@ -0,0 +1,11 @@
+Calendula — приложение-календарь с открытым исходным кодом для Android. Оно работает напрямую с системным поставщиком календарей, поэтому всё, что синхронизируется с вашим устройством (Nextcloud через DAVx5, Google, локальные календари, подписки WebCal), появляется в Calendula, а ваши изменения синхронизируются обратно тем же путём.
+
+Есть виды «Месяц», «Неделя», «День» и «Повестка». Вы можете создавать, изменять и удалять события, в том числе повторяющиеся, и задавать повторение из готовых вариантов или своими правилами. При изменении повторяющегося события вы выбираете, относится ли изменение только к этому событию, к нему и всем следующим или ко всей серии.
+
+Calendula показывает напоминания о событиях в виде уведомлений. Нажмите на уведомление, чтобы открыть событие.
+
+Если включить эту функцию, Calendula покажет и дни рождения, годовщины и другие даты ваших контактов. Контакты читаются на устройстве, никуда не отправляются и не изменяются. Calendula копирует даты в локальные календари, которыми управляете вы.
+
+Дизайн везде выполнен в Material 3 Expressive: динамические цвета, выразительная анимация и формы.
+
+В Calendula нет телеметрии, аналитики и доступа к сети. Ваши данные не покидают устройство.
diff --git a/fastlane/metadata/android/ru-RU/short_description.txt b/fastlane/metadata/android/ru-RU/short_description.txt
new file mode 100644
index 0000000..20db86f
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/short_description.txt
@@ -0,0 +1 @@
+Календарь в стиле Material 3 Expressive для Android без доступа к сети.
diff --git a/fastlane/metadata/android/ru-RU/title.txt b/fastlane/metadata/android/ru-RU/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/sk/full_description.txt b/fastlane/metadata/android/sk/full_description.txt
new file mode 100644
index 0000000..e31e031
--- /dev/null
+++ b/fastlane/metadata/android/sk/full_description.txt
@@ -0,0 +1,11 @@
+Calendula je open-source kalendár pre Android. Pracuje priamo so systémovým poskytovateľom kalendára, takže všetko, čo sa synchronizuje do vášho zariadenia (Nextcloud cez DAVx5, Google, miestne kalendáre, odbery WebCal), sa zobrazí v Calendule a vaše zmeny sa rovnakou cestou synchronizujú späť.
+
+Ponúka zobrazenie mesiaca, týždňa, dňa a agendy. Udalosti môžete vytvárať, upravovať a odstraňovať vrátane opakujúcich sa a opakovanie nastaviť z predvolieb alebo vlastných pravidiel. Pri zmene opakujúcej sa udalosti si zvolíte, či sa zmena týka len tejto udalosti, tejto a všetkých nasledujúcich, alebo celej série.
+
+Calendula zobrazuje pripomienky udalostí ako upozornenia. Ťuknutím na upozornenie otvoríte udalosť.
+
+Keď to zapnete, Calendula zobrazí aj narodeniny, výročia a ďalšie dátumy vašich kontaktov. Kontakty sa čítajú v zariadení a nikdy sa neodosielajú ani nemenia. Calendula kopíruje dátumy do miestnych kalendárov, ktoré máte pod kontrolou.
+
+Dizajn je všade Material 3 Expressive, s dynamickými farbami a výrazným pohybom a tvarmi.
+
+Calendula nemá telemetriu, analytiku ani prístup k sieti. Vaše údaje nikdy neopustia zariadenie.
diff --git a/fastlane/metadata/android/sk/short_description.txt b/fastlane/metadata/android/sk/short_description.txt
new file mode 100644
index 0000000..e049710
--- /dev/null
+++ b/fastlane/metadata/android/sk/short_description.txt
@@ -0,0 +1 @@
+Kalendár v štýle Material 3 Expressive pre Android bez prístupu k sieti.
diff --git a/fastlane/metadata/android/sk/title.txt b/fastlane/metadata/android/sk/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/sk/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt
new file mode 100644
index 0000000..a319804
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/full_description.txt
@@ -0,0 +1,11 @@
+Calendula 是一款开源的 Android 日历应用。它直接基于系统日历提供程序工作,因此同步到设备上的所有内容(通过 DAVx5 同步的 Nextcloud、Google、本地日历、WebCal 订阅)都会显示在 Calendula 中,你所做的更改也会以同样的方式同步回去。
+
+提供月、周、日和日程列表视图。你可以创建、编辑和删除日程,包括重复日程,重复规则可以从预设中选择,也可以自定义。修改重复日程时,你可以选择只修改这一次、修改这一次及之后所有,或修改整个系列。
+
+Calendula 会以通知形式发送日程提醒。点按通知即可打开对应日程。
+
+开启后,Calendula 还会显示联系人的生日、纪念日和其他日期。联系人只在设备上读取,不会上传,也不会被修改。Calendula 会把这些日期复制到由你管理的本地日历中。
+
+整体设计采用 Material 3 Expressive,支持动态配色以及富有表现力的动效和形状。
+
+Calendula 没有遥测、没有分析,也不访问网络。你的数据不会离开设备。
diff --git a/fastlane/metadata/android/zh-CN/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt
new file mode 100644
index 0000000..95942fc
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/short_description.txt
@@ -0,0 +1 @@
+一款采用 Material 3 Expressive 设计、不联网的 Android 日历。
diff --git a/fastlane/metadata/android/zh-CN/title.txt b/fastlane/metadata/android/zh-CN/title.txt
new file mode 100644
index 0000000..4f9e6a5
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/title.txt
@@ -0,0 +1 @@
+Calendula
diff --git a/fastlane/store-locales.txt b/fastlane/store-locales.txt
new file mode 100644
index 0000000..3bb07f1
--- /dev/null
+++ b/fastlane/store-locales.txt
@@ -0,0 +1,20 @@
+# Android resource qualifier -> store listing directory under metadata/android/.
+# Store codes must be ones Google Play accepts; F-Droid takes any of them.
+# `default` is app/src/main/res/values/ (English).
+# Checked by scripts/check_store_listing.py.
+default en-US
+ar ar
+be be
+cs cs-CZ
+de de-DE
+es es-ES
+fr fr-FR
+hu hu-HU
+it it-IT
+ja ja-JP
+pl pl-PL
+pt pt-PT
+pt-rBR pt-BR
+ru ru-RU
+sk sk
+zh-rCN zh-CN
diff --git a/fdroid-metadata/de.jeanlucmakiola.calendula.yml b/fdroid-metadata/de.jeanlucmakiola.calendula.yml
index 2a90a44..c623653 100644
--- a/fdroid-metadata/de.jeanlucmakiola.calendula.yml
+++ b/fdroid-metadata/de.jeanlucmakiola.calendula.yml
@@ -1,7 +1,7 @@
AuthorName: Jean-Luc Makiola
License: MIT
Name: Calendula
-Summary: A modern Material 3 Expressive calendar for Android.
+Summary: A Material 3 Expressive calendar for Android with no network access.
Categories:
- Calendar & Agenda
diff --git a/scripts/check_store_listing.py b/scripts/check_store_listing.py
new file mode 100644
index 0000000..37d375d
--- /dev/null
+++ b/scripts/check_store_listing.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python3
+"""Validate fastlane/metadata/android against Google Play's listing rules.
+
+The tree is pushed to Play on every release (and harvested by F-Droid), so a
+field over its cap, an image Play rejects, or a locale Play doesn't know would
+fail the upload after the release has shipped everywhere else.
+
+ - every locale directory is listed in fastlane/store-locales.txt, and every
+ app language (res/values-*) has an entry there and a directory
+ - title / short / full description exist, are non-empty and within Play's caps,
+ and the full description isn't hard-wrapped
+ - icon: 512x512 32-bit PNG; featureGraphic: 1024x500 JPEG or 24-bit PNG
+ - screenshots: JPEG or 24-bit PNG, sides 320..3840, long edge <= 2x short,
+ 2..8 per type
+"""
+import re
+import struct
+import sys
+from pathlib import Path
+
+ROOT = Path(__file__).resolve().parent.parent
+META = ROOT / "fastlane/metadata/android"
+MAPPING = ROOT / "fastlane/store-locales.txt"
+RES = ROOT / "app/src/main/res"
+
+TEXT_LIMITS = {"title.txt": 30, "short_description.txt": 80, "full_description.txt": 4000}
+LISTING_ENTRIES = set(TEXT_LIMITS) | {"changelogs", "images", "video.txt"}
+SCREENSHOT_DIRS = {"phoneScreenshots", "sevenInchScreenshots", "tenInchScreenshots",
+ "tvScreenshots", "wearScreenshots"}
+IMAGE_EXTS = {".png", ".jpg", ".jpeg"}
+
+errors = []
+
+
+def error(msg):
+ errors.append(msg)
+
+
+def rel(path):
+ return path.relative_to(ROOT)
+
+
+def image_info(path):
+ """(width, height, has_alpha, bits_per_pixel) for a PNG or baseline JPEG."""
+ data = path.read_bytes()
+ if data[:8] == b"\x89PNG\r\n\x1a\n":
+ width, height, depth, color_type = struct.unpack(">IIBB", data[16:26])
+ channels = {0: 1, 2: 3, 3: 1, 4: 2, 6: 4}.get(color_type, 0)
+ has_alpha = color_type in (4, 6) or b"tRNS" in data[:data.find(b"IDAT")]
+ return width, height, has_alpha, depth * channels
+ if data[:2] == b"\xff\xd8":
+ i = 2
+ while i + 9 < len(data):
+ if data[i] != 0xFF:
+ i += 1
+ continue
+ marker = data[i + 1]
+ length = struct.unpack(">H", data[i + 2:i + 4])[0]
+ if 0xC0 <= marker <= 0xCF and marker not in (0xC4, 0xC8, 0xCC):
+ height, width = struct.unpack(">HH", data[i + 5:i + 9])
+ return width, height, False, 24
+ i += 2 + length
+ return None
+
+
+def check_mapping():
+ mapping = {}
+ for line in MAPPING.read_text(encoding="utf-8").splitlines():
+ line = line.split("#", 1)[0].strip()
+ if line:
+ qualifier, store = line.split()
+ mapping[qualifier] = store
+
+ app_langs = {"default"} | {
+ d.name[len("values-"):] for d in RES.glob("values-*")
+ if re.fullmatch(r"values-[a-z]{2,3}(-r[A-Z]{2})?", d.name)
+ }
+ for q in sorted(app_langs - mapping.keys()):
+ error(f"app ships values-{q} but {rel(MAPPING)} has no store locale for it")
+ for q in sorted(mapping.keys() - app_langs):
+ error(f"{rel(MAPPING)} maps '{q}' but the app has no values-{q}")
+
+ stores = set(mapping.values())
+ dirs = {d.name for d in META.iterdir() if d.is_dir()}
+ for d in sorted(dirs - stores):
+ error(f"{rel(META / d)} is not a mapped store locale (see {rel(MAPPING)})")
+ for d in sorted(stores - dirs):
+ error(f"no listing for {d} — create {rel(META / d)}")
+ return sorted(dirs & stores)
+
+
+def check_text(locale_dir):
+ for name, limit in TEXT_LIMITS.items():
+ f = locale_dir / name
+ if not f.is_file():
+ error(f"{rel(f)} is missing")
+ continue
+ text = f.read_text(encoding="utf-8").strip()
+ if not text:
+ error(f"{rel(f)} is empty")
+ elif len(text) > limit:
+ error(f"{rel(f)} is {len(text)} chars (Play limit {limit})")
+ if name == "full_description.txt" and re.search(r"[^\n]\n(?![\n•*-])", text):
+ error(f"{rel(f)} is hard-wrapped; Play shows every newline, so keep a paragraph on one line")
+ for entry in locale_dir.iterdir():
+ if entry.name not in LISTING_ENTRIES:
+ error(f"{rel(entry)} is not a listing file supply knows")
+
+
+def check_image(f, kind):
+ info = image_info(f)
+ if f.suffix.lower() not in IMAGE_EXTS or info is None:
+ error(f"{rel(f)} is not a PNG or JPEG")
+ return
+ width, height, has_alpha, bpp = info
+ if kind == "icon":
+ if (width, height) != (512, 512) or bpp != 32 or f.suffix.lower() != ".png":
+ error(f"{rel(f)} is {width}x{height} {bpp}-bit; Play wants a 512x512 32-bit PNG")
+ elif kind == "featureGraphic":
+ if (width, height) != (1024, 500):
+ error(f"{rel(f)} is {width}x{height}; Play wants exactly 1024x500")
+ if has_alpha:
+ error(f"{rel(f)} has an alpha channel; Play wants JPEG or 24-bit PNG")
+ else:
+ short, long = sorted((width, height))
+ if short < 320 or long > 3840:
+ error(f"{rel(f)} is {width}x{height}; each side must be 320..3840")
+ if long > 2 * short:
+ error(f"{rel(f)} is {width}x{height}; the long edge may be at most 2x the short edge")
+ if has_alpha:
+ error(f"{rel(f)} has an alpha channel; Play wants JPEG or 24-bit PNG")
+
+
+def check_images(locale_dir):
+ images = locale_dir / "images"
+ if not images.is_dir():
+ return
+ for entry in sorted(images.iterdir()):
+ if entry.is_dir():
+ if entry.name not in SCREENSHOT_DIRS:
+ error(f"{rel(entry)} is not a screenshot type supply knows")
+ continue
+ shots = sorted(p for p in entry.iterdir() if p.is_file())
+ if not 2 <= len(shots) <= 8:
+ error(f"{rel(entry)} has {len(shots)} images; Play takes 2..8")
+ for shot in shots:
+ check_image(shot, "screenshot")
+ elif entry.stem in ("icon", "featureGraphic"):
+ check_image(entry, entry.stem)
+ else:
+ error(f"{rel(entry)} is not an image supply knows (icon, featureGraphic, *Screenshots/)")
+
+
+def main():
+ for locale in check_mapping():
+ check_text(META / locale)
+ check_images(META / locale)
+ if errors:
+ for e in errors:
+ print(f"ERROR: {e}", file=sys.stderr)
+ print(f"\n{len(errors)} store listing problem(s).", file=sys.stderr)
+ return 1
+ print("Store listing OK.")
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/scripts/fastlane_to_fdroid_localized.sh b/scripts/fastlane_to_fdroid_localized.sh
index 99a54e8..d74d220 100755
--- a/scripts/fastlane_to_fdroid_localized.sh
+++ b/scripts/fastlane_to_fdroid_localized.sh
@@ -15,7 +15,9 @@
# full_description.txt -> description.txt
# title.txt -> name.txt
# images/icon.png -> icon.png
+# images/featureGraphic.png -> featureGraphic.png
# images/phoneScreenshots/* -> phoneScreenshots/*
+# images/tenInchScreenshots/* -> tenInchScreenshots/*
# changelogs/.txt -> changelogs/.txt
# (changelogs are seeded into the fastlane tree by
# scripts/sync_changelog_to_fastlane.sh.)
@@ -33,10 +35,13 @@ for locdir in "$SRC"/*/; do
[ -f "$locdir/full_description.txt" ] && cp "$locdir/full_description.txt" "$dst/description.txt"
[ -f "$locdir/title.txt" ] && cp "$locdir/title.txt" "$dst/name.txt"
[ -f "$locdir/images/icon.png" ] && cp "$locdir/images/icon.png" "$dst/icon.png"
- if [ -d "$locdir/images/phoneScreenshots" ]; then
- mkdir -p "$dst/phoneScreenshots"
- cp "$locdir"images/phoneScreenshots/* "$dst/phoneScreenshots/"
- fi
+ [ -f "$locdir/images/featureGraphic.png" ] && cp "$locdir/images/featureGraphic.png" "$dst/featureGraphic.png"
+ for shots in phoneScreenshots tenInchScreenshots; do
+ if [ -d "$locdir/images/$shots" ]; then
+ mkdir -p "$dst/$shots"
+ cp "$locdir"images/$shots/* "$dst/$shots/"
+ fi
+ done
# Per-version changelogs live in the same fastlane tree (see
# scripts/sync_changelog_to_fastlane.sh) and map straight across.
if [ -d "$locdir/changelogs" ]; then