Stand: SMTP-Test, Admin-Mail-Tab, Notifiable-Fix, Lazy-Quill

- Fix: Notifiable-Trait zum User-Model hinzugefuegt (behebt notify()-500er)
- Installer: SMTP-Verbindungstest mit EsmtpTransport + Ueberspringen-Link
- Admin: Neuer E-Mail-Tab mit SMTP-Konfiguration + Verbindungstest
- Admin: Lazy Quill-Initialisierung (nur sichtbare Locale wird geladen)
- Uebersetzungen: 17 neue Mail-Keys in allen 6 Sprachen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Rhino
2026-03-02 07:30:37 +01:00
commit 2e24a40d68
9633 changed files with 1300799 additions and 0 deletions

567
lang/ru/admin.php Executable file
View File

@@ -0,0 +1,567 @@
<?php
return [
// Панель управления
'dashboard_title' => 'Панель администратора',
'stat_users' => 'Пользователи',
'stat_players' => 'Игроки',
'stat_upcoming' => 'Предстоящие мероприятия',
'stat_invitations' => 'Открытые приглашения',
'quick_links' => 'Быстрый доступ',
'new_event' => 'Новое мероприятие',
'new_player' => 'Новый игрок',
'new_invitation' => 'Новое приглашение',
'new_team' => 'Новая команда',
'open_responses_title' => 'Мероприятия с ожидающими ответами',
'x_open' => ':count открыто',
// Навигация
'nav_teams' => 'Команды',
'nav_players' => 'Игроки',
'nav_users' => 'Пользователи',
'nav_invitations' => 'Приглашения',
'nav_events' => 'Мероприятия',
'nav_settings' => 'Настройки',
'nav_verwaltung' => 'Управление',
// Общее
'actions' => 'Действия',
'action' => 'Действие',
'please_select' => 'Пожалуйста, выберите',
'back_to_list' => 'Назад к списку',
'inactive' => 'Неактивно',
'nr' => '№',
'photo' => 'Фото',
'date' => 'Дата',
'location' => 'Место',
'all_status' => 'Все статусы',
'copied' => 'Скопировано!',
'copy' => 'Копировать',
'created_by' => 'от',
'valid_until' => 'действ. до',
// Команды
'teams_title' => 'Команды',
'team_created' => 'Команда создана.',
'team_updated' => 'Команда обновлена.',
'team_name' => 'Название команды',
'year_group' => 'Год рождения',
'year_group_placeholder' => 'Например, 2017/18',
'active' => 'Активно',
'team_is_active' => 'Команда активна',
'create_team' => 'Создать команду',
'edit_team' => 'Редактировать команду',
'no_teams_yet' => 'Пока нет команд.',
'team_notes' => 'Заметки',
'team_notes_placeholder' => 'Заметки о команде (внутренние, видны только администраторам)...',
'team_coaches' => 'Тренеры',
'no_coaches_available' => 'В системе нет тренеров.',
'team_players' => 'Игроки',
'team_parent_reps' => 'Представители родителей',
'team_parent_reps_hint' => 'Родители с ролью «Представитель родителей», у которых есть дети в этой команде.',
'no_parent_reps' => 'Нет представителей родителей для этой команды.',
'log_team_updated' => 'Команда ":name" обновлена',
'log_player_team_changed' => 'Игрок :name переведён в другую команду',
// Игроки
'players_title' => 'Игроки',
'player_created' => 'Игрок создан.',
'player_updated' => 'Игрок обновлён.',
'first_name' => 'Имя',
'last_name' => 'Фамилия',
'birth_year' => 'Год рождения',
'jersey_number' => 'Номер на форме',
'photo_permission' => 'Разрешение на фото',
'notes' => 'Заметки',
'parent_assigned' => 'Родитель привязан.',
'parent_removed' => 'Привязка удалена.',
'assign_parent' => 'Привязать родителя',
'add_parent' => 'Добавить родителя',
'select_user' => 'Выбрать пользователя',
'assign' => 'Привязать',
'relationship_label' => 'Родство',
'relationship_placeholder' => 'Например, мать, отец',
'parents' => 'Родители',
'player_data' => 'Данные игрока',
'parent_assignment' => 'Привязка родителей',
'no_parents_yet' => 'Родители пока не привязаны.',
'confirm_remove_parent' => 'Действительно удалить привязку?',
'remove' => 'Удалить',
'no_players_yet' => 'Пока нет игроков.',
// Пользователи
'users_title' => 'Пользователи',
'user_toggled' => 'Пользователь :status.',
'role_updated' => 'Роль обновлена.',
'cannot_deactivate_self' => 'Вы не можете деактивировать свой аккаунт.',
'cannot_change_own_role' => 'Вы не можете изменить свою роль.',
'activated' => 'активирован',
'deactivated' => 'деактивирован',
'deactivated_label' => 'Деактивирован',
'children' => 'Дети',
'phone' => 'Телефон',
'last_login' => 'Последний вход',
'never' => 'Никогда',
'deactivate' => 'Деактивировать',
'activate' => 'Активировать',
'you_suffix' => '(вы)',
'edit' => 'Редактировать',
'edit_user' => 'Редактировать пользователя',
'user_data' => 'Данные пользователя',
'user_updated' => 'Пользователь обновлён.',
'reset_password' => 'Сбросить пароль',
'reset_password_hint' => 'Генерирует новый случайный пароль. Старый пароль станет недействительным.',
'reset_password_confirm' => 'Сгенерировать новый случайный пароль? Старый пароль станет недействительным.',
'password_reset_success' => 'Новый пароль сгенерирован.',
'new_password_label' => 'Новый пароль (виден только один раз):',
'password_only_visible_now' => 'Этот пароль отображается только сейчас. Пожалуйста, передайте его и не перезагружайте страницу.',
'cannot_edit_own_role' => 'Вы не можете изменить свою роль здесь.',
'cannot_assign_admin_role' => 'Вы не можете назначить роль администратора.',
'cannot_reset_own_password' => 'Вы не можете сбросить свой пароль через панель администратора.',
'registered_at' => 'Зарегистрирован',
// Приглашения
'invitations_title' => 'Приглашения',
'invitation_created' => 'Приглашение создано. Ссылка: :link',
'invitation_deleted' => 'Приглашение удалено.',
'invitation_already_used' => 'Использованные приглашения нельзя удалить.',
'create_invitation' => 'Создать приглашение',
'assign_players' => 'Привязать игроков',
'email_optional' => 'Эл. почта (необязательно)',
'email_optional_hint' => 'Если указана, зарегистрироваться сможет только этот адрес',
'expires_at' => 'Действует до',
'valid_for_days' => 'Действительно (дней)',
'token' => 'Токен',
'status' => 'Статус',
'used' => 'Использовано',
'expired' => 'Истекло',
'pending' => 'Ожидает',
'copy_link' => 'Копировать ссылку',
'invite_link' => 'Ссылка-приглашение',
'no_assignment' => 'Нет привязки',
'no_invitations_yet' => 'Приглашений пока нет.',
'no_active_players' => 'Нет активных игроков.',
'confirm_delete_invitation' => 'Действительно удалить приглашение?',
'created_label' => 'Создано',
'player_assignment_hint' => 'Выберите детей, которые будут автоматически привязаны к новому родительскому аккаунту.',
// Мероприятия
'events_title' => 'Мероприятия',
'event_created' => 'Мероприятие создано.',
'event_updated' => 'Мероприятие обновлено.',
'event_deleted' => 'Мероприятие удалено.',
'event_title' => 'Заголовок',
'start_at' => 'Начало',
'date' => 'Дата',
'time' => 'Время',
'end_at' => 'Окончание',
'location_name' => 'Название места',
'address' => 'Адрес',
'description' => 'Описание',
'search_address' => 'Поиск адреса...',
'new_event_title' => 'Новое мероприятие',
'edit_event_title' => 'Редактировать мероприятие',
'no_events_yet' => 'Мероприятий пока нет.',
'confirm_delete_event' => 'Действительно удалить мероприятие?',
'location_address' => 'Место / Адрес',
'location_name_hint' => 'Название места (напр. Спортзал «Север»)',
'search_by_name' => 'Найти адрес',
'location_name_placeholder' => 'напр. Стадион BVB, Спортзал...',
'search_address_hint' => 'Введите адрес (мин. 3 символа)...',
'description_placeholder' => 'Введите описание...',
'assignments' => 'Назначения',
'catering_assignment' => 'Питание',
'timekeeper_assignment' => 'Хронометрист',
'geocoding_error' => 'Ошибка поиска адреса. Попробуйте ещё раз.',
'geocoding_rate_limit' => 'Слишком много запросов. Подождите немного.',
'geocoding_no_results' => 'Адрес не найден. Уточните запрос.',
// Минимальные требования
'min_requirements' => 'Минимальные требования',
'min_players' => 'Мин. игроков',
'min_parents' => 'Мин. родителей',
'min_catering' => 'Мин. питание',
'min_timekeepers' => 'Мин. хронометристов',
'event_defaults_title' => 'Стандартные минимумы для мероприятий',
'event_defaults_description' => 'Задайте стандартные минимальные значения для новых мероприятий по типам. Администраторы могут изменить их при создании.',
// Управление локациями
'nav_locations' => 'Локации',
'locations_title' => 'Управление локациями',
'location_add' => 'Добавить новую локацию',
'location_name_label' => 'Название',
'location_save' => 'Сохранить',
'location_created' => 'Локация создана.',
'location_updated' => 'Локация обновлена.',
'location_deleted' => 'Локация удалена.',
'location_confirm_delete' => 'Действительно удалить эту локацию?',
'locations_empty' => 'Локации пока отсутствуют.',
'known_locations' => 'Известные локации',
'address_manual_hint' => 'Введите адрес вручную...',
// Настройки
'settings_title' => 'Настройки',
'settings_saved' => 'Настройки сохранены.',
'settings_tab_general' => 'Общие',
'settings_tab_legal' => 'Юридическое',
'settings_tab_defaults' => 'Стандарты событий',
'settings_tab_categories' => 'Категории файлов',
// Управление файлами
'nav_files' => 'Файлы',
'files_title' => 'Управление файлами',
'upload_file' => 'Загрузить файл',
'file_uploaded' => 'Файл был загружен.',
'file_deleted' => 'Файл был удалён.',
'file_category' => 'Категория',
'select_category' => 'Выберите категорию',
'no_files_yet' => 'В этой категории пока нет файлов.',
'no_files_at_all' => 'Файлы ещё не загружены.',
'file_size' => 'Размер',
'uploaded_by' => 'Загружено',
'uploaded_at' => 'Дата загрузки',
'confirm_delete_file' => 'Действительно удалить этот файл? Все связи с мероприятиями будут удалены.',
'allowed_file_types' => 'Допустимые типы файлов: PDF, DOCX, XLSX, Изображения (JPG, PNG, GIF, WEBP)',
'max_file_size' => 'Максимальный размер файла: 10 МБ',
'file_categories' => 'Категории файлов',
'file_categories_description' => 'Управление категориями файлов.',
'new_category' => 'Новая категория',
'category_name' => 'Название категории',
'category_created' => 'Категория создана.',
'category_updated' => 'Категория обновлена.',
'category_deleted' => 'Категория удалена.',
'category_not_empty' => 'Категория не может быть удалена, так как содержит файлы.',
'confirm_delete_category' => 'Действительно удалить эту категорию?',
'event_files' => 'Файлы',
'attach_from_library' => 'Прикрепить из библиотеки',
'upload_new_file' => 'Загрузить новый файл',
'attached_files' => 'Прикреплённые файлы',
'detach_file' => 'Удалить',
'no_attached_files' => 'Файлы не прикреплены.',
'profile_picture' => 'Фото профиля',
'upload_picture' => 'Загрузить фото',
'remove_picture' => 'Удалить фото',
'picture_uploaded' => 'Фото профиля обновлено.',
'picture_removed' => 'Фото профиля удалено.',
'max_picture_size' => 'Макс. 2 МБ (JPG, PNG, GIF, WEBP)',
'html_anchor_hint' => 'Совет: Добавьте якоря с атрибутом id, напр. &lt;h3 id="cookies"&gt;',
// Soft-Delete
'danger_zone' => 'Опасная зона',
'delete_user' => 'Удалить пользователя',
'delete_user_hint' => 'Пользователь будет деактивирован и может быть восстановлен в течение 7 дней. Исторические данные (комментарии, участия) сохранятся.',
'delete_player' => 'Удалить игрока',
'delete_player_hint' => 'Игрок будет удалён и может быть восстановлен в течение 7 дней. Исторические данные (участия, события) сохранятся.',
'user_status_label' => 'Статус пользователя',
'player_status_label' => 'Статус игрока',
'deactivate_user_hint' => 'Пользователь больше не сможет войти в систему.',
'activate_user_hint' => 'Пользователь снова сможет войти в систему.',
'deactivate_player_hint' => 'Игрок не будет отображаться в списках мероприятий.',
'activate_player_hint' => 'Игрок снова будет отображаться в списках мероприятий.',
'player_toggled' => 'Игрок :status.',
'log_player_toggled' => 'Игрок :name :status',
'confirm_delete_user' => 'Вы уверены, что хотите удалить этого пользователя? Его можно восстановить в течение 7 дней.',
'confirm_delete_player' => 'Вы уверены, что хотите удалить этого игрока? Его можно восстановить в течение 7 дней.',
'user_deleted' => 'Пользователь удалён.',
'user_restored' => 'Пользователь восстановлен.',
'player_deleted' => 'Игрок удалён.',
'player_restored' => 'Игрок восстановлен.',
'cannot_delete_self' => 'Вы не можете удалить себя.',
'cannot_delete_main_admin' => 'Главный администратор не может быть удалён.',
'restore_expired' => 'Срок восстановления истёк.',
'trash' => 'Корзина',
'restore' => 'Восстановить',
'delete' => 'Удалить',
'deleted_at' => 'Удалено',
// Activity Log
'activity_log_title' => 'Журнал активности',
'nav_activity_log' => 'Журнал активности',
'log_category' => 'Категория',
'log_all_categories' => 'Все категории',
'log_cat_auth' => 'Аутентификация',
'log_cat_users' => 'Пользователи',
'log_cat_players' => 'Игроки',
'log_cat_events' => 'Мероприятия',
'log_cat_files' => 'Файлы',
'log_cat_settings' => 'Настройки',
'log_cat_dsgvo' => 'GDPR',
'log_from' => 'С',
'log_to' => 'По',
'log_filter' => 'Фильтр',
'log_reset' => 'Сброс',
'log_time' => 'Время',
'log_user' => 'Пользователь',
'log_action' => 'Действие',
'log_description' => 'Описание',
'log_ip' => 'IP-адрес',
'log_system' => 'Система',
'log_empty' => 'Записи не найдены.',
'log_details' => 'Подробности',
'log_field' => 'Поле',
'log_old_value' => 'До',
'log_new_value' => 'После',
// Log descriptions
'log_login' => ':name вошёл в систему',
'log_logout' => ':name вышел из системы',
'log_login_failed' => 'Неудачная попытка входа для :email',
'log_registered' => ':name зарегистрировался',
'log_user_updated' => 'Пользователь :name обновлён',
'log_user_toggled' => 'Пользователь :name: статус изменён на :status',
'log_role_changed' => 'Роль :name изменена на :role',
'log_password_reset' => 'Пароль :name сброшен',
'log_user_deleted' => 'Пользователь :name удалён',
'log_user_restored' => 'Пользователь :name восстановлен',
'log_player_created' => 'Игрок :name создан',
'log_player_updated' => 'Игрок :name обновлён',
'log_player_deleted' => 'Игрок :name удалён',
'log_player_restored' => 'Игрок :name восстановлен',
'log_parent_assigned' => ':parent назначен родителем :player',
'log_parent_removed' => ':parent удалён как родитель :player',
'log_event_created' => 'Мероприятие ":title" создано',
'log_event_updated' => 'Мероприятие ":title" обновлено',
'log_event_deleted' => 'Мероприятие ":title" удалено',
'log_participant_changed' => 'Статус участия для ":event" изменён на :status',
'log_catering_changed' => 'Статус кейтеринга для ":event" изменён на :status',
'log_timekeeper_changed' => 'Статус хронометриста для ":event" изменён на :status',
'log_comment_created' => 'Комментарий добавлен к ":event"',
'log_comment_deleted' => 'Комментарий удалён из ":event"',
'log_file_uploaded' => 'Файл ":name" загружен',
'log_file_deleted' => 'Файл ":name" удалён',
'log_settings_updated' => 'Настройки обновлены',
'log_invitation_created' => 'Приглашение создано для :email',
// Статистика
'nav_statistics' => 'Статистика',
'statistics_title' => 'Статистика матчей',
'total_games' => 'Всего матчей',
'wins' => 'Победы',
'losses' => 'Поражения',
'draws' => 'Ничьи',
'win_rate' => '% побед',
'chart_win_loss' => 'Победы / Поражения',
'chart_player_participation' => 'Участие игроков',
'chart_parent_involvement' => 'Участие родителей',
'no_games_yet' => 'Матчей пока нет.',
'filter_from' => 'С',
'filter_to' => 'По',
'filter_apply' => 'Фильтр',
'filter_reset' => 'Сброс',
'all_teams' => 'Все команды',
'not_applicable' => 'Н/Д',
'min_users' => 'Мин. пользователей',
'home_short' => 'Д',
'away_short' => 'В',
'player_ranking_title' => 'Участие игроков',
'player_ranking_desc' => 'Статистика участия игроков в :count играх (домашние и выездные).',
'games_played' => 'Сыграно',
'games_assigned' => 'Назначено',
'participation_rate' => 'Процент',
'parent_ranking_title' => 'Вклад родителей',
'parent_ranking_desc' => 'Кейтеринг (:catering событий) и хронометраж (:timekeeper событий) — все опубликованные события.',
'total_contributions' => 'Итого',
'statistics_enabled_label' => 'Включить страницу статистики',
'statistics_enabled_hint' => 'Если отключено, страница статистики видна только администратору.',
// Slogan & Favicon
'slogan_label' => 'Слоган',
'slogan_hint' => 'Отображается на странице входа и в подвале.',
'favicon_label' => 'Фавикон',
'favicon_hint' => 'ICO, PNG, SVG, JPG (макс. 512 КБ)',
'favicon_current' => 'Текущий фавикон',
'favicon_remove' => 'Удалить фавикон',
'favicon_uploaded' => 'Фавикон обновлён.',
'favicon_removed' => 'Фавикон удалён.',
// Undo / Revert
'log_revert' => 'Отменить',
'log_revert_confirm' => 'Вы действительно хотите отменить это действие?',
'log_revert_success' => 'Действие успешно отменено.',
'log_revert_not_possible' => 'Это действие невозможно отменить.',
'log_reverted' => 'Отменено: ":desc"',
'event_restored' => 'Событие восстановлено.',
'log_event_restored' => 'Событие ":title" восстановлено',
// Видимость
'settings_tab_visibility' => 'Видимость',
'visibility_description' => 'Управляйте видимостью функций для различных ролей. Администраторы всегда видят всё.',
'visibility_feature_statistics' => 'Страница статистики',
'visibility_feature_catering_history' => 'История кейтеринга/хронометража',
// Генератор списков
'nav_list_generator' => 'Генератор списков',
'list_generator_title' => 'Создать список',
'list_title' => 'Тема',
'list_subtitle' => 'Подзаголовок (необязательно)',
'list_notes' => 'Заметки / Описание',
'list_source' => 'Источник строк',
'list_source_players' => 'Игроки',
'list_source_parents' => 'Родители',
'list_source_freetext' => 'Свободный текст',
'list_freetext_hint' => 'Одна строка на запись',
'list_columns' => 'Столбцы',
'list_custom_columns' => 'Дополнительные столбцы',
'list_add_column' => 'Добавить столбец',
'list_column_name' => 'Название столбца',
'list_generate' => 'Создать список',
'list_result_title' => 'Список создан',
'list_print' => 'Печать / Сохранить как PDF',
'list_new' => 'Создать новый список',
'list_to_library' => 'В библиотеку файлов',
'list_generated_at' => 'Создано',
'list_all_teams' => 'Все команды',
'list_saved_info' => 'Файл ":name" автоматически сохранён в библиотеке в разделе "Общее".',
'list_download_pdf' => 'Скачать PDF',
'list_entries_count' => 'записей',
'log_list_generated' => 'Список ":title" был создан',
'no_entries' => 'Записей нет.',
// GDPR
'dsgvo_title' => 'Согласие на обработку данных (GDPR)',
'dsgvo_short' => 'GDPR',
'dsgvo_consent_label' => 'Согласие подтверждено',
'dsgvo_view_document' => 'Просмотреть документ',
'dsgvo_confirm' => 'Подтвердить',
'dsgvo_revoke' => 'Отозвать',
'dsgvo_toggled' => 'Статус GDPR обновлён.',
'dsgvo_no_file' => 'Документ ещё не загружен.',
'dsgvo_no_document' => 'Пользователь ещё не загрузил согласие.',
'dsgvo_not_confirmed' => 'Ещё не подтверждено. Проверьте документ и подтвердите.',
'dsgvo_confirmed_info' => 'Подтверждено :name :date',
'dsgvo_confirmed_tooltip' => 'Согласие GDPR подтверждено',
'dsgvo_pending_tooltip' => 'Документ загружен, подтверждение ожидается',
'dsgvo_missing_tooltip' => 'Документ не загружен',
'dsgvo_events_title' => 'События GDPR (последние 10)',
'dsgvo_action_dsgvo_consent_uploaded' => 'Загружено',
'dsgvo_action_dsgvo_consent_confirmed' => 'Подтверждено',
'dsgvo_action_dsgvo_consent_revoked' => 'Отозвано',
'dsgvo_action_dsgvo_consent_removed' => 'Удалено',
'dsgvo_action_account_self_deleted' => 'Аккаунт удалён',
'dsgvo_action_child_auto_deactivated' => 'Ребёнок деактивирован',
'log_dsgvo_consent_uploaded' => ':name загрузил(а) согласие',
'log_dsgvo_confirmed' => 'Согласие :name подтверждено',
'log_dsgvo_revoked' => 'Подтверждение согласия :name отозвано',
'log_dsgvo_consent_removed' => ':name удалил(а) согласие',
'log_account_self_deleted' => ':name удалил(а) собственный аккаунт',
'log_child_auto_deactivated' => 'Игрок :child автоматически деактивирован (единственный родитель :parent удалил аккаунт)',
// GDPR Pending Widget
'dsgvo_pending_title' => 'GDPR — Подтверждение ожидается',
'dsgvo_pending_count' => ':count заявление(й) ожидает подтверждения',
'dsgvo_consent_document' => 'Заявление о согласии на обработку данных',
'dsgvo_reject' => 'Отклонить',
'dsgvo_reject_confirm' => 'Вы уверены, что хотите отклонить это заявление о согласии? Документ будет удалён, и пользователю потребуется загрузить его снова.',
'dsgvo_rejected' => 'Заявление о согласии отклонено.',
'log_dsgvo_rejected' => 'Заявление о согласии :name было отклонено',
'dsgvo_action_dsgvo_consent_rejected' => 'Отклонено',
'dsgvo_preview_not_available' => 'Предпросмотр недоступен для этого типа файла.',
// Factory Reset
'factory_reset_title' => 'Полный сброс',
'factory_reset_description' => 'Сбрасывает всё приложение в исходное состояние. После сброса будет запущен мастер установки.',
'factory_reset_deletes' => 'Следующие данные будут безвозвратно удалены',
'factory_reset_item_users' => 'Все пользователи (включая администратора)',
'factory_reset_item_data' => 'Все команды, игроки, мероприятия, комментарии',
'factory_reset_item_settings' => 'Все настройки и категории файлов',
'factory_reset_item_files' => 'Все загруженные файлы и фотографии профилей',
'factory_reset_warning' => 'Это действие НЕЛЬЗЯ отменить! Приложение будет полностью сброшено и запущен мастер установки.',
'factory_reset_confirm' => 'ВНИМАНИЕ: Всё приложение будет необратимо сброшено и все данные удалены. Мастер установки будет запущен заново. Вы уверены?',
'factory_reset_button' => 'Полностью сбросить приложение',
// Лицензия и поддержка
'settings_tab_license' => 'Лицензия и поддержка',
'license_title' => 'Лицензионный ключ',
'license_description' => 'Введите лицензионный ключ для получения поддержки и обновлений.',
'license_key_label' => 'Лицензионный ключ',
'license_invalid' => 'Введённый лицензионный ключ недействителен.',
'registration_status' => 'Статус регистрации',
'registration_active' => 'Зарегистрировано',
'registration_inactive' => 'Не зарегистрировано',
'register_now' => 'Зарегистрировать сейчас',
'registration_success' => 'Установка успешно зарегистрирована.',
'registration_failed' => 'Регистрация не удалась. Попробуйте позже.',
'version_info' => 'Системная информация',
'update_available' => 'Доступно обновление: Версия :version',
'update_details' => 'Показать подробности',
'download_update' => 'Скачать обновление',
'installation_id_label' => 'ID установки',
'nav_support' => 'Поддержка',
'support_title' => 'Тикеты поддержки',
'support_not_registered' => 'Установка не зарегистрирована',
'support_register_hint' => 'Для использования поддержки установка должна быть зарегистрирована. Передаются только технические данные (название приложения, URL, версия PHP).',
'support_new_ticket' => 'Создать новый тикет',
'support_subject' => 'Тема',
'support_category' => 'Категория',
'support_category_bug' => 'Отчёт об ошибке',
'support_category_feature' => 'Запрос функции',
'support_category_question' => 'Вопрос',
'support_category_other' => 'Прочее',
'support_message' => 'Сообщение',
'support_submit' => 'Отправить тикет',
'support_reply' => 'Ответить',
'support_send_reply' => 'Отправить ответ',
'support_reply_placeholder' => 'Напишите ваш ответ...',
'support_ticket_created' => 'Тикет успешно создан.',
'support_reply_sent' => 'Ответ отправлен.',
'support_submit_failed' => 'Не удалось создать тикет. Попробуйте позже.',
'support_reply_failed' => 'Не удалось отправить ответ. Попробуйте позже.',
'support_ticket_not_found' => 'Тикет не найден.',
'support_no_tickets' => 'Тикетов пока нет.',
'support_no_messages' => 'Сообщений пока нет.',
'support_ticket_id' => '№ тикета',
'support_status' => 'Статус',
'support_status_open' => 'Открыт',
'support_status_in_progress' => 'В работе',
'support_status_waiting' => 'Ожидание',
'support_status_closed' => 'Закрыт',
'support_created_at' => 'Создан',
'support_last_reply' => 'Последний ответ',
'support_back_to_list' => 'Назад к списку',
'support_system_info_note' => 'Системная информация отправляется автоматически.',
'support_sender_support' => 'Поддержка',
'support_sender_you' => 'Вы',
'support_ticket_closed' => 'Этот тикет закрыт.',
'installer_register_label' => 'Зарегистрировать установку',
'installer_register_hint' => 'Включает уведомления об обновлениях и поддержку. Передаются только технические данные (название приложения, URL, версия PHP, версия приложения).',
'installer_license_label' => 'Лицензионный ключ (необязательно)',
'installer_license_hint' => 'Можно ввести позже в настройках.',
// Сброс пароля (Администратор + Самообслуживание)
'settings_tab_maintenance' => 'Обслуживание',
'factory_reset_password_label' => 'Ваш пароль для подтверждения',
'factory_reset_confirmation_label' => 'Подтверждение безопасности',
'factory_reset_confirmation_hint' => 'Введите RESET-BESTÄTIGT для подтверждения действия.',
'password_reset_link_sent' => 'Ссылка для сброса пароля отправлена по электронной почте.',
'password_reset_email_label' => 'Шаблон письма для сброса пароля',
'password_reset_email_hint' => 'Заполнители: {name} = Имя пользователя, {link} = Ссылка сброса, {app_name} = Название приложения',
'log_password_reset_requested' => 'Запрошен сброс пароля',
'log_password_changed_self' => ':name изменил пароль',
'log_dsgvo_viewed' => 'Документ GDPR пользователя :name просмотрен',
// Многоязычный редактор правовых текстов
'legal_language_label' => 'Язык',
'legal_impressum_label' => 'Импрессум',
'legal_datenschutz_label' => 'Политика конфиденциальности',
'legal_password_reset_email_label' => 'Письмо для сброса пароля',
// Вкладка E-Mail
'settings_tab_mail' => 'E-Mail',
'mail_config_title' => 'Настройки электронной почты',
'mail_config_hint' => 'Настройки SMTP для отправки электронной почты (напр. сброс пароля, уведомления).',
'mail_mailer_label' => 'Способ отправки',
'mail_log_mode' => 'Без отправки (Лог)',
'mail_host_label' => 'SMTP-хост',
'mail_port_label' => 'Порт',
'mail_username_label' => 'Имя пользователя',
'mail_password_label' => 'Пароль',
'mail_from_address_label' => 'Адрес отправителя',
'mail_from_name_label' => 'Имя отправителя',
'mail_encryption_label' => 'Шифрование',
'mail_encryption_none' => 'Нет',
'mail_save' => 'Сохранить настройки почты',
'mail_saved' => 'Настройки почты сохранены.',
'mail_test_button' => 'Проверить соединение',
'mail_testing' => 'Проверка соединения...',
'mail_test_success' => 'SMTP-соединение успешно!',
];

