如何更改 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");
}
}
我 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");
}
}