mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 04:50:36 +03:00
Update help topics
This commit is contained in:
parent
62e30d474b
commit
31bbf0ab84
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
@ -124,10 +124,13 @@
|
|||
"viewsets",
|
||||
"wordform",
|
||||
"Wordforms",
|
||||
"Биективная",
|
||||
"биективной",
|
||||
"Булеан",
|
||||
"Бурбаки",
|
||||
"Версионирование",
|
||||
"Десинглетон",
|
||||
"интерпретируемости",
|
||||
"интерпретируемость",
|
||||
"компаратив",
|
||||
"конституент",
|
||||
|
|
|
@ -7,7 +7,10 @@ function HelpConceptSystem() {
|
|||
return (
|
||||
<div>
|
||||
<h1>Концептуализация</h1>
|
||||
<p>TBD</p>
|
||||
<p>Сложные предметные области требуют применения специальных подходов к их пониманию и описанию. <b>Системный подход</b> заключается в установлении границы системы, выделении отдельных подсистем и установления связей между ними. Подсистемы описываются раздельно. Далее их описания синтезируются с учетом установленных связей. Таким образом формируется описания системы в целом через описания ее частей</p>
|
||||
<p><b>Концептуализация</b> заключается в дедуктивном построении концептуальных схем (систем определений), описывающих содержательные отношения в рамках каждой подсистемы. Концептуальные схемы могут быть синтезированы для получения общей системы определений в выбранной предметной области.</p>
|
||||
<p>Концептуализация применяется в условиях поставленной задачи в рамках предметной области. Решаемая прикладная проблема позволяет определить границы концептуализации и разумно распределить ресурсы.</p>
|
||||
<p>в ходе многократной концептуализации и решения с помощью построенных концептуальных схем прикладных задач формируется навык <b>Концептуального мышления</b>. Это особый способ мышления, при котором строго контролируются используемые определения и предположения, в которых происходит описание предметного содержания.</p>
|
||||
|
||||
<Subtopics headTopic={HelpTopic.CONCEPTUAL} />
|
||||
</div>);
|
||||
|
|
|
@ -1,10 +1,38 @@
|
|||
import { HelpTopic } from '@/models/miscellaneous';
|
||||
|
||||
import LinkTopic from '../ui/LinkTopic';
|
||||
|
||||
function HelpRSLangCorrect() {
|
||||
// prettier-ignore
|
||||
return (
|
||||
<div>
|
||||
<h1>Переносимость и корректность</h1>
|
||||
<p>TBD</p>
|
||||
</div>);
|
||||
<div className='text-justify'>
|
||||
<h1>Переносимость и корректность</h1>
|
||||
<p>
|
||||
<b>Биективная переносимость выражений</b> заключается в независимости значений определений от биективной замены
|
||||
интерпретаций неопределяемых понятий. Она основана на принципиальной не сравнимости элементов базисных множеств.
|
||||
</p>
|
||||
<p>
|
||||
Проверка выражений, содержащих глобальные идентификаторы проводится в заданном глобальном контексте (известны
|
||||
типизации и биективная переносимость, информация об аргументах функций). Все неизвестные идентификаторы
|
||||
считаются некорректными.
|
||||
</p>
|
||||
<p>
|
||||
Правила проверки теоретико-множественных выражений выводятся из условия биективной переносимости предиката
|
||||
принадлежности – элемент должен соответствовать множеству, для которого проверяется принадлежность. Необходимым
|
||||
условием биективной переносимости является выполнение{' '}
|
||||
<LinkTopic text='соотношения типизации' topic={HelpTopic.RSL_TYPES} /> для всех локальных и глобальных
|
||||
идентификаторов.
|
||||
</p>
|
||||
<p>
|
||||
Логическая корректность (непротиворечивость) выражений в общем случае не может быть автоматически проверена.
|
||||
Однако наличие примера интерпретации на объектах предметной области является основанием утверждения о
|
||||
непротиворечивости накладываемых аксиом.
|
||||
</p>
|
||||
<p>
|
||||
Редактор выражений на Портале оснащен инструментами проверки выражений и вычисления их типизации. Найденные
|
||||
ошибки диагностируются и выводится соответствующее сообщение об ошибке.
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default HelpRSLangCorrect;
|
||||
|
|
|
@ -1,10 +1,42 @@
|
|||
import { HelpTopic } from '@/models/miscellaneous';
|
||||
|
||||
import LinkTopic from '../ui/LinkTopic';
|
||||
|
||||
function HelpRSLangInterpret() {
|
||||
// prettier-ignore
|
||||
return (
|
||||
<div>
|
||||
<h1>Интерпретируемость</h1>
|
||||
<p>TBD</p>
|
||||
</div>);
|
||||
<div className='text-justify'>
|
||||
<h1>Интерпретируемость</h1>
|
||||
<p>
|
||||
Практическое применение концептуальным схем основано на <b>интерпретации</b> - соотнесении предметного
|
||||
содержания и схемных терминов и определений. Для этого в соответствии с{' '}
|
||||
<LinkTopic text='конвенциями' topic={HelpTopic.CC_CONSTITUENTA} /> вводятся списки объектов предметной области,
|
||||
соответствующих неопределяемым понятиям. При этом обеспечивается корректность отношений{' '}
|
||||
<LinkTopic text='типизации' topic={HelpTopic.RSL_TYPES} /> для родовых структур.
|
||||
</p>
|
||||
<p>
|
||||
Интерпретация производных понятий может быть задана внешними методами либо автоматически вычислена с помощью
|
||||
формальных определений. При этом не всякое выражение, содержащее перебор элементов множеств, может быть
|
||||
вычислено за приемлемое время. Например, интерпретация утверждения {'"∀α∈Z α>0"'} приводит к перебору
|
||||
бесконечного множества целых чисел.
|
||||
</p>
|
||||
<p>
|
||||
<b>Интерпретируемыми</b> будем считать выражения, которые можно вычислить за полиномиальное время относительно
|
||||
мощностей интерпретаций глобальных идентификаторов, используемых в этом выражении. По аналогии с{' '}
|
||||
<LinkTopic text='биективной переносимостью' topic={HelpTopic.RSL_CORRECT} /> условия интерпретируемости могут
|
||||
быть выведены из утверждения {'выражения "Z, ℬ(α)" не интерпретируемы'}.
|
||||
</p>
|
||||
<p>
|
||||
Также вводится категория выражений, задающих множества, которым можно принадлежность за полиномиальное время, но
|
||||
нельзя вычислить полный список элемент. Например, {'"Z, D{ξ∈ℬ(X1×X1) | Pr1(ξ)=Pr2(ξ)}"'}. Конституенты, чьи
|
||||
выражения удовлетворяет этому свойству, называются <b>Неразмерными</b>. Их можно использовать в интерпретируемых
|
||||
выражениях только в конструкциях, не требующих перебора их элементах.
|
||||
</p>
|
||||
<p>
|
||||
Конституенты, чьи выражения не позволяют проверить принадлежность за полиномиальное время, называются{' '}
|
||||
<b>Невычислимыми</b>.
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default HelpRSLangInterpret;
|
||||
|
|
|
@ -1,10 +1,23 @@
|
|||
import { HelpTopic } from '@/models/miscellaneous';
|
||||
|
||||
import { IconTemplates } from '../Icons';
|
||||
import LinkTopic from '../ui/LinkTopic';
|
||||
|
||||
function HelpRSLangOperations() {
|
||||
// prettier-ignore
|
||||
return (
|
||||
<div>
|
||||
<h1>Операции над концептуальными схемами</h1>
|
||||
<p>TBD</p>
|
||||
</div>);
|
||||
<div>
|
||||
<h1>Операции над концептуальными схемами</h1>
|
||||
<p>В данном разделе поясняются различные операции над концептуальными схемами</p>
|
||||
|
||||
<h2>
|
||||
<IconTemplates size='1.25rem' className='inline-icon' /> Генерация из шаблона
|
||||
</h2>
|
||||
<p>
|
||||
Данная операция позволяет вставить конституенту из{' '}
|
||||
<LinkTopic text='шаблона выражения' topic={HelpTopic.RSL_TEMPLATES} />.
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default HelpRSLangOperations;
|
||||
|
|
|
@ -1,10 +1,45 @@
|
|||
function HelpRSLangTypes() {
|
||||
// prettier-ignore
|
||||
return (
|
||||
<div>
|
||||
<h1>Система типов</h1>
|
||||
<p>TBD</p>
|
||||
</div>);
|
||||
<div>
|
||||
<h1>Типизация</h1>
|
||||
<p>
|
||||
Родоструктурное выражение <b>ξ</b> обладает типизацией (структурой), если выполнено ξ∈H,
|
||||
<br />
|
||||
где <b>H</b> – корректное выражение <b>ступени</b>, задаваемой следующими правилами:
|
||||
<li>
|
||||
Xi, Ci – ступень, называемая <b>элемент</b>;
|
||||
</li>
|
||||
<li>
|
||||
Z – ступень, называемая <b>целое число</b>;
|
||||
</li>
|
||||
<li>
|
||||
(H1×...×Hn) – ступень, называемая <b>кортеж арности n</b>;
|
||||
</li>
|
||||
<li>
|
||||
ℬ(H) – ступень, называемая <b>множеством</b>.
|
||||
</li>
|
||||
</p>
|
||||
<p>Пустое множество ∅ имеет типизацию ℬ(R0) – множество с произвольной структурой элемента</p>
|
||||
<p>
|
||||
Для обобщения понятия типизация на логические и параметризованные выражения вводится ряд дополнительных
|
||||
обозначений
|
||||
</p>
|
||||
<p>
|
||||
Логические выражения (аксиомы, теоремы), принимающие значения ИСТИНА или ЛОЖЬ относятся к типизации <b>Logic</b>
|
||||
</p>
|
||||
<p>
|
||||
Параметризованные выражения (терм-функции, предикат-функции) относятся к типизации <br />
|
||||
Hr 🠔 [H1, H2, ... Hi],
|
||||
<br />
|
||||
где Hr – типизация результата, H1, ... Hi – типизации аргументов
|
||||
</p>
|
||||
<p></p>
|
||||
<p>
|
||||
Шаблонные параметризованные выражения могут содержать обозначения R1, ... Ri, соответствующие произвольным
|
||||
ступеням, определяемым исходя из типизации аргументов по месту использования выражения.
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default HelpRSLangTypes;
|
||||
|
|
|
@ -62,8 +62,8 @@ export enum HelpTopic {
|
|||
RSL_TYPES = 'rslang-types',
|
||||
RSL_CORRECT = 'rslang-correctness',
|
||||
RSL_INTERPRET = 'rslang-interpretation',
|
||||
RSL_TEMPLATES = 'rslang-templates',
|
||||
RSL_OPERATIONS = 'rslang-operations',
|
||||
RSL_TEMPLATES = 'rslang-templates',
|
||||
|
||||
TERM_CONTROL = 'terminology-control',
|
||||
VERSIONS = 'versions',
|
||||
|
@ -96,8 +96,8 @@ export const topicParent: Map<HelpTopic, HelpTopic> = new Map([
|
|||
[HelpTopic.RSL_TYPES, HelpTopic.RSLANG],
|
||||
[HelpTopic.RSL_CORRECT, HelpTopic.RSLANG],
|
||||
[HelpTopic.RSL_INTERPRET, HelpTopic.RSLANG],
|
||||
[HelpTopic.RSL_TEMPLATES, HelpTopic.RSLANG],
|
||||
[HelpTopic.RSL_OPERATIONS, HelpTopic.RSLANG],
|
||||
[HelpTopic.RSL_TEMPLATES, HelpTopic.RSLANG],
|
||||
|
||||
[HelpTopic.TERM_CONTROL, HelpTopic.TERM_CONTROL],
|
||||
[HelpTopic.VERSIONS, HelpTopic.VERSIONS],
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
'use client';
|
||||
|
||||
import { useCallback, useState } from 'react';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { urls } from '@/app/urls';
|
||||
import { useConceptNavigation } from '@/context/NavigationContext';
|
||||
import { useConceptOptions } from '@/context/OptionsContext';
|
||||
import useQueryStrings from '@/hooks/useQueryStrings';
|
||||
import { HelpTopic, topicParent } from '@/models/miscellaneous';
|
||||
import { HelpTopic } from '@/models/miscellaneous';
|
||||
|
||||
import TopicsList from './TopicsList';
|
||||
import ViewTopic from './ViewTopic';
|
||||
|
@ -15,45 +15,8 @@ function ManualsPage() {
|
|||
const router = useConceptNavigation();
|
||||
const query = useQueryStrings();
|
||||
const activeTopic = (query.get('topic') || HelpTopic.MAIN) as HelpTopic;
|
||||
const [topicFolded, setFolded] = useState<Map<HelpTopic, boolean>>(
|
||||
new Map(
|
||||
Object.values(HelpTopic).map(value => {
|
||||
const topic = value as HelpTopic;
|
||||
return [
|
||||
topic,
|
||||
topicParent.get(activeTopic) !== topic && topicParent.get(topicParent.get(activeTopic)!) !== topic
|
||||
];
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
const { mainHeight } = useConceptOptions();
|
||||
const onFoldTopic = useCallback(
|
||||
(target: HelpTopic, showChildren: boolean) => {
|
||||
if (topicFolded.get(target) === !showChildren) {
|
||||
return;
|
||||
}
|
||||
setFolded(
|
||||
new Map(
|
||||
Object.values(HelpTopic).map(value => {
|
||||
const topic = value as HelpTopic;
|
||||
if (topic === target) {
|
||||
return [topic, !showChildren];
|
||||
}
|
||||
if (
|
||||
!showChildren &&
|
||||
(topicParent.get(topic) === target || topicParent.get(topicParent.get(topic)!) === target)
|
||||
) {
|
||||
return [topic, true];
|
||||
}
|
||||
const oldValue = topicFolded.get(topic)!;
|
||||
return [topic, oldValue];
|
||||
})
|
||||
)
|
||||
);
|
||||
},
|
||||
[topicFolded]
|
||||
);
|
||||
|
||||
const onSelectTopic = useCallback(
|
||||
(newTopic: HelpTopic) => {
|
||||
|
@ -64,12 +27,7 @@ function ManualsPage() {
|
|||
|
||||
return (
|
||||
<div className='flex w-full gap-2' style={{ minHeight: mainHeight }}>
|
||||
<TopicsList
|
||||
activeTopic={activeTopic}
|
||||
onChangeTopic={topic => onSelectTopic(topic)}
|
||||
topicFolded={topicFolded}
|
||||
onFoldTopic={onFoldTopic}
|
||||
/>
|
||||
<TopicsList activeTopic={activeTopic} onChangeTopic={topic => onSelectTopic(topic)} />
|
||||
<ViewTopic topic={activeTopic} />
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -15,12 +15,10 @@ import TopicsTree from './TopicsTree';
|
|||
|
||||
interface TopicsDropdownProps {
|
||||
activeTopic: HelpTopic;
|
||||
topicFolded: Map<HelpTopic, boolean>;
|
||||
onChangeTopic: (newTopic: HelpTopic) => void;
|
||||
onFoldTopic: (target: HelpTopic, showChildren: boolean) => void;
|
||||
}
|
||||
|
||||
function TopicsDropdown({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: TopicsDropdownProps) {
|
||||
function TopicsDropdown({ activeTopic, onChangeTopic }: TopicsDropdownProps) {
|
||||
const menu = useDropdown();
|
||||
const { noNavigation, calculateHeight } = useConceptOptions();
|
||||
|
||||
|
@ -67,12 +65,7 @@ function TopicsDropdown({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }
|
|||
animate={menu.isOpen ? 'open' : 'closed'}
|
||||
variants={animateSlideLeft}
|
||||
>
|
||||
<TopicsTree
|
||||
activeTopic={activeTopic}
|
||||
onChangeTopic={selectTheme}
|
||||
topicFolded={topicFolded}
|
||||
onFoldTopic={onFoldTopic}
|
||||
/>
|
||||
<TopicsTree activeTopic={activeTopic} onChangeTopic={selectTheme} />
|
||||
</motion.div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -8,32 +8,16 @@ import TopicsStatic from './TopicsStatic';
|
|||
|
||||
interface TopicsListProps {
|
||||
activeTopic: HelpTopic;
|
||||
topicFolded: Map<HelpTopic, boolean>;
|
||||
onChangeTopic: (newTopic: HelpTopic) => void;
|
||||
onFoldTopic: (target: HelpTopic, showChildren: boolean) => void;
|
||||
}
|
||||
|
||||
function TopicsList({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: TopicsListProps) {
|
||||
function TopicsList({ activeTopic, onChangeTopic }: TopicsListProps) {
|
||||
const size = useWindowSize();
|
||||
|
||||
if (!size.isSmall) {
|
||||
return (
|
||||
<TopicsStatic
|
||||
activeTopic={activeTopic}
|
||||
onChangeTopic={onChangeTopic}
|
||||
topicFolded={topicFolded}
|
||||
onFoldTopic={onFoldTopic}
|
||||
/>
|
||||
);
|
||||
return <TopicsStatic activeTopic={activeTopic} onChangeTopic={onChangeTopic} />;
|
||||
} else {
|
||||
return (
|
||||
<TopicsDropdown
|
||||
activeTopic={activeTopic}
|
||||
onChangeTopic={onChangeTopic}
|
||||
topicFolded={topicFolded}
|
||||
onFoldTopic={onFoldTopic}
|
||||
/>
|
||||
);
|
||||
return <TopicsDropdown activeTopic={activeTopic} onChangeTopic={onChangeTopic} />;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,12 +7,10 @@ import TopicsTree from './TopicsTree';
|
|||
|
||||
interface TopicsStaticProps {
|
||||
activeTopic: HelpTopic;
|
||||
topicFolded: Map<HelpTopic, boolean>;
|
||||
onChangeTopic: (newTopic: HelpTopic) => void;
|
||||
onFoldTopic: (target: HelpTopic, showChildren: boolean) => void;
|
||||
}
|
||||
|
||||
function TopicsStatic({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: TopicsStaticProps) {
|
||||
function TopicsStatic({ activeTopic, onChangeTopic }: TopicsStaticProps) {
|
||||
const { calculateHeight } = useConceptOptions();
|
||||
return (
|
||||
<div
|
||||
|
@ -27,12 +25,7 @@ function TopicsStatic({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }:
|
|||
)}
|
||||
style={{ maxHeight: calculateHeight('2.25rem + 2px') }}
|
||||
>
|
||||
<TopicsTree
|
||||
activeTopic={activeTopic}
|
||||
onChangeTopic={onChangeTopic}
|
||||
topicFolded={topicFolded}
|
||||
onFoldTopic={onFoldTopic}
|
||||
/>
|
||||
<TopicsTree activeTopic={activeTopic} onChangeTopic={onChangeTopic} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
import clsx from 'clsx';
|
||||
import { AnimatePresence, motion } from 'framer-motion';
|
||||
import { useCallback } from 'react';
|
||||
import { useCallback, useLayoutEffect, useState } from 'react';
|
||||
|
||||
import { IconDropArrow, IconPageRight } from '@/components/Icons';
|
||||
import { CProps } from '@/components/props';
|
||||
|
@ -15,12 +15,60 @@ import { describeHelpTopic, labelHelpTopic } from '@/utils/labels';
|
|||
|
||||
interface TopicsTreeProps {
|
||||
activeTopic: HelpTopic;
|
||||
topicFolded: Map<HelpTopic, boolean>;
|
||||
onChangeTopic: (newTopic: HelpTopic) => void;
|
||||
onFoldTopic: (target: HelpTopic, showChildren: boolean) => void;
|
||||
}
|
||||
|
||||
function TopicsTree({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: TopicsTreeProps) {
|
||||
function TopicsTree({ activeTopic, onChangeTopic }: TopicsTreeProps) {
|
||||
const [topicFolded, setFolded] = useState<Map<HelpTopic, boolean>>(
|
||||
new Map(
|
||||
Object.values(HelpTopic).map(value => {
|
||||
const topic = value as HelpTopic;
|
||||
return [topic, true];
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
setFolded(
|
||||
new Map(
|
||||
Object.values(HelpTopic).map(value => {
|
||||
const topic = value as HelpTopic;
|
||||
return [
|
||||
topic,
|
||||
topicParent.get(activeTopic) !== topic && topicParent.get(topicParent.get(activeTopic)!) !== topic
|
||||
];
|
||||
})
|
||||
)
|
||||
);
|
||||
}, [activeTopic]);
|
||||
|
||||
const onFoldTopic = useCallback(
|
||||
(target: HelpTopic, showChildren: boolean) => {
|
||||
if (topicFolded.get(target) === !showChildren) {
|
||||
return;
|
||||
}
|
||||
setFolded(
|
||||
new Map(
|
||||
Object.values(HelpTopic).map(value => {
|
||||
const topic = value as HelpTopic;
|
||||
if (topic === target) {
|
||||
return [topic, !showChildren];
|
||||
}
|
||||
if (
|
||||
!showChildren &&
|
||||
(topicParent.get(topic) === target || topicParent.get(topicParent.get(topic)!) === target)
|
||||
) {
|
||||
return [topic, true];
|
||||
}
|
||||
const oldValue = topicFolded.get(topic)!;
|
||||
return [topic, oldValue];
|
||||
})
|
||||
)
|
||||
);
|
||||
},
|
||||
[topicFolded]
|
||||
);
|
||||
|
||||
const handleClickFold = useCallback(
|
||||
(event: CProps.EventMouse, topic: HelpTopic, showChildren: boolean) => {
|
||||
event.preventDefault();
|
||||
|
@ -29,6 +77,7 @@ function TopicsTree({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: To
|
|||
},
|
||||
[onFoldTopic]
|
||||
);
|
||||
|
||||
return (
|
||||
<AnimatePresence initial={false}>
|
||||
{Object.values(HelpTopic).map((topic, index) => {
|
||||
|
|
|
@ -378,8 +378,8 @@ export function labelHelpTopic(topic: HelpTopic): string {
|
|||
case HelpTopic.RSL_TYPES: return 'Типизация';
|
||||
case HelpTopic.RSL_CORRECT: return 'Переносимость';
|
||||
case HelpTopic.RSL_INTERPRET: return 'Интерпретируемость';
|
||||
case HelpTopic.RSL_TEMPLATES: return 'Шаблоны выражений';
|
||||
case HelpTopic.RSL_OPERATIONS: return 'Операции';
|
||||
case HelpTopic.RSL_TEMPLATES: return 'Шаблоны выражений';
|
||||
|
||||
case HelpTopic.TERM_CONTROL: return 'Терминологизация';
|
||||
case HelpTopic.VERSIONS: return 'Версионирование';
|
||||
|
@ -415,8 +415,8 @@ export function describeHelpTopic(topic: HelpTopic): string {
|
|||
case HelpTopic.RSL_TYPES: return 'система типов в родоструктурной экспликации';
|
||||
case HelpTopic.RSL_CORRECT: return 'корректность и переносимость определений';
|
||||
case HelpTopic.RSL_INTERPRET: return 'интерпретация формальных определений';
|
||||
case HelpTopic.RSL_TEMPLATES: return 'работа с шаблонными выражениями';
|
||||
case HelpTopic.RSL_OPERATIONS: return 'операции над концептуальными схемами';
|
||||
case HelpTopic.RSL_TEMPLATES: return 'работа с шаблонными выражениями';
|
||||
|
||||
case HelpTopic.TERM_CONTROL: return 'справка по контролю терминов и текстовым отсылкам';
|
||||
case HelpTopic.VERSIONS: return 'справка по управлению версиями схем';
|
||||
|
|
Loading…
Reference in New Issue
Block a user