Что нового

[Окна, Диалоги] Локализация диалогов: возможна ли!?

avmaksimov

Новичок
Сообщения
46
Репутация
4
Возможно ли это или надо создавать свои с помощью GUI? Я имею в виду, чтобы стандартные названия кнопок "ОК" и "Отмена" брались из системы вместо отображения "OK", "Cancel" и т.д.

Если кто знает, есть ли это в планах AutoIt.
 
Автор
avmaksimov

avmaksimov

Новичок
Сообщения
46
Репутация
4
Если непонятно, поясню... Есть например, функция InputBox - выводит внизу "OK" и "Cancel", а хотелось бы на русском... Ну и еще какие-то диалоговые функции встречал с таким "грехом".
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
avmaksimov [?]
чтобы стандартные названия кнопок "ОК" и "Отмена" брались из системы вместо отображения "OK", "Cancel" и т.д
Для своих кнопок можно брать из системы:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>

$sMB_OK = _WinAPI_LoadStringEx('user32.dll', 800)
$sMB_CANCEL = _WinAPI_LoadStringEx('user32.dll', 801)

$hGUI = GUICreate("MsgBox", 300, 200, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU))

$iOK_Button = GUICtrlCreateButton($sMB_OK, 20, 170, 70, 20)
$iCancel_Button = GUICtrlCreateButton($sMB_CANCEL, 100, 170, 70, 20)

GUISetState(@SW_SHOW, $hGUI)

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $iCancel_Button
			Exit
	EndSwitch
WEnd


а для встроенного InputBox нужно изменять ресурсы AutoIt3.exe (в папке установки AutoIt).
 
Автор
avmaksimov

avmaksimov

Новичок
Сообщения
46
Репутация
4
Всем спасибо! Напишу свое))) Изменять ресурсы - это не то... да и как-то не очень в плане УК (декомпиляции и т.д._.
 

CreatoR

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

[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Автор
avmaksimov

avmaksimov

Новичок
Сообщения
46
Репутация
4
Пометил, но вам вдвойне спасибо, что дали готовое решение без моего велосипеда))).
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
CreatoR
В теории можно еще изменить ресурсы файла AutoIT3.exe изменив форму InputBox, которая там находится, а так же можно локализировать ошибки - и по сути после этого в каждый компилируемый файл должны будут добавляться измененные ресурсы.

Ошибки будут русские, а форма русифицированная =)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Medic84 [?]
В теории можно еще изменить ресурсы файла AutoIT3.exe
Что значит в теории? :smile:
Я же написал:
[?]
для встроенного InputBox нужно изменять ресурсы AutoIt3.exe
Я раньше их постоянно менял, у меня даже на каждый проект был свой AutoItSC.bin, но это было до моего близкого знакомства с AutoItWrapper (спасибо Yashied).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Medic84 сказал(а):
В теории можно еще изменить ресурсы файла AutoIT3.exe изменив форму InputBox, которая там находится, а так же можно локализировать ошибки - и по сути после этого в каждый компилируемый файл должны будут добавляться измененные ресурсы.

Это будет нарушением лицензионного соглашения, я думаю.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
CreatoR [?]
Что значит в теории?
Потому что не проверял лично :whistle:
Но Yashied прав. Это будет уже нарушение лиц. соглашения...
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Локализация InputBox

Код:
; KaFu
; http://www.autoitscript.com/forum/topic/140024-english-msgbox-button-texts-for-everyone/page__view__findpost__p__983172

#include <WinAPI.au3>
Opt("MustDeclareVars", 1)
Global $hHookInputBox

InputBox("Test", "Eingabe")
_InputBox("Test", "Eingabe")

Func _InputBox($title, $prompt, $default = Default, $passwordchar = Default, $width = Default, $height = Default, $left = Default, $top = Default, $timeout = Default, $hwnd = Default)
    Local $hProcInputBox = DllCallbackRegister("CbtHookProcInputBox", "int", "int;int;int")
    Local $TIDInputBox = _WinAPI_GetCurrentThreadId()
    $hHookInputBox = _WinAPI_SetWindowsHookEx($WH_CBT, DllCallbackGetPtr($hProcInputBox), 0, $TIDInputBox)
    Local $iRet = InputBox($title, $prompt, $default, $passwordchar, $width, $height, $left, $top, $timeout, $hwnd)
    Local $ierror = @error
    _WinAPI_UnhookWindowsHookEx($hHookInputBox)
    DllCallbackFree($hProcInputBox)
    Return SetError($ierror, "", $iRet)
EndFunc   ;==>_InputBox

Func CbtHookProcInputBox($nCode, $wParam, $lParam, $hHookInputBox)
    Local $RET = 0, $hBitmap = 0, $xWnd = 0
    Local $sButtonText
    If $nCode < 0 Then
        $RET = _WinAPI_CallNextHookEx($hHookInputBox, $nCode, $wParam, $lParam)
        Return $RET
    EndIf
    Switch $nCode
        Case 5 ;5=HCBT_ACTIVATE
            _WinAPI_SetDlgItemText($wParam, 1, "OK")
            _WinAPI_SetDlgItemText($wParam, 2, "Отмена")
    EndSwitch
    Return
