<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
  <!ENTITY % general-entities SYSTEM "../general.ent">
  %general-entities;
]>

<sect1 id="ch-scripts-locale" revision="systemd">
  <?dbhtml filename="locale.html"?>

  <title>配置系统 Locale</title>

  <indexterm zone="ch-scripts-locale">
    <primary sortas="e-etc-locale-conf">/etc/locale.conf</primary>
  </indexterm>

  <para>下面将创建的 <filename>/etc/locale.conf</filename>
	  设定本地语言支持必要的环境变量，将它们正确设定后，
	  可以得到以下好处：</para>

  <itemizedlist>
    <listitem>
      <para>程序输出被翻译成本地语言</para>
    </listitem>
    <listitem>
      <para>字符被正确分类为字母、数字和其他类别，
      这对于使 <command>bash</command> 正确接受命令行中的非 ASCII
      本地字符来说是必要的</para>
    </listitem>
    <listitem>
      <para>根据所在地区惯例排序字母</para>
    </listitem>
    <listitem>
      <para>适用于所在地区的默认纸张尺寸</para>
    </listitem>
    <listitem>
      <para>正确格式化货币、时间和日期值</para>
    </listitem>
  </itemizedlist>

  <note><title>译注</title>
	  <para>译者强烈反对在 <filename>/etc/locale.conf</filename>
		  中指定中文 locale。由于字符终端的局限性，它根本无法显示中文字符。
		  使用中文 locale 将导致许多程序输出中文消息，
		  结果在字符终端中都显示为问号。建议在
		  <filename>/etc/locale.conf</filename> 中指定英文 locale ，
		  在 BLFS 中安装了图形环境后再将
		  <literal>LANG=zh_CN.UTF-8</literal> 写入
		  <filename>.xprofile</filename> 等图形界面配置文件，
		  这样即可在字符终端中使用英文 locale ，而在图形界面中使用中文。
	  </para>
  </note>

  <para>将下面的 <replaceable>&lt;ll&gt;</replaceable>
  	  替换为所需语言的双字符代号（例如 <quote>en</quote>），
  	  <replaceable>&lt;CC&gt;</replaceable> 替换为国家或地区的双字符代号
	  （例如 <quote>GB</quote>），
	  <replaceable>&lt;charmap&gt;</replaceable> 替换为您选定的 locale
	  的标准字符映射。另外，还可以加入 <quote>@euro</quote>
	  之类的可选修饰符。</para>

  <para>Glibc 支持的所有 locale 可以用以下命令列出：</para>

<screen role="nodump"><userinput>locale -a</userinput></screen>

  <para>字符映射可能有多个别名，例如 <quote>ISO-8859-1</quote>
	  也可以称为 <quote>iso8859-1</quote> 和 <quote>iso88591</quote>。
	  某些程序不能正确处理一些别名（例如，只识别 <quote>UTF-8</quote>，
	  不能识别 <quote>utf8</quote>），因此在多数情况下，为了保险起见，
	  最好使用 locale 的规范名称。为了确定规范名称，执行以下命令，
	  将 <replaceable>&lt;locale name&gt;</replaceable> 替换成
	  <command>locale -a</command> 对于您希望的 locale 的输出
	  （以 <quote>en_GB.iso88591</quote> 为例）。</para>

<screen role="nodump"><userinput>LC_ALL=<replaceable>&lt;locale name&gt;</replaceable> locale charmap</userinput></screen>

  <para>对于 <quote>en_GB.iso88591</quote> locale，以上命令输出：</para>

<screen><computeroutput>ISO-8859-1</computeroutput></screen>

  <para>这样就最终确定 locale 应设置为 <quote>en_GB.ISO-8859-1</quote>。
	  在将以上启发方法获得的 locale 添加到 Bash 启动文件之前，
	  一定要进行下列测试：</para>

<screen role="nodump"><userinput>LC_ALL=&lt;locale name&gt; locale language
LC_ALL=&lt;locale name&gt; locale charmap
LC_ALL=&lt;locale name&gt; locale int_curr_symbol
LC_ALL=&lt;locale name&gt; locale int_prefix</userinput></screen>

  <!--para>The above commands should print the language name, the character
  encoding used by the locale, the local currency, and the prefix to dial
  before the telephone number in order to get into the country. If any of the
  commands above fail with a message similar to the one shown below, this means
  that your locale was either not installed in Chapter&nbsp;6 or is not supported by
  the default installation of Glibc.</para-->
  <para>以上命令应该输出语言名称、选定 locale 使用的字符编码、
	  本地货币符号以及所在国家或地区的国际电话区号。
	  如果以上某个命令失败并输出类似下面这样的消息，
	  意味着您的 locale 在第 6 章中没有安装，或者不被 Glibc 的默认安装支持。
  </para>

<screen><computeroutput>locale: Cannot set LC_* to default locale: No such file or directory</computeroutput></screen>

  <!--para>If this happens, you should either install the desired locale using the
  <command>localedef</command> command, or consider choosing a different locale.
  Further instructions assume that there are no such error messages from
  Glibc.</para-->
  <para>如果出现了这种消息，您应该用 <command>localedef</command>
	  命令安装所需的 locale ，或重新选择一个不同的 locale 。
	  后文假设 Glibc 没有输出类似错误消息。</para>

  <!-- FIXME: the xlib example will became obsolete real soon -->
  <!--para>Some packages beyond LFS may also lack support for your chosen locale. One
  example is the X library (part of the X Window System), which outputs the
  following error message if the locale does not exactly match one of the character
  map names in its internal files:</para-->
  <para>某些 LFS 以外的软件包可能缺乏对您选择的 locale 的支持，
	  例如 X 库（X 窗口系统的一部分），它在您的 locale
	  与它内部文件中的字符映射表名不完全匹配时，会输出以下错误消息：</para>

