c-gettext的效率:内存翻译



我有一个带Flash的嵌入式系统,CPU非常低端,RAM更少。我想知道使用.MO文件进行gettext语言翻译的效率有多高。

为了进行区域设置语言字符串提取,每次gettext从flash OR读取MO文件时,是否首先将完整的MO二进制文件加载到RAM中,然后从那里提取区域设置字符串?

如果MO文件(由于有很多字符串,它会很大~1Mb)总是加载到RAM中,它会占用我的RAM。

正如微软所说,它是开源的,所以你可以对它进行调整

如果你对这个系统有一个更全面的定义(根据我的评论),我们可能会提供更多帮助。

如果这是一个深度嵌入式系统(我做的那种东西),没有操作系统,也没有任何类型的外部文件系统,那么字符串必须都在内存中。很可能会有一种机制将这些字符串存储在闪存中,这样它们就不会消耗RAM。

例如,在ARM上,数据结构可以很容易地存储在闪存中。要做到这一点,您需要告诉编译器程序的哪个部分要存储它们,使用类似于的东西

const char mesg1[] __attribute__((section (".USER_FLASH"))) 
             = "Ciao a tutti";
const char mesg2[] __attribute__((section (".USER_FLASH"))) 
             = "Riesco a sentire la mia mente va Dave";

当程序被链接时,需要编写链接器脚本来将字符串放入Flash中,并且它们不会被复制到RAM中。

您可以将大约多少空间用于消息?它们需要多少空间?

你可能正在与一个经过充分研究的问题作斗争;随着资源限制的临近,编程工作量呈指数级增长。可能需要付出巨大的努力才能将内容放入最后几%的内存中。

曾经"显而易见"的调整是尝试一些简单的压缩技术。其中一个可能应用于原始消息,并在打印消息时进行解压缩。

编辑:我觉得你的问题看起来很简单,很自然,我以为答案会很简单。

我看了一眼gettext文档,但没能在那里找到。我下载了源代码。10分钟后,我真的无法告诉你它是如何工作的。我可以告诉你,这比我预期的要复杂得多。我看了大量的文件。关于如何最好地组织翻译,如何准备程序,以及可能导致问题的事情,有很多文档。非常有用的见解。然而,我找不到任何解释其整体运行时体系结构的文档。没有一个没有什么

我最好的建议是去GNUgettext邮件列表,搜索/查找,如果需要的话询问。邮件列表档案可在http://savannah.gnu.org/projects/gettext/我很抱歉我帮不了什么忙。

gettext通常与哈希表一起使用:

  • 当用户选择一种语言时,对.mo文件的内容进行处理,以找到每个翻译的偏移量。这些偏移量存储在哈希表中。

  • 当要显示翻译的字符串时,计算对应的英文字符串的散列,并且使用该散列找到翻译的字符串的偏移量。

如果嵌入式系统中的fhash内存映射到地址空间,则可以将英语字符串和翻译存储在闪存中。只有哈希表需要在RAM中。您需要为每个转换后的字符串保留一个哈希和一个指针的大小。如果您使用CRC32作为哈希和4字节指针,则需要8kB的RAM来存储1024个转换后的字符串。

如果没有将闪存映射到地址空间,则必须在选择语言时在RAM中加载一个完整的.mo文件,或者每次要显示字符串时都调用闪存IO例程。

最新更新