m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
reddeer
In need of some credit
In need of some credit
Posts: 8
Joined: Tue May 14, 2019 12:17 pm

m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by reddeer » Tue May 14, 2019 12:43 pm

Здравствуйте, коллеги.

Столкнулся с такой проблемой. В Windows-10, Visual Studio 2017 никак не удаётся вывести кириллицу в программе. В настройках проекта выбран "Use Unicode Character Set", wxWidgets 3.1.2,

в программе

Code: Select all

wxLocale m_locale;
    ...
    if (!m_locale.Init(wxLANGUAGE_RUSSIAN))
    {
        wxLogError(_T("This language is not supported by the system."));
        return false;
    }
отрабатывает без ошибок, т.е. wxLANGUAGE_RUSSIAN находит и устанавливает, я правильно понимаю?

Уже пробовал и
_T(""), _wxT(""), _(L""), оставлял просто текст. Не помогает, выводит крокозябры.
Подскажите, pls, в какую сторону копать?

PS В Ubuntu 18.04 этот же код работает как надо.

Kvaz1r
Super wx Problem Solver
Super wx Problem Solver
Posts: 306
Joined: Tue Jun 07, 2016 1:07 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by Kvaz1r » Tue May 14, 2019 2:43 pm

Здравствуйте.
Возможно проблема в кодировке исходных файлов, хотя нужно проверить чтобы wxWidgets была собрана с поддержкой UNICODE.

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 5227
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by ONEEYEMAN » Tue May 14, 2019 2:44 pm

Dobrogo vremeni sutok,
A "internat" primer rabotaet?
I esche - chto znachit - "ne rabotaet"? Ne nahodit fajla s perevodami? Fajl nahodit no ne nahodit perevoda?
Ili ge prosto ne vyvodit stroku zakodirovannuju v programme?

Da, vot esche - biblioteka i proekt sobiralis' s opredelenijami "UNICODE" i "_UNICODE"? Kak v primerah?

Spasibo.

reddeer
In need of some credit
In need of some credit
Posts: 8
Joined: Tue May 14, 2019 12:17 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by reddeer » Thu May 16, 2019 9:16 am

Kvaz1r wrote:
Tue May 14, 2019 2:43 pm
Здравствуйте.
Возможно проблема в кодировке исходных файлов, хотя нужно проверить чтобы wxWidgets была собрана с поддержкой UNICODE.
В скачанном установшике (Windows Installer) среди прочих был файл, который билдит всю библиотеку: wx_vc15.sln, в настройках которого в Visual Studio 2017 выставлено "Use Unicode Character Set". Т.е. по идее собрано всё с поддержкой Unicode.

reddeer
In need of some credit
In need of some credit
Posts: 8
Joined: Tue May 14, 2019 12:17 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by reddeer » Thu May 16, 2019 9:58 am

ONEEYEMAN wrote:
Tue May 14, 2019 2:44 pm
Dobrogo vremeni sutok,
A "internat" primer rabotaet?
I esche - chto znachit - "ne rabotaet"? Ne nahodit fajla s perevodami? Fajl nahodit no ne nahodit perevoda?
Ili ge prosto ne vyvodit stroku zakodirovannuju v programme?
Да, пример работает. Но там используются файлы переводов, у меня же прога одноязычная, т.е. я просто в программе использую русские символы. И Ubuntu это позволяет. В Windows нашёл какое-то некрасивое решение: файл сохраняю в ASCII, потом VS перекодирует в UTF, в выводе ставлю L"..." или wxT(".."), тогда выводит корректно.

А хочется как Linux: просто, без макросов что-бы работало.
ONEEYEMAN wrote:
Tue May 14, 2019 2:44 pm
Da, vot esche - biblioteka i proekt sobiralis' s opredelenijami "UNICODE" i "_UNICODE"? Kak v primerah?
В Windows для Visual Studio сборка библиотеки находится в файле *.sln, в ней - проекты, в настройках каждого из них есть параметр Character Set = "Use Unicode Character Set". Это ведь, надеюсь, то, что надо?


Спасибо, парни, что откликнулись!

Kvaz1r
Super wx Problem Solver
Super wx Problem Solver
Posts: 306
Joined: Tue Jun 07, 2016 1:07 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by Kvaz1r » Thu May 16, 2019 10:12 am

Так и Windows позволяет, я в VS без всяких макросов использую кириллицу.

Что еще может быть...посмотрите установлен ли _UNICODE в определениях препроцессора(Проект -> Свойства->Свойства конфигурации -> C/C++ -> Препроцессор).

Если стоит попробовать принудительно сохранить в utf8 с помощью другого редактора и сказать VS ожидать именно такую кодировку. Если заработает то надо искать глобальные настройки чтобы VS всегда сохраняла в юникод.

reddeer
In need of some credit
In need of some credit
Posts: 8
Joined: Tue May 14, 2019 12:17 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by reddeer » Thu May 16, 2019 12:00 pm

Kvaz1r wrote:
Thu May 16, 2019 10:12 am
Так и Windows позволяет, я в VS без всяких макросов использую кириллицу.

Что еще может быть...посмотрите установлен ли _UNICODE в определениях препроцессора(Проект -> Свойства->Свойства конфигурации -> C/C++ -> Препроцессор).

Если стоит попробовать принудительно сохранить в utf8 с помощью другого редактора и сказать VS ожидать именно такую кодировку. Если заработает то надо искать глобальные настройки чтобы VS всегда сохраняла в юникод.
Да, _UNICODE был установлен. Пересобрал библиотеку с ключом /utf-8, в другом редакторе сохранил программку в utf-8, в приложении закомментил:

Code: Select all

#pragma execution_character_set("utf-8")
,
и всё заработало!

Не до конца понимаю, почему пришлось убирать директиву