EndFunc   ;==>CbtHookProcInputBox

Func _WinAPI_SetDlgItemText($hDlg, $nIDDlgItem, $lpString)
    Local $aRet = DllCall('user32.dll', "int", "SetDlgItemText", _
            "hwnd", $hDlg, _
            "int", $nIDDlgItem, _
            "str", $lpString)
    Return $aRet[0]
EndFunc   ;==>_WinAPI_SetDlgItemText
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
avmaksimov сказал(а):
Подозреваю, что данный код потребует повышенных прав и может недружелюбен с антивирусами....

Должен работать без проблем, но ведь намного проще написать свое GUI в несколько строк.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Незнаю, из какой DLL берётся текст MsgBox, но можно использовать _WinAPI_LoadString (в примере shell32.dll) с ID = 28743 для извлечения текста кнопки, тогда локализация будет соответственно языку OS.
 
Автор
avmaksimov

avmaksimov

Новичок
Сообщения
46
Репутация
4
Незнаю, из какой DLL берётся текст MsgBox, но можно использовать _WinAPI_LoadString (в примере shell32.dll) с ID = 28743 для извлечения текста кнопки, тогда локализация будет соответственно языку OS.
А где бы увидеть полный список строк? Сделал сначала по аналогии с WinAPIEx, но требует доп. WinAPIEx.au3, а хотелось бы стандартными библиотеками обойтись.

P.S. А как цитировать на форуме, кроме ручного копипаста?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
avmaksimov [?]
требует доп. WinAPIEx.au3, а хотелось бы стандартными библиотеками обойтись.
это, можно сказать, стандарт.
А как цитировать на форуме, кроме ручного копипаста?
при выделении текста для цитирования над выделением должна появится функция, вот на нее и надо нажимать
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
Незнаю, из какой DLL берётся текст MsgBox, но можно использовать _WinAPI_LoadString

“Доктор, меня игнорируют”...

Скажите, только я вижу свои сообщения? :blink:
Сначала Medic84 не замечает, а теперь и ты?

Я же дал выше пример с извлечением текста кнопок.

avmaksimov [?]
где бы увидеть полный список строк?
Не уверен что полный, но вот что то похожее:

Код:
#include <WinAPIEx.au3>
#include <APIConstants.au3>
#include <Array.au3>

$aSystemStrings = _GetSystemStrings()
_ArrayDisplay($aSystemStrings)

#CS
; USER32
#LocalString_Error = 2
#LocalString_OK = 800
#LocalString_Cancel = 801
#LocalString_Abort = 802
#LocalString_Retry = 803
#LocalString_Ignore = 804
#LocalString_Yes = 805
#LocalString_No = 806
#LocalString_Close = 807
#LocalString_Help = 808
#LocalString_TryAgain = 809
#LocalString_Continue = 810
#LocalString_Minimize = 900
#LocalString_Maximize = 901
#LocalString_RestoreUp = 902
#LocalString_RestoreDown = 903
; COMDLG32
#LocalString_Save = 369
#LocalString_Open = 370
#LocalString_Print = 371
#LocalString_SaveAs = 385
; SHELL32
#LocalString_File = 4130
#LocalString_Folder = 4131
#LocalString_Move = 4144
#LocalString_Copy = 4145
#LocalString_Delete = 4146
#LocalString_Rename = 4147
#CE
Func _GetSystemStrings($sType = $RT_DIALOG)
	Local $aModules[4][2] = [[3], ['user32.dll', '2,800-810,900-903'], ['comdlg32.dll', '369-371,385'], ['Shell32.dll', '4130,4131,4144-4147']]
	Local $aRet[1], $aNames, $aRangeNames, $sString
	
	For $i = 1 To $aModules[0][0]
		$aNames = StringSplit($aModules[$i][1], ',')
		
		For $j = 1 To $aNames[0]
			$aRangeNames = StringSplit($aNames[$j], '-')
			
			For $ij = $aRangeNames[1] To $aRangeNames[$aRangeNames[0]]
				$sString = _WinAPI_LoadStringEx($aModules[$i][0], Int($ij))
				
				If $sString <> '' Then
					$aRet[0] += 1
					ReDim $aRet[$aRet[0]+1]
					$aRet[$aRet[0]] = $sString
				EndIf
			Next
		Next
		
		Local $aResNames = _WinAPI_EnumResourceNames($aModules[$i][0], $sType)
		If @error Then ContinueLoop
		
		For $x = 1 To $aResNames[0]
			$sString = _WinAPI_LoadStringEx($aModules[$i][0], $aResNames[$x])
			
			If $sString <> '' Then
				$aRet[0] += 1
				ReDim $aRet[$aRet[0]+1]
				$aRet[$aRet[0]] = $sString
			EndIf
		Next
	Next
	
	Return $aRet
EndFunc
 
Верх