As I understand, locale-gen
utility generates /usr/lib/locale/locale-archive
database based on entries in /etc/locale.gen
file and locale template/configuration files in /usr/share/i18n/locales/
. In addition, utilities store their translation files in Machine Object format under /usr/share/locale/<locale_dir>/LC_MESSAGES/
directory. For example:
# dpkg -L wget | grep nl
/usr/share/locale/nl
/usr/share/locale/nl/LC_MESSAGES
/usr/share/locale/nl/LC_MESSAGES/wget.mo
#
Run Code Online (Sandbox Code Playgroud)
When I execute for example strace -e open wget
, then I can see that both /usr/lib/locale/locale-archive
and /usr/share/locale/nl/LC_MESSAGES/wget.mo
files are opened.
What localization data is stored in files in /usr/share/locale/<locale_dir>/LC_MESSAGES/
directory and what localization data is stored in /usr/lib/locale/locale-archive
?
尽管我事先对 Linux 中如何实现本地化几乎一无所知,但我还是尽力了解它。
/usr/lib/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 来实现。
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-Mailing-List
方法 I18N 分包:有关不同语言环境存档编译的 Fedora 文档
还要考虑locale(1), localedef(1)
和 的联机帮助页locale-gen(8)
。
对于.mo
文件:
创建.mo
文件的过程:Gettext
GNU MO 文件格式的维基百科:解释和二进制格式
还要考虑xgettext(1), msginit(1)
和 的联机帮助页msgfmt(1)
。
另请查看 ENV 变量LC_MESSAGE
和LOCPATH
.
我确信这只是这个庞大主题的表面。尽管如此,我希望这足以让您开始。
归档时间: |
|
查看次数: |
1123 次 |
最近记录: |