imbue() применяет локаль для оперций ввода-вывода, типа: как выводить разделитель дроби: точку или запятую. Тебе в начале, до операций ввода-вывода, нужно поставить:
std::locale system("");
std::locale::global(system);
Вот более полный пример, в котором видно отличия:
#include <iostream>
#include <locale>
using namespace std;
int main()
{
std::locale system("");
std::locale::global(system);
wstring str = L"hello, world. привет, МКС";
wcout << str << endl;
wcout << str.c_str() << endl;
wcout << 3.14 << endl;
// А теперь будет десятичный разделитель согласно локали выводится
wcout.imbue(system);
wcout << 3.14 << endl;
return 0;
}
Вывод такой:
hello, world. привет, МКС
hello, world. привет, МКС
3.14
3,14
UPD: еще, неплохо, при помощи setlocale() установить Си-локаль, которую библиотека Си использует. Ага, они разные, и ставятся независимо (
https://stdcxx.apache.org/doc/stdlibug/24-3.html) :)