Explorar o código

Interface internationalized and localized to Russian

Arthur Yefimov %!s(int64=3) %!d(string=hai) anos
pai
achega
9e8ba3bbb4
Modificáronse 6 ficheiros con 410 adicións e 108 borrados
  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"
 54 "result type of procedure is not a basic type"
 55 "procedure call of a function"
 55 "procedure call of a function"
 56 "assignment to non-variable"
 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"
 58 "recursive type definition"
 59 "illegal open array parameter"
 59 "illegal open array parameter"
 60 "wrong type of case label"
 60 "wrong type of case label"
@@ -70,7 +70,7 @@
 83 "undefined record field"
 83 "undefined record field"
 84 "dereferenced variable is not a pointer"
 84 "dereferenced variable is not a pointer"
 85 "guard or test type is not an extension of variable type"
 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"
 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"
 88 "open array not allowed as variable, record field or array element"
 90 "dereferenced variable is not a character array"
 90 "dereferenced variable is not a character array"
@@ -188,8 +188,11 @@
 244 "cyclic type definition not allowed"
 244 "cyclic type definition not allowed"
 265 "unsupported string operation"
 265 "unsupported string operation"
 401 "file contains wrong module name"
 401 "file contains wrong module name"
+421 "linking failed"
+422 "compilation failed"
 
 
 menuFile "&File"
 menuFile "&File"
+menuNew "&New"
 menuOpen "&Open"
 menuOpen "&Open"
 menuReload "&Reload"
 menuReload "&Reload"
 menuSave "&Save"
 menuSave "&Save"
@@ -198,6 +201,7 @@ menuSaveAll "Save a&ll"
 menuExit "E&xit"
 menuExit "E&xit"
 menuEdit "&Edit"
 menuEdit "&Edit"
 menuUndo "&Undo"
 menuUndo "&Undo"
+actionDelText "DelText"
 menuRedo "&Redo"
 menuRedo "&Redo"
 menuCut "Cu&t"
 menuCut "Cu&t"
 menuCopy "&Copy"
 menuCopy "&Copy"
@@ -262,11 +266,12 @@ menuPreviousTopic "&Previous topic"
 menuUsingHelp "&Using help"
 menuUsingHelp "&Using help"
 menuHelpFiles "&Files..."
 menuHelpFiles "&Files..."
 menuAbout "&About..."
 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"
 titleAbout "About"
 titleFreeOberon "Free Oberon"
 titleFreeOberon "Free Oberon"
@@ -286,5 +291,5 @@ labelSaveFileAs "&Save file as"
 labelName "&Name"
 labelName "&Name"
 labelFiles "&Files"
 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)
   IF (0 <= err) & (err < LEN(errorStr)) THEN Strings.Copy(errorStr[err], s)
   ELSE s := 'Text of error #'; Int.Append(err, s); Strings.Append('.', s)
   ELSE s := 'Text of error #'; Int.Append(err, s); Strings.Append('.', s)
   END
   END
-  (*'Пропущена точка с запятой.' 'Файл содержит неверное имя модуля.'*)
 END GetErrorStr;
 END GetErrorStr;
 
 
 PROCEDURE MakeErrorStr*(err: INTEGER; VAR s: ARRAY OF CHAR);
 PROCEDURE MakeErrorStr*(err: INTEGER; VAR s: ARRAY OF CHAR);

+ 93 - 92
src/FreeOberon.Mod

@@ -50,7 +50,7 @@ CONST
   (* Defaults *)
   (* Defaults *)
   defW = 106;
   defW = 106;
   defH = 25;
   defH = 25;
-  defLang = 'en';
+  defLang = 'ru';
 
 
 TYPE
 TYPE
   StrList = POINTER TO StrListDesc;
   StrList = POINTER TO StrListDesc;
@@ -99,8 +99,7 @@ VAR lines, width, x0, x, y, i: INTEGER;
 BEGIN
 BEGIN
   (*;;;;;;Out.String('ERROR STRING: ['); Out.String(s); Out.String('] END.'); Out.Ln;;;;;;*)
   (*;;;;;;Out.String('ERROR STRING: ['); Out.String(s); Out.String('] END.'); Out.Ln;;;;;;*)
   e := app.windows(Editor.Editor);
   e := app.windows(Editor.Editor);
-  Editor.SetMsg(e, s);
-  OV.SetStatusText(app, s);
+  Editor.SetMsg(e, s)
 END ShowErrors;
 END ShowErrors;
 
 
 (* !TODO move out, rewrite *)
 (* !TODO move out, rewrite *)
@@ -299,7 +298,7 @@ END ParseErrors;
 PROCEDURE PollProgram;
 PROCEDURE PollProgram;
 VAR len, i: INTEGER;
 VAR len, i: INTEGER;
     err: INTEGER;
     err: INTEGER;
