当我运行控制台应用程序时,所有应翻译的文本(并包含在 .mo 文件中)都以原始语言显示,而不是我提供的区域设置。
我正在尝试为我翻译的俄语控制台应用程序启用英语区域设置。我已使用 Poedit 设置 gettext 在本地目录中创建所需的 .mo 文件
myapp/locale/en/initial-domain.mo
。
StackOverflow 上与此相关的大多数现有问题都对应于全局区域设置覆盖本地项目区域设置。这不是我的问题,因为该应用程序是俄语的,唯一提供的区域设置是我创建的英语翻译,这也是我的 WSL 实例的全局区域设置。
Gettext 如下包含在
stat.hpp
标头中,为了清楚起见,我分配了一些宏:
#include <libintl.h>
#include <locale.h>
#define _(STRING) gettext(STRING)
#define GETTEXT_DOMAIN "initial-domain"
#define GETTEXT_OUTPUT_DIR "locale"
#define GETTEXT_LANGUAGE "en"
这些是在我的main.cpp中的主函数中调用的,如下:
//i18n: initializes the entire current locale of the program as per environment variables set by the user
setlocale(LC_MESSAGES, GETTEXT_LANGUAGE);
//i18n: Indicate the path of the i18n catalog file
bindtextdomain(GETTEXT_DOMAIN, GETTEXT_OUTPUT_DIR);
//i18n: sets the message domain
textdomain(GETTEXT_DOMAIN);
这是我的项目的
tree
:
.
├── locale
│ ├── en
│ │ └── LC_MESSAGES
│ │ └── initial-domain.mo
│ └── initial-domain.pot
├── main
├── main.cpp
├── Makefile
└── stat.hpp
Makefile配置:
CPPFLAGS=-Wall -Wextra -std=c++17
main: main.cpp stat.hpp
我
make
之后,显示的字符没有任何变化。我尝试在运行之前使用 LANG=en
强制进行域分配,但这没有效果。
我需要在 Makefile 中以不同方式链接
<libintl.h>
库吗?这是因为在 WSL 上运行吗?我知道 Windows 处理语言环境(每个线程)的方式意味着需要一些额外的配置(如这篇博文中所述),但我找不到文档表明 WSL2 确实如此,我相信 WSL2 有自己的“本地”语言环境。
提前感谢您在正确方向上的任何指点,让我的头撞到了这里的墙上。如果我可以提供澄清信息,请告诉我。
干杯, 哈尔.
花了更多时间解决这个问题后,我修复了它——这是一个路径错误,最终生成的
.mo
文件的名称与 bindtextdomain
函数期望的值不匹配。仔细命名您的来源...
此处使用
strace
进行调试最为有效,特别是查找 setlocale()
和 bindtextdomain()
函数的调用。
请注意,正如我另外怀疑的那样,libintl.so(gettext 库的一部分)不需要额外的链接。