Adjust locale settings for local usage

This commit is contained in:
Alexander Hess 2026-08-28 15:03:34 +02:00
commit 417ed15f47
Signed by: alexander
GPG key ID: B46EDB4DFC26805D
6 changed files with 187 additions and 22 deletions

View file

@ -143,6 +143,10 @@ done
unset _key
locales_ok=1
sh "$XDG_BIN_HOME/ensure-locales" >/dev/null 2>&1 || locales_ok=0
if command -v batcat >/dev/null 2>&1 && ! command -v bat >/dev/null 2>&1; then
ln -sf "$(command -v batcat)" "$XDG_BIN_HOME/bat"
fi
@ -191,6 +195,13 @@ fi
echo ""
echo "The dotfiles were installed successfully (branch: $DOTFILES_BRANCH)"
echo ""
if [ "$locales_ok" -ne 1 ]; then
echo "WARNING: Some locales are missing, fix:"
echo " sudo $XDG_BIN_HOME/ensure-locales"
echo ""
fi
echo "Reload your shell to use them:"
echo " exec \$SHELL -l"
echo ""

112
.local/bin/ensure-locales Executable file
View file

@ -0,0 +1,112 @@
#!/bin/sh
# Ensure all locales specified in ~/.config/shell/locale are installed
set -eu
LOCALES="en_US.UTF-8 de_DE.UTF-8 en_DK.UTF-8 en_IE.UTF-8"
# Because `locale -a` prints, for example, "en_US.utf8",
# and `locale.gen` wants "en_US.UTF-8" instead
_locale_present() {
norm=$(printf '%s' "$1" | tr 'A-Z' 'a-z' | tr -d '-')
locale -a 2>/dev/null | tr 'A-Z' 'a-z' | tr -d '-' | grep -qx "$norm"
}
# In most cases there should be no missing `$LOCALES`
missing=""
for l in $LOCALES; do
_locale_present "$l" || missing="$missing $l"
done
if [ -z "$missing" ]; then
echo ""
echo "All locales present"
echo ""
exit 0
fi
# If there are missing `$LOCALES`, just notify the user
# because this script most likely was run as part of `dotfiles-install`
# and therefore without root privileges
if [ "$(id -u)" != 0 ]; then
self=$(cd "$(dirname "$0")" && pwd)/$(basename "$0")
echo "" >&2
echo "Missing locales:$missing" >&2
echo "" >&2
echo "Fix with: sudo $self" >&2
echo "" >&2
exit 1
fi
# Install the missing `$LOCALES`
if ! command -v locale-gen >/dev/null 2>&1; then
echo "" >&2
echo "locale-gen not found, generate manually:" >&2
echo "" >&2
for l in $missing; do
echo " localedef -i ${l%.*} -f UTF-8 $l" >&2
done
echo "" >&2
exit 1
fi
[ -f /etc/locale.gen ] || : > /etc/locale.gen
for l in $missing; do
# Uncomment existing line, or append if not present at all
esc=$(printf '%s' "$l" | sed 's/\./\\./g')
if grep -qE "^#? *$esc UTF-8" /etc/locale.gen; then
sed -i "s/^# *\($esc UTF-8\)/\1/" /etc/locale.gen
else
printf '%s UTF-8\n' "$l" >> /etc/locale.gen
fi
done
locale-gen
# verify all missing `$LOCALES` were installed
rc=0
for l in $missing; do
_locale_present "$l" || {
echo "Failed to generate: $l" >&2;
rc=1;
}
done
exit $rc

5
.local/bin/scp Executable file
View file

@ -0,0 +1,5 @@
#!/bin/sh
# See ~/.local/bin/ssh
exec /usr/bin/scp -o SetEnv=LC_ALL=C.UTF-8 "$@"

5
.local/bin/sftp Executable file
View file

@ -0,0 +1,5 @@
#!/bin/sh
# See ~/.local/bin/ssh
exec /usr/bin/sftp -o SetEnv=LC_ALL=C.UTF-8 "$@"

14
.local/bin/ssh Executable file
View file

@ -0,0 +1,14 @@
#!/bin/sh
# Mask the exotic `LC_*` values from ~/.config/shell/locale on remote hosts
#
# Debian's /etc/ssh/ssh_config forwards them via `SendEnv LANG LC_*`,
# which cannot be cleared from ~/.ssh/config
# => Send `LC_ALL` on top, which overrides all `LC_*` and `LANG` remotely
#
# `C.UTF-8` is built into `glibc` and thus available on every host
#
# Found via the `$PATH` by `git`, `rsync`, `sshfs`, scripts, and GUI apps;
# `scp` and `sftp` call /usr/bin/ssh directly and have their own wrappers
exec /usr/bin/ssh -o SetEnv=LC_ALL=C.UTF-8 "$@"