From 64b8a2d1a086fa46e992fa435d8ab9a84c2626e4 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Wed, 30 Sep 2026 19:05:57 +0200 Subject: [PATCH] Publish the whole Play listing from the repo (#285) --- .forgejo/workflows/ci.yaml | 13 ++ CHANGELOG.md | 2 + docs/README.md | 2 +- docs/RELEASING.md | 38 ++-- fastlane/Fastfile | 61 +++---- .../metadata/android/ar/full_description.txt | 9 + .../metadata/android/ar/short_description.txt | 1 + fastlane/metadata/android/ar/title.txt | 1 + .../metadata/android/be/full_description.txt | 9 + .../metadata/android/be/short_description.txt | 1 + fastlane/metadata/android/be/title.txt | 1 + .../android/cs-CZ/full_description.txt | 9 + .../android/cs-CZ/short_description.txt | 1 + fastlane/metadata/android/cs-CZ/title.txt | 1 + .../android/de-DE/full_description.txt | 24 +-- .../metadata/android/de-DE/images/icon.png | Bin 15934 -> 0 bytes .../android/en-GB/changelogs/21801.txt | 2 - .../android/en-GB/changelogs/21900.txt | 6 - .../android/en-GB/changelogs/21901.txt | 3 - .../android/en-GB/changelogs/21902.txt | 8 - .../android/en-GB/changelogs/22003.txt | 2 - .../android/en-US/full_description.txt | 21 +-- .../metadata/android/en-US/images/icon.png | Bin 15934 -> 18246 bytes .../android/es-ES/full_description.txt | 26 +-- .../metadata/android/es-ES/images/icon.png | Bin 15934 -> 0 bytes .../android/fr-FR/full_description.txt | 9 + .../android/fr-FR/short_description.txt | 1 + fastlane/metadata/android/fr-FR/title.txt | 1 + .../android/hu-HU/full_description.txt | 9 + .../android/hu-HU/short_description.txt | 1 + fastlane/metadata/android/hu-HU/title.txt | 1 + .../android/it-IT/full_description.txt | 25 +-- .../metadata/android/it-IT/images/icon.png | Bin 15934 -> 0 bytes .../android/ja-JP/full_description.txt | 9 + .../android/ja-JP/short_description.txt | 1 + fastlane/metadata/android/ja-JP/title.txt | 1 + .../android/pl-PL/full_description.txt | 9 + .../android/pl-PL/short_description.txt | 1 + fastlane/metadata/android/pl-PL/title.txt | 1 + .../android/pt-BR/full_description.txt | 9 + .../android/pt-BR/short_description.txt | 1 + fastlane/metadata/android/pt-BR/title.txt | 1 + .../android/pt-PT/full_description.txt | 9 + .../android/pt-PT/short_description.txt | 1 + fastlane/metadata/android/pt-PT/title.txt | 1 + .../android/ru-RU/full_description.txt | 9 + .../android/ru-RU/short_description.txt | 1 + fastlane/metadata/android/ru-RU/title.txt | 1 + .../metadata/android/sk/full_description.txt | 9 + .../metadata/android/sk/short_description.txt | 1 + fastlane/metadata/android/sk/title.txt | 1 + .../android/zh-CN/full_description.txt | 9 + .../android/zh-CN/short_description.txt | 1 + fastlane/metadata/android/zh-CN/title.txt | 1 + fastlane/store-locales.txt | 20 +++ scripts/check_store_listing.py | 168 ++++++++++++++++++ scripts/fastlane_to_fdroid_localized.sh | 2 + 57 files changed, 406 insertions(+), 149 deletions(-) create mode 100644 fastlane/metadata/android/ar/full_description.txt create mode 100644 fastlane/metadata/android/ar/short_description.txt create mode 100644 fastlane/metadata/android/ar/title.txt create mode 100644 fastlane/metadata/android/be/full_description.txt create mode 100644 fastlane/metadata/android/be/short_description.txt create mode 100644 fastlane/metadata/android/be/title.txt create mode 100644 fastlane/metadata/android/cs-CZ/full_description.txt create mode 100644 fastlane/metadata/android/cs-CZ/short_description.txt create mode 100644 fastlane/metadata/android/cs-CZ/title.txt delete mode 100644 fastlane/metadata/android/de-DE/images/icon.png delete mode 100644 fastlane/metadata/android/en-GB/changelogs/21801.txt delete mode 100644 fastlane/metadata/android/en-GB/changelogs/21900.txt delete mode 100644 fastlane/metadata/android/en-GB/changelogs/21901.txt delete mode 100644 fastlane/metadata/android/en-GB/changelogs/21902.txt delete mode 100644 fastlane/metadata/android/en-GB/changelogs/22003.txt delete mode 100644 fastlane/metadata/android/es-ES/images/icon.png create mode 100644 fastlane/metadata/android/fr-FR/full_description.txt create mode 100644 fastlane/metadata/android/fr-FR/short_description.txt create mode 100644 fastlane/metadata/android/fr-FR/title.txt create mode 100644 fastlane/metadata/android/hu-HU/full_description.txt create mode 100644 fastlane/metadata/android/hu-HU/short_description.txt create mode 100644 fastlane/metadata/android/hu-HU/title.txt delete mode 100644 fastlane/metadata/android/it-IT/images/icon.png create mode 100644 fastlane/metadata/android/ja-JP/full_description.txt create mode 100644 fastlane/metadata/android/ja-JP/short_description.txt create mode 100644 fastlane/metadata/android/ja-JP/title.txt create mode 100644 fastlane/metadata/android/pl-PL/full_description.txt create mode 100644 fastlane/metadata/android/pl-PL/short_description.txt create mode 100644 fastlane/metadata/android/pl-PL/title.txt create mode 100644 fastlane/metadata/android/pt-BR/full_description.txt create mode 100644 fastlane/metadata/android/pt-BR/short_description.txt create mode 100644 fastlane/metadata/android/pt-BR/title.txt create mode 100644 fastlane/metadata/android/pt-PT/full_description.txt create mode 100644 fastlane/metadata/android/pt-PT/short_description.txt create mode 100644 fastlane/metadata/android/pt-PT/title.txt create mode 100644 fastlane/metadata/android/ru-RU/full_description.txt create mode 100644 fastlane/metadata/android/ru-RU/short_description.txt create mode 100644 fastlane/metadata/android/ru-RU/title.txt create mode 100644 fastlane/metadata/android/sk/full_description.txt create mode 100644 fastlane/metadata/android/sk/short_description.txt create mode 100644 fastlane/metadata/android/sk/title.txt create mode 100644 fastlane/metadata/android/zh-CN/full_description.txt create mode 100644 fastlane/metadata/android/zh-CN/short_description.txt create mode 100644 fastlane/metadata/android/zh-CN/title.txt create mode 100644 fastlane/store-locales.txt create mode 100644 scripts/check_store_listing.py 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..3fc4a40 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]). +- **The store listing speaks every app language.** Google Play and F-Droid now show Calendula's description in all 16 languages the app ships, and the Play listing is published from the repository with each release ([#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/docs/README.md b/docs/README.md index 79d7394..acb9257 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,7 +12,7 @@ Where to look for what: | [Issues](https://codeberg.org/jlmakiola/calendula/issues) + [milestones](https://codeberg.org/jlmakiola/calendula/milestones) | **The roadmap.** What's planned, in progress, and shipped — a milestone maps to its `release/vX.Y.Z` branch | | [`../.planning/PROJECT.md`](../.planning/PROJECT.md) | What the project is: core value, stack + version pins, constraints, naming, forge/release infrastructure | | [`design/`](design/) | Per-feature design notes kept for features whose provider behaviour is worth recording | -| [`../fastlane/metadata/android/`](../fastlane/metadata/android/) | Store metadata (single source of truth): descriptions, title, icon, screenshots (DE + EN). Harvested directly by the official F-Droid repo; transformed into the self-hosted repo layout at release time by [`../scripts/fastlane_to_fdroid_localized.sh`](../scripts/fastlane_to_fdroid_localized.sh) | +| [`../fastlane/metadata/android/`](../fastlane/metadata/android/) | Store metadata (single source of truth) for every app language, mapped in `store-locales.txt`: descriptions, title, graphics. Harvested directly by the official F-Droid repo, pushed to Google Play with every release, validated by [`../scripts/check_store_listing.py`](../scripts/check_store_listing.py); transformed into the self-hosted repo layout at release time by [`../scripts/fastlane_to_fdroid_localized.sh`](../scripts/fastlane_to_fdroid_localized.sh) | | [`../fdroid-metadata/`](../fdroid-metadata/) | App-level F-Droid control file (`*.yml`: Categories, License, links) for the self-hosted repo's `fdroid update` | | [`fdroid-official/`](fdroid-official/) | Recipe + notes for publishing to the **official** F-Droid repo (reproducible build + developer-signed binary) | diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 1d63004..2b227db 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -162,24 +162,34 @@ before. fastlane appears only as the Play Developer API client (`supply`), because the store listing already lives in `fastlane/metadata/android/` — the same tree the official F-Droid repo harvests. One metadata source, two stores. -**What gets uploaded per release:** the AAB, plus the per-version "What's New" -from `fastlane/metadata/android/en-US/changelogs/.txt` — the +**What gets uploaded per release:** the AAB, the per-version "What's New" +from `fastlane/metadata/android//changelogs/.txt` (the hand-written summary from step 3, which is why it must stay **under 500 -characters**: Play rejects a longer one. Listing text is -**not** touched — an accidental overwrite of a live listing triggers a Play -policy review. Sync it deliberately with `bundle exec fastlane listing`. +characters**), and the **whole store listing** — title, short and full +description, icon, feature graphic and screenshots for every locale — all in one +Play edit. Nothing about the Play listing is edited in the console any more: +change the files, and the next release pushes them. Unchanged images are +skipped (`sync_image_upload`). Every listing change goes through Play's review, +together with the bundle. To push a listing fix between releases, run +`bundle exec fastlane listing` (add `version_code:` 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..9ff958c --- /dev/null +++ b/fastlane/metadata/android/ar/full_description.txt @@ -0,0 +1,9 @@ +Calendula تطبيق تقويم عصري ومفتوح المصدر لنظام أندرويد. يعمل مباشرةً على مزوّد التقويم في النظام، لذا يظهر تلقائيًا أي مصدر متزامن مع جهازك — Nextcloud عبر DAVx5 أو Google أو التقويمات المحلية أو اشتراكات WebCal — وتُزامَن التغييرات التي تجريها بالطريقة نفسها. + +أنشئ الأحداث وعدّلها واحذفها، بما في ذلك الأحداث المتكررة مع تحديد نطاق التغيير (هذا الحدث فقط / هذا الحدث وكل ما يليه / السلسلة بأكملها) ومنتقي تكرار بسيط. كما يعرض Calendula تذكيرات أحداثك كإشعارات — المس الإشعار لتنتقل إلى الحدث مباشرةً. + +يمكنك اختياريًا عرض أعياد ميلاد جهات الاتصال والذكريات السنوية وغيرها من التواريخ المميزة في تقويمك. أنت من يفعّل ذلك؛ تُقرأ جهات الاتصال على جهازك فقط، ولا تُرفع أبدًا ولا تُعدَّل أبدًا — يكتفي Calendula بنسخ التواريخ إلى تقويمات محلية تتحكم فيها بالكامل. + +ما يميّزه هو التصميم: Material 3 Expressive حقيقي في كل مكان، مع ألوان ديناميكية وحركة معبّرة وأشكال معبّرة. + +الخصوصية: لا قياس عن بُعد، ولا تحليلات، ولا وصول إلى الشبكة — بياناتك لا تغادر جهازك أبدًا. diff --git a/fastlane/metadata/android/ar/short_description.txt b/fastlane/metadata/android/ar/short_description.txt new file mode 100644 index 0000000..4be48a4 --- /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..4f853e0 --- /dev/null +++ b/fastlane/metadata/android/be/full_description.txt @@ -0,0 +1,9 @@ +Calendula — сучасная праграма-каляндар з адкрытым зыходным кодам для Android. Яна працуе непасрэдна з сістэмным пастаўшчыком календароў, таму любая крыніца, сінхранізаваная з вашай прыладай, — Nextcloud праз DAVx5, Google, лакальныя календары, падпіскі WebCal — з'яўляецца аўтаматычна, а вашы змены сінхранізуюцца назад тым жа шляхам. + +Стварайце, змяняйце і выдаляйце падзеі, у тым ліку паўтаральныя — з выбарам абсягу змен (толькі гэтая падзея / гэтая і ўсе наступныя / уся серыя) і простым выбарам паўтору. Calendula таксама паказвае напаміны пра падзеі ў выглядзе апавяшчэнняў — націсніце на апавяшчэнне, і адкрыецца падзея. + +Пры жаданні ў календары можна паказваць дні нараджэння, гадавіны і іншыя памятныя даты вашых кантактаў. Гэту функцыю вы ўключаеце самі; кантакты чытаюцца толькі на прыладзе, нікуды не адпраўляюцца і ніколі не змяняюцца — Calendula толькі пераносіць даты ў лакальныя календары, якія цалкам пад вашым кантролем. + +Галоўная адметнасць — дызайн: сапраўдны Material 3 Expressive ва ўсім, з дынамічнымі колерамі, выразнай анімацыяй і выразнымі формамі. + +Прыватнасць: ніякай тэлеметрыі, ніякай аналітыкі, ніякага доступу да сеткі — вашы даныя ніколі не пакідаюць прыладу. diff --git a/fastlane/metadata/android/be/short_description.txt b/fastlane/metadata/android/be/short_description.txt new file mode 100644 index 0000000..f7c409d --- /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..d98e10d --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/full_description.txt @@ -0,0 +1,9 @@ +Calendula je moderní open-source kalendář pro Android. Pracuje přímo se systémovým poskytovatelem kalendáře, takže se automaticky zobrazí jakýkoli zdroj synchronizovaný do vašeho zařízení — Nextcloud přes DAVx5, Google, místní kalendáře, odběry WebCal — a vaše změny se stejnou cestou synchronizují zpět. + +Vytvářejte, upravujte a mažte události, včetně opakovaných s volbou rozsahu změny (jen tato událost / tato a všechny následující / celá série) a jednoduchým výběrem opakování. Calendula také doručuje připomínky událostí jako oznámení — klepněte na ně a otevře se událost. + +Volitelně můžete v kalendáři zobrazit narozeniny, výročí a další významná data svých kontaktů. Zapínáte si to sami; kontakty se čtou pouze v zařízení, nikdy se neodesílají a nikdy se nemění — Calendula data jen zrcadlí do místních kalendářů, které máte plně pod kontrolou. + +Rozdíl dělá design: skutečný Material 3 Expressive všude, s dynamickými barvami, výrazným pohybem a výraznými tvary. + +Soukromí: žádná telemetrie, žádná analytika, žádný 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..e7e4acc --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/short_description.txt @@ -0,0 +1 @@ +Moderní kalendář v Material 3 Expressive pro Android. 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..fd9ddf4 100644 --- a/fastlane/metadata/android/de-DE/full_description.txt +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -1,23 +1,9 @@ -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 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. -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. +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. -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. +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. -Der Unterschied liegt im Design: echtes Material 3 Expressive durchgehend, -mit Dynamic Color, expressiven Animationen und neuen Shape-Sprachen. +Der Unterschied liegt im Design: echtes Material 3 Expressive durchgehend, mit Dynamic Color, expressiven Animationen und neuen Shape-Sprachen. -Datenschutz: keinerlei Telemetrie, kein Tracking, kein Netzwerkzugriff — -deine Daten bleiben auf dem Gerät. +Datenschutz: keinerlei Telemetrie, kein Tracking, kein Netzwerkzugriff — deine Daten bleiben auf dem Gerät. 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 b4be2db8d7ee2c609c85900af54301656bb6a57a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15934 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 C?nKW3 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..bb11b89 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -1,20 +1,9 @@ -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 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. -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. +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. -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. +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. -The differentiator is the design: real Material 3 Expressive throughout, -with dynamic color, expressive motion, and expressive shapes. +The differentiator is the design: real Material 3 Expressive throughout, with dynamic color, expressive motion, and expressive shapes. -Privacy: zero telemetry, no analytics, no network access — your data never -leaves the device. +Privacy: zero telemetry, no analytics, no network access — your data never leaves the device. diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png index b4be2db8d7ee2c609c85900af54301656bb6a57a..17d1e242e4144b5bc48bb354fb5e9af669b63c13 100644 GIT binary patch literal 18246 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≠ilMUt=A*Xr27F6L1O)D=h=dB;^D^uZ5!?#Qc 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 C?nKW3 diff --git a/fastlane/metadata/android/es-ES/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt index 96d23d1..d057506 100644 --- a/fastlane/metadata/android/es-ES/full_description.txt +++ b/fastlane/metadata/android/es-ES/full_description.txt @@ -1,25 +1,9 @@ -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 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. -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. +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. -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. +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. -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. +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. -Privacidad: cero telemetría, sin analíticas, sin acceso a la red — tus -datos nunca salen del dispositivo. +Privacidad: cero telemetría, sin analíticas, sin 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 b4be2db8d7ee2c609c85900af54301656bb6a57a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15934 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 C?nKW3 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..b9c0c61 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -0,0 +1,9 @@ +Calendula est une application de calendrier moderne et open source pour Android. Elle fonctionne directement sur le fournisseur de calendrier du système : toute source synchronisée sur votre appareil — Nextcloud via DAVx5, Google, calendriers locaux, abonnements WebCal — apparaît automatiquement, et vos modifications sont synchronisées en retour de la même manière. + +Créez, modifiez et supprimez des événements, y compris des événements récurrents avec des modifications ciblées (uniquement cet événement / cet événement et les suivants / toute la série) et un sélecteur de répétition simple. Calendula affiche aussi vos rappels sous forme de notifications — touchez-en une pour ouvrir l'événement. + +Si vous le souhaitez, affichez dans votre calendrier les anniversaires, anniversaires de mariage et autres dates importantes de vos contacts. C'est vous qui l'activez ; les contacts sont lus uniquement sur votre appareil, ne sont jamais envoyés et jamais modifiés — Calendula se contente de reporter les dates dans des calendriers locaux que vous contrôlez entièrement. + +Ce qui fait la différence, c'est le design : du vrai Material 3 Expressive partout, avec couleurs dynamiques, animations expressives et formes expressives. + +Confidentialité : aucune télémétrie, aucune analyse, aucun accès 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..0e92fc0 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/short_description.txt @@ -0,0 +1 @@ +Un calendrier Material 3 Expressive moderne pour Android. 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..eb76a00 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/full_description.txt @@ -0,0 +1,9 @@ +A Calendula egy modern, nyílt forráskódú naptáralkalmazás Androidra. Közvetlenül a rendszer naptárszolgáltatójával dolgozik, így bármely, az eszközödre szinkronizált forrás — Nextcloud a DAVx5-ön keresztül, Google, helyi naptárak, WebCal-előfizetések — automatikusan megjelenik, és a módosításaid ugyanígy szinkronizálódnak vissza. + +Hozz létre, szerkessz és törölj eseményeket, ismétlődőket is, a módosítás hatókörének megválasztásával (csak ez az esemény / ez és az összes következő / a teljes sorozat) és egyszerű ismétlésválasztóval. A Calendula az emlékeztetőidet értesítésként is megjeleníti — egy koppintás, és már az eseménynél is vagy. + +Ha szeretnéd, a naptárban megjelenítheted a névjegyeid születésnapjait, évfordulóit és más különleges dátumait. Ezt te magad kapcsolod be; a névjegyeket csak az eszközön olvassa, soha nem tölti fel és soha nem módosítja — a Calendula csupán átmásolja a dátumokat a teljesen általad kezelt helyi naptárakba. + +A különbséget a dizájn adja: valódi Material 3 Expressive mindenhol, dinamikus színekkel, kifejező mozgással és kifejező formákkal. + +Adatvédelem: nincs telemetria, nincs analitika, nincs 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..38ac361 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/short_description.txt @@ -0,0 +1 @@ +Modern, Material 3 Expressive stílusú naptár Androidra. 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..05928c2 100644 --- a/fastlane/metadata/android/it-IT/full_description.txt +++ b/fastlane/metadata/android/it-IT/full_description.txt @@ -1,24 +1,9 @@ -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 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. -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. +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. -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. +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. -La differenza sta nel design: vero Material 3 Expressive ovunque, con -Dynamic Color, animazioni espressive e forme espressive. +La differenza sta nel design: vero Material 3 Expressive ovunque, con Dynamic Color, animazioni espressive e forme espressive. -Privacy: zero telemetria, nessuna analisi, nessun accesso alla rete — i -tuoi dati non lasciano mai il dispositivo. +Privacy: zero telemetria, nessuna analisi, nessun 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 b4be2db8d7ee2c609c85900af54301656bb6a57a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15934 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 C?nKW3 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..d482231 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/full_description.txt @@ -0,0 +1,9 @@ +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..097c775 --- /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..bfb55b9 --- /dev/null +++ b/fastlane/metadata/android/pl-PL/full_description.txt @@ -0,0 +1,9 @@ +Calendula to nowoczesna aplikacja kalendarza open source na Androida. Działa bezpośrednio na systemowym dostawcy kalendarza, więc każde źródło zsynchronizowane z urządzeniem — Nextcloud przez DAVx5, Google, kalendarze lokalne, subskrypcje WebCal — pojawia się automatycznie, a wprowadzone zmiany synchronizują się z powrotem tą samą drogą. + +Twórz, edytuj i usuwaj wydarzenia, także cykliczne, ze zmianami o wybranym zakresie (tylko to wydarzenie / to i wszystkie następne / cała seria) oraz prostym wyborem powtarzania. Calendula dostarcza też przypomnienia jako powiadomienia — dotknij jednego, a otworzy się wydarzenie. + +Opcjonalnie możesz wyświetlać w kalendarzu urodziny, rocznice i inne ważne daty swoich kontaktów. Włączasz to samodzielnie; kontakty są odczytywane tylko na urządzeniu, nigdy nie są wysyłane ani zmieniane — Calendula jedynie przenosi daty do lokalnych kalendarzy, nad którymi masz pełną kontrolę. + +Tym, co ją wyróżnia, jest wygląd: prawdziwy Material 3 Expressive w każdym miejscu, z dynamicznymi kolorami, ekspresyjnym ruchem i ekspresyjnymi kształtami. + +Prywatność: zero telemetrii, zero analityki, brak 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..5e72503 --- /dev/null +++ b/fastlane/metadata/android/pl-PL/short_description.txt @@ -0,0 +1 @@ +Nowoczesny kalendarz w stylu Material 3 Expressive na Androida. 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..62bf467 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -0,0 +1,9 @@ +Calendula é um app de calendário moderno e de código aberto para Android. Ele funciona diretamente sobre o provedor de calendário do sistema, então qualquer fonte sincronizada no seu aparelho — Nextcloud via DAVx5, Google, calendários locais, assinaturas WebCal — aparece automaticamente, e as alterações que você faz são sincronizadas de volta do mesmo jeito. + +Crie, edite e exclua eventos, inclusive eventos recorrentes com alterações por escopo (só este evento / este e os seguintes / a série inteira) e um seletor de repetição simples. O Calendula também entrega seus lembretes como notificações — toque em uma e você vai direto para o evento. + +Se quiser, mostre no calendário os aniversários, datas comemorativas e outras datas especiais dos seus contatos. Você mesmo ativa isso; os contatos são lidos apenas no seu aparelho, nunca são enviados e nunca são alterados — o Calendula só espelha as datas em calendários locais que você controla totalmente. + +O diferencial é o design: Material 3 Expressive de verdade em todo o app, com cores dinâmicas, movimento expressivo e formas expressivas. + +Privacidade: zero telemetria, nenhuma análise, nenhum 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..c72585e --- /dev/null +++ b/fastlane/metadata/android/pt-BR/short_description.txt @@ -0,0 +1 @@ +Um calendário moderno em Material 3 Expressive para Android. 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..46eac58 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/full_description.txt @@ -0,0 +1,9 @@ +O Calendula é uma aplicação de calendário moderna e de código aberto para Android. Funciona diretamente sobre o fornecedor de calendário do sistema, pelo que qualquer origem sincronizada no seu dispositivo — Nextcloud através do DAVx5, Google, calendários locais, subscrições WebCal — aparece automaticamente, e as alterações que fizer são sincronizadas de volta da mesma forma. + +Crie, edite e elimine eventos, incluindo eventos recorrentes com alterações por âmbito (apenas este evento / este e os seguintes / toda a série) e um seletor de repetição simples. O Calendula também entrega os seus lembretes como notificações — toque numa e abre o evento. + +Opcionalmente, mostre no calendário os aniversários, datas comemorativas e outras datas especiais dos seus contactos. É o utilizador que ativa esta opção; os contactos são lidos apenas no dispositivo, nunca são enviados nem alterados — o Calendula limita-se a espelhar as datas em calendários locais que controla totalmente. + +O que o distingue é o design: verdadeiro Material 3 Expressive em toda a aplicação, com cores dinâmicas, movimento expressivo e formas expressivas. + +Privacidade: zero telemetria, nenhuma análise, nenhum 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..c72585e --- /dev/null +++ b/fastlane/metadata/android/pt-PT/short_description.txt @@ -0,0 +1 @@ +Um calendário moderno em Material 3 Expressive para Android. 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..4b3ed95 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/full_description.txt @@ -0,0 +1,9 @@ +Calendula — современное приложение-календарь с открытым исходным кодом для Android. Оно работает напрямую с системным поставщиком календарей, поэтому любой источник, синхронизированный с вашим устройством, — Nextcloud через DAVx5, Google, локальные календари, подписки WebCal — появляется автоматически, а ваши изменения синхронизируются обратно тем же путём. + +Создавайте, изменяйте и удаляйте события, в том числе повторяющиеся — с выбором области изменений (только это событие / это и все последующие / вся серия) и простым выбором повторения. Calendula также показывает напоминания о событиях в виде уведомлений — нажмите на уведомление, и откроется событие. + +При желании в календаре можно показывать дни рождения, годовщины и другие памятные даты ваших контактов. Эту функцию вы включаете сами; контакты читаются только на устройстве, никуда не отправляются и никогда не изменяются — Calendula лишь переносит даты в локальные календари, которые полностью под вашим контролем. + +Главное отличие — дизайн: настоящий Material 3 Expressive во всём, с динамическими цветами, выразительной анимацией и выразительными формами. + +Конфиденциальность: никакой телеметрии, никакой аналитики, никакого доступа к сети — ваши данные никогда не покидают устройство. 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..7cf9fb4 --- /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..50fbc9c --- /dev/null +++ b/fastlane/metadata/android/sk/full_description.txt @@ -0,0 +1,9 @@ +Calendula je moderná open-source kalendárová aplikácia pre Android. Pracuje priamo so systémovým poskytovateľom kalendára, takže sa automaticky zobrazí akýkoľvek zdroj synchronizovaný do vášho zariadenia — Nextcloud cez DAVx5, Google, miestne kalendáre, odbery WebCal — a vaše zmeny sa rovnakou cestou synchronizujú späť. + +Vytvárajte, upravujte a odstraňujte udalosti vrátane opakujúcich sa, s voľbou rozsahu zmeny (len táto udalosť / táto a všetky nasledujúce / celá séria) a jednoduchým výberom opakovania. Calendula tiež doručuje pripomienky udalostí ako upozornenia — ťuknite na upozornenie a otvorí sa udalosť. + +Voliteľne môžete v kalendári zobraziť narodeniny, výročia a ďalšie významné dátumy svojich kontaktov. Zapínate si to sami; kontakty sa čítajú iba v zariadení, nikdy sa neodosielajú a nikdy sa nemenia — Calendula dátumy len zrkadlí do miestnych kalendárov, ktoré máte plne pod kontrolou. + +Rozdiel robí dizajn: skutočný Material 3 Expressive všade, s dynamickými farbami, výrazným pohybom a výraznými tvarmi. + +Súkromie: žiadna telemetria, žiadna analytika, žiadny 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..530caba --- /dev/null +++ b/fastlane/metadata/android/sk/short_description.txt @@ -0,0 +1 @@ +Moderný kalendár v štýle Material 3 Expressive pre Android. 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..d58de19 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -0,0 +1,9 @@ +Calendula 是一款现代、开源的 Android 日历应用。它直接基于系统日历提供程序工作,因此设备上同步的任何来源——通过 DAVx5 同步的 Nextcloud、Google、本地日历、WebCal 订阅——都会自动显示,你所做的更改也会通过同样的方式同步回去。 + +创建、编辑和删除日程,包括可按范围修改的重复日程(仅此日程 / 此日程及之后所有 / 整个系列),以及简单的重复规则选择器。Calendula 还会以通知形式提醒你的日程——点按通知即可直接打开该日程。 + +你还可以选择在日历中显示联系人的生日、纪念日和其他特殊日期。此功能需要你自行开启;联系人仅在设备上读取,绝不会上传,也绝不会被修改——Calendula 只会把这些日期同步到完全由你掌控的本地日历中。 + +与众不同之处在于设计:全面采用真正的 Material 3 Expressive,带来动态配色、富有表现力的动效和形状。 + +隐私:零遥测、无分析、无网络访问——你的数据永远不会离开设备。 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..14c31b8 --- /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/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..fe985ab 100755 --- a/scripts/fastlane_to_fdroid_localized.sh +++ b/scripts/fastlane_to_fdroid_localized.sh @@ -15,6 +15,7 @@ # full_description.txt -> description.txt # title.txt -> name.txt # images/icon.png -> icon.png +# images/featureGraphic.png -> featureGraphic.png # images/phoneScreenshots/* -> phoneScreenshots/* # changelogs/.txt -> changelogs/.txt # (changelogs are seeded into the fastlane tree by @@ -33,6 +34,7 @@ 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" + [ -f "$locdir/images/featureGraphic.png" ] && cp "$locdir/images/featureGraphic.png" "$dst/featureGraphic.png" if [ -d "$locdir/images/phoneScreenshots" ]; then mkdir -p "$dst/phoneScreenshots" cp "$locdir"images/phoneScreenshots/* "$dst/phoneScreenshots/"