From e8d46cd4f3c22d62ae826dee97e90b9b88ebff67 Mon Sep 17 00:00:00 2001 From: Nikita Utkin Date: Sun, 29 Sep 2024 03:23:17 +0500 Subject: [PATCH] Add russian localization (#216) --- messages/de-DE.json | 3 +- messages/en-US.json | 3 +- messages/es.json | 3 +- messages/fi.json | 3 +- messages/fr-FR.json | 3 +- messages/ru-RU.json | 396 ++++++++++++++++++++++++++++++++++++++++++++ messages/zh-CN.json | 3 +- src/i18n.ts | 10 +- 8 files changed, 417 insertions(+), 7 deletions(-) create mode 100644 messages/ru-RU.json 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'