Можно ли системных файлах modx поменять язык версии

Обновлено: 06.07.2024

MODX поставляется с гибким набором системных настроек. Они находятся в Система -> Системные настройки и могут быть легко отредактированы и изменены. Все системные настройки доступны в ваших шаблонах с помощью обозначения [[++placeholder]] . Посмотрите Теги шаблона для дополнительной информации.

Переопределение настроек (Наследование)¶

В то время как в этом документе в основном говорится о Системных настройках, MODX поставляется с очень мощной системой наследования, которая позволяет переопределять настройки в контексте, пользовательской группе или пользовательской настройке.

По сути, когда параметр запрашивается в сеансе определенного пользователя, параметры проверяются в следующем порядке:

  1. Настройка пользователя
  2. Настройка группы пользователей
  3. Настройка контекста (обратите внимание, что в менеджере контекст обычно называется mgr)
  4. Настройка системы

Создание новых системных настроек (через графический интерфейс)¶

Чтобы создать новый параметр системы, нажмите ссылку «Создать новые параметры» в разделе «Система» -> «Параметры системы».


Параметры¶

  • Ключ: в конечном итоге это уникальное имя вашего [[++placeholder]]
  • Имя: эта метка отображается в столбце «Имя» при просмотре всех настроек системы. Это значение может быть локализовано (см. Ниже).
  • Тип поля: в настоящее время поддерживаются 3 типа ввода: TextField, TextArea, Yes/No
  • Пространство имен: как с Пользовательские страницы менеджера, пространство имен определяет папку внутри core/components/.
  • Area Lexicon Entry: это значение влияет на группировку системных настроек; создайте несколько системных настроек, которые совместно используют «Область ввода лексики», и они будут сгруппированы вместе.
  • Значение: значение по умолчанию.
  • Описание: это значение может быть локализовано (см. Ниже).

Локализация¶

Значения, используемые для описания настроек системы, могут быть необязательно локализованы (т.е. переведены) путем ссылки на конкретный файл локализации. Ключи лексики следуют определенному формату:

  • Имя: setting_ + Key
  • Описание: setting_ + Key + _desc

Например, если мы посмотрим на Quip's [[++quip.emailsFrom]] настройки, мы видим, что он использует пространство имен quip. Ожидаемая структура папок состоит в том, чтобы искать файлы локализации в папке пространства имен, затем в папке «лексикона», затем в папках, разделенных по языковым кодам, и затем в default.inc.php файле, для примера core/components/quip/lexicon/en/default.inc.php

В нашем примере Quip мы видим имя setting_quip.emailsFrom и описание setting_quip.emailsFrom_desc. Эти два значения соответствуют ключам в $_lang массив внутри default.inc.php:

Мы рекомендуем вам щелкнуть правой кнопкой мыши существующий системный параметр и выбрать «Обновить системный параметр», чтобы получить представление о том, как это работает.

Получение настроек системы (программно)¶

Чтобы получить значение настройки из сниппета, плагина или другого PHP-кода, вы используете getOption функции и передачи ей уникальный ключ для опции, например:

В WordPress сопоставимая функция API get_option().

Эта функция извлекает значение из кэша настроек.

Сохранение настроек системы (программно)¶

Здесь все становится немного сложнее: когда мы получаем значение, используя getOption, мы получаем объект из кэша настроек. Это имеет явное преимущество в скорости, но это означает, что у нас по существу есть копия значения настройки, доступная только для чтения.

Пока есть метод setOption; это только обновляет кэш настроек в памяти.

Это по архитектурным причинам: системные настройки должны быть определены как configurations, NOT runtime dynamic values. Они обычно устанавливаются во время установки, а затем не часто обновляются. Однако могут быть законные времена, когда вам нужно обновить системные настройки программно, например, возможно, вы написали Пользовательская страница менеджера которая предлагает настраиваемую форму для ваших пользователей для своих системных настроек.

Если мы хотим обновить настройки системы, мы используем мощный xPDO getObject функция. Итак, давайте вернемся к нашему поиску простой настройки сайта и сравним ее рядом с более подробным (и более гибким) аналогом xPDO:

Разница в том, что использование getObject извлекает объект из базы данных без кэширования, и мы можем делать с объектом гораздо больше вещей, включая сохранение этого объекта. Итак, вот как мы должны получить и сохранить настройки системы:

