Adjust locale settings for local usage
This commit is contained in:
parent
1b1f309586
commit
2f9103e5b3
6 changed files with 187 additions and 22 deletions
|
|
@ -1,24 +1,42 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# Locale settings for headless machines
|
# Locale settings for desktop machines
|
||||||
|
# as run by the author of this `dotfiles` repository
|
||||||
|
|
||||||
|
# Requires the en_US.UTF-8, en_DK.UTF-8, en_IE.UTF-8, and de_DE.UTF-8
|
||||||
|
# locales be installed which is checked by ~/.local/bin/ensure-locales
|
||||||
|
|
||||||
|
# Other hosts (e.g., servers) usually lack some of these locales,
|
||||||
|
# and Debian's /etc/ssh/ssh_config forwards all of them via `SendEnv LANG LC_*`
|
||||||
|
# => ~/.local/bin/ssh, ~/.local/bin/scp, and ~/.local/bin/sftp
|
||||||
|
# send `LC_ALL=C.UTF-8` on top to mask them on remote hosts
|
||||||
|
|
||||||
|
|
||||||
# Drop what a client may forward over `ssh`,
|
export LANG=en_US.UTF-8 # Fallback for any (future) LC_* not set below
|
||||||
# because `AcceptEnv LANG LC_*` may be set in /etc/ssh/sshd_config
|
|
||||||
unset \
|
|
||||||
LC_ALL \
|
|
||||||
LC_ADDRESS \
|
|
||||||
LC_COLLATE \
|
|
||||||
LC_CTYPE LC_IDENTIFICATION \
|
|
||||||
LC_MEASUREMENT \
|
|
||||||
LC_MESSAGES \
|
|
||||||
LC_MONETARY \
|
|
||||||
LC_NAME \
|
|
||||||
LC_NUMERIC \
|
|
||||||
LC_PAPER \
|
|
||||||
LC_TELEPHONE \
|
|
||||||
LC_TIME
|
|
||||||
|
|
||||||
|
|
||||||
# Set every LC_* category implicitly with the `$LANG` fallback
|
# Base: US English for language, text handling, and sorting
|
||||||
export LANG=C.UTF-8
|
|
||||||
|
export LC_COLLATE=en_US.UTF-8 # Dictionary sort order => Ignore punctuation
|
||||||
|
export LC_CTYPE=en_US.UTF-8 # UTF-8 character classification
|
||||||
|
export LC_MESSAGES=en_US.UTF-8
|
||||||
|
export LC_NUMERIC=en_US.UTF-8 # 1,234.56 rather than 1.234,56
|
||||||
|
|
||||||
|
|
||||||
|
# Exceptions: European conventions with English number formatting
|
||||||
|
|
||||||
|
export LC_MEASUREMENT=en_IE.UTF-8 # Use the metric system
|
||||||
|
export LC_MONETARY=en_IE.UTF-8 # Euro with 1,234.56
|
||||||
|
export LC_PAPER=en_IE.UTF-8 # Use DIN-A4 for a page
|
||||||
|
export LC_TIME=en_DK.UTF-8 # ISO dates, 24h clock, Monday first
|
||||||
|
|
||||||
|
|
||||||
|
# (German) metadata
|
||||||
|
|
||||||
|
export LC_ADDRESS=de_DE.UTF-8 # German postal layout
|
||||||
|
export LC_IDENTIFICATION=en_US.UTF-8
|
||||||
|
export LC_NAME=en_US.UTF-8
|
||||||
|
export LC_TELEPHONE=de_DE.UTF-8 # For "+49" and "030 12345"
|
||||||
|
|
||||||
|
|
||||||
|
export TZ="Europe/Berlin"
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,10 @@ done
|
||||||
unset _key
|
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
|
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"
|
ln -sf "$(command -v batcat)" "$XDG_BIN_HOME/bat"
|
||||||
fi
|
fi
|
||||||
|
|
@ -191,6 +195,13 @@ fi
|
||||||
echo ""
|
echo ""
|
||||||
echo "The dotfiles were installed successfully (branch: $DOTFILES_BRANCH)"
|
echo "The dotfiles were installed successfully (branch: $DOTFILES_BRANCH)"
|
||||||
echo ""
|
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 "Reload your shell to use them:"
|
||||||
echo " exec \$SHELL -l"
|
echo " exec \$SHELL -l"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
|
||||||
112
.local/bin/ensure-locales
Executable file
112
.local/bin/ensure-locales
Executable 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
5
.local/bin/scp
Executable 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
5
.local/bin/sftp
Executable 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
14
.local/bin/ssh
Executable 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 "$@"
|
||||||
Loading…
Reference in a new issue