如何更改 cin 的语言环境

How to change locale for cin

我 Ubuntu 有两种语言。我想启动我的简单程序,但需要用不同的语言输入数据。我厌倦了将全局切换从一种语言切换到另一种语言。现在我正尝试通过以下代码自动执行此过程:

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

看来你要的是改变键盘布局。不幸的是,C++ 语言环境不会影响这一点。您需要与操作系统交互,特别是 IME subsystem. There are some instructions here for Ubuntu which you've said you are using: https://askubuntu.com/questions/813094/how-to-change-uim-ime-input-method-using-command-line-or-programmatically/967787

要点是您需要打开一个 Unix Domain Socket $XDG_RUNTIME_DIR/uim/socket/uim-helper 并编写如下特定消息:

im_change_whole_desktop
anthy
<one blank line with trailing newline>

最后,使用 setxkbmap 实用程序找到了解决方案。 我创建了两个脚本,其中命令被调用

  • de.sh 文件 setxkbmap de
  • en.sh 文件 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");
    }
}