Browse Source

Interface internationalized and localized to Russian

Arthur Yefimov 3 years ago
parent
commit
9e8ba3bbb4
6 changed files with 410 additions and 108 deletions
  1. 14 9
      Data/Texts/en.dat
  2. 294 0
      Data/Texts/ru.dat
  3. 0 1
      src/FoStrings.Mod
  4. 93 92
      src/FreeOberon.Mod
  5. 8 5
      src/OV.Mod
  6. 1 1
      src/make.bat

+ 14 - 9
Data/Texts/en.dat

@@ -41,7 +41,7 @@
 54 "result type of procedure is not a basic type"
 55 "procedure call of a function"
 56 "assignment to non-variable"
-57 "pointer not bound to record or array type"
+57 "pointer not bound to record type"
 58 "recursive type definition"
 59 "illegal open array parameter"
 60 "wrong type of case label"
@@ -70,7 +70,7 @@
 83 "undefined record field"
 84 "dereferenced variable is not a pointer"
 85 "guard or test type is not an extension of variable type"
-86 "guard or testtype is not a pointer"
+86 "guard or test type is not a pointer"
 87 "guarded or tested variable is neither a pointer nor a VAR- or IN-parameter record"
 88 "open array not allowed as variable, record field or array element"
 90 "dereferenced variable is not a character array"
@@ -188,8 +188,11 @@
 244 "cyclic type definition not allowed"
 265 "unsupported string operation"
 401 "file contains wrong module name"
+421 "linking failed"
+422 "compilation failed"
 
 menuFile "&File"
+menuNew "&New"
 menuOpen "&Open"
 menuReload "&Reload"
 menuSave "&Save"
@@ -198,6 +201,7 @@ menuSaveAll "Save a&ll"
 menuExit "E&xit"
 menuEdit "&Edit"
 menuUndo "&Undo"
+actionDelText "DelText"
 menuRedo "&Redo"
 menuCut "Cu&t"
 menuCopy "&Copy"
@@ -262,11 +266,12 @@ menuPreviousTopic "&Previous topic"
 menuUsingHelp "&Using help"
 menuHelpFiles "&Files..."
 menuAbout "&About..."
-menuHelp "Help"
-menuSave "Save"
-menuOpen "Open"
-menuCompileAndRun "Compile & Run"
-menuLocalMenu "Local menu"
+
+btnHelp "Help"
+btnSave "Save"
+btnOpen "Open"
+btnCompileAndRun "Compile & Run"
+btnLocalMenu "Local menu"
 
 titleAbout "About"
 titleFreeOberon "Free Oberon"
@@ -286,5 +291,5 @@ labelSaveFileAs "&Save file as"
 labelName "&Name"
 labelFiles "&Files"
 
-
-
+pressAnyKeyToReturnToIde "Press any key to return to IDE"
+runtimeError "Runtime error"

+ 294 - 0
Data/Texts/ru.dat

