Что нового

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

Автор
avmaksimov

avmaksimov

Новичок
Сообщения
46
Репутация
4
это, можно сказать, стандарт.
Да, но только для для текущей beta-версии... Стандарт для текущего релиза WinAPI.au3.

при выделении текста для цитирования над выделением должна появится функция, вот на нее и надо нажимать
Я как бы догадался... Только нажимаю и ничего не происходит... Пробовал по-разному... Результат в FF14 и IE9 один и тот же.

Не уверен что полный, но вот что то похожее
Спасибо, но в MSDN нет или быть может программу знаете, чтобы просмотреть, какие ресурсные строки есть в системных битлотеках?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
avmaksimov [?]
Только нажимаю и ничего не происходит.
попробуй отключить в профиле WYSIWIG.
Профиль - Изменить профиль - Внешний вид форума - Укажите тип формы быстрого ответа - Не WYSIWIG


Добавлено:
Сообщение автоматически объединено:

avmaksimov [?]
Да, но только для для текущей beta-версии... Стандарт для текущего релиза WinAPI.au3.
серьезно? он идет в стандартной поставке? говоря стандарт я имел в виду стандарт в кавычках, то есть его нужно отдельно качать, но без него половина функционала пропадает. а в чем проблема с тем чтобы поставить? он как бы с имеющимся WinAPI.au3 не конфликтует
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
avmaksimov [?]
в MSDN нет или быть может программу знаете, чтобы просмотреть, какие ресурсные строки есть в системных битлотеках?
Чего нет?
В примере выше функция перебирает 3 системных библиотеки, и поверяет их на содержание строк ($RT_DIALOG).

OffTopic:
Kaster [?]
серьезно? он идет в стандартной поставке?
Я тебе советую читать иногда список изменении...

UDFs:
- Добавлено #1158: Интеграция WinAPIEx (только файлы, на данный момент без документации).
 
Автор
avmaksimov

avmaksimov

Новичок
Сообщения
46
Репутация
4
OffTopic:
попробуй отключить в профиле WYSIWIG.
Профиль - Изменить профиль - Внешний вид форума - Укажите тип формы быстрого ответа - Не WYSIWIG
Так и стояло... Поменял на "не WYSIWIG. Стандартное" - тоже самое...

Чего нет?
В примере выше функция перебирает 3 системных библиотеки, и поверяет их на содержание строк ($RT_DIALOG)
Это люди методом научного тыка нашли? А если мне другие слова понадобятся... Ну пока и этого хватит, конечно, но хотелось бы знать для расширения кругозора.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
avmaksimov [?]
Это люди методом научного тыка нашли?
При чём здесь метод научного тыка, _WinAPI_EnumResourceNames перебирает строки по типу, помещает в массив все найденные.

А если мне другие слова понадобятся
Какие другие?

Обычно этим не занимаются, проще делать так:

Код:
#include <Misc.au3>

$bOSLangIsRussian = (@OSLang = 0419)

$sOK_Msg = _Iif($bOSLangIsRussian, 'ОК', 'OK')
$sCancel_Msg = _Iif($bOSLangIsRussian, 'Отмена', 'Cancel')
$sOther_Msg = _Iif($bOSLangIsRussian, 'Другое сообщение', 'Other message')

ConsoleWrite($sOK_Msg & @LF)
ConsoleWrite($sCancel_Msg & @LF)
ConsoleWrite($sOther_Msg & @LF)
 
Автор
avmaksimov

avmaksimov

Новичок
Сообщения
46
Репутация
4
Какие другие?

Обычно этим не занимаются, проще делать так:
Для других языков далее if переделать в switch?))) да нет, уж если эти строки есть в ресурсах, оттуда и возьму. А уж если нестандартные строки, тогда да - согласен.

Почему-то рес.хакер не показывает, но [AZJIO] подкинул программу на AutoIt - там все строковые параметры видны..
 

CreatoR

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
avmaksimov [?]
Ну так и функцию выше можно использовать также, например вместо $RT_DIALOG указать $RT_STRING:

Код:
$aSystemStrings = _GetSystemStrings($RT_STRING)
_ArrayDisplay($aSystemStrings)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А с чего вы решили, что значения тех или иных ресурсов постоянны для разных версий Windows?
 
Автор
avmaksimov

avmaksimov

