问题描述
在系统\u2192管理\u2192语言支持\u2192文本。我只能选择标准区域设置,但我想要 fine-tune。例如,在 Windows 中,我可以手动自定义时间和日期格式、度量单位、小数分隔符、货币等内容 – 我如何在 Ubuntu 中执行此操作?
最佳答案
此答案将演示如何完全自定义区域设置,可以选择使用现有区域设置作为基础。此答案中将使用的语言环境类型是 i18n
类型;这种类型的区域设置将隐含在答案正文中每次提到 “locale” 一词时。
寻找指南
自定义区域设置需要的第一件事是了解区域设置的格式。 This web locale editor 对语言环境中的每个字段都有全面的描述,尽管不是任何人都能以 right-away 的方式使用。这将是使用指南。
需要的工具
使用语言环境所需的唯一工具是
-
文本编辑器。任何都可以,但 VIM 会更出色。
-
text-to-unicode 转换器。很可能您没有,所以我将为您提供一个简单的。请阅读下一小节来获取它。
我建议您创建一个目录并将与您将在该语言环境中执行的工作相关的所有内容保存到其中。
Text-to-unicode 转换器(encodestr)
注意:如果您使用非常见字符,我在下面编写的脚本可能会出现问题;您可能想看看 nas 链接的替代脚本。
将以下代码保存到文件中。该文件将被您的系统识别为 python 脚本,这没关系,因为它是一个。本指南假设您调用脚本 encodestr
。
#!/usr/bin/env python3
import sys
def main():
if len(sys.argv) != 2:
exit(f'Usage: {sys.argv[0]} <string to encode>')
print(encode(sys.argv[1]))
def encode(s):
return ''.join(f"<U{ord(c):04X}>" for c in s)
if __name__ == '__main__':
sys.exit(main())
保存后,授予文件执行权限 – 这会派上用场。您可以使用 nautilus 来执行此操作,或者从终端在保存脚本的目录中运行以下命令: chmod +x encodestr
。
您现在可以通过在同一目录上运行来测试此脚本:./encodestr hello
。您应该得到等于 <U0068><U0065><U006C><U006C><U006F>
的输出。
修改现有区域设置
修改现有区域设置是最简单的情况,因为理想情况下您将选择几乎完全满足您需求的区域设置,在这种情况下您只需进行少量修改。要对其进行定制,您可以使用指南来了解您想要更改哪些部分以及如何更改它们。所有已安装的语言环境都驻留在 /usr/share/i18n/locales
中,但是 the guide 几乎包含曾经创建的所有语言环境。
然而,当你打开一个语言环境时,你会注意到的第一件事是你会读到英语单词和奇怪的 <UXXXX>
代码。您需要能够创建这些代码 – 这就是 encodestr
脚本的来源。
当您知道必须更改哪些部分时,您需要了解该部分中包含的每个字段。
\\n
For example, the
LC_TIME
section contains the fieldt_fmt
, and many others. Each field has its own description on the guide.\\n
现在您知道要修改哪些字段,请再次使用 the guide 找出该字段接受哪些值。
\\n
For example, the field
t_fmt
accepts text and the common strfmt variables.\\n
当您知道要在要修改的字段上写入什么内容时,请通过 encodestr
脚本运行文本以获取其编码的等效项。
注意:并非每个字段都需要编码,如果需要,请使用现有区域设置作为参考。
\\n
For example, if you want to have the time format
Time: %T
in thet_fmt
field, run./encodestr "Time: %T"
; this will return<U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>
and so you will have the linet_fmt <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>
in your locale (in it’s respective section, of course).\\n
修改完所需的每个字段后,您将需要继续将区域设置安装到系统中,以便可以使用它。继续执行此操作的安装部分。
从头开始创建语言环境
与修改一种方法相反,您可以用来创建自定义区域设置的另一种方法是从头开始处理它。如果您再次使用 the guide ,这并不是很困难。不过,这里有一个有用的提示:您可以从其他语言环境复制部分,而无需实际的复制和粘贴方法。您只需遵循以下格式:
LC_SECTION
copy "locale"
END LC_SECTION
其中 LC_SECTION
是您要修改的部分,locale
是您要从中复制该部分的区域设置。
\\n
For example, if you want to copy the time format in the English locale, you would have this text your custom locale file:
\\n
LC_TIME
copy "en_GB"
END LC_TIME
\\n
And that saves you a lot of work and assures that any change made to the referenced locale will be mirrored to yours.
\\n
安装您的自定义区域设置
我将在下面展示的步骤可能不是最佳的,但可行。
-
编译您的语言环境。不要恐慌!这不需要时间。只需运行命令
sudo localedef -i custom -f UTF-8 custom.UTF-8 -c -v
,其中custom
是您的区域设置的名称。\n -
将您的区域设置复制到
/usr/share/i18n/locales/
目录。您肯定需要 sudo 权限才能执行此操作,并且可以使用命令sudo cp locale /usr/share/i18n/locales/
来执行此操作,其中locale
是自定义区域设置的文件名。\n -
在
/var/lib/locales/supported.d/
中指定您的区域设置。例如,创建文件名/var/lib/locales/supported.d/asd
并添加行custom UTF-8
,其中 custom 是您的区域设置的名称。\n -
运行魔法命令。我实际上不知道这个命令到底是做什么的,但它是至关重要的。运行
sudo locale-gen
。它很可能会在需要时生成对可用区域设置的引用。\n -
告诉您的系统使用区域设置。如果您希望以 system-wide 方式使用语言环境,请修改
/etc/environment
文件。如果没有,您可以修改~/.profile
文件,或启动时获取的任何其他文件。如果您不知道后者的含义,请不要担心,只需使用~/.profile
文件即可。要知道必须在其中写入什么内容,请首先运行locale
命令。它应该发布一个包含LANGUAGE
、LC_MESSAGES
、LC_CTYPE
等项目的列表。对于所需的每个部分(由上一个命令列出),您将在单独的行中写入此SECTION="locale"
,其中SECTION
是该部分,locale
是自定义区域设置的名称。\n
\\n
For example, if you want to use the time format from the Netherlands, but the english language, write:
\\n
LANGUAGE="en_GB:en"
LC_TIME="nl_NL"
注意:如果您想对每个区域设置使用一种区域设置,请写入 LC_ALL="locale"
,其中 locale
是您的自定义区域设置的名称。如果您想对除语言之外的所有内容使用区域设置,您可以编写 LANG="locale"
和(当然,在另一行)LANGUAGE="locale":XX
,其中 XX
是您想要的语言的 2 个字母代码。
\\n
For example, if you want to use the Dutch locale and the English language, you could use:
\\n
LANG="nl_NL"
LANGUAGE="nl_NL:en"
你已经完成了
下次登录时,您的区域设置应该已被使用。您可以通过再次运行 locale
命令来测试这一点。
请评论本指南中的不一致或虚假陈述!
次佳答案
不确定您想要哪种自定义,但您可以使用 ~/.locale
设置一些区域设置变量。例如,要获取英语消息,但要获取德国时间等我使用的信息
export LC_ALL=""
export LANG="en_GB.utf8"
export LC_CTYPE="de_DE.utf8"
export LC_NUMERIC="de_DE.utf8"
export LC_TIME="de_DE.utf8"
export LC_COLLATE="de_DE.utf8"
export LC_MONETARY="de_DE.utf8"
export LC_MESSAGES="en_GB.utf8"
export LC_PAPER="de_DE.utf8"
export LC_NAME="en_GB.utf8"
export LC_ADDRESS="de_DE.utf8"
export LC_TELEPHONE="de_DE.utf8"
export LC_MEASUREMENT="de_DE.utf8"
export LC_IDENTIFICATION="de_DE.utf8"
还可以生成自定义区域设置。参见例如this guide 表示日期。