我陷入了一个棘手的境地。
我正在设置一台公用计算机,希望人们使用访客帐户登录。需要使用计算机的人说着多种不同的语言。
该电脑是旧的,目前运行的是 Lubuntu 15.10,Lightdm 登录。
但是,由于只有通过注销并重新登录帐户才能切换系统语言,而且一旦注销,访客帐户的数据就会被清除......这有点像第 22 条军规。
我可能需要使用某种脚本语言选择器来解决这个问题。我看到两种可能的解决方案,它们构成了我的问题:
有没有办法无需完全注销即可更改系统语言?
或者,是否可以在登录期间启动脚本?我正在考虑几种不同的来宾帐户/skel 替代方案,并在登录期间创建符号链接。
答案1
可以在会话中更改环境变量 LANG 和 LANGUAGE,但这不会影响已在运行的进程。因此,没有实际的方法可以在不注销的情况下执行此操作。
考虑到 lightdm-gtk-greeter 已经有一个语言选择器,可以在您登录普通帐户时选择语言,最优雅的解决方案可能是以某种方式利用该功能。但不知道怎么做...
以下示例解决方案使用包装器脚本让用户通过 zenity 对话框选择显示语言。示例包括英语和瑞典语;当然,您必须安装您使用的语言。此解决方案应适用于更高版本的 Ubuntu 上的 unity-greeter 和 lightdm-gtk-greeter。我在 15.10 和 16.04 上进行了测试。
创建/etc/guest-session/choose-language-wrapper.sh
,并赋予其以下内容:
#!/bin/sh -e
# show zenity dialog only when launched from greeter
ONLYGUEST=true
for U in $(users); do
if [ "${U%%-*}" != 'guest' ]; then
ONLYGUEST=false
break
fi
done
if $ONLYGUEST && [ -x /usr/bin/zenity ]; then
guestlang=$( zenity --list --title 'Select language' \
--text 'Select language for the guest session' --radiolist \
--column 'Pick' --column '' TRUE 'English' FALSE 'Swedish' )
if [ "$guestlang" = 'English' ]; then
echo 'export LANGUAGE=en_US' >> "$HOME/.profile"
echo 'export LANG=en_US.UTF-8' >> "$HOME/.profile"
elif [ "$guestlang" = 'Swedish' ]; then
echo 'export LANGUAGE=sv' >> "$HOME/.profile"
echo 'export LANG=sv_SE.UTF-8' >> "$HOME/.profile"
fi
fi
exec /usr/lib/lightdm/lightdm-guest-session "$@"
并使其可执行:
sudo chmod +x /etc/guest-session/choose-language-wrapper.sh
然后通过创建此文件使 lightdm 使用包装器脚本:
$ cat /etc/lightdm/lightdm.conf.d/50-choose-guest-language.conf
[Seat:*]
guest-wrapper=/etc/guest-session/choose-language-wrapper.sh
下次重启后,从接待程序启动访客会话时应该会出现 zenity 对话框。