Code: Select all

#pragma...
, не иначе как двойное перекодирование? Но в таком варианте работает. Спасибо!

Kvaz1r
Super wx Problem Solver
Super wx Problem Solver
Posts: 306
Joined: Tue Jun 07, 2016 1:07 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by Kvaz1r » Thu May 16, 2019 1:37 pm

reddeer wrote:
Thu May 16, 2019 12:00 pm
Не до конца понимаю, почему пришлось убирать директиву

Code: Select all

#pragma...
, не иначе как двойное перекодирование? Но в таком варианте работает. Спасибо!
Скорее всего. Ни разу эту директиву раньше не встречал, но документация говорит, что она уже устаревшая:
This compiler directive is obsolete starting in Visual Studio 2015 Update 2. We recommend that you use the /execution-charset:utf-8 or /utf-8 compiler options together with using the u8 prefix on narrow character and string literals that contain extended characters.

reddeer
In need of some credit
In need of some credit
Posts: 8
Joined: Tue May 14, 2019 12:17 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by reddeer » Thu May 16, 2019 2:46 pm

Kvaz1r wrote:
Thu May 16, 2019 1:37 pm
reddeer wrote:
Thu May 16, 2019 12:00 pm
Не до конца понимаю, почему пришлось убирать директиву

Code: Select all

#pragma...
, не иначе как двойное перекодирование? Но в таком варианте работает. Спасибо!
Скорее всего. Ни разу эту директиву раньше не встречал, но документация говорит, что она уже устаревшая:
This compiler directive is obsolete starting in Visual Studio 2015 Update 2. We recommend that you use the /execution-charset:utf-8 or /utf-8 compiler options together with using the u8 prefix on narrow character and string literals that contain extended characters.
Это было в самом проекте примера minimal (в версии для Windows):

Code: Select all

#ifdef x64
#include <windows.h>
//#pragma execution_character_set("utf-8")
#endif
Для Linux такой проверки нет, хотя там тоже проект 64-битный.

reddeer
In need of some credit
In need of some credit
Posts: 8
Joined: Tue May 14, 2019 12:17 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by reddeer » Mon May 31, 2021 2:10 pm

Здравствуйте, коллеги!

Чтобы не плодить тем, спрошу тут.

Есть программа, работающая в Windows 10 и Ubuntu 20.04.
В OnInit устанавливается локаль:

Code: Select all

bool MainApp::OnInit()
{
	if (!wxApp::OnInit())
		return false;

	wxLocale m_locale;
 	m_locale.Init(wxLANGUAGE_RUSSIAN);
....
}
В отдельном файле mainframe.cpp обрабатывается закрытие программы:

Code: Select all

void MainFrame::OnCloseFrame(wxCloseEvent& event)
{
	if (wxMessageBox(("Выйти из программы?"),
		_("Вопрос"), wxICON_EXCLAMATION | wxYES_NO) == wxYES) {
		Destroy();
	}
}
Так вот, вопрос. В Windows всё работает правильно, в Linux не выводит текст на русском, просто пустое место. Если определить локаль ещё раз:

Code: Select all

void MainFrame::OnCloseFrame(wxCloseEvent& event)
{
	wxLocale m_locale;
 	m_locale.Init(wxLANGUAGE_RUSSIAN);
	if (wxMessageBox(("Выйти из программы?"),
   		_("Вопрос"), wxICON_EXCLAMATION | wxYES_NO) == wxYES) {
		Destroy();
	}
}
вывод корректен. Но это некрасиво как-то. Пробовал m_locale сохранять глобально:

Code: Select all

extern wxLocale m_locale;
но это не помогает, пока не укажешь в лоб. Никто не сталкивался с такой проблемой?
Last edited by reddeer on Mon May 31, 2021 2:22 pm, edited 1 time in total.

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 5227
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by ONEEYEMAN » Mon May 31, 2021 2:22 pm

Доброго времени суток,
А версия Ubuntu русская или английская?
Если английская - какие локали стоят?

Спасибо.

reddeer
In need of some credit
In need of some credit
Posts: 8
Joined: Tue May 14, 2019 12:17 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by reddeer » Mon May 31, 2021 2:31 pm

ONEEYEMAN wrote:
Mon May 31, 2021 2:22 pm
Доброго времени суток,
А версия Ubuntu русская или английская?
Если английская - какие локали стоят?

Спасибо.
Русская. Ubuntu не рядом, локали по памяти: ru_RU, ru_RU.utf8 и др. Дело в том, что при старте всё корректно, русский есть. Лишь при

Code: Select all

if (wxMessageBox(("Выйти из программы?"),
   		_("Вопрос"), wxICON_EXCLAMATION | wxYES_NO) == wxYES) {
		Destroy();
	}
его нет. И надписи на кнопках "Да"/ "Нет" меняются на "Yes"/"No".

reddeer
In need of some credit
In need of some credit
Posts: 8
Joined: Tue May 14, 2019 12:17 pm

Re: m_locale.Init(wxLANGUAGE_RUSSIAN) Windows-10

Post by reddeer » Mon May 31, 2021 6:28 pm

Проблема была не только в

Code: Select all

wxMessageBox
, но и в других диалогах, например в

Code: Select all

wxFileDialog
.
В общем проблему решил.

Вместо:

Code: Select all

        wxLocale m_locale;
 	m_locale.Init(wxLANGUAGE_RUSSIAN);
Нужно:

Code: Select all

#ifdef _WIN64
	wxLocale m_locale;
 	m_locale.Init(wxLANGUAGE_RUSSIAN);
#else
	std::locale::global(std::locale("ru_RU.UTF8"));	
#endif
Это устанавливает локаль глобально для всей программы, это работает в Linux. В Windows - штатная установка wxLocale.

Post Reply