<screen><computeroutput>Warning: locale not supported by Xlib, locale set to C</computeroutput></screen>

  <!--para>In several cases Xlib expects that the character map will be listed in
  uppercase notation with canonical dashes. For instance, "ISO-8859-1" rather
  than "iso88591". It is also  possible to find an appropriate specification by
  removing the charmap part of the locale specification.  This can be checked
  by running the <command>locale charmap</command> command in both locales.
  For example, one would have to change "de_DE.ISO-8859-15@euro" to
  "de_DE@euro" in order to get this locale recognized by Xlib.</para-->
  <para>某些情况下 Xlib 期望字符映射以带有规范连字符的大写形式给出，
	  例如应该使用 <quote>ISO-8859-1</quote> 而不是
	  <quote>iso88591</quote>。
	  有时也可以通过去除 locale 规范中的字符映射部分找到合适的规范，
	  可以通过运行 <command>locale charmap</command> 确认。
	  例如，您需要将 <quote>de_DE.ISO-8859-15@euro</quote>
	  替换成 <quote>de_DE@euro</quote>，以获得 Xlib 能够识别的 locale。
  </para>

  <!--para>Other packages can also function incorrectly (but may not necessarily
  display any error messages) if the locale name does not meet their expectations.
  In those cases, investigating how other Linux distributions support your locale
  might provide some useful information.</para-->
  <para>其他软件包在 locale 名不符合它们的期望时可能工作不正常
	  （但未必输出错误消息）。在这种情况下，探索一下其他 Linux
	  发行版是如何支持您的 locale 的，可以得到一些有用的信息。</para>

  <para>在确定了正确的 locale 设置后，创建
  <filename>/etc/locale.conf</filename> 文件：</para>

<screen><userinput>cat &gt; /etc/locale.conf &lt;&lt; "EOF"
<literal>LANG=<replaceable>&lt;ll&gt;_&lt;CC&gt;.&lt;charmap&gt;&lt;@modifiers&gt;</replaceable></literal>
EOF</userinput></screen>

  <para>您也可以使用 systemd 的 <command>localectl</command> 工具修改
	  <filename>/etc/locale.conf</filename> 。如果希望使用
	  <command>localectl</command> 创建以上例子中的
	  <filename>locale.conf</filename>，运行：</para>

<screen role="nodump"><userinput>localectl set-locale LANG="<replaceable>&lt;ll&gt;_&lt;CC&gt;.&lt;charmap&gt;&lt;@modifiers&gt;</replaceable>"</userinput></screen>

  <!--para>You can also specify other language specific environment variables such
  as <envar>LANG</envar>, <envar>LC_CTYPE</envar>, <envar>LC_NUMERIC</envar> or
  any other environment variable from <command>locale</command> output. Just
  separate them with a space. An example where <envar>LANG</envar> is set as
  en_US.UTF-8 but <envar>LC_CTYPE</envar> is set as just en_US is:</para-->
  <para>您也可以指定其他语言相关的环境变量，例如 <envar>LANG</envar>、
	  <envar>LC_CTYPE</envar>、<envar>LC_NUMERIC</envar> 或
	  <command>locale</command> 输出的其他环境变量，用空格将它们分割即可。
	  例如，将 <envar>LANG</envar> 设置为 en_US.UTF-8，但
	  <envar>LC_CTYPE</envar> 设置为 en_US：</para>

<screen role="nodump"><userinput>localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"</userinput></screen>

  <note><title>译注</title>
	  <para>这种设置的好处是使得一些程序（如 <command>gcc</command>）
		  不使用 UTF-8 引号。默认终端字体不包含 UTF-8 字形，因此 UTF-8
		  引号会显示为一个白底黑字问号。如果希望使用 UTF-8 引号，
		  参阅
		  <ulink url="&blfs-book;postlfs/console-fonts.html">BLFS</ulink>
		  中的说明安装支持 UTF-8 符号的终端字体。
	  </para>
  </note>

  <note><para>请注意 <command>localectl</command> 只能在使用 systemd
  引导的系统中使用。</para></note>

  <!--para>The <quote>C</quote> (default) and <quote>en_US</quote> (the recommended
  one for United States English users) locales are different. <quote>C</quote>
  uses the US-ASCII 7-bit character set, and treats bytes with the high bit set
  as invalid characters. That's why, e.g., the <command>ls</command> command
  substitutes them with question marks in that locale. Also, an attempt to send
  mail with such characters from Mutt or Pine results in non-RFC-conforming
  messages being sent (the charset in the outgoing mail is indicated as <quote>unknown
  8-bit</quote>). So you can use the <quote>C</quote> locale only if you are sure that
  you will never need 8-bit characters.</para-->
  <para><quote>C</quote> （默认 locale）和 <quote>en_US</quote>
	  （推荐美式英语用户使用的 locale）是不同的。
	  <quote>C</quote> locale 使用 US-ASCII 7 位字符集，并且将最高位为 1
	  的字节视为无效字符。因此，<command>ls</command>
	  等命令会将它们替换为问号。另外，如果试图用 Mutt 或 Pine
	  发送包含这些字符的邮件，会发出不符合 RFC 标准的消息
	  （发出邮件的字符集会被标为 <quote>未知 8 位</quote>）。
	  因此，您只能在确信自己永远不会使用 8 位字符时才能使用
	  <quote>C</quote> locale。</para>

  <para>许多程序不能很好地支持基于 UTF-8 的 locale，
  	  我们正在努力记录并（如果可能的话）修复它们，参阅
  	  <ulink url="&blfs-book;introduction/locale-issues.html"/>。</para>

</sect1>