@@ -0,0 +1,294 @@
+0 "необъявленное имя"
+1 "имя объявляется повторно"
+2 "недопустимая литера в числе"
+3 "недопустимая литера в строке"
+4 "имя не совпадает с именем процедуры"
+5 "не закрыт комментарий"
+11 'ожидается "="'
+12 "определение типа начинается с неправильной литеры"
+13 "множитель начинается с неправильной литеры"
+14 "оператор начинается с неправильной литеры"
+15 "за объявлением следует неправильная литера"
+16 "ожидается слово MODULE"
+20 'пропущена "."'
+21 'пропущена ","'
+22 'пропущено ":"'
+24 'пропущена ")"'
+25 'пропущена "]"'
+26 'пропущена "}"'
+27 "пропущено слово OF"
+28 "пропущено слово THEN"
+29 "пропущено слово DO"
+30 "пропущено слово TO"
+32 'пропущена "("'
+33 "пропущено CONST, TYPE, VAR, PROCEDURE, BEGIN или END"
+34 "пропущено PROCEDURE, BEGIN или END"
+35 'пропущена "," или OF'
+36 'пропущено ":="'
+39 "это не параметр-переменная"
+40 "ожидается имя"
+41 'пропущена ";"'
+42 'пропущена "@"'
+43 "пропущено слово END"
+46 "пропущено слово UNTIL"
+47 "EXIT не находится внутри цикла"
+48 "имя помечено неправильно"
+49 "неправильно используется слово RETURN"
+50 "выражение должно быть константным"
+51 "константа - не целое число"
+52 "имя не обозначает тип"
+53 "имя не обозначает записевый тип"
+54 "тип возвращаемого значения процедуры должен быть элементарным"
+55 "процедурный вызов функции"
+56 "присваивание не в переменную"
+57 "указатель не связан с записевым типом"
+58 "рекурсивное определение типа"
+59 "недопустимый параметр - открытый массив"
+60 "неверный тип метки оператора CASE"
+61 "неприемлемый тип метки оператора CASE"
+62 "метка оператора CASE объявлена повторно"
+63 "недопустимое значение константы"
+64 "слишком много фактических параметров"
+65 "слишком мало фактических параметров"
+66 "отличаются типы элементов фактического массива и формального открытого массива"
+67 "фактический параметр, соответствующий открытому массиву, не является массивом"
+68 "управляющая переменная должна быть целого типа"
+69 "параметр должен быть константой целого типа"
+70 "в качестве формального приёмника необходим указатель или передаваемая через VAR / IN запись"
+71 "в качестве фактического приёмника ожидается указатель"
+72 "процедура должна быть связана с записью в той же области видимости"
+73 "процедура должна быть на уровне 0"
+74 "процедуры нет в базовом типе"
+75 "недействительный вызов базовой процедуры"
+76 "эта переменная (поле) доступно только для чтения"
+77 "объект не является записью"
+78 "разыменовываемый объект не является переменной"
+79 "индексируемый объект не является переменной"
+80 "индексное выражение не является целым числом"
+81 "индекс выходит за указанные пределы"
+82 "индексируемая переменная не является массивом"
+83 "поле записи не определено"
+84 "разыменовываемая переменная не является указателем"
+85 "охрана (проверка) типа не является расширением типа переменной"
+86 "охраняемый (проверяемый) тип не является указателем"
+87 "охраняемая (проверяемая) переменная - ни указатель, ни передаваемая через VAR- или IN-параметр запись"
+88 "открытый массив не допускается в качестве переменной, поля записи или элемента массива"
+90 "разыменовываемая переменная не является массивом литер"
+91 "управляющая переменная должна быть локальной"
+92 "операнд операции IN - ни целое число, ни множество"
+93 "тип элемента множества не целое число"
+94 "операнд операции & должен быть булевого типа"
+95 "операнд операции OR должен быть булевого типа"
+96 "операнд не подходит к (одноместному) +"
+97 "операнд не подходит к (одноместному) -"
+98 "операнд операции ~ должен быть булевого типа"
+99 "ASSERT не прошёл"
+100 "операнды двуместной операции несовместимы"
+101 "операнд не подходит к *"
+102 "операнд не подходит к /"
+103 "операнд не подходит к DIV"
+104 "операнд не подходит к MOD"
+105 "операнд не подходит к +"
+106 "операнд не подходит к -"
+107 "операнд не подходит к = или #"
+108 "операнд не подходит к отношению"
+110 "операнд не является типом"
+111 "операнд не подходит к (этой) функции"
+112 "операнд не является переменной"
+113 "несовместимое присваивание"
+114 "строка слишком длинная - присваивание невозможно"
+115 "параметр не совпадает"
+116 "количество параметров не совпадает"
+117 "тип возвращаемого значения не совпадает"
+118 "пометка на экспорт не совпадает с опережающим объявлением"
+119 "переопределение текстуально предшествует процедуре, привязанной к базовому типу"
+120 "тип выражения, следующего за словом IF, WHILE, UNTIL или ASSERT не является булевым"
+121 "вызываемый объект не является процедурой (или является процедурой-прерыванием)"
+122 "фактический VAR-параметр не является переменной"
+123 "тип не идентичен с типом формального VAR-параметра"
+124 "тип возвращаемого значения отличается от типа указанного в заголовке процедуры"
+125 "тип выражения CASE - ни INTEGER, ни CHAR"
+126 "это выражение не может быть типом или процедурой"
+127 "недопустимое использование объекта"
+128 "неудовлетворённая опережающая ссылка"
+129 "неудовлетворённая опережающая процедура"
+130 "после WITH указана не переменная"
+131 "LEN применён не к массиву"
+132 "размерность в LEN слишком большая или отрицательная"
+133 "системный флаг не соответствует опережающему объявлению"
+135 "модуль SYSTEM не подключён"
+136 "LEN применён к непомеченному массиву"
+137 "неизвестная длина массива"
+138 "NEW not allowed for untagged structures"
+139 "test applied to untagged record"
+140 "operand type inapplicable to DIV0"
+141 "operand type inapplicable to REM0"
+145 "untagged open array not allowed as value parameter"
+150 "несоответствует ключ импортированного модуля"
+151 "неправильный символьный файл"
+152 "не найден символьный файл импортируемого модуля"
+153 "объектный или символьный файл не открыт (диск переполнен?)"
+154 "рекурсивный импорт воспрещён"
+155 "генерация нового символьного файла запрещена"
+156 "используется адресный размер целевой машины и выравнивание по умолчанию"
+157 "syntax error in parameter file"
+177 "IN применим только к записям и массивам"
+178 "недопустимый атрибут"
+179 "abstract methods of exported records must be exported"
+180 "недопустимый тип приёмника"
+181 "базовый тип нерасширяем"
+182 "базовая процедура нерасширяема"
+183 "non-matching export"
+184 "атрибут не соответствует опережающему объявлению"
+185 "пропущен атрибут NEW"
+186 "недопустимый атрибут NEW"
+187 "new empty procedure in non extensible record"
+188 "extensible procedure in non extensible record"
+189 "illegal attribute change"
+190 "record must be abstract"
+191 "base type must be abstract"
+192 "unimplemented abstract procedures in base types"
+193 "abstract or limited records may not be allocated"
+194 "no supercall allowed to abstract or empty procedures"
+195 "empty procedures may not have out parameters or return a value"
+196 "procedure is implement-only exported"
+197 "extension of limited type must be limited"
+200 "пока не реализовано"
+201 "нижняя граница промежутка в множестве больше верхней границы"
+202 "элемент множества больше чем максимально допустимого или меньше 0"
+203 "число слишком большое"
+204 "произведение слишком большое"
+205 "деление на нуль"
+206 "сумма слишком большая"
+207 "разность слишком большая"
+208 "переполнение при арифметическом сдвиге"
+209 "слишком большой диапазон оператора CASE"
+210 "переполнение при логическом сдвиге"
+213 "слишком много меток в операторе CASE"
+214 "name collision"
+218 "недопустимое значение параметра (0 <= p < 256)"
+220 "недопустимое значение параметра"
+221 "too many pointers in a record"
+222 "too many global pointers"
+223 "too many record types"
+225 "address of pointer variable too large (move forward in text)"
+226 "too many exported procedures"
+227 "too many imported modules"
+228 "too many exported structures"
+229 "too many nested records for import"
+230 "too many constants (strings) in module"
+231 "too many link table entries (external procedures)"
+232 "too many commands in module"
+233 "record extension hierarchy too high"
+234 "export of recursive type not allowed"
+240 "имя слишком длинное"
+241 "строка слишком длинная"
+242 "адресное переполнение"
+243 "сцепление модуля, типа и защищённой переменной превышает максимальную длину имени"
+244 "циклическое определение типа не допускается"
+265 "строковая операция не поддерживается"
+401 "файл содержит неверное имя модуля"
+421 "компоновка не удалась"
+422 "компиляция не удалась"
+
+menuFile "&Файл"
+menuNew "&Новый"
+menuOpen "&Открыть"
+menuReload "О&бновить с диска"
+menuSave "&Сохранить"
+menuSaveAs "Сохранить &как..."
+menuSaveAll "Сохранить &всё"
+menuExit "Вы&ход"
+menuEdit "&Правка"
+menuUndo "&Отмена"
+actionDelText "УдалТекст"
+menuRedo "&Повтор"
+menuCut "&Вырезать"
+menuCopy "&Копировать"
+menuPaste "В&ставить"
+menuClear "&Удалить"
+menuSelectAll "Выделить в&сё"
+menuUnselect "С&нять выделение"
+menuSearch "По&иск"
+menuFind "&Найти..."
+menuReplace "&Замена..."
+menuSearchAgain "&Искать далее"
+menuGoToLineNumber "&Перейти к строчке..."
+menuFindProcedure "На&йти процедуру..."
+menuRun "&Запуск"
+menuRunDirectory "&Каталог запуска..."
+menuParameters "&Параметры..."
+menuCompile "&Компиляция"
+menuMake "&Смастерить"
+menuMakeAndRun "Смастерить и &запустить"
+menuBuild "&Собрать"
+menuDebug "&Отладка"
+menuOutput "&Вывод"
+menuTools "&Сервис"
+menuMessages "С&ообщения"
+menuCalculator "&Калькулятор"
+menuAsciiTable "&Таблица Ascii"
+menuOptions "&Опции"
+menuMode "Режим&..."
+menuNormalMode "Норма"
+menuCompiler "&Компилятор..."
+menuMemorySizes "&Размеры памяти..."
+menuLinker "&Компоновщик..."
+menuDirectories "&Каталоги..."
+menuEnvironment "Окру&жение"
+menuPreferences "&Предпочтения..."
+menuEditor "&Редактор..."
+menuCodeComplete "&Автозавершение кода..."
+menuCodeTemplates "&Шаблоны кода..."
+menuDesktop "&Рабочий стол..."
+menuKeyboardAndMouse "Клавиатура и &мышь..."
+menuLearnKeys "Изучить &клавиши"
+menuOpenOptions "&Открыть..."
+menuSaveOptions "&Сохранить"
+menuSaveOptionsAs "Сохранить &как..."
+menuWindow "&Окно"
+menuTile "&Замостить"
+menuCascade "&Каскад"
+menuCloseAll "З&акрыть все"
+menuSizeMove "&Размер/двигать"
+menuZoom "Раз&вернуть"
+menuNextWindow "&Следующее"
+menuPreviousWindow "&Предыдущее"
+menuCloseWindow "Зак&рыть"
+menuListWindows "Сп&исок..."
+menuRefreshDisplay "&Обновить дисплей"
+menuHelp "Сп&равка"
+menuContents "&Содержание"
+menuIndex "И&ндекс"
+menuTopicSearch "По&иск по темам"
+menuPreviousTopic "&Предыдущая тема"
+menuUsingHelp "&Как пользоваться справкой"
+menuHelpFiles "&Файлы..."
+menuAbout "&О программе..."
+
+btnHelp "Справка"
+btnSave "Сохранить"
+btnOpen "Открыть"
+btnCompileAndRun "Скомпилировать и запустить"
+btnLocalMenu "Местное меню"
+
+titleAbout "О программе"
+titleFreeOberon "Фри Оберон"
+version "версия"
+copyright "Copyright (c)"
+copyrightBy ""
+authorName "Артур Ефимов"
+
+btnOk "О&К"
+btnOpen "&Открыть"
+btnCancel "Отмена"
+
+titleSaveFileAs "Сохранить файл как"
+titleOpenAFile "Открыть файл"
+
+labelSaveFileAs "&Сохранить файл как"
+labelName "&Имя"
+labelFiles "&Файлы"
+
+pressAnyKeyToReturnToIde "Нажмите любую клавишу, чтобы вернуться в среду"
+runtimeError "Ошибка времени выполнения"

