diff --git a/next-i18next.config.js b/next-i18next.config.js
index 8c1d2859d..5e848b582 100644
--- a/next-i18next.config.js
+++ b/next-i18next.config.js
@@ -19,6 +19,7 @@ module.exports = {
"pl",
"pt-BR",
"pt",
+ "ru",
"sk",
"sv",
"zh",
diff --git a/public/locales/ru/app.json b/public/locales/ru/app.json
new file mode 100644
index 000000000..b3458a626
--- /dev/null
+++ b/public/locales/ru/app.json
@@ -0,0 +1,125 @@
+{
+ "12h": "12-часовой",
+ "24h": "24-часовой",
+ "addParticipant": "Добавить участника",
+ "addTimeOption": "Добавить временной вариант",
+ "alreadyVoted": "Вы уже проголосовали",
+ "applyToAllDates": "Применить ко всем датам",
+ "areYouSure": "Вы уверены?",
+ "back": "Назад",
+ "calendarHelp": "Вы не можете создать опрос без каких-либо параметров. Добавьте хотя бы один вариант, чтобы продолжить.",
+ "calendarHelpTitle": "Забыли что-нибудь?",
+ "cancel": "Отменить",
+ "comment": "Комментарий",
+ "commentPlaceholder": "Оставить комментарий в этом опросе (виден всем)",
+ "comments": "Комментарии",
+ "continue": "Далее",
+ "copied": "Скопировано",
+ "copyLink": "Скопировать ссылку",
+ "createdBy": "от {{name}}",
+ "createPoll": "Создать опрос",
+ "creatingDemo": "Создание демо-опроса…",
+ "delete": "Удалить",
+ "deleteComment": "Удалить комментарий",
+ "deleteDate": "Удалить дату",
+ "deletedPoll": "Удалённый опрос",
+ "deletedPollInfo": "Этот опрос больше не существует.",
+ "deletePoll": "Удалить опрос",
+ "deletePollDescription": "Все данные, связанные с этим опросом, будут удалены. Для подтверждения, пожалуйста, введите “{{confirmText}}” в поле ниже:",
+ "deletingOptionsWarning": "Вы удаляете варианты, за которые участники уже проголосовали. Их ответы также будут удалены.",
+ "demoPollNotice": "Демо-опросы автоматически удаляются через 1 день",
+ "description": "Описание",
+ "descriptionPlaceholder": "Привет всем! Выберите даты, которые вам подходят!",
+ "donate": "Пожертвовать",
+ "edit": "Изменить",
+ "editDetails": "Изменить детали",
+ "editOptions": "Изменить варианты",
+ "email": "Email",
+ "emailPlaceholder": "jessie.smith@email.com",
+ "endingGuestSessionNotice": "Как только гостевая сессия завершится, она не сможет быть возобновлена. Вы не сможете исправить ответы или комментарии, сделанные в этой сессии.",
+ "endSession": "Завершить сессию",
+ "exportToCsv": "Экспорт в CSV",
+ "forgetMe": "Забыть меня",
+ "goToAdmin": "Перейти в админку",
+ "guest": "Гость",
+ "guestSessionNotice": "Вы используете гостевую сессию. Это позволяет нам распознать вас, если вы вернетесь позже, чтобы вы могли редактировать свои ответы.",
+ "guestSessionReadMore": "Подробнее о гостевых сессиях.",
+ "hide": "Скрыть",
+ "ifNeedBe": "Если уж необходимо",
+ "linkHasExpired": "Срок действия вашей ссылки истёк или она более не действительна",
+ "loading": "Загрузка…",
+ "loadingParticipants": "Загрузка участников…",
+ "location": "Местоположение",
+ "locationPlaceholder": "Кофейный магазин Джо",
+ "lockPoll": "Заблокировать опрос",
+ "login": "Войти",
+ "loginCheckInbox": "Пожалуйста, проверьте вашу электронную почту.",
+ "loginMagicLinkSent": "Волшебная ссылка отправлена на:",
+ "loginSendMagicLink": "Отправить мне волшебную ссылку",
+ "loginViaMagicLink": "Войти по волшебной ссылке",
+ "loginViaMagicLinkDescription": "Мы вышлем вам письмо с волшебной ссылкой, которую вы можете использовать для входа.",
+ "loginWithValidEmail": "Пожалуйста, введите корректный email адрес",
+ "logout": "Выйти",
+ "manage": "Настроить",
+ "menu": "Меню",
+ "mixedOptionsDescription": "Вы не можете оставить как время, так и дату в одном опросе. Что бы вы хотели сохранить?",
+ "mixedOptionsKeepDates": "Сохранить варианты даты",
+ "mixedOptionsKeepTimes": "Сохранить варианты времени",
+ "mixedOptionsTitle": "Минуточку…🤔",
+ "monday": "Понедельник",
+ "monthView": "Месяц",
+ "name": "Имя",
+ "namePlaceholder": "Пётр Иванов",
+ "new": "Новый",
+ "newPoll": "Новый опрос",
+ "next": "Далее",
+ "nextMonth": "Следующий месяц",
+ "no": "Нет",
+ "noDatesSelected": "Дата не выбрана",
+ "notificationsDisabled": "Уведомления отключены",
+ "notificationsOff": "Уведомления выключены",
+ "notificationsOn": "Уведомлений включены",
+ "notificationsOnDescription": "Письмо будет отправлено {{email}} при появлении активности в этом опросе.",
+ "notificationsVerifyEmail": "Вам нужно подтвердить вашу электронную почту, чтобы включить уведомления",
+ "noVotes": "Никто не проголосовал за этот вариант",
+ "ok": "OK",
+ "participant": "Участник",
+ "participantCount_other": "{{count}} участников",
+ "participantCount": "{{count}} участник",
+ "pollHasBeenLocked": "Этот опрос заблокирован",
+ "pollHasBeenVerified": "Ваш опрос подтверждён",
+ "pollOwnerNotice": "Привет, {{name}}, похоже, вы являетесь владельцем этого опроса.",
+ "pollsEmpty": "Опросы отсутствуют",
+ "possibleAnswers": "Возможные ответы",
+ "preferences": "Настройки",
+ "previousMonth": "Предыдущий месяц",
+ "profileLogin": "Профиль - Войти",
+ "profileUser": "Профиль - {{username}}",
+ "requiredNameError": "Необходимо указать имя",
+ "save": "Сохранить",
+ "saveInstruction": "Укажите когда вы доступны и нажмите {{save}}",
+ "share": "Поделиться",
+ "shareDescription": "Поделитесь этой ссылкой с вашими участниками, чтобы они смогли ответить на ваш опрос.",
+ "shareLink": "Поделиться с помощью ссылки",
+ "specifyTimes": "Укажите время",
+ "specifyTimesDescription": "Включить время начала и окончания для каждого варианта",
+ "stepSummary": "Шаг {{current}} из {{total}}",
+ "sunday": "Воскресенье",
+ "timeFormat": "Формат времени:",
+ "timeZone": "Часовой пояс:",
+ "title": "Название",
+ "titlePlaceholder": "Ежемесячная Встреча",
+ "today": "Сегодня",
+ "unlockPoll": "Разблокировать опрос",
+ "unverifiedMessage": "Письмо было отправлено на {{email}} со ссылкой для подтверждения адреса электронной почты.",
+ "user": "Пользователь",
+ "weekStartsOn": "Начало недели",
+ "weekView": "Неделя",
+ "whatsThis": "Что это?",
+ "yes": "Да",
+ "you": "Вы",
+ "yourDetails": "Ваши данные",
+ "yourName": "Ваше имя…",
+ "yourProfile": "Ваш профиль",
+ "yourPolls": "Ваши опросы"
+}
diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
new file mode 100644
index 000000000..7c552783c
--- /dev/null
+++ b/public/locales/ru/common.json
@@ -0,0 +1,15 @@
+{
+ "blog": "Блог",
+ "discussions": "Обсуждение",
+ "donate": "Поддержать",
+ "footerCredit": "Творение @imlukevella",
+ "footerSponsor": "Этот проект финансируется пользователями. Пожалуйста, поддержите его пожертвованием.",
+ "home": "Главная",
+ "language": "Язык",
+ "links": "Ссылки",
+ "poweredBy": "Powered by",
+ "privacyPolicy": "Политика конфиденциальности",
+ "starOnGithub": "В избранное на Github",
+ "support": "Поддержка",
+ "volunteerTranslator": "Помочь с переводом того сайта"
+}
diff --git a/public/locales/ru/errors.json b/public/locales/ru/errors.json
new file mode 100644
index 000000000..78f185ab4
--- /dev/null
+++ b/public/locales/ru/errors.json
@@ -0,0 +1,6 @@
+{
+ "notFoundTitle": "404: Не найдено",
+ "notFoundDescription": "Мы не можем найти страницу, которую вы искали.",
+ "goToHome": "Вернуться на главную",
+ "startChat": "Начать чат"
+}
diff --git a/public/locales/ru/homepage.json b/public/locales/ru/homepage.json
new file mode 100644
index 000000000..ae05e7f02
--- /dev/null
+++ b/public/locales/ru/homepage.json
@@ -0,0 +1,35 @@
+{
+ "3Ls": "Да — с 3 L",
+ "adFree": "Без рекламы",
+ "adFreeDescription": "Можете позволить вашему блокировщику рекламы расслабиться — здесь он вам не понадобится.",
+ "comments": "Комментарии",
+ "commentsDescription": "Участники могут комментировать ваш опрос, и комментарии будут видны всем.",
+ "features": "Возможности",
+ "featuresSubheading": "Умный планировщик",
+ "getStarted": "Начать",
+ "heroSubText": "Найти нужную дату без лишних итераций",
+ "heroText": "Запланировать
групповые встречи
с легкостью",
+ "links": "Ссылки",
+ "liveDemo": "Демонстрация",
+ "metaDescription": "Создавайте опросы и голосуйте за лучший день или время. Бесплатная альтернатива Doodle.",
+ "metaTitle": "Rallly - Расписание групповых встреч",
+ "mobileFriendly": "Адаптировано для мобильных устройств",
+ "mobileFriendlyDescription": "Работает отлично на мобильных устройствах, так что участники могут отвечать на опросы, где бы они ни были.",
+ "new": "Новый",
+ "noLoginRequired": "Вход не требуется",
+ "noLoginRequiredDescription": "Вам не нужно авторизоваться, чтобы создать или принять участие в опросе",
+ "notifications": "Уведомления",
+ "notificationsDescription": "Будьте в курсе кто ответил. Получайте уведомление, когда участники голосуют или комментируют ваш опрос.",
+ "openSource": "Открытый код",
+ "openSourceDescription": "Код полностью открыт и доступен на GitHub.",
+ "participant": "Участник",
+ "participantCount_other": "{{count}} участников",
+ "participantCount": "{{count}} участник",
+ "perfect": "Превосходно!",
+ "principles": "Принципиальные отличия",
+ "principlesSubheading": "Мы не такие, как все",
+ "selfHostable": "Собственный хостинг",
+ "selfHostableDescription": "Запустите его на своём сервере, чтобы полностью контролировать ваши данные",
+ "timeSlots": "Временные интервалы",
+ "timeSlotsDescription": "Установите индивидуальное время начала и окончания для каждого варианта в вашем опросе. Время может автоматически подстраиваться под часовой пояс каждого участника или может быть установлено так, чтобы полностью игнорировать часовые пояса."
+}
diff --git a/src/components/poll/language-selector.tsx b/src/components/poll/language-selector.tsx
index 477feecd7..3d59bfaf4 100644
--- a/src/components/poll/language-selector.tsx
+++ b/src/components/poll/language-selector.tsx
@@ -34,6 +34,7 @@ export const LanguageSelect: React.VoidFunctionComponent<{
+
diff --git a/src/middleware.ts b/src/middleware.ts
index 308f768eb..c08e36e60 100644
--- a/src/middleware.ts
+++ b/src/middleware.ts
@@ -17,6 +17,7 @@ const supportedLocales = [
"pl",
"pt-BR",
"pt",
+ "ru",
"sk",
"sv",
"zh",
diff --git a/src/utils/dayjs.tsx b/src/utils/dayjs.tsx
index 94d526e2d..4e18d75a9 100644
--- a/src/utils/dayjs.tsx
+++ b/src/utils/dayjs.tsx
@@ -95,6 +95,11 @@ const dayjsLocales: Record<
timeFormat: "24h",
import: () => import("dayjs/locale/pt-br"),
},
+ ru: {
+ weekStartsOn: "monday",
+ timeFormat: "24h",
+ import: () => import("dayjs/locale/ru"),
+ },
ko: {
weekStartsOn: "sunday",
timeFormat: "12h",