据我了解,locale-gen
实用程序/usr/lib/locale/locale-archive
根据/etc/locale.gen
文件中的条目和/usr/share/i18n/locales/
.此外,实用程序将其翻译文件以机器对象格式存储在/usr/share/locale/<locale_dir>/LC_MESSAGES/
目录下。例如:
# dpkg -L wget | grep nl
/usr/share/locale/nl
/usr/share/locale/nl/LC_MESSAGES
/usr/share/locale/nl/LC_MESSAGES/wget.mo
#
当我执行 example 时strace -e open wget
,我可以看到/usr/lib/locale/locale-archive
和/usr/share/locale/nl/LC_MESSAGES/wget.mo
文件都已打开。
目录中的文件中存储了哪些本地化数据/usr/share/locale/<locale_dir>/LC_MESSAGES/
以及存储在哪些本地化数据中/usr/lib/locale/locale-archive
?
答案1
尽管我事先对 Linux 中如何实现本地化几乎一无所知,但我还是尽力了解它。
简要描述;简介
/usr/lib/locale/locale 存档
locale-archive
locale-gen(8)
是通过调用生成的内存映射文件localedef(1)
。内存映射意味着一旦它被程序创建并调用,它只会被加载到内存中一次。
由于 中定义的所有语言集/etc/locale.gen
都是预定义的,并且存档本身是高度静态的,因此不需要在内存中多次保存它。因此,每次被另一个程序调用时,该进程都会指向已加载到内存中的存档,因此只会添加到程序虚拟内存中。这样不仅可以降低进程的物理内存占用量,而且可以加快每个与本地化有关的系统的速度。 (不需要额外的磁盘 I/O!)
此外,它似乎可以作为一种包含所有系统范围语言的故障恢复语言环境文件。此外,该存档被使用 glibc 编写的软件大量使用。
/usr/share/locale/$LOCALE_DIR/LC_MESSAGES/$PROGRAM.mo
Linux 中软件的国际化 ( i18n, 18 chars between 'i' and 'n'
) 可以通过使用 GNU-gettext 来实现。
- 当编写程序时,每个打印语句都适合使用 GNU
gettext()
函数来包装需要打印的字符串。 - 然后,
xgettext(1)
迭代源,.pot (Portable Object Template Files)
按其方式创建。 - 然后,人工翻译人员可以
msginit(1)
将其解析为.po (Portable Object)
文件,通常表示消息目录。然后所有字符串都会被手工翻译。 - 之后,
msgfmt(1)
用于将编辑后的.po
文件编译为二进制.mo (Message Object)
文件。这些可以与软件包一起提供。
在系统上安装软件包时,/usr/share/locale/<locale_dir>/LC_MESSAGES/
会填充$PROGRAM.mo
文件。例如,当调用 wget 时,您的LANG
环境变量将指向wget
使用当前的语言环境设置,这会导致wget
通过指针将正确的预编译翻译包含到 read 中.mo binary
。
其他细节和来源
对于区域设置存档:
内存映射:CentOS 邮件列表
I18N 分包方法:关于不同语言环境归档编译的 Fedora 文档
还要考虑locale(1), localedef(1)
和 的联机帮助页locale-gen(8)
。
对于.mo
文件:
创建文件的过程.mo
:Gettext 上的维基百科
GNU MO 文件格式:解释和二进制格式
还要考虑xgettext(1), msginit(1)
和 的联机帮助页msgfmt(1)
。
另请查看 ENV 变量LC_MESSAGE
和LOCPATH
.
我确信这只是这个庞大主题的表面。尽管如此,我希望这足以让您开始。