-    s, sN: ARRAY 120 OF CHAR;
+    s, sN: FoStrings.String;
 
 
   PROCEDURE WriteProgBuf;
   PROCEDURE WriteProgBuf;
   VAR ch: SHORTCHAR; i: INTEGER;
   VAR ch: SHORTCHAR; i: INTEGER;
@@ -333,11 +332,11 @@ BEGIN
       Read(TRUE); (* Read everything until pipe is empty *)
       Read(TRUE); (* Read everything until pipe is empty *)
       programFinished := TRUE;
       programFinished := TRUE;
       IF tempWindowed THEN T.SwitchToFS END;
       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
     ELSE
       Read(FALSE) (* Attempt several reads *)
       Read(FALSE) (* Attempt several reads *)
     END
     END
@@ -494,7 +493,7 @@ BEGIN
       Strings.Append('" /C Data\bin\', cmd);
       Strings.Append('" /C Data\bin\', cmd);
       Strings.Append(command, cmd);
       Strings.Append(command, cmd);
       Strings.Append('.bat ', 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
     END
   ELSE (* Linux *)
   ELSE (* Linux *)
     cmd := 'Data/bin/'; Strings.Append(command, cmd);
     cmd := 'Data/bin/'; Strings.Append(command, cmd);
@@ -539,8 +538,8 @@ BEGIN
       ELSE e.text.MoveToLineCol(line, col, e.h - 2)
       ELSE e.text.MoveToLineCol(line, col, e.h - 2)
       END;
       END;
       Editor.PrintText(app.windows(Editor.Editor))
       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;
     END;
     IF z[0] = 0X THEN ShowErrors(s) ELSE ShowErrors(z) END
     IF z[0] = 0X THEN ShowErrors(s) ELSE ShowErrors(z) END
   END ;
   END ;
@@ -987,14 +986,15 @@ END CascadeWindows;
 PROCEDURE InitIDE;
 PROCEDURE InitIDE;
 VAR w: OV.Window;
 VAR w: OV.Window;
   m, m2: OV.Menu;
   m, m2: OV.Menu;
-  s, q: ARRAY 256 OF CHAR;
+  s, q: FoStrings.String;
 BEGIN
 BEGIN
   app := OV.NewApp();
   app := OV.NewApp();
   FileNew(app.menu);
   FileNew(app.menu);
 
 
   FoStrings.Get('menuFile', s);
   FoStrings.Get('menuFile', s);
   m := OV.NewMenu(s, '', 0, NIL);
   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);
   FoStrings.Get('menuOpen', s);
   OV.Add(m, OV.NewMenu(s, 'F3', OV.hF3, FileOpen));
   OV.Add(m, OV.NewMenu(s, 'F3', OV.hF3, FileOpen));
   FoStrings.Get('menuReload', s);
   FoStrings.Get('menuReload', s);
@@ -1002,7 +1002,7 @@ BEGIN
   FoStrings.Get('menuSave', s);
   FoStrings.Get('menuSave', s);
   OV.Add(m, OV.NewMenu(s, 'F2', OV.hF2, FileSave));
   OV.Add(m, OV.NewMenu(s, 'F2', OV.hF2, FileSave));
   FoStrings.Get('menuSaveAs', s);
   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);*)
   (*FoStrings.Get('menuSaveAll', s);*)
   (*OV.Add(m, OV.NewMenu(s, '', 0, NIL));*)
   (*OV.Add(m, OV.NewMenu(s, '', 0, NIL));*)
   OV.Add(m, OV.NewMenu('-', '', 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.Add(m, OV.NewMenu(s, 'Alt+X', OV.hAltX, OV.QuitApp));
   OV.AddMenu(app, m);
   OV.AddMenu(app, m);
   FoStrings.Get('menuEdit', s);
   FoStrings.Get('menuEdit', s);
-  m := OV.NewMenu('&Edit', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuUndo', s);
   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);
   OV.Add(m, m2);
   FoStrings.Get('menuRedo', s);
   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, m2);
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuCut', s);
   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);
   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);
   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);
   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);
   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);
   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);
   OV.AddMenu(app, m);
   FoStrings.Get('menuSearch', s);
   FoStrings.Get('menuSearch', s);
-  m := OV.NewMenu('&Search', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuFind', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuReplace', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuSearchAgain', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuGoToLineNumber', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuFindProcedure', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   OV.AddMenu(app, m);
   FoStrings.Get('menuRun', s);
   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);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuParameters', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   OV.AddMenu(app, m);
   FoStrings.Get('menuCompile', s);
   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);
   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);
   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);
   FoStrings.Get('menuBuild', s);