7
lang/ru/auth.php Executable file
View File

@@ -0,0 +1,7 @@
<?php
return [
'failed' => 'Неверные учётные данные.',
'password' => 'Указанный пароль неверен.',
'throttle' => 'Слишком много попыток входа. Пожалуйста, повторите через :seconds секунд.',
];

37
lang/ru/auth_ui.php Executable file
View File

@@ -0,0 +1,37 @@
<?php
return [
// Вход
'login_title' => 'Вход',
'email_label' => 'Эл. почта',
'password_label' => 'Пароль',
'remember_me' => 'Запомнить меня',
'login_button' => 'Войти',
// Регистрация
'register_title' => 'Регистрация',
'name_label' => 'Имя',
'children_assigned' => 'Ваш аккаунт будет привязан к следующим детям:',
'password_min' => '(мин. 8 символов)',
'password_confirm_label' => 'Подтвердить пароль',
'create_account' => 'Создать аккаунт',
'already_registered' => 'Уже зарегистрированы?',
'go_to_login' => 'Войти',
'email_fixed_by_invitation' => 'Адрес электронной почты определён приглашением.',
'invalid_invitation' => 'Ссылка приглашения недействительна или истекла.',
'welcome' => 'Добро пожаловать! Ваш аккаунт создан.',
'forgot_password_link' => 'Забыли пароль?',
'forgot_password_title' => 'Сброс пароля',
'forgot_password_description' => 'Введите адрес электронной почты, и мы отправим вам ссылку для сброса пароля.',
'send_reset_link' => 'Отправить ссылку',
'back_to_login' => 'Вернуться к входу',
'reset_password_title' => 'Установить новый пароль',
'reset_password_button' => 'Сбросить пароль',
'new_password_label' => 'Новый пароль',
'confirm_password_label' => 'Подтвердить пароль',
'login_failed' => 'Неверные учетные данные.',
'email_must_match_invitation' => 'Адрес электронной почты должен совпадать с приглашением: :email',
'cookie_notice' => 'Этот сайт использует только технически необходимый сессионный файл cookie. Без отслеживания.',
'cookie_notice_link' => 'Подробнее',
'account_deactivated' => 'Ваш аккаунт был деактивирован. Пожалуйста, обратитесь к администратору.',
];

