feat: Englische Oberfläche

Alle Oberflächentexte und Fehlermeldungen stehen in t!("…"); der deutsche
Text ist zugleich der Schlüssel für die englische Fassung in
src/i18n/en.rs (430 Einträge). Platzhalter heißen {name}. ink-notes folgt
der Systemsprache (Deutsch bei de…, sonst Englisch); im ☰-Menü lässt sie
sich unter „Sprache / Language“ auf System, Deutsch oder English
festlegen, gespeichert in ui.json.

Ein Test prüft, dass jeder markierte Text übersetzt ist, keine
Übersetzung verwaist und die Platzhalter übereinstimmen.
Konsolenausgaben bleiben deutsch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
haraldandClaude Opus 5.5 committed 2026-10-09 15:37:41 +02:00
1 parent ec6a5259d5
commit 6c0db643c4
23 files changed
+1576 -617

No files matched your search

+16 -11
View File
@@ -14,6 +14,7 @@ use std::path::{Path, PathBuf};
use sha2::{Digest, Sha256};
use crate::storage;
use crate::t;
/// Name des Unterordners mit den Bilddateien.
pub const ASSETS_DIR: &str = "assets";
@@ -40,15 +41,18 @@ pub enum AssetError {
impl std::fmt::Display for AssetError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
AssetError::Decode(msg) => write!(f, "Bild kann nicht gelesen werden: {msg}"),
AssetError::TooLarge(bytes) => write!(
f,
"Bild ist zu groß ({} MB, höchstens {} MB)",
bytes / (1024 * 1024),
MAX_IMPORT_BYTES / (1024 * 1024)
),
AssetError::InvalidName(name) => write!(f, "Ungültiger Bildverweis '{name}'"),
AssetError::Io(e) => write!(f, "Ein-/Ausgabefehler: {e}"),
AssetError::Decode(msg) => {
f.write_str(&t!("Bild kann nicht gelesen werden: {msg}", msg = msg))
}
AssetError::TooLarge(bytes) => f.write_str(&t!(
"Bild ist zu groß ({size} MB, höchstens {max} MB)",
size = bytes / (1024 * 1024),
max = MAX_IMPORT_BYTES / (1024 * 1024)
)),
AssetError::InvalidName(name) => {
f.write_str(&t!("Ungültiger Bildverweis '{name}'", name = name))
}
AssetError::Io(e) => f.write_str(&t!("Ein-/Ausgabefehler: {e}", e = e)),
}
}
}
@@ -164,8 +168,9 @@ impl AssetStore {
height: u32,
pixels: Vec<u8>,
) -> Result<ImportedImage, AssetError> {
let buffer = image::RgbaImage::from_raw(width, height, pixels)
.ok_or_else(|| AssetError::Decode("Pixeldaten passen nicht zur Bildgröße".into()))?;
let buffer = image::RgbaImage::from_raw(width, height, pixels).ok_or_else(|| {
AssetError::Decode(t!("Pixeldaten passen nicht zur Bildgröße").into())
})?;
let mut decoded = image::DynamicImage::ImageRgba8(buffer);
if width > MAX_IMPORT_DIMENSION || height > MAX_IMPORT_DIMENSION {
decoded = decoded.resize(