Пролог
Начну с того, что за много лет работы программистом я неоднократно сталкивался с задачей внедрения в проект локализации в том или ином виде, но обычно это были решения, работающие на основе подгружаемого словаря с парами ключ-значение. Такой подход вполне оправдан для небольших проектов, но имеет ряд существенных недостатков:
Проанализировав эти проблемы, я пришел к выводу о необходимости создания собственной библиотеки для локализации проектов, которая будет лишена перечисленных выше недостатков. В этой статье я расскажу о принципах ее работы с примерами кода на C#.
Состав библиотеки
В сборку входят следующие проекты:
Основные принципы
Менеджер локализаций
Библиотека построена на базе плагинов и работает следующим образом: при запуске приложения создается менеджер локализаций (LocalizationManager), которому указывается путь к каталогу, где он будет производить поиск доступных пакетов локализаций (LocalizationPackage), каждый из которых отвечает за некоторую культуру (пакет русской локализации, английской и т.п.). После этого дается команда на поиск и загрузку дескрипторов всех пакетов, весь код инициализации выглядит примерно следующим образом:
Если все прошло без ошибок, в менеджере появится список доступных локализаций в виде их кратких описаний (дескрипторов, LocalizationDescriptor). Эти дескрипторы не содержат в себе какой-либо логики, а служат только лишь описанием того или иного пакета, который можно загрузить и начать применять в программе.
Список всех локализаций можно получить из менеджера:
Например, мы захотели подключить русскую локализацию, для этого необходимо загрузить ее непосредственно в менеджер:
После загрузки с локализацией можно работать — получать из нее строки, ресурсы и т.д., а если она более не нужна, ее можно выгрузить:
Важно! Можно загружать и выгружать неограниченное число локализаций, т.к. все они создаются в собственных доменах (AppDomain).
Пакет локализации
Каждая локализация представляет из себя набор файлов в отдельном каталоге, корневым для всех является тот, который был выбран при загрузке менеджера локализаций. В примере выше, это будет каталог [ProjectDir]\Localization, а непосредственно пакеты локализаций будут размещаться в каталогах [ProjectDir]\Localization\ru, [ProjectDir]\Localization\en и т.д…
Каждый стандартный пакет, обязательно должен содержать следующие файлы:
Пример для русской локализации:
Пример исполняемого кода для русской локализации:
Ниже будет дано пояснение, что такое метод Plural.
Применение пакетов локализации
Итак, мы создали менеджер локализаций и загрузили в него пакет с переводом. Теперь его можно использовать в программе тремя способами:
В качестве аргументов могут использоваться любые объекты. Подробнее об этом методе будет рассказано ниже.
Интерпретатор строк
Сила библиотеки заключается в ее интерпретаторе строк. Что же он из себя представляет?
Если вкратце, то это набор инструкций, включаемых в локализованные строки, с помощью которых можно адаптировать перевод под ту или иную культуру.
Интерпретатор строк вызывается описанным выше методом получения строки с заданными аргументами (при обычном обращении по ключу возвращается локализованная строка в «чистом» виде) или специальным методом GetFormattedString(string format, params object[] args), который работает точно так же, но при этом в качестве первого аргумента передается произвольная строка формата.
Теперь подробнее об этих инструкциях. Всего их две:
Формат инструкции:
Результат: встраивание в строку аргумента под номером index
Обратите внимание, что символ %, будучи служебным, должен экранироваться другим таким же символом, как в этом примере.
Аргументами могут быть числа, строки в двойных кавычках (сами кавычки экранируются, как и %, двойным повтором), аргументы строки по их номеру (%index) или вызовы других функций.
Встроенные функции и интеграция
В классе LocalizationPackage встроено несколько «стандартных» функций, часть была использована в примере выше:
Обратите внимание, что для функции допустимо задание списка ее псевдонимов (для краткой записи), например Plural может вызываться как через основное имя (Plural), так и через псевдоним (P), при этом регистр в названиях функций не имеет значения.
В качестве аргумента для InjectFormatterFunction может быть передан метод (MethodInfo) или делегат (в примере выше передаются делегаты).
Дополнительные возможности
Помимо основных функций, библиотека предоставляет еще два дополнения.
Отладочный режим
В Debug-версии библиотеки включена возможность не только получения локализованных строк описанными выше способами, но и их непосредственная запись:
В этом случае будет создана новая локализованная строка с указанным ключом и значением (либо перезаписана уже имеющаяся), а сам пакет сохранен на диск. Также в режиме отладки при попытке чтения строки с отсутствующим ключом, будет возвращено пустое значение, но при этом будет создана новая запись. Это удобно на начальном этапе разработки — нам не нужно заботится о наполнении словаря — он сам будет пополняться пустыми значениями, которые мы потом заполним данными.
В релизе функции записи недоступны, что вполне логично — промышленная программа не должна уметь пополнять свой словарь локализации.
Маппинги
Это наш десерт. Назначение — быстрая локализация форм, контролов и других сложных объектов.
Данная функция используется в демонстрационном проекте LocalizationViewer.
Приведу отрывок описания главной формы:
Заключение
Библиотека в скором времени будет опробована в одном из моих проектов, так что скорее всего будут кое-какие доработки, в основном направленные на расширение базового функционала пакетов. Следите за обновлениями на SourceForge и пишите свои комментарии и мысли по дальнейшему развитию библиотеки.
Возможно, вы скажете, что я изобретаю велосипед. Пусть так, но изобретать велосипеды — это мое хобби…
К тому же, это намного интереснее и полезнее в плане самосовершенствования в программировании.
По этой же причине здесь не будет ссылок на литературу и прочие источники информации — все было написано с нуля.
Комплект вопросов сертификационного экзамена на знание основных механизмов платформы «1С: Предприятие 8» (стр. 17 )
| Из за большого объема этот материал размещен на нескольких страницах: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
4. в начале отработает процедура, определенная по подписке, затем процедура, расположенная в модуле объекта
6.49 Подписка на событие может быть определена:
1. только для одного объекта
2. для разных объектов, по только одного вида (например, для нескольких справочников или для нескольких документов)
3. для разных объектов
6.50 При определении подписки на событие для разных объектов перечень показываемых событий формируется по принципу:
1. должно совпадать количество параметров события
2. должно совпадать имя события
3. должны выполняться оба вышеприведенных требования
6.51 Процедура, используемая подпиской на событие, должна располагаться в модуле с установленными (взведенными) флажками:
3. Внешнее соединение
4. обязательно Клиент и Сервер
5. обязательно Клиент, Сервер и Внешнее соединение
6. определяется разработчиком исходя из практической задачи
6.52 Пессимистическая блокировка объекта (метод Заблокиро-вать()):
1. не позволяет программно менять данные объекта
2. позволяет программно менять данные объекта, по только если он заблокирован через ту же переменную, через которую и будет производиться изменение данных объекта
3. блокировка объекта не мешает программно менять данные объекта
6.53 Пессимистическая блокировка объекта (метод Заблокировать^)):
1. не позволяет интерактивно (в основной форме объекта) менять данные объекта
2. позволяет интерактивно (в основной форме объекта) менять данные объекта, по только если он заблокирован через какую-либо другую форму
3. блокировка объекта не мешает интерактивно (в основной форме объекта) менять данные объекта
6.54 Тип анализа «Кластерный анализ» подразумевает:
1. Поиск часто встречаемых вместе групп объектов или значений характеристик
2. Поиск цепочек событий
3. Построение иерархической структуры классифицирующих правил
4. Разделение исходного набора на группы объектов
5. Получение общестатистических показателей в виде дерева
6.55 Тип анализа «Дерево решений» подразумевает:
1. Поиск часто встречаемых вместе групп объектов или значений характеристик
2. Поиск цепочек событий
3. Построение иерархической структуры классифицирующих правил
4. Разделение исходного набора на группы объектов
5. Получение общестатистических показателей в виде дерева
6.56 Тип анализа «Поиск ассоциаций» подразумевает:
1. Поиск часто встречаемых вместе групп объектов или значений характеристик
2. Поиск цепочек событий
3. Построение иерархической структуры классифицирующих правил
4. Разделение исходного набора на группы объектов
5. Получение общестатистических показателей в виде дерева
6.57 Тип анализа «Поиск последовательностей» подразумевает:
1. Поиск часто встречаемых вместе групп объектов или значений характеристик
2. Поиск цепочек событий
3. Построение иерархической структуры классифицирующих правил
4. Разделение исходного набора на группы объектов
5. Выявления последовательно расположенных объектов
6.58 Объект МодельПрогноза создается:
1. С использованием конструктора «Новый»
2. При обращении к одноименному свойству глобального контекста
3. Из результата анализа данных
6.59 У регистра сведений установлен режим записи «Независимый». Редактирование осуществляется в диалоге, ни одна из форм регистра не определена. При попытке интерактивного добавления в него «Записи» со значениями измерений, комбинация которых уже прописана в регистре:
1. На экран выводится предупреждение, но запись все равно записывается в базу данных
2. Возникает ошибочная ситуация
3. Происходит замещение записи
4. Интерактивная запись в такой регистр невозможна
6.60 При проведении документа по какому-либо регистру в случае если у документа установлен автоматический режим управления транзакционными блокировками, а у регистра управляемый (в свойствах конфигурации используется вариант «Автоматический и управляемый»), то такое проведение приведет:
1. к возникновению ошибочной ситуации
2. вся транзакция будет выполнена в автоматическом режиме
3. вся транзакция будет выполнена в управляемом режиме
6.61 При проведении документа по какому-либо регистру в случае если у документа установлен управляемый режим управления транзакционными блокировками, а у регистра автоматический (в свойствах конфигурации используется вариант «Автоматический и управляемый»), то такое проведение приведет:
1. к возникновению ошибочной ситуации
2. вся транзакция будет выполнена в автоматическом режиме
3. вся транзакция будет выполнена в управляемом режиме
6.62 При проведении документа по какому-либо регистру в случае если у документа установлен автоматический режим управления транзакционными блокировками, а у регистра управляемый (в свойствах конфигурации используется вариант «Управляемый»), то такое проведение приведет:
1. к возникновению ошибочной ситуации
2. вся транзакция будет выполнена в автоматическом режиме
3. вся транзакция будет выполнена в управляемом режиме
6.63 Алгоритмы в модуле управляемой формы могут исполняться?
1. Только на клиентском компьютере
2. Только на сервере
3. Место исполнения определяется настройками модуля
4. Место определяется для каждой процедуры и функции модуля
5. Возможность зависит от объектов встроенного языка
6.64 Алгоритмы в модуле обычной формы могут исполняться?
1. Только на клиентском компьютере
2. Только на сервере
3. Возможность определяется настройками модуля
4. Возможность определяется для каждой процедуры и функции модуля
5. Обычный параметр существует только при открытии формы, ключевой только при закрытии формы
6.65 Существует ли в 1С:Предприятии 8 возможность настроить конкретное прикладное решение на использование региональных настроек чисел, дат и времени?
1. Да, в региональных установках информационной базы можно настроить эти параметры
2. В региональных установках информационной базы можно настроить только формат даты и времени
3. В региональных установках информационной базы можно настроить только формат даты и чисел
4. В 1С:Предприятие 8 такой возможности не существует
6.66 К чему приведет изменение кода языка в свойстве «Код языка», если уже введены тексты в свойствах «Синоним» или «Заголовок» на этом языке?
1. К «потере» введенных текстов без возможности «восстановления»
2. К «потере» введенных текстов с возможностью «восстановления» при указании прежнего значения кода языка
3. К потере данных это действие не приведет, введенные тексты будут соответствовать языку с новым кодом
6.67 Какой режим используется для выполнения задач локализации (создания интерфейса на другом языке)?
1. «Редактирование текстов интерфейса»
2. Никакой специальный режим не требуется
3. «Редактирование интерфейса»
4. Нет правильного ответа
6.68 При необходимости использования англоязычной транскрипции встроенного языка 1С:Предприятие 8 в уже существующей конфигурации можно:
1. Использовать англоязычные варианты только для конструкций встроенного языка
2. Использовать англоязычные варианты встроенных процедур/функций, операторных скобок и языковых конструкций
3. Использовать англоязычные варианты встроенных функций, операторных скобок и языковых конструкций, а также переводные имена вызываемых процедур и функций существующей конфигурации
4. Использовать англоязычные варианты встроенных процедур и функций, операторных скобок, языковых конструкций и англоязычных синонимов идентификаторов объектов и их реквизитов
6.69 Если в региональных установках информационной базы ни одно из свойств установлено не будет, тогда.
1. язык и форматы отображения чисел, даты и времени будут определяться настройками операционной системы
2. язык и форматы отображения чисел, даты и времени будут определяться настройками технологической платформы 1С
3. нет правильного ответа
6.70 Что такое локализация?
1. Адаптация программы под конкретные национальные требования
2. Перевод программы на другой язык
3. Ограничение на доступ к базам для различных категорий пользователей
6.71 Для чего применяется код локализации?
1. Для указания региональных установок информационной базы
2. В форматных строках во встроенном языке для упрощения адаптации решений к конкретным региональным установкам
3. Для идентификации программного продукта
4. Верны ответы 1 и 2
5. Верны ответы 1 и 3
6.72 На что влияют региональные установки информационной базы?
1. На формат отображения чисел и дат
2. На интерфейс 1С:Предприятие
3. На порядок сортировки строк в базе данных
4. Верно все вышеперечисленное
5. Верны варианты 1 и 3
6.73 Создание многоязыковых прикладных решений.
1. возможно только в специальной версии программы 1С:Предприятие 8
2. в 1С:Предприятие 8 невозможно, так как программный продукт уже локализован
3. возможно благодаря тому, что существует возможность создания нескольких языков в конфигурации и локализованных интерфейсов платформы
Принципы документирования и локализации, или как получить хорошую локализацию минимальными затратами
Меня зовут Денисов Александр. Я работаю в компании Naumen и отвечаю за документирование и локализацию программного продукта Naumen Contact Center (NCC).
В этой статье расскажу о тех проблемах, с которыми мы сталкивались при локализации NCC на английский и немецкий языки и о том, как мы решали эти проблемы. Конечно, на сегодняшний день мы решили далеко не все свои задачи и, скорее всего, этот процесс вообще бесконечен. В статье рассматривается видение всего процесса в целом и те принципы, которым мы стараемся придерживаться или которые начинаем пробовать применять. Материал будет полезен тем, кто только начинает проектировать ПО, планирует его локализацию или уже сталкивается с проблемами, но пока не знает как их решить.
Введение
Часто компания задумывается о локализации ПО тогда, когда продукт уже готов и для него написана документация. И так же часто бывает уже поздно что-либо сделать, чтобы в короткие сроки получить хорошую локализацию и не потратить на это огромное количество ресурсов.
Подробно написать обо всех проблемах и трудностях в одной статье невозможно, поэтому я расскажу немного об основных этапах документирования и локализации и затрону несколько, на мой взгляд, наиболее важных вопросов:
Особенности NCC и процесса разработки
Naumen Contact Center — это сложное программное обеспечение для организации крупных корпоративных или аутсорсинговых контактных центров.
В чем сложность документирования и локализации этой системы:
Жизненный цикл разработки
Давайте посмотрим на жизненный цикл разработки ПО и выделим только те этапы, которые касаются документирования и локализации:
А теперь давайте представим, что в интерфейсе была допущена одна незначительная ошибка. Она автоматом распространяется на каждый этап, на несколько версий и языков.
Дополнительные ошибки могут появляться на каждом этапе, то есть в результате мы можем получить огромное число ошибок. Незначительные ошибки интерфейса скорее всего не будут исправлены никогда, всегда есть более важные задачи. А если их править, то стоимость этих правок будет очень высокой, так как придется снова пройтись по всей цепочке, всем версиям и языкам. И чем больше версий и языков, тем дороже.
В данном контексте нельзя говорить только о качестве локализации интерфейса или о качестве переведенной документации, так как результат работ каждого этапа является фундаментом для следующего этапа. Именно поэтому очень важно сразу все делать правильно на каждом этапе. И именно поэтому стоит рассматривать разработку ПО, документирование и локализацию как этапы единого неразрывного процесса.
Организация текста в интерфейсе
Когда наши программисты взялись за локализацию системы, она была абсолютно к этому не готова. Текст интерфейса хранился в коде, а желание руководства было: «все сделать быстро». Программисты написали скрипт, который выдернул весь текст из кода и закинул в файлы ресурсов, а на следующий день отдали файлы ресурсов первому попавшемуся сотруднику со знанием английского языка, который все быстренько перевел в блокноте. Что из этого получилось, можно увидеть ниже.
На изображении приведена простая кнопка, она открывает какую-то форму с параметрами, где эти параметры можно изменить. Таких кнопок в системе десятки. На русском языке для такой кнопки обнаружилось 3 варианта, локализация на английский содержала уже 7 вариантов.
В этой ситуации сразу возникает большое желание навести порядок в строках интерфейса. Для этого предлагаю применять следующие правила:
Идентификатор строки может состоять из идентификатора самой строки и группы, к которой строка относится. Это нужно, чтобы переводчик мог использовать идентификатор для выбора правила локализации. Если мы имеем такие правильные идентификаторы, то процесс проверки и исправления тех же ошибок капитализации можно легко автоматизировать.
К сожалению, применить подобные правила ко всем существующим 30 000 строкам сразу, очень трудоемко. Здесь мы находимся на начальном этапе и постепенно приводим в порядок наиболее часто повторяющиеся строки и разрабатываем правила для новых строк. Но согласитесь, было бы супер, если бы все правила были прописаны и выполнялись сразу!
Процесс документирования и локализации
Давайте взглянем на процесс документирования и локализации с привязкой ко времени. Если начать документирование и локализацию раньше, чем закончилась разработка фичи, то придется все переделать (возможно, несколько раз).
То же самое с переводом документации.
А если отдать пользователям документацию раньше, чем закончились все правки, можно рассчитывать на кучу замечаний. Скорее всего часть из этих замечаний и так будет поправлена на последних этапах разработки, но придется потратить лишнее время, чтобы их обработать.
Если же процессы не согласованы, и мы вовремя не отслеживаем все изменения, то «ничего-ничему-нигде» не будет соответствовать.
Документация не будет соответствовать интерфейсу. Скриншоты не будут соответствовать интерфейсу и тексту документации.
То же самое с локализацией. Текст интерфейса и документации на исходном языке не будет соответствовать тексту интерфейса и документации на других языках.
Мы решили, что на текущий момент можем себе позволить начинать каждый новый этап только после того, как закончили предыдущий.
Да, документация и локализация у нас выходят с опозданием уже после релиза. И если говорить о локализации, мы уже обеспечили себе возможность непрерывной локализации, но мы этой возможностью не пользуемся и делаем всю локализацию одним этапом в конце релиза. Пара дней в рамках полугодового релиза — это совсем небольшой этап.
Пока наш продукт не массовый, у нас нет острой необходимости чтобы документация и локализация появлялись в один день. У нас длинные релизы, крупные корпоративные клиенты, которых не очень много по сравнению с небольшими и более массовыми продуктами, и устанавливать новую версию продукта или обновляться на нее они начинают далеко не сразу. Затраты на постоянное переделывание при этом заметно сокращаются.
Проблемы терминологии
На этапе документирования и локализации мы постоянно сталкивались с проблемами терминологии:
Сейчас мы проверяем термины и текст интерфейса параллельно тестированию постановки. То есть пока тестировщики пишут свои замечания, мы пишем свои.
Что мы делаем во время тестирования постановки:
Документирование
Принципы, которым мы придерживаемся при документировании:
Переиспользование текста
В большинстве систем работы с единым источником можно использовать переменные. Поэтому мы разработали сценарии, которые автоматически преобразуют файлы ресурсов интерфейса в файлы с переменными. В процессе разработки документации мы не набираем тексты элементов интерфейса, а вставляем в текст переменные. Таким образом в русскую версию автоматически подтягиваются русские строки, в английскую версию английские, в немецкую немецкие.
Какие это дает преимущества:
Как вы можете заметить, текст кнопки Сохранить в сниппет также подставляется из переменной.
Это дает следующие преимущества:
Скриншоты и другие изображения
В своей документации мы часто используем скриншоты и другие изображения, которые могут содержать текст.
Чтобы делать скриншоты на разных языках своими силами, под каждым скриншотом мы пишем текст, который на нем используется. Этот текст тегируется и не попадает в готовую документацию. Перед тем, как делать перевод документации, мы переводим тексты для скриншотов. А во время перевода документации делаем скриншоты силами технических писателей без знания языка.
С использованием скриншотов бывают и другие трудности. Например, как отследить все изменения, если в интерфейсе меняется одна строка текста, которая используется в 50 местах?
Как потом найти все скриншоты этих 50 мест, чтобы заменить их в документации?
Для решения этой проблемы мы используем инструмент QVisual, который разработали в компании Tinkoff. Процесс работы с ним выглядит так:
Таким образом мы сокращаем затраты на многочисленные проверки скриншотов вручную. Тем более, что вручную не всегда удается выявить все ошибки, что-то можно просто проглядеть.
Правда, не все окна можно открыть при помощи ссылок и это работает только для Web-интерфейса, но часть проблем с обновлением скриншотов это все равно снимает.
Локализация интерфейса
Перед локализацией интерфейса, если это еще не сделано, нужно перевести все термины глоссария.
Когда глоссарий переведен, можно начинать локализацию. В этом процессе мы придерживаемся следующих принципов:
Может быть несколько способов предоставления контекста:
Перевод документации
Принципы, которым мы стараемся придерживаться при переводе документации:
Организационная структура и обратная связь
Скажу несколько слов об организационной структуре компании. У всех она разная, но представим такой случай, когда за каждый этап отвечает свой отдел.
Обратная связь от одного отдела к предыдущему в таком варианте будет затруднена, взаимодействие между сотрудниками разных отделов налаживается сложно. Решение всех вопросов через руководителя тоже «узкое горлышко». У каждого руководителя свое видение, цели и приоритеты. Много времени может тратиться на дополнительные согласования.
На мой взгляд за все тексты на всех языках должен отвечать один отдел.
При таком распределении ответственности, каждая версия продукта — это отдельный проект из нескольких этапов, и за качество выполнения этого проекта нужно отвечать в целом. Так проще наладить обратную связь, оперативно разобраться в любой проблеме, сделать ретроспективу и найти первопричину проблемы.
Благодаря тому, что наши технические писатели сами проверяют переводы с помощью QA, мы увидели десятки, а то и сотни ошибок неконсистентности.
Оказалось, что переводчик видит одинаковые по смыслу, но по разному написанные предложения и делает для них один и тот же перевод. Мы инициировали задачу и технический писатель заменил все разные варианты одного и того же по смыслу текста на один сниппет. Теперь таких повторяющихся ошибок больше не будет. Специалистам не придется тратить время на их анализ, а перевод на новые языки в будущем будет проще.
В общем случае, если у переводчика во время перевода возникают вопросы, то для нас это уже «звоночек» о том, что что-то не так на ранних этапах и надо делать задачу на исправление.
Какое качество документации нужно
Перед тем как пытаться сделать идеальную документацию на всех языках, стоит задуматься, а какое качество нужно? Ответить на этот вопрос помогут дополнительные вопросы:
Вычитка документации и обратная связь пользователей
Если принято решение вычитывать документацию:
Новые сотрудники также очень ценные пользователи документации. У новичков свежий взгляд, а еще цель разобраться с системой во время испытательного срока.
Переведенную документацию могут вычитывать и партнеры. Можно заключать с ними такие соглашения. Партнер присылает вам все замечания, а заодно сам разбирается в системе.
Что заставляет пользователей отправлять обратную связь:
То есть, помогают улучшить документацию для себя и для других пользователей, получают от этого удовлетворение. В следующий раз, когда им повторно потребуется информация (в которой была ошибка или которой недоставало), они ее найдут в документации и им не придется самим писать ответ клиенту. Они просто отправят ссылку клиенту, который обратился в техподдержку. Таким образом они сокращают себе и своим коллегам затраты.
Отмечу, что замечания мы исправляем только в текущей версии документации, то есть той, что еще находится в разработке. Считаем, что лучше уделять как можно больше внимания новым версиям и делать в ней как можно меньше ошибок, чем тратить кучу времени на поддержку старых версий.
Выводы
Каждая компания находится на своем этапе развития, и часто не нужно вкладывать огромное число человеко-ресурсов, чтобы достичь приемлемого на сегодняшний день результата.
Сначала разберитесь, что именно необходимо на текущий момент и сделайте только это, а затраты увеличивайте по мере возрастания потребностей.
Это была достаточно общая статья о процессах документирования и локализации в целом. В будущем попробую написать о более узких темах.
Спасибо, если дочитали до конца! Желаю вам успехов в работе и отладке своих процессов документирования и локализации!
Буду рад ответить на вопросы, обсудить ваши мысли и идеи!