在Mac Sierra上设置系统范围的语言环境

时间:2018-11-27 20:44:04

标签: macos locale

由于某种原因,我的Sierra安装未正确设置语言环境。我已经为终端和外壳程序目的正确导出了语言环境设置,但是如果我从外壳程序外部执行locale命令,则会得到以下信息:

​LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

如何设置系统范围的非Shell语言环境?

1 个答案:

答案 0 :(得分:0)

在外壳程序之外,您是指从GUI运行的应用程序(Finder,Dock,Launchpad等)吗?此外,您还需要指定影响区域设置的内容,要使用的与区域设置相关的API。

如果使用的是C库,则需要构造适当的语言环境字符串并将其传递给setlocale(),而不是使用""。 (或者,您可以在调用setenv()之前使用setlocale(..., "")来设置相关的环境变量,但这似乎是回旋处。)

那么,您从哪里获得构造该区域设置字符串的信息?如果使用Objective-C,则可以使用NSLocale。您也可以在Swift中使用它,但是Swift-ier API是Locale。如果您使用C或其他具有C绑定的语言,则应使用CFLocale

但是,有一个重要警告。与那些高级API相比,macOS上的C库支持的语言环境要少得多。如果您基于高级API构造一个语言环境字符串,并将其传递给C库,而C库不支持它,那么您仍然会以“ C”语言环境结束。仅使用某些语言环境信息(例如省去国家/地区代码),可能会做得更好。

对于这种方法的一个(有点费解的)示例,您可以查看Wine的源代码,但要知道它是LGPLv2。查看this file中特定于__APPLE__的代码。