использование ресурса языка

 

На форуме пошла речь об использовании языков в интерфейсе программы. Вспомнилась старая запись на заброшенном сайте, вот результат:

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

К проекту нужно добавить файл 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.

Комментарии