Однако обратите внимание, что это не очищает кэш настроек, поэтому любые последующие вызовы getOption по-прежнему будут возвращать более старую кешированную версию настройки.

В WordPress сопоставимая функция API update_option().

Получение метаданных настроек¶

Как только мы начнем извлекать Objects, которые представляют системные настройки, а не только их значение, мы можем увидеть все метаданные для любого заданного параметра (то есть все атрибуты). Посмотрите на этот код в качестве примера:

Как только вы поймете, как манипулировать объектами с помощью MODX и xPDO, вы сможете извлекать и изменять практически все внутри MODX, потому что практически все является объектом.

Получение списка связанных настроек¶

Если вы заметили в графическом интерфейсе выше, MODX позволяет несколько логично сгруппировать настройки системы. Самые полезные группировки - это area и префикс key. Использование xPDO getCollection Метод, мы можем легко предоставить некоторые критерии поиска, чтобы получить настройки, которые мы хотим.

Вот как мы можем получить все настройки из области «Почта»:

Это естественным образом приводит нас к одной из других особенностей xPDO: xPDOQuery объект. Мы можем использовать его для передачи более сложных критериев нашему вызову getCollection. Вот как мы можем получить все настройки, которые используют префикс «quip»:

Возможно, вы не ожидали введения в xPDO, пока вы просто пытались получить и установить системные настройки, но он там.

Создание системной настройки программно¶

Возможно, вы захотите создать Системные настройки программно, чтобы предоставить вашим пользователям более чистый UX / UI. В своем коде вы можете поместить что-то вроде следующего:

Обратите внимание, что вы должны создать записи лексики, которые соответствуют вашему имени ключа (см. Раздел «Локализация» выше):

  • Имя: setting_ + Key
  • Описание: setting_ + Key + _desc

Таким образом, в этом примере вам необходимо добавить следующие записи лексикона в загруженный вами лексикон:

MODX заполняет значения для имени и описания на основе этих записей лексики.

Может оказаться полезным ссылаться на ваши локализованные языковые строки внутри ваших шаблонов или CMP. Это можно сделать с помощью тега лексикона, но вы должны указать тему «setting», например,

Типы системных настроек¶

Атрибут xtype определяет, какой тип поля GUI будет использовать при рендеринге интерфейса для этого поля:

  • combo-boolean : сохраненные значения 1 и 0. Будет отображать «Да» и «Нет»
  • textfield : стандартное текстовое поле
  • textarea : стандартная текстовая область
  • text-password : стандартное поле пароля (ввод маскируется)
  • numberfield : используется для ввода цифр
  • modx-combo-language : позволяет пользователю выбрать язык
  • modx-combo-source :
  • modx-combo-template : позволяет пользователю выбрать шаблон
  • modx-combo-content-type : позволяет пользователю выбрать тип контента
  • modx-combo-charset : позволяет пользователю выбрать набор символов
  • modx-combo-rte : как текстовая область, но с элементами управления форматированием
  • modx-combo-context : позволяет пользователю выбрать контекст
  • modx-combo-manager-theme : позволяет пользователю выбрать тему оформления интерфейса менеджера MODX

Список настроек¶

Описание каждого параметра следующее:

Разработано, построено и написано со всей любовью в мире от сообщества MODX.

Подключить мультиязычность на MODX Revolution не сложно, но нужен четкий план действий. Для лучшего понимания рассмотрим процедуру подключения на примере.

Допустим мы хотим подключить два дополнительных языка для сайте, то есть мы хотим получить следующий результат:

Навигация по статье:

Языков можно подключить неограниченно, для примера остановимся на 1-ом дополнительном языке. Также нам нужен удобный интерфейс создания ресурсов в панели с учетом мультиязычности: связка страниц разных языков.

Для реализации данной задачи нам понадобится:

  • MODX Revolution (2.0 и старше), само собой
  • Доступ до .htaccess (или ht.access)
  • Плагин Babel (2.2 и старше)

Настройка .htaccess

В корне сайта должен быть файл .htaccess (иногда файлы скрыты от просмотра, см. в настройках вашего FTP-клиента) или ht.access (его переименовываем в .htaccess).


В файле .htaccess проверяем правильность 'RewriteBase' и включен ли modRewrite ('RewriteEngine On').