-  OV.Add(m, OV.NewMenu('&Build', '', 0, OnBuild));
+  OV.Add(m, OV.NewMenu(s, '', 0, OnBuild));
   OV.AddMenu(app, m);
   OV.AddMenu(app, m);
   FoStrings.Get('menuDebug', s);
   FoStrings.Get('menuDebug', s);
-  m := OV.NewMenu('&Debug', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuOutput', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   OV.AddMenu(app, m);
   FoStrings.Get('menuTools', s);
   FoStrings.Get('menuTools', s);
-  m := OV.NewMenu('&Tools', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuMessages', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuCalculator', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuAsciiTable', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   OV.AddMenu(app, m);
   FoStrings.Get('menuOptions', s);
   FoStrings.Get('menuOptions', s);
-  m := OV.NewMenu('&Options', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuMode', s);
   FoStrings.Get('menuMode', s);
   FoStrings.Get('menuNormalMode', q);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuCompiler', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuMemorySizes', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuLinker', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuDirectories', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuTools', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuEnvironment', s);
   FoStrings.Get('menuEnvironment', s);
-  m2 := OV.NewMenu('&Environment', '', 0, NIL);
+  m2 := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuPreferences', s);
   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;
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuEditor', s);
   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;
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuCodeComplete', s);
   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;
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuCodeTemplates', s);
   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;
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuDesktop', s);
   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;
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuKeyboardAndMouse', s);
   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;
   (*!TODO*) m2.children.prev.status := OV.disabled;
   FoStrings.Get('menuLearnKeys', s);
   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;
   (*!TODO*) m2.children.prev.status := OV.disabled;
   OV.Add(m, m2);
   OV.Add(m, m2);
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuOpenOptions', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuSaveOptions', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuSaveOptionsAs', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   OV.AddMenu(app, m);
   FoStrings.Get('menuWindow', s);
   FoStrings.Get('menuWindow', s);
-  m := OV.NewMenu('&Window', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuTile', s);
   FoStrings.Get('menuTile', s);
-  OV.Add(m, OV.NewMenu('&Tile', '', 0, TileWindows));
+  OV.Add(m, OV.NewMenu(s, '', 0, TileWindows));
   FoStrings.Get('menuCascade', s);
   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);
   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));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuSizeMove', s);
   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);
   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);
   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);
   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);
   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));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuListWindows', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuRefreshDisplay', s);
   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);
   OV.AddMenu(app, m);
   FoStrings.Get('menuHelp', s);
   FoStrings.Get('menuHelp', s);
-  m := OV.NewMenu('&Help', '', 0, NIL);
+  m := OV.NewMenu(s, '', 0, NIL);
   FoStrings.Get('menuContents', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuIndex', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuTopicSearch', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuPreviousTopic', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuUsingHelp', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   FoStrings.Get('menuHelpFiles', s);
   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;
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuAbout', s);
   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);
   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;
 END InitIDE;
 
 
 PROCEDURE OpenFiles(VAR fnames: Fnames);
 PROCEDURE OpenFiles(VAR fnames: Fnames);

+ 8 - 5
src/OV.Mod

@@ -801,10 +801,13 @@ END SetApp;
 
 
 (* Common *)
 (* Common *)
 
 
-PROCEDURE Cap*(ch: CHAR): CHAR;
+PROCEDURE Cap(c: CHAR): CHAR;
 BEGIN
 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);
 PROCEDURE Refresh*(c: Control);
 BEGIN
 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;
     IF (x = '&') & (c.caption[i + 1] = '&') THEN INC(i, 2) ELSE INC(i) END;
     x := c.caption[i]
     x := c.caption[i]
   END
   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);
 PROCEDURE MenuKeyDown*(c: Control; VAR E: T.Event);
 VAR p, p2, br: Control; found: BOOLEAN;
 VAR p, p2, br: Control; found: BOOLEAN;
@@ -1974,7 +1977,7 @@ PROCEDURE ColumnListTextInput*(c: Control; ch: CHAR);
 VAR C: ColumnList; n: INTEGER;
 VAR C: ColumnList; n: INTEGER;
 BEGIN C := c(ColumnList);
 BEGIN C := c(ColumnList);
   IF ch # 0X THEN
   IF ch # 0X THEN
-    n := FindFirstLetterInList(C.items, CAP(ch));
+    n := FindFirstLetterInList(C.items, Cap(ch));
     IF n # -1 THEN ColumnListSetCur(C, n) END
     IF n # -1 THEN ColumnListSetCur(C, n) END
   END
   END
 END ColumnListTextInput;
 END ColumnListTextInput;

+ 1 - 1
src/make.bat

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