如何调整静态控件以显示阿拉伯语(从右到左)文本?

时间:2019-04-01 22:31:55

标签: c++ user-interface winapi dialog internationalization

我想马上说我不会说阿拉伯语。

我正在尝试通过翻译其简单文本(使用Google翻译服务)来使对话框窗口国际化。

使用两个static文本控件显示消息。在默认配置下,它们具有以下样式:

//Top window:
//Wnd Styles: 0x50020001 = WS_CHILD | WS_VISIBLE | WS_GROUP | SS_CENTER
//Wnd ExStyles: 0x4 = WS_EX_NOPARENTNOTIFY

//Bottom window:
//Wnd Styles: 0x50020000 = WS_CHILD | WS_VISIBLE | WS_GROUP | SS_LEFT
//Wnd ExStyles: 0x4 = WS_EX_NOPARENTNOTIFY

这是我显示英文文本的方式:

pStrPleaseRead = L"*** PLEASE READ ***";
pStrMsg = L"Check your \"Spam\" or \"Other\" folders if you don't see that email right away.";

this->SetDlgItemText(IDC_STATIC_PLS_READ, pStrPleaseRead);
this->SetDlgItemText(IDC_STATIC_MSG, pStrMsg);

这看起来像这样:

enter image description here

因此,当将其翻译为从右到左的任何一种语言时,我首先进行两次翻译。这是一个:

enter image description here

然后是这个:

enter image description here

然后我将两个结果都作为字符串复制到Visual Studio中,并按如下方式调整我的代码:

enter image description here

pStrPleaseRead = L"*** בבקשה תקרא ***";
pStrMsg = L"בדוק את התיקיות 'ספאם' או 'אחר' אם אינך רואה את האימייל מיד.";

//Need to apply R-T-L reading

static UINT ctrlIDs[] = {
    IDC_STATIC_PLS_READ,
    IDC_STATIC_MSG,
};

for(int i = 0; i < _countof(ctrlIDs); i++)
{
    CWnd* pW = this->GetDlgItem(ctrlIDs[i]);
    ASSERT(pW);
    pW->ModifyStyleEx(0, WS_EX_LAYOUTRTL | WS_EX_RTLREADING | WS_EX_RIGHT);
}

this->SetDlgItemText(IDC_STATIC_PLS_READ, pStrPleaseRead);
this->SetDlgItemText(IDC_STATIC_MSG, pStrMsg);

但这就是结果。第一个翻译(红色)是正确的,但第二个翻译(下面)不正确:

enter image description here

(这是Google版本的外观):

enter image description here

同样,我看不懂。我只是将其与Google Translate窗口中的原始外观进行比较。

那我在那里想念什么?

PS。对于这个项目,我坚持使用Visual Studio 2008 IDE。

1 个答案:

答案 0 :(得分:0)

阿拉伯语的阅读顺序是从右到左,因此Google翻译也将以阿拉伯语的阅读顺序进行翻译。

https://en.wikipedia.org/wiki/Right-to-left

例如:    ep    ep2

  

因此,您会发现,当输出到静态文本框时,文本在从右到左的行中。