78
lang/ru/events.php Executable file
View File

@@ -0,0 +1,78 @@
<?php
return [
'title' => 'Мероприятия',
'no_events' => 'Мероприятия не найдены.',
'no_upcoming' => 'Нет предстоящих мероприятий.',
'upcoming_title' => 'Ближайшие мероприятия',
'cancelled_label' => 'Отменено',
'draft_label' => 'Черновик',
'cancelled_banner' => 'Это мероприятие отменено.',
'draft_banner' => 'Черновик — виден только администраторам.',
'back_to_list' => 'К списку мероприятий',
// Детали
'description' => 'Описание',
'plan_route' => 'Построить маршрут',
'start_navigation' => 'Начать навигацию',
// Участники
'participants' => 'Участники',
'confirmations' => 'Подтвердили',
'rejections' => 'Отклонили',
'open_responses' => 'Ожидают ответа',
'participation_updated' => 'Участие обновлено.',
// Питание
'catering' => 'Питание / Снабжение',
'bring_something' => 'Принесу что-нибудь',
'bring_nothing' => 'Ничего не принесу',
'catering_note_placeholder' => 'Например, принесу торт',
'no_catering_yet' => 'Пока никто не записался на питание.',
'catering_updated' => 'Статус питания обновлён.',
// Хронометрист
'timekeeper' => 'Хронометрист',
'timekeeper_yes' => 'Да, могу',
'timekeeper_no' => 'Нет',
'catering_short' => 'Кейтеринг',
'timekeeper_short' => 'Хронометрист',
'no_timekeeper_yet' => 'Хронометрист ещё не назначен.',
'timekeeper_updated' => 'Статус хронометриста обновлён.',
// Комментарии
'comments' => 'Комментарии',
'comment_placeholder' => 'Написать комментарий...',
'no_comments' => 'Пока нет комментариев.',
'comment_deleted' => '[Удалён]',
'confirm_delete_comment' => 'Удалить комментарий?',
'comment_added' => 'Комментарий добавлен.',
'comment_removed' => 'Комментарий удалён.',
// Главная
'hello_user' => 'Привет, :name!',
'upcoming_events' => 'Ближайшие мероприятия',
// Календарь
'calendar' => 'Календарь',
'today' => 'Сегодня',
'month_view' => 'Месяц',
'year_view' => 'Год',
// Файлы
'files' => 'Файлы',
'download' => 'Скачать',
'no_files' => 'Файлы не прикреплены.',
// Соперник и счёт
'opponent' => 'Соперник',
'score' => 'Счёт',
'score_home' => 'Хозяева',
'score_away' => 'Гости',
'vs' => 'против',
// Staff visibility
'signed_up' => 'записался',
'withdrawn' => 'отказался',
'deleted_label' => 'удалён',
];

