const ru = { translation: { appName: "WealthLedger", navigation: { cards: "Карты", accounts: "Счета", stocks: "Акции", bonds: "Облигации", settings: "Настройки", }, breadcrumbs: { label: "Хлебные крошки", accounts: "Брокерские счета", accountFallback: "Счет", operations: "Операции", income: "Пассивный доход", events: "Будущие события", settings: "Настройки", }, bank: { title: "Карты", card: "Карта", addCard: "Добавить карту", editCard: "Изменить карту", manualBalance: "Баланс по внесённым операциям", openingHint: "Остаток до операций с выбранной даты. Валюта — рубли (RUB).", name: "Название карты", bankName: "Банк (необязательно)", paymentSystem: "Платёжная система (необязательно)", paymentSystemUnknown: "Не указана", paymentSystems: { mir: "МИР", visa: "Visa", mastercard: "Mastercard" }, lastFour: "Последние четыре цифры (необязательно)", openingBalance: "Начальный остаток, ₽", openingDate: "Дата начала учёта", showArchive: "Показать архив", archived: "В архиве", archive: "Убрать в архив", restore: "Вернуть из архива", archiveHint: "История и деньги сохраняются. Для финансовых изменений верните карту из архива.", empty: "Добавьте первую карту", emptyHint: "Укажите начальный остаток и вносите расходы вручную.", noActive: "Нет активных карт. Включите показ архива.", loading: "Загрузка банковских карт", loadingHistory: "Загрузка операций", error: "Не удалось загрузить данные карт.", retry: "Повторить", refreshing: "Обновляем данные…", refreshError: "Не удалось обновить данные. Показаны последние полученные.", save: "Сохранить", cancel: "Отмена", close: "Закрыть", summary: "Расходы", allSummary: "Расходы по всем картам", month: "Месяц", period: "Период", expenses: "Потрачено", refunds: "Возвращено", net: "После возвратов", summaryHint: "Возвраты учитываются по дате получения. Итог может быть отрицательным.", noExpenses: "За этот период операций по расходам нет.", categories: "Категории", category: "Категория", categoryName: "Название категории", addCategory: "Добавить категорию", rename: "Переименовать", defaultCategory: "По умолчанию", notFound: "Карта не найдена", back: "К картам", operations: "Операции", noOperations: "Операций за период нет.", addOperation: "Добавить операцию", editOperation: "Изменить операцию", kind: "Вид операции", kinds: { expense: "Расход", topup: "Пополнение", transfer: "Перевод", refund: "Возврат", }, source: "Карта-источник", destination: "Карта-получатель", operationCard: "Карта операции", amount: "Сумма, ₽", date: "Дата операции", description: "Описание (необязательно)", expense: "Исходная покупка за любой период", availableRefund: "Доступно к возврату: {{amount}}", expenseChoice: "{{date}} · {{name}} · {{amount}} · доступно {{available}}", noPurchases: "На этой странице нет покупок. Проверьте другие страницы истории.", purchaseImmutable: "Исходная покупка и карта возврата не изменяются.", previous: "Назад", next: "Далее", page: "Страница {{page}}", pagination: "Страницы операций", pageSize: "Операций на странице", allOperations: "Все", transferTo: "Перевод на «{{name}}»", transferFrom: "Перевод с «{{name}}»", edit: "Изменить", delete: "Удалить", deleteTitle: "Удалить операцию?", deleteHint: "{{kind}} · {{amount}} · {{card}}. Денежное влияние будет отменено.", deleteTransfer: "Перевод {{amount}}: «{{source}}» → «{{target}}». Обе стороны перевода будут удалены.", reloadRecord: "Перечитать запись", adoptVersion: "Использовать актуальную версию {{version}}", versionHint: "Актуальные данные: {{details}}. Черновик сохранён; проверьте его перед повторной отправкой.", requestError: "Не удалось подтвердить сохранение. Ввод сохранён; повтор использует то же намерение.", errors: { BANK_VERSION_CONFLICT: "Запись уже изменена. Перечитайте её и проверьте черновик перед повторным сохранением.", BANK_WRITE_CONFLICT: "Данные изменяются другим запросом. Перечитайте запись и повторите действие.", BANK_DUPLICATE_CATEGORY: "Категория с таким названием уже есть.", BANK_NOT_FOUND: "Запись не найдена или недоступна.", BANK_INTENT_CONFLICT: "Это намерение уже сохранено с другим содержимым. Закройте форму и проверьте историю перед новым действием.", BANK_CARD_ARCHIVED: "Затронутая карта в архиве. Сначала верните её из архива.", BANK_REFUND_LIMIT: "Сумма превышает доступный возврат. Перечитайте покупку.", BANK_DEPENDENT_REFUNDS: "Изменению мешают связанные возвраты. Сначала исправьте или удалите их.", BANK_OPENING_DATE_CONFLICT: "Дата начала противоречит сохранённой истории карты.", BANK_INVALID_DATE: "Проверьте дату операции и даты начала учёта обеих карт.", BANK_INVALID_MONEY: "Введите допустимую сумму с точностью до копеек.", BANK_INVALID_INPUT: "Проверьте поля и связанные карты.", BANK_INVALID_REFUND: "Исходная покупка недоступна для этого возврата.", BANK_IMMUTABLE_OPERATION: "Вид операции и исходную покупку возврата изменить нельзя.", BANK_OPERATION_DELETED: "Операция уже удалена. Она не будет создана повторно.", }, validation: { name: "Введите название от 1 до 100 символов.", paymentSystem: "Выберите платёжную систему из списка.", bankName: "Не более 100 символов.", lastFour: "Укажите ровно четыре цифры или оставьте поле пустым.", money: "Введите сумму в допустимом диапазоне, не более двух знаков после запятой.", positive: "Сумма операции должна быть больше нуля.", date: "Укажите существующую дату не позже сегодняшнего дня по Москве.", start: "Дата не может быть раньше начала учёта затронутых карт или исходной покупки.", required: "Выберите значение.", destination: "Выберите другую активную карту.", description: "Не более 500 символов.", category: "Введите название от 1 до 80 символов.", duplicate: "Категория с таким названием уже есть.", refund: "Сумма превышает доступный возврат.", }, }, bond: { instrument: "Облигация", searching: "Ищем облигации", noSearchResults: "Облигации не найдены. Попробуйте другое название, тикер или ISIN.", searchVariants: "Одна карточка на выпуск (ISIN). Разные выпуски одного эмитента показаны отдельно.", chartLabel: "Дневные цены облигации, {{currency}}", quantity: "Количество облигаций", historyNote: "Операции по этой облигации на доступных открытых счетах, включая прошлые годы. Дата сделки — дата операции брокера; количество — исполненная часть. История закрытых счетов не включена.", couponWindow: "Календарь выпуска с {{from}} по {{to}}. Личные зачисления показаны в истории событий.", searchTitle: "Облигации", searchSubtitle: "Найдите выпуск по названию, тикеру или ISIN.", searchLabel: "Поиск облигаций", searchPlaceholder: "Например, ОФЗ или SU26238RMFS4", loading: "Загрузка облигации", unavailable: "Облигация недоступна", unavailableText: "Не удалось найти выпуск или загрузить его данные.", connect: "Подключите Т-Банк в настройках, чтобы открыть облигации.", ambiguousTicker: "Тикер соответствует нескольким выпускам. Выберите облигацию через поиск.", backToSearch: "К поиску облигаций", lot: "Размер лота", unknown: "—", percentOfNominal: "% от номинала", chartNote: "Дневная цена закрытия в процентах от номинала, без НКД. Исторические цены не пересчитаны в деньги по сегодняшнему номиналу.", terms: "Условия выпуска", nominal: "Текущий номинал", initialNominal: "Первоначальный номинал", maturity: "Погашение", matures: "Погашение {{date}}", callDate: "Оферта", couponFrequency: "Купонов в год", floatingCoupon: "Плавающий купон", perpetual: "Бессрочная", amortization: "С амортизацией", subordinated: "Субординированная", aci: "НКД на одну облигацию", cleanPrice: "Без НКД", dirtyPrice: "С НКД, без комиссии", indicativePrice: "Денежная оценка рассчитана по текущему номиналу и НКД. Котировка может относиться к более ранним торгам.", percentagePoints: "п. п.", coupons: "Купоны", upcomingCoupons: "Ближайшие купоны", couponHistory: "Прошедшие и недатированные купоны", couponNumber: "Купон № {{number}}", perBond: "На одну облигацию", couponDays: "Купонный период: {{count}} дн.", couponNote: "Календарь выпуска, не личные зачисления. Оценка по текущей позиции не подтверждает право на выплату и не учитывает налоги и будущие сделки. Неизвестная сумма не означает нулевой купон.", returnNote: "Изменение стоимости открытой позиции по ценам портфеля. Не включает выплаченные купоны и результат продаж; это не доходность к погашению.", noCoupons: "В выбранном периоде известных купонов нет.", metrics: "Купон, рейтинг и доходность", creditRating: "Кредитный рейтинг НКР", ratingWithdrawn: "Отозван", ratingUnavailable: "Источник недоступен", ratingMissing: "В реестре НКР не найден", ratingSource: "НКР · рейтинг выпуска от {{date}}", ratingChecked: "Реестр получен {{date}}", ratingCoverage: "Источник — реестр эмиссий НКР. Рейтинг сопоставлен по ISIN; отсутствие записи не исключает рейтингов других агентств.", couponAmount: "Размер ближайшего купона", couponType: "Тип купона", couponDate: "Дата выплаты купона", effectiveYield: "Эффективная доходность, годовых", couponYield: "Текущая купонная доходность, годовых", yieldUnavailable: "MOEX не предоставила доходность для этого выпуска и режима торгов.", yieldSource: "MOEX · {{target}} {{date}} · цена расчёта {{price}} % · торги {{at}}. Данные могут поступать с задержкой.", yieldTargets: { MATDATE: "к погашению", OFFERDATE: "к оферте", PUTOPTIONDATE: "к оферте", CALLOPTIONDATE: "к досрочному погашению", unknown: "к дате", }, couponYieldNote: "Купонная доходность = ближайший купон × 365 / дней в купонном периоде / цена без НКД × 100 %. Это годовая оценка при сохранении размера купона и номинала, без налогов, комиссий и реинвестирования; для плавающего или переменного купона будущий доход изменится.", couponYieldPriceAt: "Для купонной доходности использована котировка Т-Банка на {{date}}.", metricsPartial: "Часть показателей временно недоступна. Обновите раздел, чтобы повторить запрос.", couponTypes: { COUPON_TYPE_CONSTANT: "Постоянный", COUPON_TYPE_FLOATING: "Плавающий", COUPON_TYPE_DISCOUNT: "Дисконтный", COUPON_TYPE_MORTGAGE: "Ипотечный", COUPON_TYPE_FIX: "Фиксированный", COUPON_TYPE_VARIABLE: "Переменный", COUPON_TYPE_OTHER: "Другой", }, }, stock: { searchTitle: "Акции", searchSubtitle: "Найдите компанию, изучите цену и дивиденды, посмотрите свою историю владения.", searchLabel: "Поиск акций", searchPlaceholder: "Название или тикер, например Сбер или SBER", searchHint: "Введите хотя бы два символа.", searching: "Ищем акции", noSearchResults: "Акции не найдены. Попробуйте другое название или тикер.", backToSearch: "Все акции", searchVariants: "Одна карточка на выпуск (ISIN). Обыкновенные и привилегированные акции показаны отдельно.", apiUnavailable: "Торги через API недоступны", apiAvailable: "Доступна через API", exchangeUnknown: "Площадка не указана", classCode: "Режим: {{code}}", isin: "ISIN: {{value}}", priceUnavailable: "Цена недоступна", exchanges: { REAL_EXCHANGE_MOEX: "Мосбиржа", REAL_EXCHANGE_RTS: "СПБ Биржа", REAL_EXCHANGE_OTC: "Внебиржевой рынок", }, aboutCompany: "О компании", priceTableHint: "Дневные закрытия · записей: {{count}} · сначала новые", share: "Акция", loading: "Загружаем страницу акции", loadingSection: "Загружаем: {{section}}", loadingPrice: "Загружаем текущую цену", unavailable: "Акция недоступна", ambiguousTicker: "Этот тикер относится к нескольким выпускам. Выберите нужную акцию в поиске.", unavailableText: "Проверьте ссылку или попробуйте загрузить данные ещё раз.", connect: "Для просмотра акций подключите T-Банк в настройках или обновите подключение.", sectionError: "Не удалось загрузить этот раздел. Попробуйте ещё раз.", refreshPrice: "Обновить цену", price: "Цена", priceAt: "Цена на {{date}} UTC", changeBase: "К закрытию предыдущего торгового дня, {{date}}", noComparison: "Изменение за день недоступно: нет подтверждённой цены сравнения.", partialQuote: "Часть данных о цене или торгах временно недоступна.", chart: "График цены", period: "Период графика", periods: { month: "Месяц", halfYear: "Полгода", year: "Год", all: "Вся история", }, chartLabel: "Дневные цены акции, {{currency}}", chartNote: "Дневные цены по данным Т-Банка. Исторические цены могут учитывать корпоративные изменения.", incomplete: "Последняя свеча ещё формируется: её цена может измениться.", averageLine: "Текущая средняя покупка", priceTable: "Цены в таблице", date: "Дата", candle: "Свеча", complete: "Завершена", forming: "Формируется", noCandles: "За этот период нет доступных цен. Возможно, торги ещё не начались.", position: "Моя позиция", quantity: "Количество акций", value: "Текущая стоимость", average: "Средняя покупка", openReturn: "Результат позиции", openReturnNote: "Результат только открытой позиции: без проданных акций, дивидендов и полной доходности владения. «—» означает, что расчёт недоступен.", portfolio: "Портфель", snapshotAt: "Позиция на {{date}} UTC", upcoming: "Предстоящие дивиденды", companyEvent: "Событие компании", perShare: "на акцию", yourEstimate: "Оценка по вашей позиции", record: "Дата реестра", lastBuy: "Последний день покупки", payment: "Выплата по данным источника", noUpcoming: "Нет известных предстоящих выплат до {{to}}.", dividendNote: "Личная сумма — оценка по текущему количеству, не гарантия выплаты. Налоги не сопоставлены; дата выплаты компании может отличаться от дня зачисления на ваш счёт.", estimateUnavailable: "Данные позиции не удалось обновить. Личная оценка недоступна или рассчитана по сохранённой позиции.", dividendHistory: "История дивидендов компании", dividendWindow: "События компании с {{from}} по {{to}}. Личные зачисления показаны отдельно в истории событий.", noDividends: "Нет известных выплат за этот период.", dateUnknown: "Дата не указана", history: "Моя история событий", historyNote: "Операции по этой акции на доступных открытых счетах, включая периоды до текущего года. Дата сделки — дата операции брокера; количество — исполненная часть. История закрытых счетов не включена.", eventFilter: "Фильтр событий", filters: { all: "Все", trades: "Сделки", dividends: "Дивиденды", other: "Другие", }, noOperations: "Нет доступных операций по выбранному фильтру.", previous: "Назад", next: "Далее", eventQuantity: "{{value}} шт.", eventPrice: "Цена: {{value}}", company: "Компания и показатели", sector: "Сектор", lot: "Лот: {{value}} шт.", partialCompany: "Часть сведений о компании временно недоступна.", noFundamentals: "Нет доступных финансовых показателей.", periodNote: "TTM — последние 12 месяцев, MRQ — последний отчётный квартал. Дата отчётности не предоставлена источником. Отсутствующие значения не показаны.", metrics: { marketCapitalization: "Капитализация", peRatioTtm: "P/E", priceToBookTtm: "P/B", revenueTtm: "Выручка", ebitdaTtm: "EBITDA", netIncomeTtm: "Чистая прибыль", roe: "Рентабельность капитала (ROE)", totalDebtMrq: "Общий долг", netDebtToEbitda: "Чистый долг / EBITDA", }, shareTypes: { SHARE_TYPE_COMMON: "Обыкновенная акция", SHARE_TYPE_PREFERRED: "Привилегированная акция", SHARE_TYPE_ADR: "Депозитарная расписка", SHARE_TYPE_GDR: "Депозитарная расписка", }, sectors: { financial: "Финансы", energy: "Энергетика", materials: "Материалы", industrials: "Промышленность", utilities: "Коммунальные услуги", telecom: "Телекоммуникации", it: "Информационные технологии", consumer: "Потребительский сектор", health_care: "Здравоохранение", real_estate: "Недвижимость", }, trading: { unknown: "Статус торгов неизвестен", SECURITY_TRADING_STATUS_NORMAL_TRADING: "Идут торги", SECURITY_TRADING_STATUS_NOT_AVAILABLE_FOR_TRADING: "Торги недоступны", SECURITY_TRADING_STATUS_OPENING_PERIOD: "Период открытия", SECURITY_TRADING_STATUS_CLOSING_PERIOD: "Период закрытия", SECURITY_TRADING_STATUS_BREAK_IN_TRADING: "Перерыв в торгах", SECURITY_TRADING_STATUS_CLOSING_AUCTION: "Аукцион закрытия", SECURITY_TRADING_STATUS_OPENING_AUCTION: "Аукцион открытия", SECURITY_TRADING_STATUS_SESSION_OPEN: "Сессия открыта", SECURITY_TRADING_STATUS_SESSION_CLOSE: "Сессия закрыта", SECURITY_TRADING_STATUS_DEALER_NORMAL_TRADING: "Дилерские торги", }, }, auth: { login: "Вход", register: "Регистрация", email: "Email", password: "Пароль", passwordConfirmation: "Подтвердите пароль", noAccount: "Нет аккаунта? Зарегистрироваться", haveAccount: "Уже есть аккаунт? Войти", requestError: "Не удалось выполнить запрос. Попробуйте ещё раз.", logout: "Выйти", validation: { invalidEmail: "Некорректный email", invalidPasswordLength: "Пароль должен содержать от 12 до 72 байт", passwordsDoNotMatch: "Пароли не совпадают", }, }, accounts: { all: "Все счета", openAll: "Портфель по всем счетам", scope: "Счёт", allDescription: "Портфель по всем доступным инвестиционным счетам", title: "Счета", subtitle: "Ваши инвестиции по счетам", currentValue: "Текущая стоимость", stocks: "Акции", bonds: "Облигации", emptyTitle: "Нет инвестиционных счетов", emptyText: "Откройте инвестиционный счет в T-Bank, чтобы он появился здесь.", openedOn: "Открыт {{date}}", openAccount: "Открыть счет", summaryUnavailable: "Сводка временно недоступна", summaryEmpty: "Нет текущих сумм", remainingCurrencies_one: "Еще {{count}} валюта", remainingCurrencies_few: "Еще {{count}} валюты", remainingCurrencies_many: "Еще {{count}} валют", remainingCurrencies_other: "Еще {{count}} валюты", openSettings: "Открыть настройки T-Bank", notConnectedTitle: "Подключите T-Bank", notConnectedText: "Для просмотра счетов подключите T-Bank Invest в настройках.", invalidTokenTitle: "Проверьте подключение T-Bank", invalidTokenText: "Сохраненный token больше не дает доступ к счетам.", unavailableTitle: "T-Bank временно недоступен", unavailableText: "Попробуйте загрузить счета еще раз или проверьте подключение.", refreshing: "Обновляем данные", refreshError: "Не удалось обновить данные. Показаны последние полученные.", retry: "Повторить", types: { BROKERAGE: "Брокерский счет", INDIVIDUAL_INVESTMENT: "ИИС", INVEST_BOX: "Инвесткопилка", MONEY_MARKET_FUND: "Фонд денежного рынка", }, }, account: { title: "Счет" }, portfolio: { byAccount: "Позиции по счетам", allEmptyText: "На доступных счетах нет позиций и денежных остатков.", allUpdatedAt: "Самые ранние данные в сводке: {{date}}", currencies: { RUB: "Российский рубль", USD: "Доллар США", EUR: "Евро", }, title: "Портфель", emptyTitle: "Портфель пока пуст", emptyText: "На счете нет позиций и доступных денежных остатков.", accountUnavailableTitle: "Счет недоступен", accountUnavailableText: "Вернитесь к списку и выберите доступный счет.", connectionErrorTitle: "Проверьте подключение T-Bank", connectionErrorText: "Настройте подключение, чтобы посмотреть портфель.", back: "К счетам", staleWarning: "T-Bank временно недоступен. Показан последний успешный снимок.", refreshing: "Обновляем портфель", refreshError: "Не удалось обновить портфель. Показан последний полученный снимок.", updatedAt: "Данные получены {{date}}", positions: "Позиции", stocks: "Акции", bonds: "Облигации", otherPositions: "Другие позиции", cashBalances: "Денежные остатки", structure: { title: "Структура портфеля", other: "Другие активы", cash: "Свободные деньги", currency: "Валюта структуры портфеля", categories: "Категории активов", chartLabel: "Структура по типам активов. Суммы и доли — в списке рядом.", basis: "Доли учитывают свободные деньги и округлены до сотых процента.", incomplete: "Оценка неполная: ниже показаны только известные суммы. Валюта оценки части позиций неизвестна, поэтому доли и диаграмма недоступны.", unvaluedCategory: "{{category}}: без оценки — {{count}}", negative: "Есть отрицательные стоимости. Кольцевая диаграмма и доли недоступны; в списке сохранены суммы со знаком.", empty: "Нет положительной стоимости для кольцевой диаграммы.", unavailable: "Данные о структуре портфеля пока недоступны.", shareUnavailable: "Доля недоступна", unvalued: "Нет оценки", knownAmount: "Известно: {{amount}}", smallShare: "< 0,01 %", }, quantity: "Количество: {{value}}", return: "Доход: {{value}}", avgPrice: "Средняя цена: {{value}}", share: "Доля: {{value}}", }, ledger: { clearPeriod: "Очистить период", occurredAt: "{{date}} UTC", quantity: "{{value}} шт.", price: "Цена: {{value}}", operationType: { buy: "Покупка", sell: "Продажа", dividend: "Зачисление дивидендов", tax: "Налог", fee: "Комиссия", input: "Зачисление ценных бумаг", output: "Вывод ценных бумаг", transfer: "Перевод между счетами", other: "Другая операция", }, title: "Журнал операций", back: "К счету", open: "Открыть журнал", recentTitle: "Последние события", recentLoading: "Загрузка последних событий", recentError: "Не удалось загрузить последние события.", recentEmpty: "Последних событий пока нет.", period: "Период", from: "С", to: "По", categories: "Категории", categoriesPlaceholder: "Выберите категории", apply: "Применить", reset: "Сбросить", previous: "Назад", next: "Далее", retry: "Повторить", errorTitle: "Не удалось загрузить журнал", errorText: "Попробуйте запросить операции еще раз.", emptyTitle: "Операций нет", emptyText: "Измените период или фильтры.", noMoney: "Без движения денег", noInstrument: "Без инструмента", entryLabel: { income: { coupon: "Купон", dividend: "Дивиденд", }, }, category: { trade: "Сделка", income: "Доход", tax: "Налог", fee: "Комиссия", transfer: "Перевод", other: "Прочее", }, }, events: { title: "Будущие события", open: "Открыть будущие события", recentTitle: "Будущие события", recentLoading: "Загрузка будущих событий", recentError: "Не удалось загрузить будущие события.", recentEmpty: "На ближайшие 30 дней событий не найдено.", hint: "Прогноз рассчитан по текущей позиции до налогов. Покрытие зависит от доступных данных MOEX.", emptyTitle: "За выбранный период событий не найдено", emptyText: "Доступные источники не сообщили о купонах, дивидендах, погашениях или офертах в этом периоде.", errorTitle: "Не удалось загрузить будущие события", errorText: "Попробуйте запросить прогноз еще раз.", retry: "Повторить", noAmount: "Сумма неизвестна", projectedAmount: "Ожидаемая сумма", dateKind: { event: "Дата события", registry: "Дата реестра" }, type: { coupon: "Купон", dividend: "Дивиденд", maturity: "Погашение", offer: "Оферта", }, }, income: { title: "Пассивный доход", open: "Открыть пассивный доход", summaryTitle: "Получено купонами и дивидендами", summaryLoading: "Загрузка дохода текущего месяца", summaryError: "Не удалось загрузить доход текущего месяца", summaryRetry: "Повторить загрузку дохода", summaryEmpty: "В текущем месяце купоны и дивиденды не найддены.", from: "С", to: "По", apply: "Применить", reset: "Сбросить", coupon: "Купоны", dividend: "Дивиденды", taxBoundary: "Налоговые операции не включены в этот результат.", comparisonEmpty: "За эти периоды купоны и дивиденды не найдены.", yearAgo: "Годом ранее", yearUnavailable: "Сравнение с годом ранее недоступно.", difference: "Разница", total: "Итого", payments: "Выплаты", emptyTitle: "Купоны и дивиденды не найдены", emptyText: "За выбранный период подходящих исполненных выплат нет.", errorTitle: "Не удалось рассчитать пассивный доход", errorText: "Попробуйте загрузить результат еще раз.", retry: "Повторить", period: "Период", datePlaceholder: "ДД.ММ.ГГГГ", refreshing: "Обновляем пассивный доход", refreshError: "Не удалось обновить пассивный доход. Показан последний загруженный результат.", validation: { date: "Введите существующую дату в формате ДД.ММ.ГГГГ.", future: "Дата не может быть позже сегодняшнего дня.", period: "Укажите корректный период без будущих дат: начало не позже окончания.", }, }, settings: { title: "Настройки" }, tbank: { title: "T-Bank Invest", disconnected: "Не подключено", connected: "Подключено с {{date}}", hint: "Укажите read-only token T-Bank Invest.", token: "Token T-Bank", tokenRequired: "Введите token", connect: "Подключить", replace: "Заменить token", delete: "Удалить подключение", deleteTitle: "Удалить подключение?", deleteText: "Backend сразу потеряет доступ к данным T-Bank.", deleteConfirm: "Удалить", invalidToken: "Проверьте token и его права.", unavailable: "T-Bank временно недоступен. Повторите попытку позже.", requestError: "Не удалось выполнить запрос. Попробуйте ещё раз.", statusError: "Не удалось загрузить статус подключения. Обновите страницу.", retry: "Повторить", }, notFound: { title: "Страница не найдена", action: "К счетам" }, routeError: { title: "Не удалось открыть страницу", text: "Перейдите в безопасный раздел и попробуйте снова.", action: "Продолжить", }, states: { loadingTitle: "Загрузка", loadingText: "Пожалуйста, подождите.", errorTitle: "Что-то пошло не так", errorText: "Попробуйте обновить страницу позже.", emptyTitle: "Пока ничего нет", emptyText: "Данные появятся здесь.", }, }, } as const; export { ru };