diff --git a/messages/de-DE.json b/messages/de-DE.json
index 46363d5..575da56 100644
--- a/messages/de-DE.json
+++ b/messages/de-DE.json
@@ -299,7 +299,8 @@
"fr-FR": "Français",
"es": "Español",
"de-DE": "Deutsch",
- "zh-CN": "Chinese (Simplified)"
+ "zh-CN": "Chinese (Simplified)",
+ "ru-RU": "Русский"
},
"Share": {
"title": "Teilen",
diff --git a/messages/en-US.json b/messages/en-US.json
index 11d9154..db6ea82 100644
--- a/messages/en-US.json
+++ b/messages/en-US.json
@@ -299,7 +299,8 @@
"fr-FR": "Français",
"es": "Español",
"de-DE": "Deutsch",
- "zh-CN": "Chinese (Simplified)"
+ "zh-CN": "Chinese (Simplified)",
+ "ru-RU": "Русский"
},
"Share": {
"title": "Share",
diff --git a/messages/es.json b/messages/es.json
index 2198769..c860bd8 100644
--- a/messages/es.json
+++ b/messages/es.json
@@ -299,7 +299,8 @@
"fr-FR": "Français",
"es": "Español",
"de-DE": "Deutsch",
- "zh-CN": "Chinese (Simplified)"
+ "zh-CN": "Chinese (Simplified)",
+ "ru-RU": "Русский"
},
"Share": {
"title": "Compartir",
diff --git a/messages/fi.json b/messages/fi.json
index 2e5c585..6ab9ea3 100644
--- a/messages/fi.json
+++ b/messages/fi.json
@@ -299,7 +299,8 @@
"fr-FR": "Français",
"es": "Español",
"de-DE": "Deutsch",
- "zh-CN": "Chinese (Simplified)"
+ "zh-CN": "Chinese (Simplified)",
+ "ru-RU": "Русский"
},
"Share": {
"title": "Jaa",
diff --git a/messages/fr-FR.json b/messages/fr-FR.json
index 26a6872..d17298d 100644
--- a/messages/fr-FR.json
+++ b/messages/fr-FR.json
@@ -299,7 +299,8 @@
"fr-FR": "Français",
"es": "Español",
"de-DE": "Deutsch",
- "zh-CN": "Chinese (Simplified)"
+ "zh-CN": "Chinese (Simplified)",
+ "ru-RU": "Русский"
},
"Share": {
"title": "Partager",
diff --git a/messages/ru-RU.json b/messages/ru-RU.json
new file mode 100644
index 0000000..4fa9c67
--- /dev/null
+++ b/messages/ru-RU.json
@@ -0,0 +1,396 @@
+{
+ "Homepage": {
+ "title": "Делитесь расходами с друзьями и семьей",
+ "description": "Добро пожаловать в вашу новую инстанцию Spliit!",
+ "button": {
+ "groups": "Перейти к группам",
+ "github": "GitHub"
+ }
+ },
+ "Header": {
+ "groups": "Группы"
+ },
+ "Footer": {
+ "madeIn": "Сделано в Монреале, Квебек 🇨🇦",
+ "builtBy": "Создано Sebastien Castiel и соавторами"
+ },
+ "Expenses": {
+ "title": "Расходы",
+ "description": "В этом разделе находятся расходы вашей группы.",
+ "create": "Создать расход",
+ "createFirst": "Создать первый расход",
+ "noExpenses": "У вашей группы пока что нет расходов.",
+ "exportJson": "Экспортировать в JSON",
+ "searchPlaceholder": "Поиск расходов…",
+ "ActiveUserModal": {
+ "title": "Кто вы?",
+ "description": "Скажите нам, кто вы из этого списка, чтобы мы могли подстроить интерфейс под вас.",
+ "nobody": "Не хочу выбирать",
+ "save": "Сохранить изменения",
+ "footer": "Вы сможете изменить это в настройках группы."
+ },
+ "Groups": {
+ "upcoming": "Будущее",
+ "thisWeek": "На этой неделе",
+ "earlierThisMonth": "Ранее в этом месяце",
+ "lastMonth": "В прошлом месяце",
+ "earlierThisYear": "Ранее в этом году",
+ "lastYera": "В прошлом году",
+ "older": "Очень давно"
+ }
+ },
+ "ExpenseCard": {
+ "paidBy": "Потратил {paidBy} за ",
+ "receivedBy": "Получил {paidBy} за ",
+ "yourBalance": "Изменение баланса участника:"
+ },
+ "Groups": {
+ "myGroups": "Мои группы",
+ "create": "Создать",
+ "loadingRecent": "Загрузка недавних групп…",
+ "NoRecent": {
+ "description": "У вас нет недавних групп.",
+ "create": "Вы можете создать группу",
+ "orAsk": "или попросить вашего друга отправить вам ссылку на существующую."
+ },
+ "recent": "Недавние группы",
+ "starred": "Избранные",
+ "archived": "Архивированные группы",
+ "archive": "Архивировать группу",
+ "unarchive": "Восстановить группу",
+ "removeRecent": "Убрать группу из недавних",
+ "RecentRemovedToast": {
+ "title": "Группа убрана",
+ "description": "Группа была убрана из вашего списка недавних групп.",
+ "undoAlt": "Отменить удаление группы из этого списка",
+ "undo": "Отмена"
+ },
+ "AddByURL": {
+ "button": "Добавить по URL",
+ "title": "Добавить группу по URL",
+ "description": "Если с вами поделились ссылкой на группу, вставьте ее сюда, чтобы добавить ее в ваш список.",
+ "error": "К сожалению, мы не смогли найти группу по этому URL."
+ },
+ "NotFound": {
+ "text": "Этой группы не существует",
+ "link": "Перейти к списку недавних групп"
+ }
+ },
+ "GroupForm": {
+ "title": "Сведения о группе",
+ "NameField": {
+ "label": "Название группы",
+ "placeholder": "Летние поездки",
+ "description": "Введите название вашей группы."
+ },
+ "InformationField": {
+ "label": "Информация о группе",
+ "placeholder": "Что важно знать участникам этой группы?"
+ },
+ "CurrencyField": {
+ "label": "Символ валюты",
+ "placeholder": "$, €, £…",
+ "description": "Этот символ будет использован для отображений денежных сумм."
+ },
+ "Participants": {
+ "title": "Участники",
+ "description": "Введите имя каждого участника.",
+ "protectedParticipant": "Этот участник — часть расходов, и поэтому не может быть удален.",
+ "new": "Новый участник",
+ "add": "Добавить участника",
+ "John": "Александр",
+ "Jane": "Михаил",
+ "Jack": "Иван"
+ },
+ "Settings": {
+ "title": "Локальные настройки",
+ "description": "Эти настройки хранятся на вашем устройстве и используются для подстройки интерфейса для вас.",
+ "ActiveUserField": {
+ "label": "Активный участник",
+ "placeholder": "Выберите участника",
+ "none": "Не выбран",
+ "description": "Этот участник будет автоматически выбран при создании нового расхода."
+ },
+ "save": "Сохранить",
+ "saving": "Сохранение…",
+ "create": "Создать",
+ "creating": "Создание…",
+ "cancel": "Отмена"
+ }
+ },
+ "ExpenseForm": {
+ "Income": {
+ "create": "Создать доход",
+ "edit": "Изменить доход",
+ "TitleField": {
+ "label": "Название доходв",
+ "placeholder": "Поход в ресторан",
+ "description": "Введите описание для этого дохода."
+ },
+ "DateField": {
+ "label": "Дата дохода",
+ "description": "Введите дату, когда этот доход был получен."
+ },
+ "categoryFieldDescription": "Выберите категорию дохода.",
+ "paidByField": {
+ "label": "Получивший",
+ "description": "Выберите участника, который получил этот доход."
+ },
+ "paidFor": {
+ "title": "Участники",
+ "description": "Выберите тех, между кем этот доход будет распределен."
+ },
+ "splitModeDescription": "Выберите, как доход необходимо распределить между людьми.",
+ "attachDescription": "Просмотр и прикрепление чеков к этому расходу."
+ },
+ "Expense": {
+ "create": "Создать расход",
+ "edit": "Изменить расход",
+ "TitleField": {
+ "label": "Название расхода",
+ "placeholder": "Поход в ресторан",
+ "description": "Введите описание для этого расхода."
+ },
+ "DateField": {
+ "label": "Дата расхода",
+ "description": "Введите дату, когда этот расход был совершен."
+ },
+ "categoryFieldDescription": "Выберите категорию расхода.",
+ "paidByField": {
+ "label": "Оплативший",
+ "description": "Выберите участника, который оплатил этот расход."
+ },
+ "paidFor": {
+ "title": "Участники",
+ "description": "Выберите тех, между кем этот расход будет распределен. Если этот расход — возмещение участнику (участникам), выберите только его (их)."
+ },
+ "splitModeDescription": "Выберите, как расход необходимо распределить между людьми.",
+ "attachDescription": "Просмотр и прикрепление чеков к этому доходу."
+ },
+ "amountField": {
+ "label": "Сумма"
+ },
+ "isReimbursementField": {
+ "label": "Этот расход является возмещением"
+ },
+ "categoryField": {
+ "label": "Категория"
+ },
+ "notesField": {
+ "label": "Заметки"
+ },
+ "selectNone": "Выбрать никого",
+ "selectAll": "Выбрать всех",
+ "shares": "доля(и)",
+ "advancedOptions": "Дополнительные настройки распределения…",
+ "SplitModeField": {
+ "label": "Режим разделения",
+ "evenly": "Равный",
+ "byShares": "Неравный – По долям",
+ "byPercentage": "Неравный – По процентам",
+ "byAmount": "Неравный – По суммам",
+ "saveAsDefault": "Сделать режимом по умолчанию"
+ },
+ "DeletePopup": {
+ "label": "Удалить",
+ "title": "Удалить этот расход?",
+ "description": "Вы действительно хотите удалить этот расход? Это действие нельзя отменить.",
+ "yes": "Удалить",
+ "cancel": "Отмена"
+ },
+ "attachDocuments": "Прикрепить документы",
+ "create": "Создать",
+ "creating": "Создание…",
+ "save": "Сохранить",
+ "saving": "Сохранение…",
+ "cancel": "Отмена"
+ },
+ "ExpenseDocumentsInput": {
+ "TooBigToast": {
+ "title": "Файл слишком большой",
+ "description": "Максимальный размер файла, который можно загрузить — {maxSize}. Размер вашего файла — ${size}."
+ },
+ "ErrorToast": {
+ "title": "Ошибка при загрузке документа",
+ "description": "При загрузке документа что-то пошло не так. Пожалуйста, повторите позднее или попробуйте загрузить другой файл.",
+ "retry": "Повторить"
+ }
+ },
+ "CreateFromReceipt": {
+ "Dialog": {
+ "triggerTitle": "Создать расход из чека",
+ "title": "Создать из чека",
+ "description": "Извлечение информации о расходах из фотографии чека",
+ "body": "Загрузите фотографию чека, и мы попытаемся отсканировать его, чтобы извлечь информацию о расходах.",
+ "selectImage": "Выбрать изображение…",
+ "titleLabel": "Название:",
+ "categoryLabel": "Категория:",
+ "amountLabel": "Сумма:",
+ "dateLabel": "Дата:",
+ "editNext": "Вы сможете изменить эту информацию позднее.",
+ "continue": "Продолжить"
+ },
+ "unknown": "Неизвестно",
+ "TooBigToast": {
+ "title": "Файл слишком большой",
+ "description": "Максимальный размер файла, который можно загрузить — {maxSize}. Размер вашего файла — ${size}."
+ },
+ "ErrorToast": {
+ "title": "Ошибка при загрузке документа",
+ "description": "При загрузке документа что-то пошло не так. Пожалуйста, повторите позднее или попробуйте загрузить другой файл.",
+ "retry": "Повторить"
+ }
+ },
+ "Balances": {
+ "title": "Балансы",
+ "description": "Это список балансов всех участников группы. Баланс увеличивается у тех, кто оплачивает расход, и уменьшается у тех, между кем он был распределен.",
+ "Reimbursements": {
+ "title": "Предложенные возмещения",
+ "description": "Вот список задолженностей между участниками.",
+ "noImbursements": "Похоже, все в расчете 😁",
+ "owes": "{from} должен {to}",
+ "markAsPaid": "Пометить оплаченным"
+ }
+ },
+ "Stats": {
+ "title": "Статистика",
+ "Totals": {
+ "title": "Итоговые суммы",
+ "description": "Общая информация о расходах вашей группы.",
+ "groupSpendings": "Всего потрачено группой",
+ "groupEarnings": "Всего заработано группой",
+ "yourSpendings": "Всего потрачено вами",
+ "yourEarnings": "Всего заработано вами",
+ "yourShare": "Ваша суммарная доля"
+ }
+ },
+ "Activity": {
+ "title": "Активность",
+ "description": "Обзор действий, совершенных участниками этой группы.",
+ "noActivity": "История действий пуста.",
+ "someone": "Аноним",
+ "settingsModified": "Настройки группы изменены участником {participant}.",
+ "expenseCreated": "Расход {expense} создан участником {participant}.",
+ "expenseUpdated": "Расход {expense} изменен участником {participant}.",
+ "expenseDeleted": "Расход {expense} удален участником {participant}.",
+ "Groups": {
+ "today": "Сегодня",
+ "yesterday": "Вчера",
+ "earlierThisWeek": "Ранее на этой неделе",
+ "lastWeek": "На прошлой неделе",
+ "earlierThisMonth": "Ранее в этом месяце",
+ "lastMonth": "В прошлом месяце",
+ "earlierThisYear": "Ранее в этом году",
+ "lastYear": "В прошлом году",
+ "older": "Очень давно"
+ }
+ },
+ "Information": {
+ "title": "Информация",
+ "description": "В этом разделе вы можете добавить важную для участников информацию.",
+ "empty": "Информации нет."
+ },
+ "Settings": {
+ "title": "Настройки"
+ },
+ "Locale": {
+ "en-US": "English",
+ "fi": "Suomi",
+ "fr-FR": "Français",
+ "es": "Español",
+ "de-DE": "Deutsch",
+ "zh-CN": "Chinese (Simplified)",
+ "ru-RU": "Русский"
+ },
+ "Share": {
+ "title": "Поделиться",
+ "description": "Чтобы другие участники получили доступ к этой группе и смогли добавлять расходы, отправьте им этот URL.",
+ "warning": "Внимание!",
+ "warningHelp": "Любой человек с доступом к этой ссылке сможет просматривать и редактировать расходы. Будьте осторожны!"
+ },
+ "SchemaErrors": {
+ "min1": "Введите как минимум один символ.",
+ "min2": "Введите как минимум два символа.",
+ "max5": "Введите максимум 5 символов.",
+ "max50": "Введите максимум 50 символов.",
+ "duplicateParticipantName": "Участник с таким именем уже существует.",
+ "titleRequired": "Пожалуйста, введите название.",
+ "invalidNumber": "Неверное число.",
+ "amountRequired": "Пожалуйста, введите сумму.",
+ "amountNotZero": "Сумма не может быть нулевой.",
+ "amountTenMillion": "Сумма должна быть меньше 10 000 000.",
+ "paidByRequired": "Пожалуйста, выберите участника.",
+ "paidForMin1": "За этот расход должен заплатить как минимум один участник.",
+ "noZeroShares": "Все доли должны быть больше 0.",
+ "amountSum": "Сумма расхода должна быть равна сумме значений, распределенных между участниками.",
+ "percentageSum": "Сумма процентов должна быть равна 100."
+ },
+ "Categories": {
+ "search": "Поиск категорий...",
+ "noCategory": "Категорий не нашлось.",
+ "Uncategorized": {
+ "heading": "Без категории",
+ "General": "Общее",
+ "Payment": "Выплата"
+ },
+ "Entertainment": {
+ "heading": "Развлечения",
+ "Entertainment": "Развлечения",
+ "Games": "Игры",
+ "Movies": "Кино",
+ "Music": "Музыка",
+ "Sports": "Спорт"
+ },
+ "Food and Drink": {
+ "heading": "Еда и напитки",
+ "Food and Drink": "Еда и напитки",
+ "Dining Out": "Рестораны и кафе",
+ "Groceries": "Продукты",
+ "Liquor": "Напитки"
+ },
+ "Home": {
+ "heading": "Дом",
+ "Home": "Дом",
+ "Electronics": "Электроника",
+ "Furniture": "Мебель",
+ "Household Supplies": "Расходные материалы",
+ "Maintenance": "Уборка",
+ "Mortgage": "Ипотека",
+ "Pets": "Домашние животные",
+ "Rent": "Аренда",
+ "Services": "Коммунальные расходы"
+ },
+ "Life": {
+ "heading": "Жизнь",
+ "Childcare": "Дети",
+ "Clothing": "Одежда",
+ "Education": "Образование",
+ "Gifts": "Подарки",
+ "Insurance": "Страховки",
+ "Medical Expenses": "Медицина",
+ "Taxes": "Налоги"
+ },
+ "Transportation": {
+ "heading": "Транспорт",
+ "Transportation": "Транспорт",
+ "Bicycle": "Велосипед",
+ "Bus/Train": "Автобусы и поезда",
+ "Car": "Авто",
+ "Gas/Fuel": "Топливо",
+ "Hotel": "Отели",
+ "Parking": "Парковка",
+ "Plane": "Самолеты",
+ "Taxi": "Такси"
+ },
+ "Utilities": {
+ "heading": "Коммунальные расходы",
+ "Utilities": "Коммунальные расходы",
+ "Cleaning": "Клининг",
+ "Electricity": "Электричество",
+ "Heat/Gas": "Отопление/Газ",
+ "Trash": "Утилизация отходов",
+ "TV/Phone/Internet": "ТВ/Телефон/Интернет",
+ "Water": "Вода"
+ }
+ }
+}
diff --git a/messages/zh-CN.json b/messages/zh-CN.json
index a1b2a56..8202210 100644
--- a/messages/zh-CN.json
+++ b/messages/zh-CN.json
@@ -299,7 +299,8 @@
"fr-FR": "Français",
"es": "Español",
"de-DE": "Deutsch",
- "zh-CN": "Chinese (Simplified)"
+ "zh-CN": "Chinese (Simplified)",
+ "ru-RU": "Русский"
},
"Share": {
"title": "分享",
diff --git a/src/i18n.ts b/src/i18n.ts
index 77e619d..b908f0e 100644
--- a/src/i18n.ts
+++ b/src/i18n.ts
@@ -1,7 +1,15 @@
import { getRequestConfig } from 'next-intl/server'
import { getUserLocale } from './lib/locale'
-export const locales = ['en-US', 'fi', 'fr-FR', 'es', 'de-DE', 'zh-CN'] as const
+export const locales = [
+ 'en-US',
+ 'fi',
+ 'fr-FR',
+ 'es',
+ 'de-DE',
+ 'zh-CN',
+ 'ru-RU',
+] as const
export type Locale = (typeof locales)[number]
export type Locales = ReadonlyArray
export const defaultLocale: Locale = 'en-US'