+ 0 - 1
src/FoStrings.Mod

@@ -37,7 +37,6 @@ BEGIN
   IF (0 <= err) & (err < LEN(errorStr)) THEN Strings.Copy(errorStr[err], s)
   ELSE s := 'Text of error #'; Int.Append(err, s); Strings.Append('.', s)
   END
-  (*'Пропущена точка с запятой.' 'Файл содержит неверное имя модуля.'*)
 END GetErrorStr;
 
 PROCEDURE MakeErrorStr*(err: INTEGER; VAR s: ARRAY OF CHAR);

+ 93 - 92
src/FreeOberon.Mod

@@ -50,7 +50,7 @@ CONST
   (* Defaults *)
   defW = 106;
   defH = 25;
-  defLang = 'en';
+  defLang = 'ru';
 
 TYPE
   StrList = POINTER TO StrListDesc;
@@ -99,8 +99,7 @@ VAR lines, width, x0, x, y, i: INTEGER;
 BEGIN
   (*;;;;;;Out.String('ERROR STRING: ['); Out.String(s); Out.String('] END.'); Out.Ln;;;;;;*)
   e := app.windows(Editor.Editor);
-  Editor.SetMsg(e, s);
-  OV.SetStatusText(app, s);
+  Editor.SetMsg(e, s)
 END ShowErrors;
 
 (* !TODO move out, rewrite *)
