就算世界终结,也无所谓

愿你有一天,能与你最重要的人重逢

记一次 Raspbian 下的 locale 设置

警告:本文废话极多,介意者请直接 Ctrl + W,谢谢

TL;DR

  1. 使用任意文本编辑器打开 /etc/locale.gen
  2. 删除你想要生成的 locale 之前的 #,保存
  3. 执行 locale-gen

废话一堆的正文

嘛…

我之前有只 Raspberry Pi 1B+,当下载机用了大概两年,然后借给我比利玩烧了…

在这之后我就各种不爽。讲道理,在 Windows 下做开发真的非常难受,特别是做 Web 相关的开发。一来我不熟悉 Windows 下 LNMP 环境的部署,二来各种操作在 GUI 下也没有在 CLI 下方便。虽然说有 PhpStudy 和 UPUPW 之类的一键包,但是我使用了一番后,仍然觉得不满意。

所以,我还是使用 VMware Workstation 搭建虚拟机,在虚拟机上调试开发。可惜的是,我的电脑实在是过于垃圾,开机之后 VMware Workstation 的 daemon 就要占去许多资源让我实在心疼,而开启虚拟机之后的可用资源简直是少到可怜。并且安装 VMware Tools 也非常麻烦,在 CentOS 7 上安装程序无法自动检测到当前 kernel-header 的路径,需要使用 yum 安装 kernel-header 一个才可以(我折腾这个时走了不少弯路)。种种原因,让我放弃了虚拟机。

然后是 WSL(Windows Subsystem for Linux,适用于 Windows 的 Linux 子系统,于 Windows 10 Version 1607 正式推出)。作为 Windows Insider 之一,听到这个玩意儿之后我是非常激动的。当时天真的我想着再也不需要开虚拟机做开发了,当即下载了最新的 Windows 10 Insider Preview,开启了 WSL(当时还只有 Ubuntu 16.04 LTS 一个发行可供选择)。试用了五分钟之后,我发现了问题所在:这性能也太 TMD 烂了吧!在我的电脑上,用 apt 安装个 vim,在原生 Linux 上只需要不到一分钟,而在 WSL 上需要五分钟。执行一句指令也需要等待好几秒才会有响应。而且兼容性问题严重,我跑个 OneinStack 部署 LNMP,在编译 Nginx 时就失败了。我真的用不下去。

在这些之后,我就转战在原生 Linux 上做开发了,使用的发行版是 Ubuntu。尽管在 Linux 下做开发非常爽,但是 Linux 下常用的软件缺失并不能忽略。我平时习惯使用的 TIM、QQ 音乐等软件在 Linux 下并没有可用的版本,而我又懒得去配置 Wine。所以,在这一年内,我一直非常纠结:到底是使用 Windows 做开发好呢,还是使用 Linux 做开发好呢。

一星期前我突然心血来潮,打算把 LittleSkin 上的图形验证码换成 reCAPTCHA。我当时使用的是 Windows,并不想重启到 Linux 下,于是就又开启了 WSL。但是 WSL 的性能还是和之前一样糟糕,我真的无法忍受,就在 Twitter 上发了个牢骚,大概是说「WSL 的性能真的是太烂了,真想念我的那块 Pi」。两天之后,我的生日,我的主人仿佛是会读心术一般,送了我一套 Pi 3B+。我看了一下这个套装里的包含的东西,除了常规的 Micro SD 卡、充电头、Micro USB 电源线(这条电源线还带一个小开关的,重启 Pi 的时候只需要关闭再打开即可,非常方便👍)、亚克力外壳、风扇和散热片之外,居然还有杜邦线、面包板(虽然说挺小一块,但是总比没有要好)等,我都可以直接拿这套来做 IoT 开发了。这在之前是我想都不敢想的。拿到手的时候真的是高兴地像个孩子。


扯远了,明明这篇博文是记录在 Raspbian 下的一次 locale 设置的,怎么就扯到那么远的地方去了呢。不过懒得一次更新博客,多扯点也没什么大问题,是吧(笑)

回到正题上来。昨天晚上下晚自习把 Pi 拿到手之后我真的很激动,以致于我熬夜配置这只 Pi 到今天凌晨一点。其实凌晨一点我还是没有困意,只是考虑到今天还要上课,就还是乖乖滚去睡觉了。事实证明只睡五个小时真的不够

昨天也只是把一些基础(烧录系统以及 raspi-config etc.)配置好,而今天我在使用 apt 安装软件包时,出现了这个错误:

apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct!
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_TIME = "en_US.UTF-8",
	LC_MONETARY = "en_US.UTF-8",
	LC_CTYPE = "en_US.UTF-8",
	LC_ADDRESS = "en_US.UTF-8",
	LC_TELEPHONE = "en_US.UTF-8",
	LC_NAME = "en_US.UTF-8",
	LC_MEASUREMENT = "en_US.UTF-8",
	LC_IDENTIFICATION = "en_US.UTF-8",
	LC_NUMERIC = "en_US.UTF-8",
	LC_PAPER = "en_US.UTF-8",
	LANG = "en_GB.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

虽然说我很不明白为什么 apt 会报这个错——我应该在 raspi-config 中应该把 locale 都设置好了才对。还是认真读了下报错,大概是说我选择的这些语言不被支持或者没有被安装。en_US.UTF-8 不被支持是不可能的,剩下的只会有一个结果:语言没有被安装。

Google 了一下报错信息,相关的问答还挺多的。随便打开了几个看了看,基本都是使用一个指令:

locale-gen en_US.UTF-8 zh_CN.UTF-8

但是这在我的 Raspbian 上好像不起作用。不管我如何更改的参数,始终都只会生成 en_GB.UTF-8 这个 locale。

于是就继续翻 Google 咯。发现一个不一样的,是使用 localepurge 来管理 locale 的,但是生成 locale 是使用的仍然是 locale-gen 这个指令。好像全网都在使用 locale-gen 生成 locale!

既然这样的话,我下意识地执行了

locale-gen --help

来查看我的参数是否写错了。滑稽的是,它貌似直接忽略了后面的 --help 参数,直接开始生成 locale 了。这应该就是为什么我更改参数无效的原因!

然后我不知道是在执行哪个指令时加入了 --help 参数,其提示我使用 man 指令查询这个指令的文档。就是 man!我可以使用 man 指令查询 locale-gen 的用法!

然后我看到了这句话:

locale-gen is a program that reads the file /etc/locale.gen and invokes localedef for the chosen localisation profiles. Run locale-gen after you have modified the /etc/locale.gen file.

《记一次 Raspbian 下的 locale 设置》

vim 打开 /etc/locale.gen,取消掉我要生成的 locale 前的 #,保存,再执行 locale-gen,成功生成 locale。

后记

后来想想,这可能是因为我在执行 raspi-config 时操作不当造成的。

raspi-config 中有个地区和语言设置,其中选中 / 取消选中某个 locale 是敲空格来的,而我太久没摸 Pi 了,就傻逼地直接按了回车。

默认的 locale 就是 en_GB.UTF-8,或许这也可以解释为什么 /etc/locale.gen 里默认只有 en_GB.UTF-8 是没有被注释掉的。

点赞
由于 LiveRe 使用的头像 API 不支持 HTTPS,现在已经禁用了 QQ、微信和微博的 OAuth 登录。
我也不想就这样因噎废食,但事实是我根本没有能力去搭建一个反代。
如果你发现了有评论被删除的痕迹,八成是这些评论使用的 OAuth 方式是 QQ 或者微信或者微博。