ВАЖНО! .htaccess - файл дополнительной конфигурации веб-сервера Apache, если у вас другой сервер и без Apache конфигураций, то директивы в .htaccess у вас работать не будут. Но практически все современные сервера используют связку Apache + NGINX, т. е. работать .htaccess в скорее всего будет. Работает ли modRewrite можно проверить путем добавления обычных редиректов в .htaccess или путем настройки SEF-ссылок (если они работают, то .htaccess активен).

Если сайт установлен в корневой каталог используемого домена, то в .htaccess пишем:

RewriteEngine On
RewriteBase /

Если сайт установлен не в корневой каталог, то пишем:

RewriteEngine On
RewriteBase /каталог/

Далее добавляем в наш .htaccess после наших редиректов, в самом конце, следующее (см. изображение ниже):

RewriteCond % !-d
RewriteCond % !-f
RewriteRule ^(ru|en)/favicon.ico$ favicon.ico [L,QSA]

RewriteCond % !-d
RewriteCond % !-f
RewriteRule ^(ru|en)/assets(.*)$ assets$2 [L,QSA]


Настройка контекстов

В админке MODX нам нужно создать контекст для нового языка. Для этого перейдите по: "Система" -> "Контексты" и нажимаем "Создать новый".


Далее в качестве "Ключа контекста" вводим, например, для английского - "eng".

ВАЖНО! Эти ключи в дальнейшем будут использованные в плагине переключения контекстов.


Далее правый клик мыши по новому контексту и выбираем "Редактировать". Переходим по табу "Настройки контекста" и нажимаем "Создать новый".


Для каждого языка нам нужно добавить следующие настройки.

  • Ключ: base_url (!именно base_url, MODX предлагает не тот ключ)
  • Имя: Base URL
  • Запись словаря для раздела: language
  • Значение: /
  • Ключ: base_url
  • Имя: Base URL
  • Запись словаря для раздела: language
  • Значение: /en/

Culture key ([ [++cultureKey]]).
Не путать с "Ключом контекста" ([ [*context_key]])

  • Ключ: cultureKey
  • Имя: Culture key
  • Запись словаря для раздела: language
  • Значение: ru

Culture key

  • Ключ: cultureKey
  • Имя: Culture key
  • Запись словаря для раздела: language
  • Значение: en
  • Ключ: site_start
  • Имя: Site start
  • Запись словаря для раздела: language
  • Значение: 1
  • Ключ: site_start
  • Имя: Site start
  • Запись словаря для раздела: language
  • Значение: id страницы для Главной в английской версии.
    Все id создаем через Babel, об этом ниже.
  • Ключ: site_name
  • Имя: Site name
  • Запись словаря для раздела: language
  • Значение: Название сайта
  • Ключ: site_name
  • Имя: Site name
  • Запись словаря для раздела: language
  • Значение: Название сайта на английском языке
  • Ключ: error_page
  • Имя: 404 page
  • Запись словаря для раздела: language
  • Значение: id страницы для 404 ошибки
  • Ключ: error_page
  • Имя: 404 page
  • Запись словаря для раздела: language
  • Значение: id страницы для 404 ошибки в английской версии.
    Все id создаем через Babel, об этом ниже.

Locale, используется для форматирования даты в текстовом виде

  • Ключ: locale
  • Имя: Setting locale
  • Запись словаря для раздела: language
  • Значение: ru_RU.UTF8
  • Ключ: locale
  • Имя: Setting locale
  • Запись словаря для раздела: language
  • Значение: en_US.UTF8

Для контекста "web" все настройки уже есть в "Системных настройках", но при этом для каждого контекста их можно переопределить.

Создание плагина "switchContext"

Для того чтобы наша мультиязычность работала нам нужен плагин для связки языка с контекстом.

В панели управления переходим по табу "Элементы" и нажимаем на иконку "Новый плагин".

В поле имя пишем switchContext и помещаем следующий код:

<?php
/* Запускаем плагин только на фронтенде и с включенными sef-url */
if ($modx->context->key == 'mgr' || !$modx->getOption('friendly_urls') || $modx->event->name != 'OnHandleRequest') return;
>

/* Определяем текущий язык в cultureKey */
switch ($_REQUEST['cultureKey']) /* Переключаем контекст */
case 'en':
$modx->switchContext('eng');
break;

