feat: add bond pages and portfolio navigation

This commit is contained in:
2026-09-10 22:30:47 +03:00
parent 561222e468
commit 232d7f9990
39 changed files with 4217 additions and 221 deletions
+104 -1
View File
@@ -1,7 +1,12 @@
const ru = {
translation: {
appName: "WealthLedger",
navigation: { accounts: "Счета", stocks: "Акции", settings: "Настройки" },
navigation: {
accounts: "Счета",
stocks: "Акции",
bonds: "Облигации",
settings: "Настройки",
},
breadcrumbs: {
label: "Хлебные крошки",
accounts: "Брокерские счета",
@@ -11,6 +16,104 @@ const ru = {
events: "Будущие события",
settings: "Настройки",
},
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: