diff --git a/DECISIONS.md b/DECISIONS.md index 386b456..019aac1 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -1,5 +1,11 @@ # Decisions +## 2026-04-19 – moonup i18n: reuse pacman gettext catalog + inline fallback +- **Who**: Dominik, ClaudeCode +- **Why**: moonup prompts looked foreign next to pacman/paru output (`[y/N]` vs `[J/n]`, English strings on a German system). User wanted consistency with the rest of the pacman UX. +- **Tradeoffs**: Full `.po`/`.mo` build-chain for moonarch was overkill for ~15 strings. gettext-only approach misses most moonarch-specific strings (no matching msgids in pacman catalog). Chose hybrid: `TEXTDOMAIN=pacman` for strings that match upstream msgids (prompts like `Proceed with installation?`, `Do you want to remove these packages?`, `[Y/n]`, `Starting full system upgrade...`), inline `_t()` helper for moonarch-specific strings. +- **How**: `moonarch-update` sets `TEXTDOMAIN=pacman`/`TEXTDOMAINDIR=/usr/share/locale`. `_t "en" "de"` picks by `${LANG%%.*}` matching `de_*`. `confirm()` now uses `::` prefix, default Y, accepts `y/Y/j/J`. No PKGBUILD change — `gettext` is in `base`. pacman msgids with trailing `\n` (e.g. `Starting full system upgrade...\n`) require ANSI-C quoting `$'...\n'` to match. + ## 2026-04-08 – Battery conservation mode: udev + sysfs + Waybar toggle - **Who**: Dominik, ClaudeCode - **Why**: Laptops with `charge_control_end_threshold` support benefit from limiting charge to 80% to extend battery lifespan. Needed a user-friendly toggle without requiring sudo. diff --git a/scripts/moonarch-update b/scripts/moonarch-update index e7dede3..bccb51b 100755 --- a/scripts/moonarch-update +++ b/scripts/moonarch-update @@ -4,6 +4,21 @@ set -euo pipefail +# --- i18n --- +# Reuse pacman's gettext catalog for prompts that match upstream msgids. +# For moonarch-specific strings fall back to _t() inline translation. +export TEXTDOMAIN=pacman +export TEXTDOMAINDIR=/usr/share/locale +YN=$(gettext "[Y/n]") + +_t() { + # _t "english" "deutsch" — picks by $LANG + case "${LANG%%.*}" in + de_*) printf '%s' "$2" ;; + *) printf '%s' "$1" ;; + esac +} + # --- Helper functions --- log() { @@ -19,8 +34,8 @@ read_packages() { } confirm() { - read -r -p "$1 [y/N] " response - [[ "$response" =~ ^[yY]$ ]] + read -r -p ":: $1 $YN " response + [[ -z "$response" || "$response" =~ ^[yYjJ]$ ]] } OFFICIAL_PACKAGES="/usr/share/moonarch/official.txt" @@ -29,85 +44,85 @@ AUR_PACKAGES="/usr/share/moonarch/aur.txt" # --- Prerequisites --- if [[ $EUID -eq 0 ]]; then - err "Do NOT run as root. The script uses sudo where needed." + err "$(_t "Do NOT run as root. The script uses sudo where needed." "Nicht als root ausführen. Das Script verwendet sudo wo nötig.")" exit 1 fi # --- 1. Update system packages --- -log "=== Update system packages ===" +log "=== $(gettext $'Starting full system upgrade...\n' | tr -d '\n.') ===" -if confirm "Run pacman -Syu?"; then +if confirm "$(_t "Run pacman -Syu?" "pacman -Syu ausführen?")"; then sudo pacman -Syu else - log "System update skipped." + log "$(_t "System update skipped." "Systemaktualisierung übersprungen.")" fi if command -v paru &>/dev/null; then - if confirm "Update AUR packages (paru -Sua)?"; then + if confirm "$(_t "Update AUR packages (paru -Sua)?" "AUR-Pakete aktualisieren (paru -Sua)?")"; then paru -Sua else - log "AUR update skipped." + log "$(_t "AUR update skipped." "AUR-Aktualisierung übersprungen.")" fi fi # --- 2. Reconcile package lists --- -log "=== Reconcile package lists ===" +log "=== $(_t "Reconcile package lists" "Paketlisten abgleichen") ===" if [[ -f "$OFFICIAL_PACKAGES" ]]; then MISSING_OFFICIAL=$(comm -23 <(read_packages "$OFFICIAL_PACKAGES" | sort) <(pacman -Qq | sort) || true) if [[ -n "$MISSING_OFFICIAL" ]]; then - log "Missing official packages:" + log "$(_t "Missing official packages:" "Fehlende offizielle Pakete:")" echo "$MISSING_OFFICIAL" - if confirm "Install?"; then + if confirm "$(gettext 'Proceed with installation?')"; then # shellcheck disable=SC2086 sudo pacman -S --needed --noconfirm $MISSING_OFFICIAL fi else - log "All official packages installed." + log "$(_t "All official packages installed." "Alle offiziellen Pakete installiert.")" fi fi if [[ -f "$AUR_PACKAGES" ]] && command -v paru &>/dev/null; then MISSING_AUR=$(comm -23 <(read_packages "$AUR_PACKAGES" | sort) <(pacman -Qq | sort) || true) if [[ -n "$MISSING_AUR" ]]; then - log "Missing AUR packages:" + log "$(_t "Missing AUR packages:" "Fehlende AUR-Pakete:")" echo "$MISSING_AUR" - if confirm "Install?"; then + if confirm "$(gettext 'Proceed with installation?')"; then # shellcheck disable=SC2086 paru -S --needed --noconfirm $MISSING_AUR fi else - log "All AUR packages installed." + log "$(_t "All AUR packages installed." "Alle AUR-Pakete installiert.")" fi fi # --- 3. Orphaned packages --- -log "=== Orphaned packages ===" +log "=== $(_t "Orphaned packages" "Verwaiste Pakete") ===" ORPHANS=$(pacman -Qdtq 2>/dev/null || true) if [[ -n "$ORPHANS" ]]; then - log "Orphaned packages found:" + log "$(_t "Orphaned packages found:" "Verwaiste Pakete gefunden:")" echo "$ORPHANS" - if confirm "Remove?"; then + if confirm "$(gettext 'Do you want to remove these packages?')"; then # shellcheck disable=SC2086 sudo pacman -Rsn --noconfirm $ORPHANS fi else - log "No orphaned packages." + log "$(_t "No orphaned packages." "Keine verwaisten Pakete.")" fi # --- Done --- log "" log "============================================" -log " Moonarch update complete!" +log " $(_t "Moonarch update complete!" "Moonarch-Aktualisierung abgeschlossen!")" log "============================================" # Keep terminal open when launched from a GUI (e.g. Waybar on-click) if [[ -t 0 ]]; then echo - read -n 1 -s -r -p "Press any key to close..." + read -n 1 -s -r -p "$(_t "Press any key to close..." "Beliebige Taste drücken zum Schließen …")" fi