/* Добавляем дополнительные языки в плагин, если нужно
case 'de':
$modx->switchContext('dtsch');
break;
*/

/* Устанавливаем контекст по умолчанию */
default:
$modx->switchContext('web');
break;
>

/* Очищаем GET-параметр чтобы не допустить появлении ссылки вида cultureKey=xy при генерации URL других компонентов */
unset($_GET['cultureKey']);
?>

Далее переходим по вкладке "Системные события", включаем OnHandleRequest и сохраняем.


Установка Babel

Устанавливаем пакет Babel, в панели управления переходим по "Система" -> "Управление пакетами" и нажимаем "Загрузить дополнения" и находим там Babel, загружаем и устанавливаем пакет.

Проходим все необходимые условия установки пока не увидите "Настройки установки". Здесь уже должны быть контексты которые мы создали (по примеру это: web, eng; если поле пустое, то можно вписать ключи контекстов руками), другие настройки оставляем без изменений.


Создание мультиязычного контента

Как добавлять страницы сайта на других языках?

В панели управления сайта, во вкладке "Ресурсы", мы видим наши контексты (выводятся имена контекстов, которые вы заполнили при создании/редактировании контекста). Ресурсы каждого из контекстов отвечают за ресурсы языковых версий сайта.


Но как нам знать какой ресурс за какую страницу отвечает, т.е. как же связать страницы разных языков между собой?

Здесь нам и поможет Babel. При создании или редактировании ресурса в правом верхнем углу появятся кнопки, отвечающие за языковые версии ("Создать перевод", "Связать перевод"). Через эти кнопки создаются и связываются ресурсы в другом контексте (языковой версии).

Полученные id ресурсов и используем в настройках контекстов для страниц Главная и 404 (см. таблицу с настройками выше).


Переключатель языков на сайте.

Наконец нам нужны кнопки (ссылки) переключения языковых версий на сайте (не забудьте опубликовать нужные ресурсы). Для этого в любом месте где нужно вывести переключатель (шаблон, чанк) пишем следующее:

Очень редко бывает, что BabelLinks не выводит связанные страницы, хотя все верно настроено и опубликовано. Для этого проверьте создан ли TV связи ссылок - babelLanguageLinks, если TV нет, то создайте его с именем babelLanguageLinks (и названием Babel Translation Links) и укажите имя TV для Babel в "Системных настройках", а так же проверьте указаны ли ключи контекстов в тех же настройках. Или попробуйте переустановить Babel.

Вывод статического содержимого в зависимости от языка

Существует несколько методов вывода разного статического содержания (заголовки, адреса и копирайт в футере, кнопки и пр.) в зависимости от языка:

1. Для текстовых строк самый правильный вариант - это создавать переводы в лексиконах для каждого языка. И эти лексиконы вызывать в шаблоне. Лексиконы же в зависимости от нужной языковой версии будут выводиться свои.

2. Для, к примеру, чанков можно создать для каждого копии с нужным языком, например, [ [$footer_ru]], [ [$footer_en]], а в шаблонах вызывать в виде [ [$footer_[ [++cultureKey]]]] (при генерации страницы MODX подставит нужное значение [ [++cultureKey]] и выведет содержание чанка для активного языка).

3. Ну и можно проверять контекст и выводить нужное содержимое (как лексиконы, так и прочее) через фильтры ввода-вывода.

Условие вывода лучше прописывать именно через [ [*context_key]], а, к примеру, не через [ [++cultureKey]] т. к. Ключ контекста заполняется один раз и изменить его нельзя, а настройки же контекста можно менять. Например, условие будет таким:

[ [*context_key:is=`web` :then=`г. Москва, ул. Льва Толстого, д. 1` :else=`Moscow, Leo Tolstoy st. 1`]]

С другой стороны, с использованием [ [++cultureKey]], условие будет грамотнее читаться:

[ [++cultureKey:is=`ru` :then=`г. Москва, ул. Льва Толстого, д. 1` :else=`Moscow, Leo Tolstoy st. 1`]]

В общем, выбор, как всегда, за вами :)

Автоматически определяем id переведенных страниц

Часто в статических элементах сайта прописаны ссылки на ресурсы обычной версии, и, соответственно, нужно прописать и id другой языковой версии сайта, но как их узнать, не выискивая перевода каждой страницы сайта (а если каталог огромный, то можно засеть на долгое время)?

