chore: Improved Italian translations#1685
Conversation
📝 WalkthroughWalkthroughThis PR updates the Italian localization with refined and concise translations, addressing natural phrasing and consistency improvements. Additionally, a new Italian translator is documented in the contributors list. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
lib/I18n/translations/italian.yaml (1)
119-119: Consider an Italian term instead of the English "Wallpaper".
STR_CUSTOMwas repurposed from "Personalizzato" to "Wallpaper", andSTR_COVER_CUSTOMnow reads "Copertina + Wallpaper". Using an English word in an Italian UI is inconsistent with the rest of the file; "Sfondo" (used commonly in Italian localizations, including Mozilla Italia guidance referenced in the PR) would read more naturally. If "Wallpaper" was chosen deliberately to match a brand/UX term used elsewhere, feel free to ignore.✏️ Suggested alternative
-STR_CUSTOM: "Wallpaper" +STR_CUSTOM: "Sfondo" ... -STR_COVER_CUSTOM: "Copertina + Wallpaper" +STR_COVER_CUSTOM: "Copertina + Sfondo"Also applies to: 232-232
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/I18n/translations/italian.yaml` at line 119, The Italian translation uses the English word "Wallpaper" for STR_CUSTOM (and STR_COVER_CUSTOM) which is inconsistent; replace "Wallpaper" with the Italian term "Sfondo" (or "Sfondo personalizzato" if you want to keep the "custom" nuance) in the YAML entries STR_CUSTOM and any related key STR_COVER_CUSTOM so the UI reads naturally in Italian and matches other localized strings.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@lib/I18n/translations/italian.yaml`:
- Line 287: Update the Italian translation value for the key STR_FOOTNOTES to
include the missing preposition; locate STR_FOOTNOTES in the Italian
translations file and change its value from "Note piè pagina" to a correct form
such as "Note a piè di pagina" (or the shorter "Note a piè pagina" if space is
constrained) so the phrase is grammatically correct.
---
Nitpick comments:
In `@lib/I18n/translations/italian.yaml`:
- Line 119: The Italian translation uses the English word "Wallpaper" for
STR_CUSTOM (and STR_COVER_CUSTOM) which is inconsistent; replace "Wallpaper"
with the Italian term "Sfondo" (or "Sfondo personalizzato" if you want to keep
the "custom" nuance) in the YAML entries STR_CUSTOM and any related key
STR_COVER_CUSTOM so the UI reads naturally in Italian and matches other
localized strings.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 75369d0a-50b3-41ac-ad1a-2eda0e7c76c8
📒 Files selected for processing (2)
docs/translators.mdlib/I18n/translations/italian.yaml
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: cppcheck
- GitHub Check: build
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2026-02-16T22:25:35.674Z
Learnt from: whyte-j
Repo: crosspoint-reader/crosspoint-reader PR: 733
File: lib/I18n/I18nKeys.h:271-272
Timestamp: 2026-02-16T22:25:35.674Z
Learning: In the crosspoint-reader i18n system (lib/I18n/), missing translation keys in non-English YAML files are automatically filled with English strings at build time by the gen_i18n.py script. All generated string arrays (STRINGS_EN, STRINGS_ES, etc.) have identical lengths, so runtime array indexing is safe without per-string fallback logic. The system prints "INFO: '{key}' missing in {lang_code}, using English fallback" during code generation when this occurs.
Applied to files:
lib/I18n/translations/italian.yaml
📚 Learning: 2026-03-25T10:28:30.516Z
Learnt from: jpirnay
Repo: crosspoint-reader/crosspoint-reader PR: 1495
File: lib/I18n/translations/german.yaml:294-322
Timestamp: 2026-03-25T10:28:30.516Z
Learning: In crosspoint-reader, it is expected to include “pre-emptive” translation keys in non-English YAML files before the corresponding English keys exist (e.g., german.yaml ahead of en.yaml). When reviewing changes to files under lib/I18n/translations/*.yaml, do not flag missing corresponding English keys in non-English locales as an error if the repo’s gen_i18n.py fallback mechanism is intended to handle missing English keys safely until the pending PRs land.
Applied to files:
lib/I18n/translations/italian.yaml
📚 Learning: 2026-02-23T22:11:42.181Z
Learnt from: ariel-lindemann
Repo: crosspoint-reader/crosspoint-reader PR: 1133
File: lib/I18n/translations/finnish.yaml:92-92
Timestamp: 2026-02-23T22:11:42.181Z
Learning: In translation YAML files located in lib/I18n/translations/, literal percent signs (%) in strings (e.g., STR_HIDE_BATTERY, STR_GO_TO_PERCENT, STR_PERCENT_STEP_HINT) do not require escaping as %% and this convention is consistent across all language translations. Ensure that this pattern is followed for all YAML files in this directory to avoid introducing incorrect formatting markers in localized strings.
Applied to files:
lib/I18n/translations/italian.yaml
📚 Learning: 2026-04-17T18:59:20.878Z
Learnt from: KymAndriy
Repo: crosspoint-reader/crosspoint-reader PR: 1684
File: lib/I18n/translations/ukrainian.yaml:29-29
Timestamp: 2026-04-17T18:59:20.878Z
Learning: For Ukrainian (and other Slavic-language) translation YAML strings in lib/I18n/translations/*.yaml: if a format string contains a numeric placeholder produced via snprintf-style formatting (e.g., %zu) and runtime noun inflection is not feasible, place the relevant noun in genitive plural before the number in the string (e.g., "мереж %zu") rather than after it (e.g., "мережу %zu"). This avoids incorrect case forms that would otherwise result from the value affecting inflection (e.g., wrong forms like "мережу/мережі/мереж"). In such cases, do not flag the word order as incorrect.
Applied to files:
lib/I18n/translations/italian.yaml
🔇 Additional comments (1)
docs/translators.md (1)
29-29: LGTM — translator credit added correctly.New Italian contributor entry is properly placed under the existing "Italian" section and follows the established
[handle](https://github.com/handle)format.
| STR_BOOK_S_STYLE: "Stile libro" | ||
| STR_EMBEDDED_STYLE: "Stile integrato dell'epub" | ||
| STR_OPDS_SERVER_URL: "Server OPDS" | ||
| STR_FOOTNOTES: "Note piè pagina" |
There was a problem hiding this comment.
Minor Italian grammar: missing preposition in "Note piè pagina".
The idiomatic Italian expression is "Note a piè di pagina" (or, when space is tight, "Note a piè pagina"). Dropping the preposition "a" renders the phrase ungrammatical. Given the e-ink space constraints mentioned in the PR objectives, the short form with "a" would still be concise.
✏️ Proposed fix
-STR_FOOTNOTES: "Note piè pagina"
+STR_FOOTNOTES: "Note a piè pagina"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| STR_FOOTNOTES: "Note piè pagina" | |
| STR_FOOTNOTES: "Note a piè pagina" |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@lib/I18n/translations/italian.yaml` at line 287, Update the Italian
translation value for the key STR_FOOTNOTES to include the missing preposition;
locate STR_FOOTNOTES in the Italian translations file and change its value from
"Note piè pagina" to a correct form such as "Note a piè di pagina" (or the
shorter "Note a piè pagina" if space is constrained) so the phrase is
grammatically correct.
|
Thanks @znelson for picking this up! Regarding the two points from CodeRabbit:
|
|
@alan0ford ah, thanks for confirmation! I'll revise this in another PR |
## Summary Following up on #1685. One tweaked string confirmed by @alan0ford. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_
* chore: One Italian translation tweak (crosspoint-reader#1718) ## Summary Following up on crosspoint-reader#1685. One tweaked string confirmed by @alan0ford. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_ * style: unify page headers across web UI (crosspoint-reader#1702) ## Summary * **Goal**: Align `FilesPage` and `SettingsPage` headers with the existing `HomePage` pattern. * **Changes**: - Added `<h1>📚 CrossPoint Reader</h1>` at the top of `<body>` on both pages. - Demoted the page-specific `📁 File Manager` heading on `FilesPage` from `<h1>` to `<h2>` (inside `.page-header`), so every page has a single `<h1>` — the app name. - Moved the accent-colored `border-bottom` from `.page-header` to `h1`, matching the HomePage CSS. All three pages now share the same top structure: `<h1>CrossPoint Reader</h1>` → nav links → page content. ## Screenshots ### Home **Before and after is the same** <img width="1153" height="388" alt="home before" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/4eb1c969-89fd-4965-ba17-5ff956576a8b">https://github.com/user-attachments/assets/4eb1c969-89fd-4965-ba17-5ff956576a8b" /> ### File Manager **Before** <img width="1153" height="388" alt="files before" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/ba689d6b-56b1-44d1-a151-3f67b0fcdb16">https://github.com/user-attachments/assets/ba689d6b-56b1-44d1-a151-3f67b0fcdb16" /> **After** <img width="1153" height="388" alt="files after" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/437db5e4-9102-4a19-b049-7a93e4e403b2">https://github.com/user-attachments/assets/437db5e4-9102-4a19-b049-7a93e4e403b2" /> ### Settings **Before** <img width="1153" height="388" alt="settings before" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/39a7e489-f0d3-4ac1-a2d7-98028aae65c0">https://github.com/user-attachments/assets/39a7e489-f0d3-4ac1-a2d7-98028aae65c0" /> **After** <img width="1153" height="388" alt="settings_after" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/1c479618-ec8b-4dee-b704-3da07e6c279e">https://github.com/user-attachments/assets/1c479618-ec8b-4dee-b704-3da07e6c279e" /> ## Additional Context * Pure markup + CSS, no JavaScript or behavioral changes. * Improves HTML semantics (single `<h1>` per page, referring to the app). * No new CSS duplication introduced — borrows existing styling from HomePage. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Replaced Bookerly with Noto Serif for licensing reasons (crosspoint-reader#1736) ## Summary Fixes crosspoint-reader#258. Bookerly is not licensed for use in CrossPoint. Switched to Google's open Noto Serif font. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_ * feat: Support for multiple OPDS servers (crosspoint-reader#1209) ## Summary * Add support for configuring and using multiple OPDS servers, replacing the previous single-server limitation. Closes crosspoint-reader#1178 * New OpdsServerStore singleton (modeled after WifiCredentialStore) that persists up to 8 OPDS servers to /.crosspoint/opds.json with MAC-based password obfuscation. * One-time migration from legacy single-server fields in CrossPointSettings to the new store on first boot. * New OpdsServerListActivity for the device UI — works in two modes: a settings list (add/edit/delete servers) and a picker (select which server to browse). When only one server is configured, the picker is skipped automatically. * Renamed CalibreSettingsActivity → OpdsSettingsActivity for clarity. It now edits individual OpdsServer entries (name, URL, username, password, delete). * OpdsBookBrowserActivity now receives an OpdsServer at construction and uses its credentials for all fetches/downloads, and shows the server name in the header. * HttpDownloader::fetchUrl and downloadToFile accept optional per-call username/password parameters instead of reading from global settings. * REST API endpoints on CrossPointWebServer: GET /api/opds, POST /api/opds, POST /api/opds/delete — passwords are never exposed over the API (only a hasPassword flag), and omitting the password field on update preserves the existing one. * Web UI (SettingsPage.html) with dynamic OPDS server management cards — add, edit, save, and delete servers from the browser. <img width="932" height="906" alt="SCR-20260416-stvu" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/a8f18d84-4204-46a0-bb31-b73d24b3255f">https://github.com/user-attachments/assets/a8f18d84-4204-46a0-bb31-b73d24b3255f" /> ## Additional Context * The OpdsServerStore JSON format and obfuscation scheme are identical to WifiCredentialStore, so the same JsonSettingsIO infrastructure handles both. * The web API uses POST /api/opds/delete instead of DELETE /api/opds because the ESP32 WebServer doesn't support the DELETE method with a request body. * Existing single-server configurations are migrated automatically — no user action required. After migration the legacy CrossPointSettings fields are cleared so it only runs once. * The HttpDownloader changes are backward-compatible: the credential parameters default to empty strings, so existing callers are unaffected. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**< YES >**_ --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: Add swedish keyboard translations (crosspoint-reader#1726) ## Summary * Add the swedish translations of the text strings added by crosspoint-reader#1697 --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_ * feat: Add royalty.dev funding integration (crosspoint-reader#1741) Adds royalty.dev as a funding platform for contributors by adding custom funding link and badge to README A maintainer would need to click the "Are you the maintainer?" button on https://app.royalty.dev/crosspoint-reader/crosspoint-reader to install the github app which pulls the PRs in and ranks them. (Disclosure, Royalty is a product I've recently built and am using for my own OSS and currently gating custom font builds and nightlys on crosspointreader.com) This page currently can collect donations but without the integration it wont notify contributors and it wont rescore fresh PRs. * fix: pressing space barely moves input cursor (crosspoint-reader#1729) (crosspoint-reader#1733) ## Summary * **What is the goal of this PR?** Fix the visual keyboard cursor not advancing when typing a space. Typing one space leaves the cursor at position 0; typing two spaces advances it only by one space width. This affects all input types except URL. * **What changes are included?** Replace `getTextWidth()` with `getTextAdvanceX()` in four locations within `KeyboardEntryActivity::render()` for cursor positioning and line-wrapping calculations. ## Additional Context * **Root cause**: `getTextWidth()` returns the bounding-box width of the drawn glyphs. The space glyph has `width=0` and `height=0` (it's invisible), so `getTextWidth(" ") == 0`. The trailing `advanceX` of the last character is only flushed when the *next* character is processed, so a string ending in space reports zero width. `getTextAdvanceX()` correctly includes the final glyph's advance, matching how `drawText()` actually positions characters. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ * chore: git pre-commit hook for format fix (crosspoint-reader#1730) ## Summary * Adds pre-commit git hook that automatically runs ./bin/clang-format-fix --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**< YES >**_ --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Revert "feat: Add royalty.dev funding integration" (crosspoint-reader#1745) Reverts crosspoint-reader#1741 I don't entirely understand Royalty.dev and want to vet this further. --------- Co-authored-by: Zach Nelson <zach@zdnelson.com> Co-authored-by: Pietro Campagnano <hello@pietro.camp> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com> Co-authored-by: Justin Mitchell <justin@jmitch.com> Co-authored-by: pablohc <pablohc@users.noreply.github.com>
* chore: One Italian translation tweak (crosspoint-reader#1718) ## Summary Following up on crosspoint-reader#1685. One tweaked string confirmed by @alan0ford. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_ * style: unify page headers across web UI (crosspoint-reader#1702) ## Summary * **Goal**: Align `FilesPage` and `SettingsPage` headers with the existing `HomePage` pattern. * **Changes**: - Added `<h1>📚 CrossPoint Reader</h1>` at the top of `<body>` on both pages. - Demoted the page-specific `📁 File Manager` heading on `FilesPage` from `<h1>` to `<h2>` (inside `.page-header`), so every page has a single `<h1>` — the app name. - Moved the accent-colored `border-bottom` from `.page-header` to `h1`, matching the HomePage CSS. All three pages now share the same top structure: `<h1>CrossPoint Reader</h1>` → nav links → page content. ## Screenshots ### Home **Before and after is the same** <img width="1153" height="388" alt="home before" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/4eb1c969-89fd-4965-ba17-5ff956576a8b">https://github.com/user-attachments/assets/4eb1c969-89fd-4965-ba17-5ff956576a8b" /> ### File Manager **Before** <img width="1153" height="388" alt="files before" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/ba689d6b-56b1-44d1-a151-3f67b0fcdb16">https://github.com/user-attachments/assets/ba689d6b-56b1-44d1-a151-3f67b0fcdb16" /> **After** <img width="1153" height="388" alt="files after" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/437db5e4-9102-4a19-b049-7a93e4e403b2">https://github.com/user-attachments/assets/437db5e4-9102-4a19-b049-7a93e4e403b2" /> ### Settings **Before** <img width="1153" height="388" alt="settings before" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/39a7e489-f0d3-4ac1-a2d7-98028aae65c0">https://github.com/user-attachments/assets/39a7e489-f0d3-4ac1-a2d7-98028aae65c0" /> **After** <img width="1153" height="388" alt="settings_after" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/1c479618-ec8b-4dee-b704-3da07e6c279e">https://github.com/user-attachments/assets/1c479618-ec8b-4dee-b704-3da07e6c279e" /> ## Additional Context * Pure markup + CSS, no JavaScript or behavioral changes. * Improves HTML semantics (single `<h1>` per page, referring to the app). * No new CSS duplication introduced — borrows existing styling from HomePage. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Replaced Bookerly with Noto Serif for licensing reasons (crosspoint-reader#1736) ## Summary Fixes crosspoint-reader#258. Bookerly is not licensed for use in CrossPoint. Switched to Google's open Noto Serif font. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_ * feat: Support for multiple OPDS servers (crosspoint-reader#1209) ## Summary * Add support for configuring and using multiple OPDS servers, replacing the previous single-server limitation. Closes crosspoint-reader#1178 * New OpdsServerStore singleton (modeled after WifiCredentialStore) that persists up to 8 OPDS servers to /.crosspoint/opds.json with MAC-based password obfuscation. * One-time migration from legacy single-server fields in CrossPointSettings to the new store on first boot. * New OpdsServerListActivity for the device UI — works in two modes: a settings list (add/edit/delete servers) and a picker (select which server to browse). When only one server is configured, the picker is skipped automatically. * Renamed CalibreSettingsActivity → OpdsSettingsActivity for clarity. It now edits individual OpdsServer entries (name, URL, username, password, delete). * OpdsBookBrowserActivity now receives an OpdsServer at construction and uses its credentials for all fetches/downloads, and shows the server name in the header. * HttpDownloader::fetchUrl and downloadToFile accept optional per-call username/password parameters instead of reading from global settings. * REST API endpoints on CrossPointWebServer: GET /api/opds, POST /api/opds, POST /api/opds/delete — passwords are never exposed over the API (only a hasPassword flag), and omitting the password field on update preserves the existing one. * Web UI (SettingsPage.html) with dynamic OPDS server management cards — add, edit, save, and delete servers from the browser. <img width="932" height="906" alt="SCR-20260416-stvu" src="/deoxy?target=https%3A%2F%2Fgithub.com%2Fcrosspoint-reader%2Fcrosspoint-reader%2Fpull%2F%253Ca%2520href%3D"https://github.com/user-attachments/assets/a8f18d84-4204-46a0-bb31-b73d24b3255f">https://github.com/user-attachments/assets/a8f18d84-4204-46a0-bb31-b73d24b3255f" /> ## Additional Context * The OpdsServerStore JSON format and obfuscation scheme are identical to WifiCredentialStore, so the same JsonSettingsIO infrastructure handles both. * The web API uses POST /api/opds/delete instead of DELETE /api/opds because the ESP32 WebServer doesn't support the DELETE method with a request body. * Existing single-server configurations are migrated automatically — no user action required. After migration the legacy CrossPointSettings fields are cleared so it only runs once. * The HttpDownloader changes are backward-compatible: the credential parameters default to empty strings, so existing callers are unaffected. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**< YES >**_ --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: Add swedish keyboard translations (crosspoint-reader#1726) ## Summary * Add the swedish translations of the text strings added by crosspoint-reader#1697 --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_ * feat: Add royalty.dev funding integration (crosspoint-reader#1741) Adds royalty.dev as a funding platform for contributors by adding custom funding link and badge to README A maintainer would need to click the "Are you the maintainer?" button on https://app.royalty.dev/crosspoint-reader/crosspoint-reader to install the github app which pulls the PRs in and ranks them. (Disclosure, Royalty is a product I've recently built and am using for my own OSS and currently gating custom font builds and nightlys on crosspointreader.com) This page currently can collect donations but without the integration it wont notify contributors and it wont rescore fresh PRs. * fix: pressing space barely moves input cursor (crosspoint-reader#1729) (crosspoint-reader#1733) ## Summary * **What is the goal of this PR?** Fix the visual keyboard cursor not advancing when typing a space. Typing one space leaves the cursor at position 0; typing two spaces advances it only by one space width. This affects all input types except URL. * **What changes are included?** Replace `getTextWidth()` with `getTextAdvanceX()` in four locations within `KeyboardEntryActivity::render()` for cursor positioning and line-wrapping calculations. ## Additional Context * **Root cause**: `getTextWidth()` returns the bounding-box width of the drawn glyphs. The space glyph has `width=0` and `height=0` (it's invisible), so `getTextWidth(" ") == 0`. The trailing `advanceX` of the last character is only flushed when the *next* character is processed, so a string ending in space reports zero width. `getTextAdvanceX()` correctly includes the final glyph's advance, matching how `drawText()` actually positions characters. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ * chore: git pre-commit hook for format fix (crosspoint-reader#1730) ## Summary * Adds pre-commit git hook that automatically runs ./bin/clang-format-fix --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**< YES >**_ --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Revert "feat: Add royalty.dev funding integration" (crosspoint-reader#1745) Reverts crosspoint-reader#1741 I don't entirely understand Royalty.dev and want to vet this further. * style: formatting --------- Co-authored-by: Zach Nelson <zach@zdnelson.com> Co-authored-by: Pietro Campagnano <hello@pietro.camp> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com> Co-authored-by: Justin Mitchell <justin@jmitch.com> Co-authored-by: pablohc <pablohc@users.noreply.github.com>
Following up on crosspoint-reader#1685. One tweaked string confirmed by @alan0ford. --- While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_ (cherry picked from commit 5e26bae)
Improved Italian translations provided by @alan0ford, closes crosspoint-reader#1578. --- While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_
## Summary Following up on crosspoint-reader#1685. One tweaked string confirmed by @alan0ford. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_
## Summary Improved Italian translations provided by @alan0ford, closes crosspoint-reader#1578. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_
## Summary Following up on crosspoint-reader#1685. One tweaked string confirmed by @alan0ford. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_
Summary
Improved Italian translations provided by @alan0ford, closes #1578.
AI Usage
While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it
helps set the right context for reviewers.
Did you use AI tools to help write this code? NO