Что нового

Непонятное поведение AutoIt при обработке RTL

gora

Знающий
Сообщения
315
Репутация
19
Столкнулся с непонятным поведением AutoIt при обработке RTL (иврит) файла.
Код:
;$lang = 'Russian'
$lang = 'Hebrew'

$aUser=IniReadSection(@ScriptDir & '\' & $lang & '.ini', 'UniExtract')
Local $allaccelerator, $MSGUser[$aUser[0][0]+1]
For $i=1 To $aUser[0][0]
	$MSGUser[$aUser[$i][0]] = $aUser[$i][1]
Next
For $i=1 To $aUser[0][0]
	$nacceler = StringInStr($MSGUser[$i], '&')
;	If $lang = 'Hebrew' Then
;		If $nacceler Then $allaccelerator &= StringMid($MSGUser[$i], $nacceler-1, 2) & ', '
;	Else
		If $nacceler Then $allaccelerator &= StringMid($MSGUser[$i], $nacceler, 2) & ', '
;	EndIf
Next
$aAccelerator = StringSplit(StringTrimRight($allaccelerator, 2), ', ', 1)
MsgBox(1 + 256, $MSGUser[2] & ' 2', 'All (' & $aAccelerator[0] & ')' & @LF & $allaccelerator)

1 Скрипт должен вытащить все акселераторы из текста. С русским и другими файлами проблем нет, а вот с ивритом скрипт выдает нечто странное.
2 При выводе текста в заголовке, AutoIt самостоятельно меняет местами слово и цифру.

Почему так происходит и как получить корректный список акселераторов ?
Языковые файлы: https://dl.dropboxusercontent.com/u/35142695/lang_sl2_130522_19-40.7z

Спасибо
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: AutoIt и RTL

Можно вот так выкрутиться:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

;$lang = 'Russian'
$lang = 'Hebrew'

$aUser = IniReadSection(@DesktopDir & '\' & $lang & '.ini', 'UniExtract')
Local $allaccelerator, $MSGUser[$aUser[0][0] + 1]

For $i = 1 To $aUser[0][0]
	$MSGUser[$i] = $aUser[$i][1]
Next

For $i = 1 To $aUser[0][0]
	$nacceler = StringInStr($MSGUser[$i], '&')
	
	If $nacceler Then
		$allaccelerator &= StringMid($MSGUser[$i], $nacceler, 2) & ', '
	EndIf
Next

$aAccelerator = StringSplit(StringTrimRight($allaccelerator, 2), ', ', 1)

If $lang = 'Hebrew' Then
	_MsgBox_RTL('2 ' & $MSGUser[2], '(' & $aAccelerator[0] & ') All' & @CRLF & $allaccelerator, 400, 120)
Else
	MsgBox(1 + 256, '2 ' & $MSGUser[2], 'All (' & $aAccelerator[0] & ')' & @CRLF & $allaccelerator)
EndIf

Func _MsgBox_RTL($sTitle, $sText, $iW = 400, $iH = 120)
	$hGUI = GUICreate($sTitle, $iW, $iH, -1, -1, -1, $WS_EX_LAYOUTRTL)
	
	GUICtrlCreateLabel($sText, 20, 20, -1, $iH - 60, BitOR($GUI_SS_DEFAULT_LABEL, $SS_NOPREFIX))
	$iOK_Bttn = GUICtrlCreateButton('OK', 20, $iH - 30, 70, 20)
	$iCancel_Bttn = GUICtrlCreateButton('Cancel', 100, $iH - 30, 70, 20)
	GUISetState(@SW_SHOW, $hGUI)
	
	$iRet = 0
	
	While 1
		$nMsg = GUIGetMsg()
		
		Switch $nMsg
			Case $GUI_EVENT_CLOSE, $iCancel_Bttn
				ExitLoop
			Case $iOK_Bttn
				$iRet = 1
				ExitLoop
		EndSwitch
	WEnd
	
	GUIDelete($hGUI)
	Return $iRet
EndFunc
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
Re: AutoIt и RTL

CreatoR
Спасибо, так работает.
Остался только вопрос, почему так происходит?
Ведь $allaccelerator содержит строку с акселераторами и при отображении она не должна содержать амперсендов, но они отображаются стандартным msgbox, например, для русского языка. C RTL амперсенды то отображаются, то нет, а иногда их вообще два отображается с обеих сторон буквы.
Хотелось бы понять суть происходящего, т.к. это только часть задачи и мне нужно еще проверять наличие дубликатов ускорителей и т.д.. А не поняв, как AutoIt обрабатывает RTL, трудно быть уверенным в результатах дальнейших операций с переменными содержащими RTL стринги.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: AutoIt и RTL

gora [?]
почему так происходит?
Потому что система не заточена под RTL (если она конечно не ивритская или подобная), а MsgBox это системный диалог.

при отображении она не должна содержать амперсендов
Для отображения их можно удалить.

как AutoIt обрабатывает RTL
Это не AutoIt, это система.
 
Верх