6
lang/ru/pagination.php Executable file
View File

@@ -0,0 +1,6 @@
<?php
return [
'previous' => '&laquo; Назад',
'next' => 'Далее &raquo;',
];

14
lang/ru/passwords.php Executable file
View File

@@ -0,0 +1,14 @@
<?php
return [
'reset' => 'Ваш пароль был сброшен.',
'sent' => 'Мы отправили вам ссылку для сброса пароля.',
'throttled' => 'Пожалуйста, подождите перед повторной попыткой.',
'token' => 'Токен сброса пароля недействителен.',
'user' => 'Пользователь с таким адресом электронной почты не найден.',
'reset_subject' => 'Сброс пароля — :app',
'reset_greeting' => 'Здравствуйте, :name,',
'reset_line1' => 'Вы получили это письмо, потому что был отправлен запрос на сброс пароля вашей учётной записи.',
'reset_line2' => 'Эта ссылка для сброса пароля действительна :count минут.',
'reset_line3' => 'Если вы не запрашивали сброс пароля, просто проигнорируйте это письмо.',
];

44
lang/ru/profile.php Executable file
View File

@@ -0,0 +1,44 @@
<?php
return [
'title' => 'Мой профиль',
'name_label' => 'Имя',
'email_label' => 'Эл. почта',
'email_readonly' => 'Адрес электронной почты нельзя изменить.',
'phone_label' => 'Телефон (мобильный)',
'role_label' => 'Роль',
'language_label' => 'Язык',
'my_children' => 'Мои дети',
'updated' => 'Профиль обновлён.',
// Фото профиля
'profile_picture' => 'Фото профиля',
'upload_picture' => 'Загрузить фото',
'remove_picture' => 'Удалить фото',
'max_picture_size' => 'Макс. 2 МБ (JPG, PNG, GIF, WEBP)',
// Согласие GDPR
'dsgvo_title' => 'Согласие на обработку данных (GDPR)',
'dsgvo_description' => 'Загрузите подписанное согласие в виде фото или PDF. Одно согласие действует для обоих родителей совместно.',
'dsgvo_upload' => 'Загрузить согласие',
'dsgvo_replace' => 'Заменить',
'dsgvo_remove' => 'Удалить согласие',
'dsgvo_file_hint' => 'PDF или изображение (макс. 10 МБ)',
'dsgvo_uploaded' => 'Согласие загружено.',
'dsgvo_removed' => 'Согласие удалено.',
'dsgvo_view' => 'Просмотр',
'dsgvo_confirmed' => 'Подтверждено',
'dsgvo_pending' => 'Ожидание подтверждения админом/тренером',
'dsgvo_confirmed_by' => 'Подтверждено :name :date',
'dsgvo_confirm_remove' => 'Действительно удалить согласие? Существующее подтверждение также будет сброшено.',
// Удаление аккаунта
'danger_zone' => 'Опасная зона',
'delete_account' => 'Удалить аккаунт',
'delete_account_hint' => 'Ваш профиль будет деактивирован и может быть восстановлен администратором в течение 7 дней. Исторические данные (комментарии, участие) сохраняются.',
'delete_warning_children' => 'Внимание: Вы единственный родитель следующих детей. Они тоже будут деактивированы:',
'delete_confirm' => 'Вы действительно хотите удалить свой аккаунт? Это может отменить только администратор.',
'account_deleted' => 'Ваш аккаунт удалён.',
'cannot_delete_admin' => 'Аккаунт администратора не может быть удалён.',
'cannot_delete_staff' => 'Тренеры и администраторы не могут удалить аккаунт через профиль.',
];

