На форуме пошла речь об использовании языков в интерфейсе программы. Вспомнилась старая запись на заброшенном сайте, вот результат:
If OpenWindow(0, 0, 0, 230, 90, "Lang resource example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
;#define MAKELANGID(p, s) ((((WORD) (s)) << 10) | (WORD) (p))
hrsrc=FindResourceEx_(0,#RT_MENU,600,#LANG_RUSSIAN|(#SUBLANG_NEUTRAL<<10))
hg=LoadResource_(0,hrsrc)
hmnu=LoadMenuIndirect_(hg)
SetMenu_(WindowID(0),hmnu)
;DestroyMenu_(hmnu)
Repeat
Event = WaitWindowEvent()
If Event=#PB_Event_Menu
Debug EventMenu()
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
;#define MAKELANGID(p, s) ((((WORD) (s)) << 10) | (WORD) (p))
hrsrc=FindResourceEx_(0,#RT_MENU,600,#LANG_RUSSIAN|(#SUBLANG_NEUTRAL<<10))
hg=LoadResource_(0,hrsrc)
hmnu=LoadMenuIndirect_(hg)
SetMenu_(WindowID(0),hmnu)
;DestroyMenu_(hmnu)
Repeat
Event = WaitWindowEvent()
If Event=#PB_Event_Menu
Debug EventMenu()
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
К проекту нужно добавить файл lng.rc:
#define LANG_RUSSIAN 0x19
#define SUBLANG_NEUTRAL 0x00 // language neutral
#define LANG_ENGLISH 0x09
600 MENU
MOVEABLE PURE LOADONCALL DISCARDABLE
LANGUAGE LANG_RUSSIAN,SUBLANG_NEUTRAL
BEGIN
POPUP "Файл"
BEGIN
MENUITEM "Открыть...\tCtrl+O",1001
MENUITEM "Сохранить рисунок...\tCtrl+S",1003
MENUITEM SEPARATOR
MENUITEM "Выход",1004
END
END
600 MENU
LANGUAGE LANG_ENGLISH,SUBLANG_NEUTRAL
BEGIN
POPUP "File"
BEGIN
MENUITEM "Open...\tCtrl+O",1001
MENUITEM "Save as picture...\tCtrl+S",1003
MENUITEM SEPARATOR
MENUITEM "Exit",1004
END
END
Описание идентификаторов языков можно найти в файле ntdef.h. Скачать пример.
Дополнение 30.06.2024. Вчера убил много времени на код загрузки мультиязычных строк. Вечером вычитал, что STRINGTABLE хранятся немного другим способом. Долго промучился с ушибленным Resource Script:
Procedure.s Error()
wError = GetLastError_()
If wError
*ErrorBuffer = AllocateMemory(1024)
FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, wError, 0, *ErrorBuffer, 1024, 0)
message$=Str(wError)+":"+PeekS(*ErrorBuffer)
FreeMemory(*ErrorBuffer)
EndIf
ProcedureReturn message$
EndProcedure
Procedure.s getstring(resid,lngid)
;https://earlier132.rssing.com/chan-5264073/all_p28.html#c5264073a548
r$=""
hrsrc=FindResourceEx_(0,#RT_STRING,(resid/16)+1,lngid)
If hrsrc
hg=LoadResource_(0,hrsrc)
If hg
lpr=LockResource_(hg)
If lpr
lpsz=lpr
For i=1 To resid&15
lpsz=lpsz+2+2*PeekU(lpsz)
Next i
r$=PeekS(lpsz+2,PeekU(lpsz),#PB_Unicode)
; UnlockResource_(lpr)
Else
Debug "lock resource "+Error()
EndIf
FreeResource_(hg)
Else
Debug "load resource "+Error()
EndIf
Else
Debug "find resource "+Error()
EndIf
ProcedureReturn r$
EndProcedure
Debug getstring(1000,#LANG_ENGLISH|(#SUBLANG_ENGLISH_UK<<10))
Debug getstring(1001,#LANG_ENGLISH|(#SUBLANG_ENGLISH_UK<<10))
Debug getstring(1004,#LANG_ENGLISH|(#SUBLANG_ENGLISH_UK<<10))
Debug getstring(1002,#LANG_RUSSIAN|(#SUBLANG_DEFAULT<<10))
Сам файл ресурса:
#define LANG_RUSSIAN 25
#define LANG_ENGLISH 9
#define SUBLANG_DEFAULT 1
#define SUBLANG_ENGLISH_US 0x01
#define SUBLANG_ENGLISH_UK 0x02
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
STRINGTABLE
{
1000, "Hello"
1002, "just string"
1001, "very long String 2 hello, world!"
1004, "String 3"
}
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE
{
1002, "\x410\x431\x440\x430\x43A\x430\x434\x430\x431\x440\x430"
}
Строки Unicode описываются как \xNNN.
Комментарии
Отправить комментарий