goosemusic 1.3.2

A music player with YouTube search, local playback, and OS media controls
use super::Strings;
use crate::providers::ProviderId;

pub const STRINGS: Strings = Strings {
    search: "Поиск",
    downloads: "Загрузки",
    settings: "Настройки",
    library: "Библиотека",
    nothing_saved_yet: "Пока ничего не сохранено",
    new_playlist_name: "Название нового плейлиста",

    queue: "Очередь",
    recently_played: "Недавние",
    now_playing_from: "Сейчас играет из",
    now_playing: "Сейчас играет",
    up_next: "Далее",
    no_track_playing: "Ничего не воспроизводится",
    no_more_tracks_in_queue: "В очереди больше нет треков",
    no_recently_played_tracks: "Нет недавно воспроизведённых треков",

    not_playing: "Не воспроизводится",
    no_tracks_found: "Треки не найдены",

    searching: "Поиск…",
    loading: "Загрузка…",
    load_more: "Загрузить ещё",
    no_results_found: "Результаты не найдены",
    no_recent_searches: "Нет недавних поисков",
    generating_radio: "Создание радио…",

    not_an_artist_page: "Это не страница исполнителя",
    provided_by: "Предоставлено",
    retry: "Повторить",
    nothing_here: "Здесь ничего нет",
    most_popular_songs: "Самые популярные треки",
    albums: "Альбомы",
    playlists: "Плейлисты",
    fans_also_like: "Также нравится фанатам",

    looking_up_lyrics: "Поиск текста…",
    play_a_track_for_lyrics: "Воспроизведите трек, чтобы увидеть его текст.",
    lyrics_selectable: "Выделяемый",
    lyrics_synced: "Синхронизирован",
    lyrics_plain: "Обычный",
    lyrics_translations: "Переводы",
    lyrics_original: "Оригинал",
    add_custom: "Добавить текст",
    lyrics_name: "Название",
    translate_with_ai: "Перевести с ИИ",
    translate_title: "Перевод текста с помощью ИИ",
    translate_language_lbl: "Целевой язык",
    translate_prompt_lbl: "Промпт",
    translate_submit: "Перевести",
    translate_reset: "Сбросить промпт",
    translating: "Перевод…",
    translation_ready: "Перевод готов — проверьте и сохраните",
    translation_language_empty: "Введите целевой язык",
    no_lyrics_to_translate: "Для этого трека нет текста для перевода.",
    translation_not_configured: "Укажите URL сервера и модель в настройках.",
    translation_failed: |e| format!("Ошибка перевода: {e}"),
    sec_translation: "ИИ-перевод",
    translation_base_url_lbl: "URL сервера (OpenAI-совместимый)",
    translation_api_key_lbl: "API-ключ (пусто для локальных серверов)",
    translation_model_lbl: "Модель",
    translation_refresh_models: "Запросить список моделей",
    translation_no_models: "На этом сервере модели не найдены.",
    translation_models_failed: |e| format!("Не удалось загрузить список моделей: {e}"),
    edit_lyrics: "Изменить текст",
    lyrics_editor_hint: "Одна строка на строку текста. Добавьте [mm:ss.xx] в начало для синхронизации или оставьте как есть. Добавьте строку `# note` под любой строкой, чтобы показать заметку под текстом.",

    playlist_not_found: "Плейлист не найден",
    add_local: "Добавить локальный",
    downloaded_tracks: "Загруженные треки",
    no_downloaded_tracks: "Нет загруженных треков",

    ctx_play: "Играть",
    ctx_play_local: "Играть локально",
    ctx_edit: "Изменить",
    ctx_go_to_artist: "Перейти к исполнителю",
    ctx_add_to_queue: "Добавить в очередь",
    ctx_add_to_playlist: "Добавить в плейлист",
    ctx_download: "Скачать",
    ctx_song_radio: "Радио трека",
    ctx_artist_radio: "Радио исполнителя",
    ctx_remove_from_queue: "Убрать из очереди",
    ctx_remove_from_playlist: "Убрать из плейлиста",
    ctx_remove_from_recent: "Убрать из недавних",
    ctx_clear_cache: "Очистить кэш",
    sub_play_via: "Играть через",
    sub_download_from: "Скачать из",
    sub_via: "Через",
    sub_on: "На",
    sub_clear_cache_from: "Очистить из",
    via_search_suffix: "(поиск)",

    current: "(текущий)",
    select: "выбрать",
    find: "Найти",
    finding: "Поиск…",
    found_on: |p| format!("Найдено на {p}"),
    not_linked: "Не привязано",
    providers: "Поставщики",
    no_provider_data: "У этого трека нет данных поставщика.",
    save: "Сохранить",
    cancel: "Отмена",
    edit_track: "Изменить трек",
    lbl_title: "Название",
    lbl_artist: "Исполнитель",
    ph_track_title: "Название трека",
    ph_track_artist: "Исполнитель трека",
    delete: "Удалить",
    delete_playlist_q: "Удалить плейлист?",
    tracks_wont_be_deleted: "Треки не будут удалены.",
    lbl_id: "ID",
    lbl_url: "URL",
    lbl_artist_id: "Id исполнителя",
    lbl_duration_secs: "Длительность (в секундах)",
    lbl_thumbnail: "Обложка",
    lbl_album: "Альбом",

    sec_playback: "Воспроизведение",
    sec_storage: "Хранилище",
    sec_history: "История",
    sec_appearance: "Внешний вид",
    sec_dependencies: "Зависимости",
    theme_lbl: "Тема",
    language_lbl: "Язык",
    default_provider_lbl: "Поставщик потоковой передачи и загрузки по умолчанию",
    cookie_browser_lbl: "Cookies браузера (видео с возрастным ограничением)",
    cookies_off: "Выкл",
    normalize_volume_lbl: "Нормализовать громкость между треками",
    download_dir_lbl: "Папка загрузок",
    cache_size_lbl: "Макс. размер кэша потока (МБ)",
    hist_rows_lbl: "Строк истории поиска показано",
    hist_entries_lbl: "Сохраняемых записей истории поиска",
    recent_kept_lbl: "Сохраняемых недавно воспроизведённых треков",
    reset_defaults: "Сбросить",

    find_in_list: "Найти в списке…",
    scope_songs: "Треки",
    scope_videos: "Видео",
    scope_artists: "Исполнители",
    scope_albums: "Альбомы",
    scope_playlists: "Плейлисты",
    radio_word_song: "трек",
    radio_word_artist: "исполнитель",

    lyrics_copied: "Текст скопирован в буфер обмена",
    saved_to_library: "Сохранено в библиотеку",
    removed_from_library: "Удалено из библиотеки",
    no_lyrics_found: "Для этого трека текст не найден.",
    lyrics_saved: "Свой текст сохранён",
    lyrics_deleted: "Свой текст удалён",
    lyrics_empty: "Текст не может быть пустым",
    lyrics_name_empty: "Дайте тексту название",
    select_playlist_drop: "Выберите плейлист, чтобы бросить в него треки",
    reordered_playlist: "Плейлист переупорядочен",
    max_panes_reached: "Достигнуто максимальное число панелей",

    n_saved: |n| format!("Сохранено: {n}"),
    n_plays: |n| format!("{} воспроизведений", crate::util::format_count(n)),
    search_placeholder: |p| match p {
        ProviderId::YouTube => "Искать в YouTube Music…".into(),
        ProviderId::Local => "Искать…".into(),
        other => format!("Искать в {}", other.label()),
    },
    added: |n| format!("Добавлено: {}", ru_tracks(n)),
    added_to: |n, to| format!("Добавлено: {} в {to}", ru_tracks(n)),
    removed_n: |n| format!("Удалено: {}", ru_tracks(n)),
    removed_from: |n, from| format!("Удалено: {} из {from}", ru_tracks(n)),
    pasted_into: |n, into| format!("Вставлено: {} в {into}", ru_tracks(n)),
    saved_title: |t| format!("«{t}» сохранено в библиотеку"),
    playlist_created: |n| format!("Плейлист «{n}» создан"),
    added_local: |n| format!("Добавлено: {} (выберите плейлист для упорядочивания)", ru_tracks(n)),
    downloading_n: |n| format!("Загрузка {}", ru_tracks(n)),
    resolving_on: |title, p| format!("Разрешение «{title}» на {p}"),
    resolving_player_client: "Подбор совместимого плеер-клиента…",
    resolved_player_client: |c| format!("Выбран плеер-клиент: {c}"),
    player_client_unavailable: "Совместимый плеер-клиент не найден, используется по умолчанию…",
    provider_no_radio: |p| format!("{p} не поддерживает радио"),
    generating_radio_for: |w, name| format!("Создание радио для {w}: {name}"),
    could_not_find_on: |name, p| format!("Не удалось найти «{name}» на {p}"),
    opening: |l| format!("Открытие: {l}"),
    opening_artist: |name| format!("Открытие исполнителя: {name}"),
    download_complete: |path| format!("Загрузка завершена! Сохранено в {path}"),
    failed_resolve_on: |title, p, e| format!("Не удалось разрешить «{title}» на {p}: {e}"),
    couldnt_load: |e| format!("Не удалось загрузить: {e}"),
    couldnt_load_lyrics: |e| format!("Не удалось загрузить текст: {e}"),
    search_failed: |e| format!("Ошибка поиска: {e}"),
    cache_cleared_for: |p| format!("Кэш очищен для {p}"),
    radio_label: |w, name| format!("Радио ({w}): {name}"),
    ctx_add_to_playlist_n: |n| format!("Добавить {} в плейлист", ru_tracks(n)),
    ctx_add_to_queue_n: |n| format!("Добавить {} в очередь", ru_tracks(n)),
    ctx_download_n: |n| format!("Скачать {}", ru_tracks(n)),
    ctx_remove_from_queue_n: |n| format!("Убрать {} из очереди", ru_tracks(n)),
    ctx_remove_from_playlist_n: |n| format!("Убрать {} из плейлиста", ru_tracks(n)),
    ctx_remove_from_recent_n: |n| format!("Убрать {} из недавних", ru_tracks(n)),

    import_playlist: "Импорт плейлиста",
    import_method_native: "Нативный",
    import_method_filelist: "Список файлов",
    import_method_csv: "CSV",
    import_native_hint: "Импортирует плейлисты из файла playlists.json.",
    import_csv_name_col: "Столбец названия",
    import_csv_artist_col: "Столбец исполнителя",
    import_csv_album_col: "Столбец альбома",
    import_csv_preset: "Пресет",
    import_csv_preset_default: "По умолчанию",
    import_csv_preset_exportify: "Exportify",
    import_csv_exportify_note: "Поддерживает плейлисты Spotify, экспортированные с https://exportify.net/.",
    import_pattern_lbl: "Шаблон имени файла",
    import_playlist_name: "Название плейлиста",
    import_add_pattern: "Добавить шаблон",
    import_select_file: "Выбрать файл",
    import_select_folder: "Выбрать папку",
    import_pattern_conflict: |a, b| {
        format!(
            "Шаблоны «{a}» и «{b}» могут совпасть для одного файла с конфликтующими полями. Удалите или исправьте один из них."
        )
    },
    import_playlists_imported: |n| format!("Импортировано {}", ru_tracks(n)),
    import_imported_into: |n, into| format!("Импортировано {} в {into}", ru_tracks(n)),
    import_no_tracks: "Не найдено треков для импорта.",
    import_no_match: "Ни один файл не соответствует шаблонам.",
    import_bad_file: "Не удалось прочитать выбранный файл.",

    deps_title: "Отсутствуют зависимости",
    deps_intro: "Некоторые инструменты, используемые приложением, отсутствуют. Выберите, какие установить, или отмените, чтобы продолжить (поиск и потоковая передача могут не работать, пока они не появятся).",
    deps_install: "Установить",
    deps_install_selected: "Установить выбранные",
    deps_discard: "Отменить",
    deps_installing: "Установка…",
    deps_installed: "Установлено",
    deps_failed: "Не удалось",
    deps_installed_toast: "Выбранные зависимости установлены.",
    deps_yt_dlp_desc: "Потоковая передача и загрузка аудио (обязательно для YouTube и SoundCloud)",
    deps_ytmusicapi_desc: "Поиск в YouTube Music (необязательно, запасной вариант — yt-dlp)",
    deps_python3_desc: "Требуется ytmusicapi (поиск в YouTube Music)",
    deps_ytmusicapi_requires_python: "Требуется Python 3 (установите сначала)",
    deps_play_requires_yt_dlp: "Для воспроизведения нужен yt-dlp — установите его из стартового диалога, чтобы играть это.",
    deps_source_not_playable: "Этот источник нельзя воспроизвести.",
    deps_found_section_title: "Найдено в вашей системе",
    deps_found_section_intro: "Они уже доступны. Отметьте любой, чтобы установить управляемую копию через приложение (копия приложения имеет приоритет над системной).",
    deps_found_on_system: "Найдено в вашей системе",
    deps_managed_by_app: "Установлено (управляется приложением)",
    deps_not_installed: "Не установлено",
    deps_delete: "Удалить",
    deps_deleting: "Удаление…",
    deps_deleted: "Удалено",
    deps_delete_failed: "Не удалось удалить",

    sec_updates: "Обновления",
    check_for_updates: "Проверить обновления",
    checking_for_updates: "Проверка обновлений…",
    up_to_date: "Актуальная версия",
    current_version: |v| format!("Версия {v}"),
    update_available: |v| format!("Доступна версия {v}. Перейдите в Настройки для обновления."),
    update_now: "Обновить сейчас",
    updating: "Обновление…",
    update_applied: |v| format!("Обновлено до {v}. Перезапуск…"),
    package_managed: "Невозможно автоматическое обновление (нет прав на запись в каталог приложения). Если установлено через менеджер пакетов, используйте его для обновления.",
    update_failed: |e| format!("Обновление не удалось: {e}"),
    percent: |pct| format!("{pct}%"),
    list_match_pos: |pos, total| format!("{pos}/{total}"),
    sub_menu_label: |base, provider, suffix| format!("{base} {provider} {suffix}"),
    deps_failed_detail: |e| format!("Failed: {e}"),
    deps_delete_failed_detail: |e| format!("Delete failed: {e}"),

    sc_title: "Горячие клавиши",
    sc_sec_list: "Список треков",
    sc_move: "Перемещение по списку (с зацикливанием)",
    sc_focus_panel: "Фокус на очередь или список",
    sc_first_last: "Первая / последняя строка",
    sc_page: "Страница / полстраницы",
    sc_play: "Играть выбранный трек",
    sc_sec_select: "Выбор и редактирование",
    sc_extend: "Расширить выбор",
    sc_toggle_sel: "Переключить выбор строки",
    sc_select_all: "Выбрать всё в списке",
    sc_copy_paste: "Копировать / вставить выбранные треки",
    sc_delete: "Удалить выбранные треки",
    sc_esc: "Закрыть окно, затем снять выбор, затем вернуться к поиску",
    sc_sec_search: "Поиск",
    sc_focus_search: "Перейти к поиску",
    sc_stage_provider: "Подготовить провайдера поиска (ожидает)",
    sc_stage_scope: "Подготовить область поиска (ожидает)",
    sc_run_search: "Выполнить подготовленный поиск",
    sc_find_list: "Нечёткий поиск по списку (переход между совпадениями)",
    sc_sec_playlists: "Плейлисты и история",
    sc_prev_next_pl: "Предыдущий / следующий плейлист",
    sc_jump: "Переход к плейлисту (Enter открывает, Shift+Enter играет)",
    sc_back_fwd: "Назад / вперёд на панели",
    sc_sec_playback: "Воспроизведение",
    sc_play_pause: "Играть / пауза",
    sc_next_prev: "Следующий / предыдущий трек",
    sc_mute: "Заглушить",
    sc_volume: "Тише / громче",
    sc_seek: "Назад / вперёд на 5 с (Shift: 10 с)",
    sc_toggles: "Очередь / повтор / текст / вкладка очереди",
    sc_sec_panes: "Панели",
    sc_split: "Разделить рядом / друг под другом",
    sc_close_pane: "Закрыть панель",
    sc_adj_pane: "Фокус на соседнюю панель",
    sc_cycle_pane: "Переход / прыжок между панелями",
    sc_sec_menu: "Контекстное меню",
    sc_open_menu: "Открыть для выбранного трека",
    sc_nav_menu: "Навигация по меню",
};

fn ru_tracks(n: usize) -> String {
    let m10 = n % 10;
    let m100 = n % 100;
    if m10 == 1 && m100 != 11 {
        format!("{n} трек")
    } else if (2..=4).contains(&m10) && !(12..=14).contains(&m100) {
        format!("{n} трека")
    } else {
        format!("{n} треков")
    }
}