我的Ubuntu中有两种语言。我想开始我的简单程序,但需要输入不同语言的数据。我厌倦了将全局切换从一个lang切换到另一个lang。现在我试图通过以下代码自动执行此过程:
#include <locale>
#include <clocale>
void change_locale(bool lang)
{
std::locale delocale("de_DE.utf8");
std::locale enlocale("en_AG");
if (lang == true){
std::cout << "set DE locale" << '\n';
setlocale(LC_ALL,"de_DE.utf8");
std::locale::global(delocale);
std::cin.imbue(delocale);
}
else {
std::cout << "set Eng locale" << '\n';
setlocale(LC_ALL,"en_AG");
std::locale::global(enlocale);
std::cin.imbue(enlocale);
}
}
但它不起作用。请注意它仅适用于cin。如何使其可行?
答案 0 :(得分:0)
您所看到的似乎正在改变键盘布局。不幸的是,C ++语言环境不会影响这一点。您需要与操作系统进行交互,特别是IME子系统。 Ubuntu有一些说明,你说你正在使用它们:https://askubuntu.com/questions/813094/how-to-change-uim-ime-input-method-using-command-line-or-programmatically/967787
要点是你需要打开一个Unix域套接字$XDG_RUNTIME_DIR/uim/socket/uim-helper
并写下这样的特定消息:
im_change_whole_desktop
anthy
<one blank line with trailing newline>
答案 1 :(得分:0)
最后,找到了setxkbmap
实用程序的解决方案。
我创建了两个名为
setxkbmap de
setxkbmap en
然后从源代码中调用它
#include <locale>
#include <clocale>
void change_locale(bool lang)
{
std::locale delocale("de_DE.utf8");
std::locale enlocale("en_AG");
if (lang == true){
setlocale(LC_ALL,"de_DE.utf8");
std::locale::global(delocale);
std::cin.imbue(delocale);
system("de.sh");
}
else {
setlocale(LC_ALL,"en_AG");
std::locale::global(enlocale);
std::cin.imbue(enlocale);
system("en.sh");
}
}