如何更改cin

时间:2017-12-13 12:03:48

标签: c++ console locale cin setlocale

我的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。如何使其可行?

2 个答案:

答案 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实用程序的解决方案。 我创建了两个名为

的命令脚本
  • de.sh file setxkbmap de
  • en.sh file 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");
    }
}