【发布时间】:2021-06-23 12:09:32
【问题描述】:
我正在使用 GNU gettext 进行翻译,它可以工作。 下面的测试代码展示了我的实现思路:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <libintl.h>
#include <locale.h>
#define _(STRING) gettext(STRING)
int main()
{
/* Setting the i18n environment */
setlocale (LC_ALL, "");
bindtextdomain ("hello", getenv("PWD"));
textdomain ("hello");
/* Example of i18n usage */
std::cout << _("Hello World!") << std::endl;
setenv("LANGUAGE", "fr", 1);
std::cout << _("Hello World!") << std::endl;
return EXIT_SUCCESS;
}
我有一个工作的 .mo 文件,所以当我运行程序时,我得到:
Hello World!
Bonjour le monde!
到目前为止一切顺利。 但我必须将翻译后的字符串转发给第 3 方应用程序,并且我需要指明编码(拉丁语 1、拉丁语 9、西里尔语、UTF-8 等)。
如何在运行时获取编码?
【问题讨论】:
-
C++ 语言环境对象不提供确定语言环境编码的方法。这只能通过使用 C 库/POSIX 函数来实现。
-
看看that answer 基本上标准库旨在设置全局字符串编码(适用于应用程序和所有库)。并且流编码是单独定义的——如果需要,转换是静默完成的。你怎么
forward the translated strings to a 3rd party application? -
@MarekR 字符串在对象中转发。一个字符串对象,它保存字符串的字节表示(char 数组)。字符串对象引用保存编码的字体对象。一些较旧的控制台仅支持拉丁语 1 和拉丁语 9,另一些则支持更多的字符集,最新的将支持 UTF-16。所以我需要弄清楚如何将 gettext() 输出转换为支持的字符集,如果我知道翻译器使用的字符集,那会更容易。
-
您使用什么将数据从一个应用程序发送到另一个应用程序?这是某种
std:ostream吗? -
@MarekR。不会。它通过 CAN(控制器局域网)发送到另一台设备。有一个已定义的协议,我无法更改,因此我需要能够找到编码。或者,我可以确保所有翻译都使用 UTF-8 完成,然后在选择新语言时分析文本字符串。这将需要一种方法来遍历 .mo 文件中的所有文本字符串,但我也找不到这样做的方法。