Новичок
Сообщения
46
Репутация
4
А с чего вы решили, что значения тех или иных ресурсов постоянны для разных версий Windows?
А с чего вы взяли, что разное? Другие программы также используют эти ресурсы...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
с чего вы решили, что значения тех или иных ресурсов постоянны для разных версий Windows?
Именно поэтому я использовал _WinAPI_EnumResourceNames.
Кстати, почему она возвращает не все строки (с типом $RT_STRING/DIALOG)?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Именно поэтому я использовал _WinAPI_EnumResourceNames.

Ты не понял. В одной версии ресурс, например 6000, дает одну строку, а в другой - другую. Если это недокументировано, то использовать это можно только на свой страх и риск.

CreatoR сказал(а):
Кстати, почему она возвращает не все строки (с типом $RT_STRING/DIALOG)?

Например.

Ресурс типа STRING довольно хитрый ресурс. _WinAPI_EnumResourceNames() возвращает имена всех ресурсов этого типа в указанном файле, и делает она это хорошо. Другой вопрос, что ID строки не есть имя ресурса. Каждый ресурс типа STRING может содержать до 16 строк... Вообщем открой файл с помощью Resource Hacker'а и проверь работу функции.
 

CreatoR

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

Ну вот оттуда же:

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

$aResNames = _WinAPI_EnumResourceNames('user32.dll', $RT_STRING)
_ArrayDisplay($aResNames)

For $i = 1 To $aResNames[0]
	$sString = _WinAPI_LoadStringEx('user32.dll', $aResNames[$i])
	
	If $sString <> '' Then
		ConsoleWrite($sString & @LF)
	EndIf
Next


В массиве нету 800+, а в них содержатся строки типа ОК и Отмена.
Кстати, _WinAPI_LoadStringEx для этих найденных ID не возвращает строки.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я же написал, что ID ресурса не тоже самое, что ID строки. Каждый строковый ресурс представляет собой пачку из 16 строк, даже, если и не все используются. ID строки (ID_Str) вычисляется по следующей формуле, где ID_Res - ID ресурса, то что возвращает _WinAPI_EnumResourceNames():

ID_Str = (ID_Res - 1) * 16 + N

N - номер строки в пачке, может быть от 0 до 15.

Вообщем, вот код для перечисления всех строк в RT_STRING для языка по умолчанию.

Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

$hLibrary = _WinAPI_LoadLibraryEx(@SystemDir & '\user32.dll', $LOAD_LIBRARY_AS_DATAFILE)
$aData = _WinAPI_EnumResourceNames($hLibrary, $RT_STRING)
For $i = 1 To $aData[0]
	ConsoleWrite('!resource ' & $aData[$i] & @CR)
	$hInfo = _WinAPI_FindResource($hLibrary, $RT_STRING, $aData[$i])
	$hResource = _WinAPI_LoadResource($hLibrary, $hInfo)
	$pData = _WinAPI_LockResource($hResource)
	$Offset = 0
	For $j = 0 To 15
		$Length = DllStructGetData(DllStructCreate('ushort', $pData + $Offset), 1)
		If $Length Then
			$Text = DllStructGetData(DllStructCreate('wchar[' & $Length & ']', $pData + $Offset + 2), 1)
			$ID = ($aData[$i] - 1) * 16 + $j
			ConsoleWrite(StringFormat('%-4s - %s', $ID, $Text) & @CR)
		EndIf
		$Offset += 2 * ($Length + 1)
	Next
	If $i < $aData[0] Then
		ConsoleWrite(@CR)
	EndIf
Next
_WinAPI_FreeLibrary($hLibrary)
 
Автор
avmaksimov

avmaksimov

Новичок
Сообщения
46
Репутация
4
Yashied, тут такой вопрос: можно ли задать какой-то целочисленный или строковый ID, который хотя бы с WinXP будет также возвращать одну и туже строку!? Уж не берем малоизвестные, но хотя бы те, что есть в MessagBox (API) - Да, Нет, ОК, Отмена и т.д.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
Я же написал, что ID ресурса не тоже самое, что ID строки
Ты это добавил в то время как я писал сообщение, и редактирования я не заметил :blum:. Лучше отправляй новое сообщение, таким образом участнику будет выведено предупреждение о новом сообщении (кажется).

вот код для перечисления всех строк в RT_STRING для языка по умолчанию
Отлично, спасибо.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied
Если в этом примере использовать $RT_DIALOG с comdlg32.dll, то скрипт вываливается, в чём может быть дело?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
avmaksimov [?]
можно ли задать какой-то целочисленный или строковый ID, который хотя бы с WinXP будет также возвращать одну и туже строку!?
ID строки для «Да», «Нет», «ОК», «Отмена» и т.д в XP и в Win 7 одни и те же.
 
Верх