C 没有文件系统的Gettext

C 没有文件系统的Gettext,c,localization,internationalization,embedded,gettext,C,Localization,Internationalization,Embedded,Gettext,对于带有GUI的嵌入式系统,我们使用自定义翻译系统。字符串存储在微控制器的代码ROM中 目前,我们有多达10种语言和大约400个翻译字符串(根据产品的不同而有所不同) 我们目前的系统相当麻烦,我相信gettext将是一个更好的解决方案 据我所知,gettext需要使用bindtextdomain来设置包含已编译翻译文件(*.mo)的目录 有没有办法从记忆中读出译文?也就是说,我希望在二进制文件中包含编译的*.mo文件,并设置gettext来使用这些文件。或者,翻译数据将存储在没有文件系统的数据E

对于带有GUI的嵌入式系统,我们使用自定义翻译系统。字符串存储在微控制器的代码ROM中

目前,我们有多达10种语言和大约400个翻译字符串(根据产品的不同而有所不同)

我们目前的系统相当麻烦,我相信gettext将是一个更好的解决方案

据我所知,gettext需要使用
bindtextdomain
来设置包含已编译翻译文件(*.mo)的目录

有没有办法从记忆中读出译文?也就是说,我希望在二进制文件中包含编译的*.mo文件,并设置gettext来使用这些文件。或者,翻译数据将存储在没有文件系统的数据EEPROM中

或者,您可以推荐一种不同的翻译系统用于带有C接口的微控制器系统(16位或32位,256到512 KB ROM)


编辑:我应该补充一点,能够维护微控制器固件之外的翻译将是切换到gettext的一个原因。适当的翻译数据将由用户使用我们已经随系统提供的配置软件加载。

这就是我要做的:我将在代码中的常量变量中包含二进制“.mo”。您可以编写一个从二进制到字符数组的简单转换器,并在程序中编译该“.mo”文件。您将拥有一个“.mo”文件数据数组,每个数据都使用不同的语言

我将修改libintl源代码以访问其中一个数组。检查loadmsgcat.c文件,函数
\u nl\u load\u domain
。在这里可以看到它如何尝试使用
mmap()
(因此它准备将所有内容都存储在内存中)。只需在那里添加一些代码,就可以根据请求的语言决定使用“.mo”数组的哪个元素


我没有试过,但考虑到你的情况,我会试着这么做。这看起来并不难。

也许gettext在你的情况下会太过分?也许你会这样做?你可以在二进制文件上设置一个RAM磁盘,或者伪造文件I/O。