109
lang/ru/ui.php Executable file
View File

@@ -0,0 +1,109 @@
<?php
return [
'dashboard' => 'Главная',
'events' => 'Мероприятия',
'admin' => 'Админ',
'profile' => 'Профиль',
'logout' => 'Выйти',
'back_to_app' => 'К приложению',
'login' => 'Войти',
'save' => 'Сохранить',
'cancel' => 'Отмена',
'edit' => 'Редактировать',
'delete' => 'Удалить',
'create' => 'Создать',
'filter' => 'Фильтр',
'send' => 'Отправить',
'back' => 'Назад',
'yes' => 'Да',
'no' => 'Нет',
'open' => 'Открыто',
'all_teams' => 'Все команды',
'all_types' => 'Все типы',
'upcoming' => 'Предстоящие',
'past' => 'Прошедшие',
'period' => 'Период',
'team' => 'Команда',
'type' => 'Тип',
'name' => 'Имя',
'email' => 'Эл. почта',
'password' => 'Пароль',
'role' => 'Роль',
'language' => 'Язык',
'impressum' => 'Импрессум',
'privacy' => 'Политика конфиденциальности',
'no_entries' => 'Записи отсутствуют.',
'clock' => '',
'date_format' => 'D, d.m.Y, H:i',
'date_format_long' => 'l, d. F Y, H:i',
'date_format_short' => 'd.m.Y H:i',
'date_format_date' => 'd.m.Y',
'footer_impressum' => 'Импрессум',
'footer_privacy' => 'Политика конфиденциальности',
'pwa_install_title' => 'Установить приложение',
'pwa_install_text' => 'Добавьте приложение на главный экран для быстрого доступа.',
'pwa_install_btn' => 'Установить',
'pwa_ios_steps' => 'Нажмите <strong>⋯</strong> (Меню), затем <strong>⬆</strong> (Поделиться) и выберите «На экран Домой».',
'error_403_title' => 'Доступ запрещён',
'error_403_text' => 'У вас нет прав для просмотра этой страницы.',
'error_404_title' => 'Страница не найдена',
'error_404_text' => 'Запрашиваемая страница не найдена.',
'error_500_title' => 'Ошибка сервера',
'error_500_text' => 'Произошла внутренняя ошибка. Пожалуйста, попробуйте позже.',
'back_to_dashboard' => 'На главную',
'enums' => [
'event_type' => [
'home_game' => 'Домашняя игра',
'away_game' => 'Выездная игра',
'training' => 'Тренировка',
'tournament' => 'Турнир',
'meeting' => 'Собрание',
'other' => 'Прочее',
],
'event_status' => [
'published' => 'Опубликовано',
'cancelled' => 'Отменено',
'draft' => 'Черновик',
],
'participant_status' => [
'yes' => 'Подтверждено',
'no' => 'Отклонено',
'unknown' => 'Открыто',
],
'catering_status' => [
'yes' => 'Да',
'no' => 'Нет',
'unknown' => 'Открыто',
],
'user_role' => [
'admin' => 'Администратор',
'coach' => 'Тренер',
'parent_rep' => 'Представитель родителей',
'user' => 'Родитель',
],
],
'locales' => [
'de' => 'Deutsch',
'en' => 'English',
'pl' => 'Polski',
'ru' => 'Русский',
'ar' => 'العربية',
'tr' => 'Türkçe',
],
// Баннер GDPR
'dsgvo_banner_title' => 'Требуется согласие на обработку данных (DSGVO)',
'dsgvo_banner_text' => 'Для использования этого приложения необходимо подписанное заявление о согласии на обработку данных. Пожалуйста, загрузите заявление как фото или PDF в вашем профиле. Приложение можно полноценно использовать только после загрузки.',
'dsgvo_banner_action' => 'Загрузить в профиле',
'dsgvo_banner_pending_title' => 'Согласие проверяется',
'dsgvo_banner_pending_text' => 'Ваше заявление о согласии на обработку данных отправлено и проверяется. До подтверждения администратором приложение работает в режиме чтения — участие, кейтеринг, хронометраж и комментарии заблокированы.',
'dsgvo_restricted' => 'Ваше заявление о согласии на обработку данных ещё не подтверждено. Пожалуйста, дождитесь одобрения администратором.',
'dsgvo_restricted_hint' => 'Согласие на обработку данных не подтверждено — действия заблокированы.',
// Файлы
'files' => 'Файлы',
'download' => 'Скачать',
'all' => 'Все',
'close' => 'Закрыть',
];

