goosemusic 1.3.0

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: "Звичайний",
    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!("Додано: {}", uk_tracks(n)),
    added_to: |n, to| format!("Додано: {} до {to}", uk_tracks(n)),
    removed_n: |n| format!("Видалено: {}", uk_tracks(n)),
    removed_from: |n, from| format!("Видалено: {} з {from}", uk_tracks(n)),
    pasted_into: |n, into| format!("Вставлено: {} до {into}", uk_tracks(n)),
    saved_title: |t| format!("«{t}» збережено до бібліотеки"),
    playlist_created: |n| format!("Плейлист «{n}» створено"),
    added_local: |n| format!("Додано: {} (оберіть плейлист для впорядкування)", uk_tracks(n)),
    downloading_n: |n| format!("Завантаження {}…", uk_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!("Додати {} до плейлиста", uk_tracks(n)),
    ctx_add_to_queue_n: |n| format!("Додати {} в чергу", uk_tracks(n)),
    ctx_download_n: |n| format!("Завантажити {}", uk_tracks(n)),
    ctx_remove_from_queue_n: |n| format!("Видалити {} з черги", uk_tracks(n)),
    ctx_remove_from_playlist_n: |n| format!("Видалити {} з плейлиста", uk_tracks(n)),
    ctx_remove_from_recent_n: |n| format!("Видалити {} з нещодавніх", uk_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!("Імпортовано {}", uk_tracks(n)),
    import_imported_into: |n, into| format!("Імпортовано {} до {into}", uk_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 uk_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} треків")
    }
}