@@ -299,7 +298,7 @@ END ParseErrors;
 PROCEDURE PollProgram;
 VAR len, i: INTEGER;
     err: INTEGER;
-    s, sN: ARRAY 120 OF CHAR;
+    s, sN: FoStrings.String;
 
   PROCEDURE WriteProgBuf;
   VAR ch: SHORTCHAR; i: INTEGER;
@@ -333,11 +332,11 @@ BEGIN
       Read(TRUE); (* Read everything until pipe is empty *)
       programFinished := TRUE;
       IF tempWindowed THEN T.SwitchToFS END;
-      IF err = 0 THEN
-        WriteString(' Press any key to return to IDE')
-      ELSE s := ' Runtime error '; Int.Append(err, s);
-        WriteString(s)
-      END
+      IF err = 0 THEN s := ' '; FoStrings.Append('pressAnyKeyToReturnToIde', s)
+      ELSE s := ' '; FoStrings.Append('runtimeError', s);
+        Strings.Append(' ', s); Int.Append(err, s)
+      END;
+      WriteString(s)
     ELSE
       Read(FALSE) (* Attempt several reads *)
     END
@@ -494,7 +493,7 @@ BEGIN
       Strings.Append('" /C Data\bin\', cmd);
       Strings.Append(command, cmd);
       Strings.Append('.bat ', cmd)
-    ELSE T.Print(0, tH - 1, -1, 'Could not find cmd.exe', 15, 4)
+    ELSE T.Print(0, tH - 1, -1, 'Could not find cmd.exe', 15, 4) (*!FIXME*)
     END
   ELSE (* Linux *)
     cmd := 'Data/bin/'; Strings.Append(command, cmd);
@@ -539,8 +538,8 @@ BEGIN
       ELSE e.text.MoveToLineCol(line, col, e.h - 2)
       END;
       Editor.PrintText(app.windows(Editor.Editor))
-    ELSIF link THEN z := 'Linking failed.'
-    ELSE z := 'Compilation failed.'
+    ELSIF link THEN FoStrings.GetErrorStr(421, z)
+    ELSE FoStrings.GetErrorStr(422, z)
     END;
     IF z[0] = 0X THEN ShowErrors(s) ELSE ShowErrors(z) END
   END ;
@@ -987,14 +986,15 @@ END CascadeWindows;
 PROCEDURE InitIDE;
 VAR w: OV.Window;
   m, m2: OV.Menu;
-  s, q: ARRAY 256 OF CHAR;
+  s, q: FoStrings.String;
 BEGIN
   app := OV.NewApp();
   FileNew(app.menu);
 
   FoStrings.Get('menuFile', s);
   m := OV.NewMenu(s, '', 0, NIL);
-  OV.Add(m, OV.NewMenu('&New', 'Shift+F3', OV.hShiftF3, FileNew));
+  FoStrings.Get('menuNew', s);
+  OV.Add(m, OV.NewMenu(s, 'Shift+F3', OV.hShiftF3, FileNew));
   FoStrings.Get('menuOpen', s);
   OV.Add(m, OV.NewMenu(s, 'F3', OV.hF3, FileOpen));
   FoStrings.Get('menuReload', s);
@@ -1002,7 +1002,7 @@ BEGIN
   FoStrings.Get('menuSave', s);
   OV.Add(m, OV.NewMenu(s, 'F2', OV.hF2, FileSave));
   FoStrings.Get('menuSaveAs', s);
-  OV.Add(m, OV.NewMenu('Save &as...', 'Shift+F2', OV.hShiftF2, FileSaveAs));
+  OV.Add(m, OV.NewMenu(s, 'Shift+F2', OV.hShiftF2, FileSaveAs));
   (*FoStrings.Get('menuSaveAll', s);*)
   (*OV.Add(m, OV.NewMenu(s, '', 0, NIL));*)
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
@@ -1010,203 +1010,204 @@ BEGIN
   OV.Add(m, OV.NewMenu(s, 'Alt+X', OV.hAltX, OV.QuitApp));
   OV.AddMenu(app, m);
   FoStrings.Get('menuEdit', s);
-  m := OV.NewMenu('&Edit', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuUndo', s);
-  m2 := OV.NewMenu('&Undo', 'DelText', OV.hAltBackspace, NIL); m2.status := OV.disabled;
+  FoStrings.Get('actionDelText', q);
+  m2 := OV.NewMenu(s, q, OV.hAltBackspace, NIL); m2.status := OV.disabled;
   OV.Add(m, m2);
   FoStrings.Get('menuRedo', s);
-  m2 := OV.NewMenu('&Redo', '', 0, NIL); m2.status := OV.disabled;
+  m2 := OV.NewMenu(s, '', 0, NIL); m2.status := OV.disabled;
   OV.Add(m, m2);
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuCut', s);
-  OV.Add(m, OV.NewMenu('Cu&t', 'Ctrl+X', OV.hCtrlX, Editor.EditCut));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+X', OV.hCtrlX, Editor.EditCut));
   FoStrings.Get('menuCopy', s);
-  OV.Add(m, OV.NewMenu('&Copy', 'Ctrl+C', OV.hCtrlC, Editor.EditCopy));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+C', OV.hCtrlC, Editor.EditCopy));
   FoStrings.Get('menuPaste', s);
-  OV.Add(m, OV.NewMenu('&Paste', 'Ctrl+V', OV.hCtrlV, Editor.EditPaste));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+V', OV.hCtrlV, Editor.EditPaste));
   FoStrings.Get('menuClear', s);
-  OV.Add(m, OV.NewMenu('C&lear', 'Ctrl+Del', OV.hCtrlDel, Editor.EditClear));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+Del', OV.hCtrlDel, Editor.EditClear));
   FoStrings.Get('menuSelectAll', s);
-  OV.Add(m, OV.NewMenu('Select &All', 'Ctrl+A', OV.hCtrlA, Editor.EditSelectAll));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+A', OV.hCtrlA, Editor.EditSelectAll));
   FoStrings.Get('menuUnselect', s);
-  OV.Add(m, OV.NewMenu('U&nselect', '', 0, Editor.EditUnselect));
+  OV.Add(m, OV.NewMenu(s, '', 0, Editor.EditUnselect));
   OV.AddMenu(app, m);
   FoStrings.Get('menuSearch', s);
-  m := OV.NewMenu('&Search', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuFind', s);
-  OV.Add(m, OV.NewMenu('&Find...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuReplace', s);
-  OV.Add(m, OV.NewMenu('&Replace...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuSearchAgain', s);
-  OV.Add(m, OV.NewMenu('&Search again', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuGoToLineNumber', s);
-  OV.Add(m, OV.NewMenu('&Go to line number...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuFindProcedure', s);
-  OV.Add(m, OV.NewMenu('&Find procedure...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   FoStrings.Get('menuRun', s);
-  m := OV.NewMenu('&Run', '', 0, NIL);
-  OV.Add(m, OV.NewMenu('&Run', 'Ctrl+F9', OV.hCtrlF9, OnBuild));
+  m := OV.NewMenu(s, '', 0, NIL);
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+F9', OV.hCtrlF9, OnBuild));
   FoStrings.Get('menuRunDirectory', s);
-  OV.Add(m, OV.NewMenu('Run &Directory...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuParameters', s);
-  OV.Add(m, OV.NewMenu('P&arameters...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   FoStrings.Get('menuCompile', s);
-  m := OV.NewMenu('&Compile', '', 0, NIL);
-  OV.Add(m, OV.NewMenu('&Compile', 'Alt+F9', OV.hAltF9, OnBuild));
+  m := OV.NewMenu(s, '', 0, NIL);
+  OV.Add(m, OV.NewMenu(s, 'Alt+F9', OV.hAltF9, OnBuild));
   FoStrings.Get('menuMake', s);
-  OV.Add(m, OV.NewMenu('&Make', 'Shift+F9', OV.hShiftF9, OnBuild));
+  OV.Add(m, OV.NewMenu(s, 'Shift+F9', OV.hShiftF9, OnBuild));
   FoStrings.Get('menuMakeAndRun', s);
-  OV.Add(m, OV.NewMenu('Make && &Run', 'F9', OV.hF9, OnBuild));
+  OV.Add(m, OV.NewMenu(s, 'F9', OV.hF9, OnBuild));
   FoStrings.Get('menuBuild', s);
-  OV.Add(m, OV.NewMenu('&Build', '', 0, OnBuild));
+  OV.Add(m, OV.NewMenu(s, '', 0, OnBuild));
   OV.AddMenu(app, m);
   FoStrings.Get('menuDebug', s);
-  m := OV.NewMenu('&Debug', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuOutput', s);
-  OV.Add(m, OV.NewMenu('&Output', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   FoStrings.Get('menuTools', s);
-  m := OV.NewMenu('&Tools', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuMessages', s);
-  OV.Add(m, OV.NewMenu('&Messages', 'F11', OV.hF11, NIL));
+  OV.Add(m, OV.NewMenu(s, 'F11', OV.hF11, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuCalculator', s);
-  OV.Add(m, OV.NewMenu('&Calculator', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuAsciiTable', s);
-  OV.Add(m, OV.NewMenu('Ascii &table', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   FoStrings.Get('menuOptions', s);
-  m := OV.NewMenu('&Options', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuMode', s);
   FoStrings.Get('menuNormalMode', q);
-  OV.Add(m, OV.NewMenu('Mode&...', q, 0, NIL));
+  OV.Add(m, OV.NewMenu(s, q, 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuCompiler', s);
-  OV.Add(m, OV.NewMenu('&Compiler...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuMemorySizes', s);
-  OV.Add(m, OV.NewMenu('&Memory sizes...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuLinker', s);
-  OV.Add(m, OV.NewMenu('&Linker...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuDirectories', s);
-  OV.Add(m, OV.NewMenu('&Directories...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuTools', s);
-  OV.Add(m, OV.NewMenu('&Tools...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuEnvironment', s);
-  m2 := OV.NewMenu('&Environment', '', 0, NIL);
+  m2 := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuPreferences', s);
-  OV.Add(m2, OV.NewMenu('&Preferences...', '', 0, NIL));
+  OV.Add(m2, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuEditor', s);
-  OV.Add(m2, OV.NewMenu('&Editor...', '', 0, NIL));
+  OV.Add(m2, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuCodeComplete', s);
-  OV.Add(m2, OV.NewMenu('Code&Complete...', '', 0, NIL));
+  OV.Add(m2, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuCodeTemplates', s);
-  OV.Add(m2, OV.NewMenu('Code&Templates...', '', 0, NIL));
+  OV.Add(m2, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuDesktop', s);
-  OV.Add(m2, OV.NewMenu('&Desktop...', '', 0, NIL));
+  OV.Add(m2, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuKeyboardAndMouse', s);
-  OV.Add(m2, OV.NewMenu('Keyboard && &mouse...', '', 0, NIL));
+  OV.Add(m2, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuLearnKeys', s);
-  OV.Add(m2, OV.NewMenu('Learn &Keys', '', 0, NIL));
+  OV.Add(m2, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m2.children.prev.status := OV.disabled;
   OV.Add(m, m2);
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuOpenOptions', s);
-  OV.Add(m, OV.NewMenu('&Open...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuSaveOptions', s);
-  OV.Add(m, OV.NewMenu('&Save', 'fo.ini', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, 'fo.ini', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuSaveOptionsAs', s);
-  OV.Add(m, OV.NewMenu('Save &as...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   FoStrings.Get('menuWindow', s);
-  m := OV.NewMenu('&Window', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuTile', s);
-  OV.Add(m, OV.NewMenu('&Tile', '', 0, TileWindows));
+  OV.Add(m, OV.NewMenu(s, '', 0, TileWindows));
   FoStrings.Get('menuCascade', s);
-  OV.Add(m, OV.NewMenu('C&ascade', '', 0, CascadeWindows));
+  OV.Add(m, OV.NewMenu(s, '', 0, CascadeWindows));
   FoStrings.Get('menuCloseAll', s);
-  OV.Add(m, OV.NewMenu('Cl&ose all', '', 0, OV.CloseAllWindows));
+  OV.Add(m, OV.NewMenu(s, '', 0, OV.CloseAllWindows));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuSizeMove', s);
-  OV.Add(m, OV.NewMenu('&Size/Move', 'Ctrl+F5', OV.hCtrlF5, NIL));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+F5', OV.hCtrlF5, NIL));
   FoStrings.Get('menuZoom', s);
-  OV.Add(m, OV.NewMenu('&Zoom', 'F5', OV.hF5, OV.ZoomCurWindow));
+  OV.Add(m, OV.NewMenu(s, 'F5', OV.hF5, OV.ZoomCurWindow));
   FoStrings.Get('menuNextWindow', s);
-  OV.Add(m, OV.NewMenu('&Next', 'F6', OV.hF6, OV.NextWindow));
+  OV.Add(m, OV.NewMenu(s, 'F6', OV.hF6, OV.NextWindow));
   FoStrings.Get('menuPreviousWindow', s);
-  OV.Add(m, OV.NewMenu('&Previous', 'Shift+F6', OV.hShiftF6, OV.PrevWindow));
+  OV.Add(m, OV.NewMenu(s, 'Shift+F6', OV.hShiftF6, OV.PrevWindow));
   FoStrings.Get('menuCloseWindow', s);
-  OV.Add(m, OV.NewMenu('&Close', 'Alt+F3', OV.hAltF3, OV.CloseCurWindow));
+  OV.Add(m, OV.NewMenu(s, 'Alt+F3', OV.hAltF3, OV.CloseCurWindow));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuListWindows', s);
-  OV.Add(m, OV.NewMenu('&List...', 'Alt+0', OV.hAlt0, NIL));
+  OV.Add(m, OV.NewMenu(s, 'Alt+0', OV.hAlt0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuRefreshDisplay', s);
-  OV.Add(m, OV.NewMenu('&Refresh display', '', 0, OV.RefreshDisplay));
+  OV.Add(m, OV.NewMenu(s, '', 0, OV.RefreshDisplay));
   OV.AddMenu(app, m);
   FoStrings.Get('menuHelp', s);
-  m := OV.NewMenu('&Help', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuContents', s);
-  OV.Add(m, OV.NewMenu('&Contents', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuIndex', s);
-  OV.Add(m, OV.NewMenu('&Index', 'Shift+F1', OV.hShiftF1, NIL));
+  OV.Add(m, OV.NewMenu(s, 'Shift+F1', OV.hShiftF1, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuTopicSearch', s);
-  OV.Add(m, OV.NewMenu('&Topic search', 'Ctrl+F1', OV.hCtrlF1, NIL));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+F1', OV.hCtrlF1, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuPreviousTopic', s);
-  OV.Add(m, OV.NewMenu('&Previous topic', 'Alt+F1', OV.hAltF1, NIL));
+  OV.Add(m, OV.NewMenu(s, 'Alt+F1', OV.hAltF1, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuUsingHelp', s);
-  OV.Add(m, OV.NewMenu('&Using help', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuHelpFiles', s);
-  OV.Add(m, OV.NewMenu('&Files...', '', 0, NIL));
+  OV.Add(m, OV.NewMenu(s, '', 0, NIL));
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuAbout', s);
-  OV.Add(m, OV.NewMenu('&About...', '', OV.hF1, HelpAbout));
+  OV.Add(m, OV.NewMenu(s, '', OV.hF1, HelpAbout));
   OV.AddMenu(app, m);
 
-  FoStrings.Get('menuHelp', s);
-  OV.AddStatusbar(app, OV.NewQuickBtn('Help', 'F1', 0, HelpAbout));
-  FoStrings.Get('menuSave', s);
-  OV.AddStatusbar(app, OV.NewQuickBtn('Save', 'F2', 0, FileSave));
-  FoStrings.Get('menuOpen', s);
-  OV.AddStatusbar(app, OV.NewQuickBtn('Open', 'F3', 0, FileOpen));
-  FoStrings.Get('menuCompileAndRun', s);
-  OV.AddStatusbar(app, OV.NewQuickBtn('Compile & Run', 'F9', 0, OnBuild));
-  FoStrings.Get('menuLocalMenu', s);
-  OV.AddStatusbar(app, OV.NewQuickBtn('Local menu', 'Alt+F10', 0, NIL))
+  FoStrings.Get('btnHelp', s);
+  OV.AddStatusbar(app, OV.NewQuickBtn(s, 'F1', 0, HelpAbout));
+  FoStrings.Get('btnSave', s);
+  OV.AddStatusbar(app, OV.NewQuickBtn(s, 'F2', 0, FileSave));
+  FoStrings.Get('btnOpen', s);
+  OV.AddStatusbar(app, OV.NewQuickBtn(s, 'F3', 0, FileOpen));
+  FoStrings.Get('btnCompileAndRun', s);
+  OV.AddStatusbar(app, OV.NewQuickBtn(s, 'F9', 0, OnBuild));
+  FoStrings.Get('btnLocalMenu', s);
+  OV.AddStatusbar(app, OV.NewQuickBtn(s, 'Alt+F10', 0, NIL))
 END InitIDE;
 
 PROCEDURE OpenFiles(VAR fnames: Fnames);

+ 8 - 5
src/OV.Mod

@@ -801,10 +801,13 @@ END SetApp;
 
 (* Common *)
 
-PROCEDURE Cap*(ch: CHAR): CHAR;
+PROCEDURE Cap(c: CHAR): CHAR;
 BEGIN
-  IF ('a' <= ch) & (ch <= 'z') THEN ch := CAP(ch) END
-RETURN ch END Cap;
+  IF ('a' <= c) & (c <= 'z') THEN c := CHR(ORD('Q') - ORD('q') + ORD(c))
+  ELSIF ('а' <= c) & (c <= 'я') THEN  c := CHR(ORD('Б') - ORD('б') + ORD(c))
+  ELSIF c = 'ё' THEN c := 'Ё'
+  END ;
+RETURN c END Cap;
 
 PROCEDURE Refresh*(c: Control);
 BEGIN
@@ -1202,7 +1205,7 @@ BEGIN i := 0; x := c.caption[0];
     IF (x = '&') & (c.caption[i + 1] = '&') THEN INC(i, 2) ELSE INC(i) END;
     x := c.caption[i]
   END
-RETURN (c.caption[i] # 0X) & (CAP(c.caption[i + 1]) = CAP(ch)) END MenuHotkey;
+RETURN (c.caption[i] # 0X) & (Cap(c.caption[i + 1]) = Cap(ch)) END MenuHotkey;
 
 PROCEDURE MenuKeyDown*(c: Control; VAR E: T.Event);
 VAR p, p2, br: Control; found: BOOLEAN;
@@ -1974,7 +1977,7 @@ PROCEDURE ColumnListTextInput*(c: Control; ch: CHAR);
 VAR C: ColumnList; n: INTEGER;
 BEGIN C := c(ColumnList);
   IF ch # 0X THEN
-    n := FindFirstLetterInList(C.items, CAP(ch));
+    n := FindFirstLetterInList(C.items, Cap(ch));
     IF n # -1 THEN ColumnListSetCur(C, n) END
   END
 END ColumnListTextInput;

+ 1 - 1
src/make.bat

@@ -98,7 +98,7 @@ windres resources.rc resources.o
   ..\Data\bin\FreeOberon.a ^
   %OFRDIR%\Lib\Ofront.a ^
   -lallegro -lallegro_primitives -lallegro_image ^
-  -I..\Data\bin\mingw32\include
+  -I..\Data\bin\mingw32\include -Wl,-subsystem,windows
 
 @GOTO QUIT
 :ERR