130
lang/ru/validation.php Executable file
View File

@@ -0,0 +1,130 @@
<?php
return [
'accepted' => ':attribute должен быть принят.',
'active_url' => ':attribute не является допустимым URL.',
'after' => ':attribute должен быть датой после :date.',
'after_or_equal' => ':attribute должен быть датой после или равной :date.',
'alpha' => ':attribute может содержать только буквы.',
'alpha_dash' => ':attribute может содержать только буквы, цифры, дефисы и подчёркивания.',
'alpha_num' => ':attribute может содержать только буквы и цифры.',
'array' => ':attribute должен быть массивом.',
'before' => ':attribute должен быть датой до :date.',
'before_or_equal' => ':attribute должен быть датой до или равной :date.',
'between' => [
'numeric' => ':attribute должен быть между :min и :max.',
'file' => ':attribute должен быть от :min до :max килобайт.',
'string' => ':attribute должен содержать от :min до :max символов.',
'array' => ':attribute должен содержать от :min до :max элементов.',
],
'boolean' => ':attribute должен быть true или false.',
'confirmed' => 'Подтверждение :attribute не совпадает.',
'date' => ':attribute не является допустимой датой.',
'date_equals' => ':attribute должен быть датой, равной :date.',
'date_format' => ':attribute не соответствует формату :format.',
'different' => ':attribute и :other должны различаться.',
'digits' => ':attribute должен содержать :digits цифр.',
'digits_between' => ':attribute должен содержать от :min до :max цифр.',
'email' => ':attribute должен быть действительным адресом электронной почты.',
'exists' => 'Выбранное значение для :attribute недопустимо.',
'file' => ':attribute должен быть файлом.',
'filled' => ':attribute должен иметь значение.',
'gt' => [
'numeric' => ':attribute должен быть больше :value.',
'file' => ':attribute должен быть больше :value килобайт.',
'string' => ':attribute должен содержать больше :value символов.',
'array' => ':attribute должен содержать больше :value элементов.',
],
'gte' => [
'numeric' => ':attribute должен быть больше или равен :value.',
'file' => ':attribute должен быть не менее :value килобайт.',
'string' => ':attribute должен содержать не менее :value символов.',
'array' => ':attribute должен содержать не менее :value элементов.',
],
'image' => ':attribute должен быть изображением.',
'in' => 'Выбранное значение для :attribute недопустимо.',
'in_array' => ':attribute не существует в :other.',
'integer' => ':attribute должен быть целым числом.',
'ip' => ':attribute должен быть действительным IP-адресом.',
'json' => ':attribute должен быть допустимой строкой JSON.',
'lt' => [
'numeric' => ':attribute должен быть меньше :value.',
'file' => ':attribute должен быть меньше :value килобайт.',
'string' => ':attribute должен содержать менее :value символов.',
'array' => ':attribute должен содержать менее :value элементов.',
],
'lte' => [
'numeric' => ':attribute должен быть меньше или равен :value.',
'file' => ':attribute должен быть не более :value килобайт.',
'string' => ':attribute должен содержать не более :value символов.',
'array' => ':attribute должен содержать не более :value элементов.',
],
'max' => [
'numeric' => ':attribute не должен превышать :max.',
'file' => ':attribute не должен превышать :max килобайт.',
'string' => ':attribute не должен содержать более :max символов.',
'array' => ':attribute не должен содержать более :max элементов.',
],
'min' => [
'numeric' => ':attribute должен быть не менее :min.',
'file' => ':attribute должен быть не менее :min килобайт.',
'string' => ':attribute должен содержать не менее :min символов.',
'array' => ':attribute должен содержать не менее :min элементов.',
],
'not_in' => 'Выбранное значение для :attribute недопустимо.',
'numeric' => ':attribute должен быть числом.',
'present' => ':attribute должен присутствовать.',
'regex' => ':attribute имеет недопустимый формат.',
'required' => ':attribute обязателен для заполнения.',
'required_if' => ':attribute обязателен, когда :other равно :value.',
'required_unless' => ':attribute обязателен, если :other не равно :values.',
'required_with' => ':attribute обязателен, когда :values указано.',
'required_with_all' => ':attribute обязателен, когда указаны :values.',
'required_without' => ':attribute обязателен, когда :values не указано.',
'required_without_all' => ':attribute обязателен, когда ни одно из :values не указано.',
'same' => ':attribute и :other должны совпадать.',
'size' => [
'numeric' => ':attribute должен быть :size.',
'file' => ':attribute должен быть :size килобайт.',
'string' => ':attribute должен содержать :size символов.',
'array' => ':attribute должен содержать :size элементов.',
],
'string' => ':attribute должен быть строкой.',
'timezone' => ':attribute должен быть допустимым часовым поясом.',
'unique' => ':attribute уже занят.',
'url' => ':attribute должен быть допустимым URL.',
'password' => [
'letters' => ':attribute должен содержать хотя бы одну букву.',
'mixed' => ':attribute должен содержать хотя бы одну заглавную и одну строчную букву.',
'numbers' => ':attribute должен содержать хотя бы одну цифру.',
'symbols' => ':attribute должен содержать хотя бы один специальный символ.',
'uncompromised' => ':attribute был найден в утечке данных. Пожалуйста, выберите другой пароль.',
],
'attributes' => [
'name' => 'Имя',
'email' => 'Эл. почта',
'password' => 'Пароль',
'password_confirmation' => 'Подтверждение пароля',
'title' => 'Заголовок',
'body' => 'Сообщение',
'type' => 'Тип',
'status' => 'Статус',
'team_id' => 'Команда',
'start_date' => 'Дата',
'start_time' => 'Время',
'location_name' => 'Место',
'address_text' => 'Адрес',
'description_html' => 'Описание',
'first_name' => 'Имя',
'last_name' => 'Фамилия',
'birth_year' => 'Год рождения',
'jersey_number' => 'Номер на форме',
'note' => 'Заметка',
'season' => 'Сезон',
'player_id' => 'Игрок',
'parent_id' => 'Родитель',
'relationship_label' => 'Родство',
],
];