В этом нам поможет сниппет BabelTranslation. Подробнее можно посмотреть тут - BabelTranslation. BabelTranslation выводит связанный id переведенной страницы нужного контекста:

[ [BabelTranslation? &resourceId=`6` &contextKey=`eng`]]

Выведет в шаблоне связанный id в контексте eng для страницы с активного контекста (в нашем случае web).

В совокупности с условиями ввода-вывода, конструкцию можно сделать грамотнее:

[ [*context_key:is=`web` :then=`6` :else=`[ [BabelTranslation:default=`6`? &resourceId=`6` &contextKey=`eng`]]`]]

Тут мы выводим если контекст web и выводим связанный id для контекста eng через BabelTranslation, если же связанного id нет, то выведет (исходя из :default).

Конструкцию можно сделать еще проще, для этого всю конструкцию сохраняем в чанк [ [$eng_id]] и задаем параметр [ [+ru_id]] в чанке (чанк и параметр можно назвать как угодно). Код чанка:

[ [*context_key:is=`web` :then=`[ [+ru_id]]` :else=`[ [BabelTranslation:default=`[ [+ru_id]]`? &resourceId=`[ [+ru_id]]` &contextKey=`eng`]]`]]

А так, например, выводим id для ссылки через наш чанк с параметром (если не найдет переведенную страницу, откроется исходная страница):

Ссылка на страницу

Источники файлов в TV для нескольких контекстов

Если у вас для каких-либо TV настроены источники файлов, то после создания нового контекста нужно будет добавить источники файлов в настройках этих TV к новым контекстам.

Символические ссылки для контекстов

По умолчанию между контекстами нельзя ставить символические ссылки, чтобы это включить - переходим в админке сайта "Системные настройки" выбираем в фильтре "Система и сервер" и ставим у "Разрешить перенаправление через контексты" - "Да"


Вот, собственно, и все, да здравствует мультиязычность в MODX Revolution :)

Настройка MODX

MODX Revo

В предыдущей статье мы произвели установили дополнения. Сегодня мы произведем основные настройки MODX Revo.

Русификация MODX

На всякий случай решил написать, о том как русифицировать modx revo (сменить язык админки), чтобы названия настроек не отличались от моих, если ваша админка на другом языке.

Переходим во вкладку System Settings

В принципе все) Разлогиниваетесь из админки и снова зайдите в нее.

Разлогиниваемся и снова залогиниваемся в modx

Настройка modx revolution после установки

Заходим в админку MODX и переходим на панель настроек «Системные настройки».

Переходим в системные настройки MODX

Здесь можно фильтровать настройки, относящиеся к тому или иному компоненту системы MODX, а также настройки, относящиеся к одному и тому же компоненту, но сгруппированные по категориям в зависимости от выполняемой функции.

сортировка системных настроек modx

Идем по порядку (по категориям).

Настраиваем (правим) следующие параметры для ядра (core).

Авторизация и безопасность

Кеширование пропускаем

Визуальный редактор

Файловая система

Дружественные URL

Пока что пропускаем, по их настройке будет отдельная статья: Настройка ЧПУ MODX (откроется в новом окне).

Шлюз пропускаем.

Словарь и язык

Система управления

Понедельник в России.

Делается для того, чтобы названия ресурсов в дереве с лева были покороче.

Делается для того, чтобы можно было понять, какой у ресурса адрес

Прокси, сессии и куки пропускаем.

Сайт

У вновь создаваемых ресурсов (страниц) по умолчанию будет снята галочка «Отображать в меню». В любой момент её можно будет включить. Но зачем лишний раз снимать галочку, ведь не все создаваемые в дальнейшем страницы сайта будут отображаться в меню. Установив опцию в «Да» вам в дальнейшем не нужно будет совершать лишних действий.

Та же история, что и с предыдущей опцией, только наоборот. При создании страницы уже будет стоять отметка «Опубликовать». Если ресурс не опубликован, то он будет недоступен посетителям сайта. Но мы же создаём публичные страницы – так ведь?

Можете написать всё, что угодно. Надпись будет отображаться всем, кто зайдёт на сайт во время его технического обслуживания. Для перевода сайта на техническое обслуживание служит отдельная опция.

устанавливаем настройки для системных страниц

