i21sys/Docu/ru/Vocabulary.odc

i21sysVocabulary

DEFINITION i21sysVocabulary;

	IMPORT TextModels, i21sysScanner;

	VAR
		language-: ARRAY 100 OF CHAR;

	PROCEDURE AllCapsToUnicode (IN in: i21sysScanner.String; OUT out: i21sysScanner.String);
	PROCEDURE ConvertFocus;
	PROCEDURE ConvertText (t0: TextModels.Model; OUT t1: TextModels.Model);
	PROCEDURE IsImport (IN s: ARRAY OF CHAR): BOOLEAN;
	PROCEDURE IsModule (IN s: ARRAY OF CHAR): BOOLEAN;
	PROCEDURE OriginalPos (pos: INTEGER): INTEGER;
	PROCEDURE Retranslate (IN na: i21sysScanner.String; OUT en: i21sysScanner.String);
	PROCEDURE SetLanguage (lang: ARRAY OF CHAR);
	PROCEDURE Show;
	PROCEDURE Translate (IN en: i21sysScanner.String; OUT na: i21sysScanner.String);

END i21sysVocabulary.

Поддержка использования ключевых слов на родном языке.

Обычно речь идёт о переводе ключевых слов языка Оберон/Компонентный Паскаль, но на самом деле механизм может работать с произвольными идентификаторами..

Команды компиляции программ с ключевыми словами на родном языке  в модуле i21sysCompiler.

Модуль i21sysVocabulary выделен из i21sysCompiler, чтобы не привязывать DevDebug к DevCompiler через i21sysCompiler. Такая привязка создаёт проблемы при экспериментировании с компилятором.

Принцип работы модуля подразумевает, что модуль хранит словарик для перевода некоторого набора (ключевых) слов, установленный последним вызовом процедуры SetLanguage; 
к этому словарику обращаются процедуры Translate и Retranslate.
Кроме того, модуль помнит информацию о позициях слов, подвергшихся переводу в последнем вызове ConvertFocus или ConvertText. Это позволяет узнавать, какой позиции в исходном тексте соответствует та или иная позиция в переведённом тексте (функция OriginalPos).

VAR language-: ARRAY 100 OF CHAR;
Значение параметра lang, использованное в последнем вызове установки языка ключевых слов (SetLanguage). При этом словарики берутся из подпапки language в папке i21sys/Rsrc/.
По умолчанию language = 'en', при этом словарик пуст и перевода не делается.

PROCEDURE AllCapsToUnicode (IN in: i21sysScanner.String; OUT out: i21sysScanner.String);
Если цепочка in состоит из одних заглавных литер (допустимых в данной локализации), то она переводится в Уникод (результат в out), в противном случае просто копируется в out.

PROCEDURE ConvertText (t0: TextModels.Model; OUT t1: TextModels.Model);
Транслирует текст t0 в текст t1, используя текущий словарик.
Экспортирована для поддержки гиперссылок на исходник в окошках ТРАПов (модуль DevDebug).

PROCEDURE ConvertFocus;
Берёт текст в переднем окне (в фокусе), переводит его, вызывая ConvertText, а затем открывает переведённый текст в новом окне.

PROCEDURE IsModule (IN s: ARRAY OF CHAR): BOOLEAN;
Является ли s$ ключевым словом MODULE или его нац. соответствием.
Используется в информационном аппарате (DevDebug, DevReferences, ...).

PROCEDURE IsImport (IN s: ARRAY OF CHAR): BOOLEAN;
Является ли s$ ключевым словом IMPORT или его нац. соответствием.
Используется в информационном аппарате (DevDebug, DevReferences, ...).

PROCEDURE OriginalPos (pos: INTEGER): INTEGER;
Длина слов при переводе меняется, однако незатронутые переводом фрагменты текста в исходном документе и в переводе находятся во взаимно-однозначном соответствии. 
Для каждой позиции в незатронутых фрагментах в переводе можно узнать соответствующую позицию в исходном документе  это и позволяет сделать данная функция.
Это нужно, например, для корректной вставки маркеров ошибок компиляции в исходную программу с ключевыми словами на родном языке. А также для обеспечения гиперссылок на такую программу в окошках ТРАПов (модуль DevDebug).

PROCEDURE Translate (IN en: i21sysScanner.String; OUT na: i21sysScanner.String)
Попытка перевести по словарику слово en с английского на национальный язык. Результат возвращается в параметре na.

PROCEDURE Retranslate (IN na: i21sysScanner.String; OUT en: i21sysScanner.String)
Обратное действие к Translate: попытка перевести по словарику слово na с родного на английский язык. Результат возвращается в параметре en.

PROCEDURE SetLanguage (lang: ARRAY OF CHAR);
Установка нового словарика перевода.
В качестве входных данных берется файл с именем vocab.odc в подпапке lang в папке
i21sys/Rsrc/. 
Пример словарика  документ i21sys/Rsrc/ru/vocab.odc для русскоязычных ключевых слов (lang='ru'). Полезно помнить, что словарик не обязан быть полным, то есть не обязан содержать переводы всех ключевых слов Компонентного Паскаля: в учебном контексте это обычно и не нужно.

Установку словарика (вызов процедуры SetLanguage) для школьных нужд проще всего прописать в процедуре Setup модуля Config (дважды кликнуть по имени модуля и нажать Ctrl+0 (цифра 0), чтобы открыть исходник для редактирования).

В папку i21sys/Rsrc/ можно добавить подпапки со словариками для любых языков и активировать их с помощью вызовов вида i21sysVocabulary.SetLanguage('ru').

Если lang = '' или lang = 'en' или файл не обнаруживается, то словарик очищается,  переменная language устанавливается в 'en', и никакого перевода не делается до установки нового словарика.


PROCEDURE Show
Печать активного словарика в рабочий журнал.

______________
info21 2010-09-30; последнее обновление: 2012-04-23