Compare commits

..

3 Commits

Author SHA1 Message Date
f4f6ede2a7 feat: i18n moonarch-update via pacman gettext + inline DE
All checks were successful
Update PKGBUILD version / update-pkgver (push) Successful in 2s
Prompts and log lines now follow the user's LANG. Reuses pacman's
gettext catalog for strings with matching upstream msgids
(Proceed with installation?, [Y/n], Starting full system upgrade...,
Do you want to remove these packages?). Moonarch-specific strings
go through an inline _t "en" "de" helper keyed off ${LANG%%.*}.

confirm() switches to pacman-style: :: prefix, default Y, accepts
y/Y/j/J. No PKGBUILD change — gettext ships with base.
2026-04-19 15:47:28 +02:00
ee85b87d3a fix: signal waybar after wlsunset starts to update nightlight icon
Waybar starts before wlsunset (due to ExecStartPre sleep) and only
checks the service status once. ExecStartPost sends SIGRTMIN+11 so
waybar refreshes the nightlight module after wlsunset is ready.
2026-04-16 10:36:05 +02:00
fcac91b540 fix: add polkit rule to allow greeter user to reboot and shutdown
The greetd greeter session is inactive in logind, so polkit defaults
require admin authentication for power actions. This rule grants the
greeter user permission for reboot and power-off without authentication.
2026-04-15 14:23:49 +02:00
4 changed files with 55 additions and 21 deletions

View File

@ -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.

View File

@ -0,0 +1,12 @@
// ABOUTME: Allow the greeter user to reboot and power off without authentication.
// ABOUTME: Required because greetd's greeter session is inactive in logind.
polkit.addRule(function(action, subject) {
if (subject.user === "greeter" &&
(action.id === "org.freedesktop.login1.reboot" ||
action.id === "org.freedesktop.login1.reboot-multiple-sessions" ||
action.id === "org.freedesktop.login1.power-off" ||
action.id === "org.freedesktop.login1.power-off-multiple-sessions")) {
return polkit.Result.YES;
}
});

View File

@ -12,6 +12,7 @@ Type=simple
# Give kanshi time to configure all outputs before wlsunset captures them
ExecStartPre=/bin/sleep 2
ExecStart=/usr/bin/wlsunset -T 6500 -t 5000 -S 00:00 -s 00:01
ExecStartPost=/usr/bin/pkill -RTMIN+11 waybar
Restart=on-failure
RestartSec=3

View File

@ -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