/** Словарь локали «ru». Плоская правка: ключи обеих локалей обязаны совпадать. */ export const ru = { appName: 'TeleWave', nav: { dashboard: 'Эфир', admin: 'Админка', settings: 'Настройки', login: 'Войти', register: 'Регистрация', logout: 'Выйти', }, theme: { light: 'Светлая', dark: 'Тёмная', system: 'Системная' }, lang: { ru: 'RU', en: 'EN' }, common: { save: 'Сохранить', cancel: 'Отмена', retry: 'Повторить', close: 'Закрыть', delete: 'Удалить', create: 'Создать', loading: 'Загрузка…', error: 'Что-то пошло не так', search: 'Поиск', actions: 'Действия', prevPage: 'Предыдущая страница', nextPage: 'Следующая страница', yes: 'Да', no: 'Нет', }, home: { title: 'TELEWAVE', subtitle: 'ЭФИРНАЯ СЕТКА КАНАЛОВ', tagline: 'Твои каналы. Твой эфир. В любое время.', cta: 'Войти в эфир', ctaRegister: 'Создать аккаунт', }, auth: { userName: 'Имя пользователя', password: 'Пароль', loginTitle: 'Вход в эфир', loginSubtitle: 'Введите учётные данные для доступа к сетке каналов', registerTitle: 'Новый зритель', registerSubtitle: 'Создайте аккаунт, чтобы настроить свою сетку каналов', submitLogin: 'Войти', submitRegister: 'Зарегистрироваться', noAccount: 'Нет аккаунта?', haveAccount: 'Уже есть аккаунт?', registrationClosed: 'Регистрация закрыта', registrationClosedHint: 'Открытая регистрация отключена. Учётную запись может завести администратор.', invalidCredentials: 'Неверное имя пользователя или пароль', userNameTaken: 'Это имя пользователя уже занято', blocked: 'Аккаунт заблокирован администратором', genericError: 'Не удалось выполнить вход. Попробуйте ещё раз', }, air: { now: 'Сейчас', next: 'Далее', ad: 'Реклама', bumper: 'Заставка', episode: 'Серия', live: 'В эфире', volume: 'Громкость', noChannels: 'Пока нет доступных каналов. Загляните позже.', offline: 'Канал сейчас не в эфире', offlineHint: 'Нет расписания или контента. Загляните позже.', numbersHint: '↑ / ↓ — переключение каналов по номерам', retry: 'Повторить', }, settings: { title: 'Настройки аккаунта', changeUserName: 'Смена имени пользователя', newUserName: 'Новое имя пользователя', changePassword: 'Смена пароля', currentPassword: 'Текущий пароль', newPassword: 'Новый пароль', dangerZone: 'Опасная зона', deleteAccount: 'Удалить аккаунт', deleteAccountConfirm: 'Аккаунт и все данные будут удалены безвозвратно. Продолжить?', saved: 'Сохранено', }, admin: { groups: { title: 'Группы', hint: 'Группа — что может попасть в эфир. На неё ссылается слот сетки, из неё стратегия выбирает элемент.', name: 'Название', description: 'Описание', items: 'Позиций', units: 'Единиц', duration: 'Объём', hoursShort: 'ч', minutesShort: 'мин', hasFilter: 'с правилом', composition: 'Состав', empty: 'Группа пуста', orderHint: 'Порядок задаётся перетаскиванием — по нему идут последовательные стратегии.', showAdvanced: 'Дополнительно', hideAdvanced: 'Скрыть', find: 'Подобрать', addFound: 'Добавить найденное', found: 'Найдено: {{total}}, новых: {{fresh}}', added: 'Добавлено позиций: {{count}}', alreadyIn: 'уже в группе', elementKinds: { Show: 'Шоу', Collection: 'Коллекция' }, filter: { title: 'Правило набора', hint: 'Правило только ищет кандидатов — состав группы остаётся явным списком.', elementKinds: 'Что искать', showKinds: 'Тип шоу', genres: 'Жанры', genresHint: 'Любой из отмеченных.', maxAudience: 'Возраст не строже', audienceHint: 'Рейтинги упорядочены по строгости: G → PG → PG-13 → R → NC-17. Шоу без рейтинга остаются в выборке.', year: 'Год', unitMinutes: 'Длительность единицы, мин', unitMinutesHint: 'Средняя длина серии или фильма. Позиции без готовых ассетов фильтр не отбрасывает.', from: 'от', to: 'до', any: 'любой', }, }, collections: { title: 'Коллекции', hint: 'Франшиза — упорядоченный набор фильмов, который играется как одно целое.', name: 'Название', description: 'Описание', parts: 'Части', units: 'Единиц', addShow: 'Добавить шоу', empty: 'Коллекция пуста', orderHint: 'Порядок частей задаётся перетаскиванием — в нём они и пойдут в эфир.', }, interstitials: { title: 'Ролики', hint: 'Реклама, промо и джинглы. Перетащите ролики в сборку блока или в группу справа — блок сохранится коллекцией и пойдёт в эфир целиком.', upload: 'Загрузить ролики', name: 'Название', duration: 'Длительность', empty: 'Роликов пока нет', noAsset: 'Без файла', blocks: 'Блоки', noBlocks: 'Блоков пока нет', clipsCount: '{{count}} рол.', blockBuilder: 'Сборка блока', blockName: 'Название блока', blockTotal: 'Длительность блока', dropHint: 'Перетащите сюда ролики', groups: 'Группы роликов', pickGroup: 'Выберите группу', pickGroupFirst: 'Сначала выберите группу', dropToGroup: 'Перетащите сюда ролик или блок', openGroup: 'Открыть группу', newGroupName: 'Новая группа', }, genres: { title: 'Жанры', hint: 'Справочник жанров: по нему собираются группы контента, в него сводятся жанры из метаданных.', name: 'Название', slug: 'Ключ', slugHint: 'Латиницей, без пробелов — по нему жанр опознаётся при обновлении справочника.', aliases: 'Варианты написания', aliasesHint: 'Через запятую. Так жанры провайдеров сводятся к вашему: tmdb:28, action, боевик.', order: 'Порядок', usage: 'Шоу', system: 'Системный', create: 'Новый жанр', edit: 'Изменить жанр', }, roles: { title: 'Роли', name: 'Название', system: 'Системная', create: 'Новая роль', rename: 'Переименовать', }, users: { title: 'Пользователи', userName: 'Имя пользователя', role: 'Роль', status: 'Статус', createdAt: 'Регистрация', blocked: 'Заблокирован', active: 'Активен', block: 'Заблокировать', unblock: 'Разблокировать', resetPassword: 'Пароль', resetPasswordFor: 'Сменить пароль: {{name}}', newPassword: 'Новый пароль', passwordReset: 'Пароль изменён', filterAll: 'Все роли', createTitle: 'Создать пользователя', password: 'Пароль', passwordHint: 'Минимум 8 символов, хотя бы одна цифра и заглавная буква.', create: 'Создать', created: 'Пользователь создан', }, media: { title: 'Медиа', upload: 'Загрузить', manualButton: 'Из папки manual', manualTitle: 'Ручной разбор папки manual', manualHint: 'Файлы из manual/ не разбираются сканером — выберите нужные и укажите шоу. Импортированные файлы уходят из папки, как и из inbox.', manualSelectAll: 'Выбрать все', manualSelected: 'Выбрано: {{count}}', manualEmpty: 'В папке manual пусто', regexPickHint: 'Кликните число в имени файла — по нему соберётся правило для всех файлов:', regexPickTitle: 'Это номер серии', regexPresets: 'Готовые:', regexPresetNames: { seriesWord: 'Серия N', episodeWord: 'Эпизод N', seasonEpisode: 'SxxEyy', afterDash: 'после тире', firstNumber: 'первое число', }, regexClear: 'сбросить', manualAlready: 'уже в библиотеке', manualRoot: 'корень manual/', manualRecognized: 'Распознано: {{count}} из {{total}}', manualCleanupHint: 'Файлы уйдут из папки, спутники (субтитры, nfo) и опустевший каталог будут удалены.', manualTruncated: 'Показаны первые 500 файлов — в папке есть ещё.', manualShow: 'Шоу', manualDetected: 'Определено по имени релиза — проверьте и поправьте, если не то.', manualPickShow: 'Выберите шоу', manualImport: 'Забрать в шоу', manualImported: 'Импортировано файлов: {{count}}', uploadToShow: 'Загрузить в шоу', toShowTitle: 'Загрузить и добавить в шоу', autoDetectHint: 'Каждый файл привяжется к шоу, чьё оригинальное (или отображаемое) название есть в имени релиза, напр. «The.Simpsons.S33E01…» → The Simpsons.', toShowLibrary: 'В библиотеку', toShowSeason: 'Сезон (вручную)', toShowAuto: 'авто', toShowRegex: 'Regex серии', toShowRegexInvalid: 'некорректный regex', toShowHint: 'Сезон и regex — необязательны: обычно номера распознаются сами (см. ниже). Regex: 1 группа = серия, 2 группы = сезон и серия. Пример: ^(\\d+) для «01. Название.mkv».', toShowPreview: 'Что распознаем', toShowMatched: 'шоу распознано у {{matched}} из {{total}}', applyToAll: 'Задать всем…', toShowUnknown: '—', toShowConfirm: 'Загрузить и добавить', uploadedCount: 'Загружено файлов: {{count}}', uploadingCount: 'Загрузка {{done}}/{{total}}', cancelAll: 'Отменить все загрузки', skippedDuplicates: 'Пропущено дубликатов: {{count}}', filterActive: 'Активные', filterAll: 'Все', name: 'Файл', status: 'Статус', duration: 'Длительность', resolution: 'Разрешение', processingTime: 'Время обработки', empty: 'Пока нет загруженных файлов', statuses: { Pending: 'В очереди', Processing: 'Обработка', Ready: 'Готов', Failed: 'Ошибка', }, stats: { queued: 'Сейчас в очереди', queuedShort: 'В очереди', processing: 'Сейчас в обработке', processingShort: 'В обработке', average: 'Среднее время обработки (по недавним)', averageShort: 'Ср. время', }, }, gallery: { title: 'Галерея', upload: 'Загрузить', empty: 'В этой категории пока нет изображений', pickHint: 'Выберите изображение или загрузите новое', browseHint: 'Все изображения приложения по категориям', sort: { newest: 'Сначала новые', oldest: 'Сначала старые', nameAsc: 'Имя: А–Я', nameDesc: 'Имя: Я–А', }, categories: { Library: 'Библиотека', ShowPoster: 'Постеры шоу', EpisodeStill: 'Кадры серий', BumperBackground: 'Фоны заставок', }, }, shows: { title: 'Шоу', name: 'Название', originalName: 'Оригинальное название (eng)', kind: 'Тип', kinds: { Series: 'Сериал', Single: 'Полнометражка', Interstitial: 'Ролик' }, audience: 'Рейтинг', audienceUnset: 'Не проставлен', audiences: { G: 'G — без ограничений', PG: 'PG — с родителями', 'PG-13': 'PG-13 — с 13 лет', R: 'R — с 17 со взрослым', 'NC-17': 'NC-17 — только взрослым', }, seasons: 'Сезоны', loadedSeasons: 'Загружены сезоны', genre: 'Жанр', allGenres: 'Все жанры', genresEmpty: 'Жанры не проставлены', genresEdit: 'Жанры', genresHint: 'Отметьте жанры шоу. Основной показывается в списке; в отборе контента участвуют все.', genrePrimary: 'основной', inCollections: 'Входит в коллекции', episodes: 'Серии', episode: 'Серия', noEpisodes: 'Серий пока нет', filterAssets: 'Фильтр по имени, напр. Family.Guy.S16', selectAll: 'Выбрать все', deselectAll: 'Снять все', addSelected: 'Добавить выбранные', noMatches: 'Нет подходящих файлов', addedCount: 'Добавлено серий: {{count}}', candidatesTruncated: 'Показаны не все файлы (слишком много готовых ассетов) — уточните фильтр, чтобы увидеть остальные.', }, channels: { number: 'Номер', numberPlaceholder: 'не задан', utcOffset: 'Часовой пояс, ч', utcOffsetHint: 'Целыми часами: 3 — Москва, 0 — UTC, −5 — Нью-Йорк. В этом времени задаётся вся сетка и показывается расписание.', dayStart: 'Начало вещательных суток', dayStartHint: 'Ночной блок до этого времени относится к предыдущему дню.', disabled: 'выключен', layers: 'Слои', layersHint: 'Побеждает слой с большим приоритетом. Фоновый лежит под всеми и закрывает дыры.', background: 'фон', newLayerName: 'Новый слой', addSlotHere: 'Добавить слот', newSlot: 'Новый слот', editSlot: 'Слот', slotTitle: 'Название блока', slotStart: 'Начало', slotDuration: 'Бюджет, мин', weekday: 'День недели', everyDay: 'каждый день', daypart: 'Дейпарт', slotKind: 'Тип слота', group: 'Группа', pickGroup: 'выберите группу', strategy: 'Стратегия', cooldownDays: 'Остывание, дней', cooldownHint: 'Не брать то, что уже выходило за этот срок.', blockMode: 'Блок', blockValue: 'Значение', overflow: 'Если не помещается', overflowHint: 'Как поступить с элементом, который не влезает в бюджет слота.', repeatDaysAgo: 'Суток назад', repeatTime: 'Время', repeatDuration: 'Длительность, мин', anchor: 'Якорь', anchorHint: 'Якорь держит старт жёстко: через него не переносят то, что не влезает. Округление мягкое — сдвигает старт до круглого времени, если это укладывается в допуск.', maxDrift: 'Допуск, мин', snap: 'Округление', snapOff: 'нет', bumperConditionsHint: 'Как часто ставить заставку и на каких переходах — условия элемента стыка, а не настройка канала.', resizeSlot: 'Потянуть за край — длительность', copyDay: 'Копировать день', copyDayFrom: 'Копировать {{day}} в:', copy: 'Копировать', layerVisible: 'Показывать слой', layerName: 'Название слоя', layerApplicability: 'Когда действует', applicabilityHint: 'Разделы объединяются по ИЛИ: слой действует, если дата подходит хотя бы под одно условие. Ничего не заполнено — действует всегда.', applicabilityWeekdays: 'Дни недели', applicabilityDateRanges: 'Диапазоны дат', applicabilityAnnual: 'Ежегодно (месяц / день)', applicabilityDates: 'Конкретные даты', applicabilityNone: 'не задано', showForDate: 'Сетка на дату', allDates: 'Все слои', tabs: { grid: 'Сетка', rules: 'Правила', junctions: 'Стыки', bumpers: 'Заставки', viewer: 'Зритель', settings: 'Настройки', air: 'Эфир', }, noTemplate: 'Сетка канала не загрузилась', createTemplate: 'Создать сетку', createTemplateHint: 'Появится пустая сетка с фоновым слоем — дальше добавляйте слои и слоты.', rules: 'Правила отбора', rulesHint: 'Жёсткие фильтры: отсекают неподходящее до жребия. Как и правка сетки, эфир не двигают — нужно применить.', audienceWindows: 'Детское время', noAudienceWindows: 'Окон нет — возраст ничем не ограничен.', audienceWindowsHint: 'В окне в эфир идёт контент не строже выбранной категории. Окно может переходить через полночь. Контент без категории не отсекается.', from: 'С', to: 'До', maxAudience: 'Не строже', repeatLimit: 'Потолок повторов', repeatWindowDays: 'Окно, суток', repeatMax: 'Не чаще, раз', repeatLimitHint: 'Считается по уже записанной ленте. Если потолка достигли все кандидаты, слот всё равно заполняется: пустой эфир хуже раннего повтора.', preview: 'Предпросмотр', previewHide: 'Свернуть предпросмотр', previewHint: 'Прогон по текущим правилам: ничего не пишется, курсоры слотов не двигаются.', previewDays_one: '{{count}} сутки', previewDays_few: '{{count}} суток', previewDays_many: '{{count}} суток', previewTabs: { programme: 'Программа', tape: 'Лента', problems: 'Проблемы' }, noProblems: 'Проблем нет', andMore: 'и ещё {{count}}', heatmap: 'Повторы: шоу × сутки', heatmapTotal: 'всего', issues: 'Проверки: ошибок {{errors}}, предупреждений {{warnings}}', goToSlot: 'к слоту', issueKinds: { GroupEmpty: 'Пустая группа', GroupTooSmall: 'Мало контента', GridGap: 'Дыра в сетке', SlotOverlap: 'Слоты пересекаются', CooldownUnreachable: 'Недостижимое остывание', AudienceConflict: 'Возрастной конфликт', GroupMissing: 'Группа не выбрана', }, viewer: 'Как выглядит у зрителя', viewerHint: 'Оверлеи рисуются поверх картинки на клиенте — видео не перекодируется. Всё по умолчанию выключено.', logo: 'Логотип', noLogo: 'нет', pickLogo: 'Выбрать логотип', logoCorner: 'Угол', logoOpacity: 'Прозрачность', corners: { TopLeft: 'Слева вверху', TopRight: 'Справа вверху', BottomLeft: 'Слева внизу', BottomRight: 'Справа внизу', }, showClock: 'Показывать часы', analogFilter: 'Аналоговый фильтр', analogFilterHint: 'Сила 0..1. Ноль — выключен; переборщить очень легко.', whyHere: 'Почему это здесь', priority: 'приоритет', traceLayer: 'Слой', traceSlot: 'Слот', traceGroup: 'Группа', traceCollection: 'Коллекция', traceStrategy: 'Стратегия', traceJunction: 'Врезки', traceDrift: 'дрейф {{minutes}} мин', traceSnapped: 'старт округлён', traceCooldown: 'остывание {{days}} дн.', traceCandidates: 'кандидатов после остывания: {{count}}', diffSummary: 'Затронет {{total}} записей, изменятся {{changed}}', diffSoon: 'В ближайшие сутки изменится записей: {{count}}', diffNoChanges: 'Эфир не изменится', copyTemplate: 'Скопировать сетку с канала', pickSourceChannel: 'Выберите канал-источник', copyHere: 'Скопировать сюда', copyTemplateHint: 'Слои, слоты, стыки и правила выбранного канала заменят сетку этого канала. Группы общие и не копируются.', copyTemplateConfirm: 'Текущая сетка этого канала будет заменена сеткой выбранного канала. Продолжить?', templateCopied: 'Скопировано: слоёв {{layers}}, слотов {{slots}}', copyDroppedBumpers: 'Врезок без блока заставки: {{count}} — донастройте руками', postChecks: 'Пост-проверки', breakLimit: 'Потолок врезок в час, мин', genreShare: 'Потолок доли жанра за сутки, %', fallbackShare: 'Потолок доли фона, %', postChecksHint: 'Пост-проверки считаются по готовой ленте и только предупреждают — ничего не переигрывается.', previewKinds: { Program: 'Программа', Fallback: 'Фон', SignOff: 'Конец вещания', Ad: 'Реклама', Promo: 'Анонс', Bumper: 'Заставка', }, previewLoad: 'Врезки по часам, пик — {{peak}} мин', junctions: 'Стыки', junctionsHint: 'Что играет между программами: реклама, анонсы, заставки. Слот может взять свой стык, иначе берётся стык по умолчанию.', defaultJunction: 'Стык по умолчанию', noJunction: 'без стыка', newJunctionName: 'Новый стык', addJunctionElement: '+ врезка', junctionEmpty: 'пусто', junctionFrom: 'конец', junctionTo: 'начало', junctionElement: 'Врезка', junctionKind: 'Тип', junctionKinds: { Ad: 'Реклама', Promo: 'Анонс', Bumper: 'Заставка', Filler: 'Заполнитель', }, junctionAmountMode: 'Чем меряется', junctionAmountModes: { Count: 'Единиц', Duration: 'Минут' }, junctionCount: 'Сколько единиц', junctionMinutes: 'Сколько минут', junctionAmountHint: 'В смешанной группе (ролики и готовые блоки) считайте минутами: одна «единица» там — то ли ролик, то ли блок.', junctionRequired: 'Обязательная — не выбрасывать при нехватке времени', junctionOnlyOnChange: 'Только при смене шоу', junctionMinInterval: 'Не чаще, чем раз в, мин', junctionMinIntervalHint: '0 — без ограничения.', junctionBetween: 'Стык внутри слота', junctionAfter: 'Стык после слота', junctionDefault: 'по умолчанию', bumperTemplate: 'Блок заставки', pickBumperTemplate: 'выберите блок', minutesShort: ' мин', pendingChanges: 'Правила изменены — эфир идёт по старым.', apply: 'Применить', applied: 'Эфир пересобран, записей: {{count}}', weekdays: { 0: 'Вс', 1: 'Пн', 2: 'Вт', 3: 'Ср', 4: 'Чт', 5: 'Пт', 6: 'Сб', }, dayparts: { Morning: 'Утро', Day: 'День', Prime: 'Прайм', Night: 'Ночь' }, slotKinds: { Content: 'Контент', Repeat: 'Повтор', SignOff: 'Конец вещания' }, blockModes: { Count: 'Единиц', Duration: 'Минут', FillSlot: 'Весь слот' }, overflows: { ContinueNext: 'Доиграть в следующий раз', ExtendSlot: 'Растянуть слот', SkipIfNotFits: 'Не начинать', }, strategies: { Sequential: 'По порядку', RandomWithCooldown: 'Случайно с остыванием', Fixed: 'Фиксированный элемент', }, warnings: { SlotEmpty: 'Слот не дал контента', DriftExceeded: 'Старт ушёл за допуск', CooldownExhausted: 'Остывание отсекло всех', RepeatSourceEmpty: 'Нечего повторять', FallbackEmpty: 'Нечем закрыть паузы', CandidatesFiltered: 'Возрастной потолок отсёк всех', BreakLimitExceeded: 'Врезок в часе больше потолка', GenreShareExceeded: 'Доля жанра выше нормы', FallbackShareExceeded: 'Фона в эфире больше нормы', }, title: 'Каналы', name: 'Название', slug: 'Slug', state: 'Состояние', enabled: 'В эфире', enabledLabel: 'Канал в эфире', settings: 'Настройки', bumpers: 'ТВ-заставки', bumpersLabel: 'Заставки на переходах', bumpersHint: 'Короткая заставка «Сейчас / Далее» между разными шоу', bumperSelection: 'Выбор блока', bumperSelectionRandom: 'Случайно', bumperSelectionWeighted: 'Случайно взвешенный', bumperSelectionAlwaysFirst: 'Всегда первый', bumperFont: 'Шрифт', bumperFontSans: 'Гротеск', bumperFontSerif: 'Антиква', bumperNowLabel: 'Подпись «Сейчас»', bumperNextLabel: 'Подпись «Далее»', bumperBg: 'Фон (цвет 1)', bumperBg2: 'Фон (цвет 2)', bumperAccent: 'Акцент', bumperText: 'Текст', bumperTemplates: 'Блоки заставок', bumperTemplatesHint: 'Каждый блок — свой звук и оформление. Первый блок дефолтный, его нельзя удалить. Длительность заставки — по длине звука.', bumperAddTemplate: 'Добавить блок', bumperTemplateName: 'Название', bumperVariants: 'Подблоки (текст)', bumperVariantsHint: 'Разный текст на одной музыке и оформлении блока. Правило показа — у каждого подблока своё.', bumperAddVariant: 'Добавить текст', bumperVariantName: 'Название', bumperTextKind: 'Режим текста', bumperKindNowNext: 'Сейчас / Далее', bumperKindFree: 'Свободный текст', bumperLine1: 'Строка 1', bumperLine2: 'Строка 2', bumperTrigger: 'Показывать', bumperTriggerOnShowChange: 'При смене шоу', bumperTriggerBetweenEpisodes: 'Между сериями', bumperTriggerBoth: 'Оба', bumperVariantWeight: 'Вес', bumperVariantWeightHint: 'Для стратегии «случайно взвешенный»: чем больше — тем чаще (0 — не выбирается)', bumperDefault: 'по умолчанию', bumperSeconds: 'с', bumperDefaultDuration: '≈8 с (джингл)', bumperAudio: 'Звук', bumperAudioHint: 'Звук заставки; иначе — синтезированный джингл', bumperPreview: 'Отрендерить примеры', bumperPreviewRendering: 'Рендерим…', bumperPreviewHint: 'Примеры всех подблоков со звуком и анимацией (примерные названия шоу). Использует сохранённые настройки.', bumperBackground: 'Фон-картинка', bumperBackgroundHint: 'Картинка фона; иначе — постер шоу или градиент', bumperBackgroundPick: 'Выбрать из галереи', bumperFileLoaded: 'загружено', bumperFileDefault: 'по умолчанию', bumperUpload: 'Загрузить', bumperReset: 'Сбросить', filler: 'Заглушка', noFiller: 'Без заглушки', noSchedule: 'Расписание ещё не построено', }, maintenance: { title: 'Обслуживание', warning: 'Операции необратимы — удаляют данные и файлы навсегда.', clearMedia: 'Очистить все медиа', clearMediaHint: 'Удалит все загруженные файлы и их нарезку, а также расписание каналов.', confirmClearMedia: 'Удалить ВСЕ медиа-файлы безвозвратно?', clearShowMedia: 'Удалить медиа шоу', clearShowMediaHint: 'Удалит файлы всех серий выбранного шоу и очистит его серии.', confirmClearShowMedia: 'Удалить все медиа выбранного шоу безвозвратно?', pickShow: 'Выберите шоу', deleteShows: 'Удалить все шоу', deleteShowsHint: 'Удалит все шоу и их серии. Медиа-файлы останутся в библиотеке.', confirmDeleteShows: 'Удалить ВСЕ шоу безвозвратно?', doneCount: 'Удалено: {{count}}', }, settings: { title: 'Настройки', registration: 'Регистрация', registrationHint: 'Когда выключено — новые пользователи не могут регистрироваться сами, учётки заводит только администратор.', registrationLabel: 'Разрешить регистрацию на сайте', preferredAudio: 'Предпочитаемые озвучки', channelNumbers: 'Переключение каналов по номерам', channelNumbersHint: 'Зритель переключает каналы стрелками, как на телевизоре. Сетка каналов остаётся всегда.', preferredAudioHint: 'Коды языков через запятую в порядке приоритета (напр. «rus, eng»). Если в файле есть дорожка с таким языком — при обработке выбирается она (по порядку); иначе — выбор ffmpeg по умолчанию. Применяется к новым обработкам.', }, metadata: { title: 'Метаданные', pickPoster: 'Из галереи', name: 'Название', originalName: 'Оригинальное название (eng)', originalNamePlaceholder: 'Например: Family Guy', originalNameHint: 'По нему ищутся метаданные; на экранах показывается обычное название.', sourceLabel: 'Источник', searchBtn: 'Искать', nothingFound: 'Ничего не найдено', apply: 'Применить', applied: 'Метаданные применены', overview: 'Описание', year: 'Год', clear: 'Очистить', noPoster: 'Нет постера', refreshEpisodes: 'Обновить серии', refreshing: 'Обновляем…', refreshedCount: 'Обновлено серий: {{count}}', findMissing: 'Найти отсутствующие серии', missingTitle: 'Отсутствующие серии', missingNoSeasons: 'В шоу нет загруженных серий с распознанными номерами.', seasonN: 'Сезон {{n}}', loadedOf: 'загружено {{loaded}} из {{total}}', missingUnknown: 'Источник не отдал число серий этого сезона.', missingNone: 'Все серии на месте.', missingList: 'Не хватает', }, }, }