我有一个用英语为某些嵌入式设备编写的 C 程序。 所以有这样的代码:
SomeMethod("Please select menu");
OtherMethod("Choice 1");
假设我想支持其他语言,但我不知道我的设备有多少内存。我不想将字符串存储在我可能空间较少并使程序崩溃的其他内存区域。所以我想把字符串存放在同一个内存区,占用同一个空间。所以我想到了这个:
SomeMethod(SELECT_MENU);
OtherMethod(CHOICE_1);
还有一个单独的头文件:
英语.h
#define SELECT_MENU "Please select menu"
#define CHOICE_1 "Choice 1"
对于其他语言:
法语.h
#define SELECT_MENU "Text in french"
#define CHOICE_1 "same here"
现在,根据我想要的语言,我将只包含该头文件。
这是否满足以下要求:如果我选择英文版,我的国际化程序的字符串
将存储在相同的内存区域 并占用与我之前的程序相同的内存? (我知道法语可能需要更多 - 但这是与法语字母需要更多字节相关的其他问题)。
我想因为我将使用 defines
字符串将被放置在内存中与之前相同的位置。
最佳答案
至少在 Linux 和许多其他 POSIX 系统上,您应该对 gettext(3) 感兴趣(并通过 printf(3) 中的定位参数,例如 %3$d
而不是控制格式字符串中的 %d
)。
然后你会编码
printf(gettext("here x is %d and y is %d"), x, y);
这很常见,以至于有习惯
#define _(X) gettext(X)
稍后编码
printf(_("here x is %d and y is %d"), x, y);
您还需要使用 msgfmt(1) 处理消息目录
您会找到一些关于国际化 (i18n) 和本地化的文档,例如Debian Introduction to i18n .另请阅读 locale(7) .你可能应该总是使用 UTF-8今天。
此类消息目录的优点(默认情况下所有这些都已在 Linux 系统上可用!)是国际化发生在运行时。没有理由限制它在编译时发生。消息目录可以(并且经常)由开发人员的其他人翻译。你的文件系统中会有包含这些的目录(例如,在一些便宜的闪存中,如一些 SD 芯片)。
请注意,国际化和本地化是一个困难的主题(阅读更多文档以了解它有多困难,一旦你想处理非欧洲语言),Linux 基础设施设计得很好(可能更好,甚至更多)高效,比你建议的宏)。 Qt 和 Gtk 也广泛支持国际化(基于 gettext
等...)。
关于c - 国际化C程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30875412/