Skip to content

chore: Improved Italian translations#1685

Merged
znelson merged 2 commits into
crosspoint-reader:masterfrom
znelson:italian
Apr 18, 2026
Merged

chore: Improved Italian translations#1685
znelson merged 2 commits into
crosspoint-reader:masterfrom
znelson:italian

Conversation

@znelson
Copy link
Copy Markdown
Member

@znelson znelson commented Apr 17, 2026

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

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 17, 2026

📝 Walkthrough

Walkthrough

This 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

Cohort / File(s) Summary
Documentation
docs/translators.md
Added new Italian translator entry with GitHub profile link.
Italian Localization
lib/I18n/translations/italian.yaml
Updated existing translation strings for improved brevity and consistency (status phrases, sleep terminology, connection/auth/cache/error messaging, UI labels). Added 134 new translation keys for images display, hidden files visibility, status bar customization, progress indicators, chapter/book info, footnotes, links, screenshots, and auto page-turn features. Modified several existing key values to reflect refined terminology and shorter phrasing suitable for e-ink displays.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • #1144: Introduced initial Italian translation to the project; this PR refines and extends those translations with improved phrasing and additional UI strings.
  • #1504: Adds the same new translation keys (e.g., STR_IMAGES*, STR_SHOW_HIDDEN_FILES) to other language YAML files in parallel.
  • #1493: Adds identical UI translation keys (e.g., STR_CUSTOMISE_STATUS_BAR, progress-bar, and auto-turn parameters) across multiple localization files.

Suggested reviewers

  • osteotek
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'chore: Improved Italian translations' directly and clearly summarizes the main change of updating Italian translation strings in the repository.
Description check ✅ Passed The description is directly related to the changeset, mentioning improved Italian translations from @alan0ford and referencing the linked issue #1578.
Linked Issues check ✅ Passed The PR successfully implements the objectives from issue #1578 by updating the Italian translations with improved, shorter, and more natural strings suitable for e-ink displays.
Out of Scope Changes check ✅ Passed All changes are in scope: the translator metadata addition (docs/translators.md) and Italian translation updates (italian.yaml) directly address issue #1578 requirements.

✏️ 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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@znelson znelson marked this pull request as ready for review April 17, 2026 19:59
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_CUSTOM was repurposed from "Personalizzato" to "Wallpaper", and STR_COVER_CUSTOM now 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

📥 Commits

Reviewing files that changed from the base of the PR and between 2c5a47f and 6b15161.

📒 Files selected for processing (2)
  • docs/translators.md
  • lib/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"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

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.

Suggested change
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.

@znelson znelson merged commit 3cdfc6c into crosspoint-reader:master Apr 18, 2026
6 checks passed
@alan0ford
Copy link
Copy Markdown

Thanks @znelson for picking this up!

Regarding the two points from CodeRabbit:

  • "Wallpaper" is intentional — in the CrossPoint UI it refers specifically to a custom image loaded from the SD card, so "Sfondo" (which in Italian normally means desktop background) felt misleading in this context.
  • "Note piè pagina" → agree, "Note a piè pagina" is the correct form. Good catch.

@znelson
Copy link
Copy Markdown
Member Author

znelson commented Apr 19, 2026

@alan0ford ah, thanks for confirmation! I'll revise this in another PR

@znelson znelson deleted the italian branch April 20, 2026 17:50
znelson added a commit that referenced this pull request Apr 21, 2026
## 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**_
uxjulia added a commit to uxjulia/CrossInk that referenced this pull request Apr 23, 2026
* 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>
uxjulia added a commit to uxjulia/CrossInk that referenced this pull request Apr 23, 2026
* 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>
franssjz pushed a commit to franssjz/cpr-vcodex that referenced this pull request Apr 26, 2026
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)
Unintendedsideeffects pushed a commit to Unintendedsideeffects/ForkDrift-crosspointReader that referenced this pull request Apr 29, 2026
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**_
Unintendedsideeffects pushed a commit to Unintendedsideeffects/ForkDrift-crosspointReader that referenced this pull request Apr 29, 2026
## 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**_
aBER0724 pushed a commit to aBER0724/crosspoint-reader-cjk that referenced this pull request May 7, 2026
## 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**_
aBER0724 pushed a commit to aBER0724/crosspoint-reader-cjk that referenced this pull request May 7, 2026
## 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**_
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Proposed improvements to Italian translation

2 participants