From 8f8bc33a7bf14d19be38b49942a244859b873a06 Mon Sep 17 00:00:00 2001 From: Luke Vella Date: Thu, 12 Jan 2023 16:09:46 +0000 Subject: [PATCH] Add support for russian locale (#392) --- next-i18next.config.js | 1 + public/locales/ru/app.json | 125 ++++++++++++++++++++++ public/locales/ru/common.json | 15 +++ public/locales/ru/errors.json | 6 ++ public/locales/ru/homepage.json | 35 ++++++ src/components/poll/language-selector.tsx | 1 + src/middleware.ts | 1 + src/utils/dayjs.tsx | 5 + 8 files changed, 189 insertions(+) create mode 100644 public/locales/ru/app.json create mode 100644 public/locales/ru/common.json create mode 100644 public/locales/ru/errors.json create mode 100644 public/locales/ru/homepage.json 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",