我有一个带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例程。