Где я могу перевести сообщения MFC - PullRequest
6 голосов
/ 02 марта 2009

Я локализую приложение MFC на японский, и ресурсы работают правильно.

Моя текущая проблема заключается в том, что когда я использую AfxMessageBox или MessageBox, заголовок диалогового окна и сообщения кнопок появляются на английском языке, и я не нашел нигде, чтобы это изменить.

Я не нашел ничего полезного в поиске по MSDN или Google.

Итак,

Это работает? Windows предлагает кнопки «ОК» или «Да / Нет» на японском, арабском и русском языках?

Если нет, что я могу указать, чтобы изменить их?

Редактировать: Я пошел с MessageBoxEx, написав класс-обертку, чтобы сделать его таким же удобным, как AfxMessageBox. Похоже, что MB_OK выглядит как «ОК» на английском и японском языках, но другие варианты кнопок, такие как MB_YESNO, переводятся в нечто, что, как я полагаю, является правильным японским. Это было довольно маленькое приложение для перевода, и мы могли бы использовать что-то автоматизированное для больших.

Ответы [ 3 ]

5 голосов
/ 02 марта 2009

Используйте MessageBoxEx и укажите WORD wLanguageId поле.

wLanguageId [in] Определяет язык для текста, отображаемого в окне сообщения. Кнопка (ы). Указание нулевого значения (0) указывает на отображение кнопки текст на системном языке по умолчанию. Если этот параметр MAKELANGID (LANG_NEUTRAL, SUBLANG_NEUTRAL), текущий язык связанный с вызывающим потоком б.

Чтобы указать язык, отличный от текущего языка, используйте Макелангид макрос для создания этого параметр. Для получения дополнительной информации см. MAKELANGID.

Более подробную информацию о MAKELANGID можно найти здесь.


Если это не работает для вас, альтернативой может быть создание собственного диалогового окна.

2 голосов
/ 03 марта 2009

Заголовок - это указанная вами строка, поэтому вы должны иметь возможность ее перевести. В AfxMessageBox () заголовком является имя приложения (AfxGetAppName () IIRC).

Что касается кнопок, текст является частью ОС и не может быть переведен.

MessageBoxEx (упомянутый Брайаном) никогда не работал хорошо с поддержкой языков. В этой статье MS KB , написанной более десяти лет назад, говорится, что идентификатор языка будет корректно поддерживаться в Windows 2000. Но, очевидно, он никогда не проходил.

Значит, вам не повезло. Ваше единственное решение состоит в том, чтобы использовать стороннюю реализацию, такую ​​как превосходный XMessageBox , и предоставлять переводы через таблицу строк.

Обратите внимание, что глоссарий appTranslator содержит такие слова, как Да, нет, отмена, ... на 25 языках, и переводит их автоматически.

1 голос
/ 06 сентября 2011

Создайте свой собственный L10N макрос / функцию и используйте этот код:

static LRESULT __stdcall ChangeCaptions(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HCBT_ACTIVATE) {
        SetWindowText(GetDlgItem((HWND) wParam, IDOK), L10N(GUI_OK_MSG));
        SetWindowText(GetDlgItem((HWND) wParam, IDCANCEL), L10N(GUI_CANCEL_MSG));
        SetWindowText(GetDlgItem((HWND) wParam, IDYES), L10N(GUI_YES_MSG));
        SetWindowText(GetDlgItem((HWND) wParam, IDNO), L10N(GUI_NO_MSG));
    }
    return 0;
}

int addon_gui_messagebox(HWND parentHWnd, HINSTANCE hInstance, void *text, void *caption, int type)
{
    int ret;
    hook = SetWindowsHookEx(WH_CBT, ChangeCaptions, hInstance, GetCurrentThreadId());
    ret = MessageBox(parentHWnd, text, caption, type);
    UnhookWindowsHookEx(hook);
    return ret;
}

Как я уже писал ранее, MessageBoxEx в настоящее время игнорирует lang arg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...