Система и сервер

Дополнительные настройки, для тех кто устанавливал пакеты из моего урока.

Системные настройки основных дополнений

Идем в раздел mixedimage и в Транслитерация файлов (mixedimage.translit) ставим Да.

Чтобы загружаемые к ресурсам картинки транслитерировались.

Затем идем в раздел tickets и в Считать просмотры страниц гостями (tickets.count_guests) ставим Да.

На этом первичные настройки можно завершать. К остальным настройкам MODX мы будем возвращаться по необходимости.

MODX Advanced setup

Переименовывание каталогов критически важно для того, чтобы затруднить сканирование сайта на предмет определения используемой CMS. Вынос же папки core за корневой каталог вовсе запретит доступ к ней извне.

В отличие от стандартной установки MODX Revo установку расширенную нужно начинать со скачивания предназначенного для такого типа установки пакета.

MODX Advanced setup

И теперь главное: если в распакованном инсталляционном пакете мы оставим все, как есть, установка начнется подобно стандартному режиму – с выбора языка. Но мы специально скачали дистрибутив с возможностью смены, в первую очередь, названия папки core, во вторую, ее местоположения.

Расширенная установка МОДЭКС

Корректируем путь к нашей папке с ядром МОДЭКС и продолжаем процесс установки, нажав кнопку «Submit».

Расширенная установка MODX Revo

Выбираем языковую версию будущего сайта:

MODX advanced setup

Если мы планируем запуск нескольких сайтов с общим ядром, вводим конфигурационный ключ, если не планируем, пропускаем его ввод.

МОДЕКС установка

MODX Revo – ввод конфигурационного ключа

Займемся параметрами установки MODX Revo. Если сайт новый, выбираем «Новую» установку. Дополнительные параметры, связанные с назначением прав доступа к файлам и каталогам, оставляем как есть, по умолчанию, опцию «Отправлять заголовок x-Powere-by» отключаем, продолжаем процесс с помощью кнопки «Далее».

параметры установки MODX Revolution

Далее этап из трех шагов.

На первом шаге настраивается подключение к нашей базе данных. Вводим имя пользователя (именно базы данных, созданной нами на сервере), пароль пользователя, также базы данных, имя самой базы данных.

Для повышения безопасности рекомендуется изменить и значение префикса таблиц, на что-нибудь, мало схожее с «modx».

Покончив с вводом данных, нажимаем «Проверить соединение с сервером базы данных и отобразить список доступных сопоставлений»

Проверка соединения с базой данный Модэкс

При успешном соединении с БД переходим к следующему шагу: проверяем кодировку и сопоставление символов. Если значения по умолчанию вас устраивают (как правило, это так, за исключением каких-то особых требований), выполняем проверку «Попытка создания или выборки из базы данных».

Проверка кодировки MODX при установке

Положительный результат проверки приводит нас к третьему шагу этапа: вводу данных администратора – логина, адреса электронной почты и пароля. Именно эта пара «Логин/пароль» будет требоваться для входа в панель управления сайтом.

MODX логин - пароль при установке

А вот и второе отличие процесса развертывания расширенного установочного пакета MODX Revolution – окно установки контекста – указание путей к файлам, настройка коннекторов и установка параметров контекста административной части сайта.

Установка контекста MODX

Здесь необходимо задать новые имена для папок connectors, manager и корневой директории. Изменяйте лишь необходимые параметры. При этом обязательно нужно менять оба параметра – как путь к контексту, так и его (контекста) URL.

Установка контекста MODX

Нажатие кнопки «Далее» приведет нас к чтению отчета о прохождении предустановочных тестов.

Отчет об установке MODX

МОДЭКС – Отчет об установке

Нам останется только войти в панель управления, нажав соответствующую и единственную кнопку экрана.

Окончание установки MODX Revolution

Вводим данные администратора – «Имя пользователя (логин)» и «Пароль».

Авторизация в CMS MODX Revolution

Все, мы в административной части сайта, панели управления MODX Revolution.

Спасибо за установку MODX Revo

MODX Back-end

Не забудьте, что переименованная папка manager означает и новый адрес для доступа в административную часть, уже не «адрес_Сайта/manager», а «адрес_Сайта/secadm» для нашего примера или, соответственно, ваше название бывшей папки manager.

Читайте также: