about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/components/containers/mastodon.jsx6
-rw-r--r--app/assets/javascripts/components/locales/index.jsx6
-rw-r--r--app/assets/javascripts/components/locales/ru.jsx68
-rw-r--r--app/helpers/settings_helper.rb4
-rw-r--r--config/application.rb4
-rw-r--r--config/locales/devise.ru.yml61
-rw-r--r--config/locales/doorkeeper.ru.yml113
-rw-r--r--config/locales/ru.yml165
-rw-r--r--config/locales/simple_form.ru.yml46
9 files changed, 469 insertions, 4 deletions
diff --git a/app/assets/javascripts/components/containers/mastodon.jsx b/app/assets/javascripts/components/containers/mastodon.jsx
index 00f20074d..fea8b1594 100644
--- a/app/assets/javascripts/components/containers/mastodon.jsx
+++ b/app/assets/javascripts/components/containers/mastodon.jsx
@@ -48,6 +48,8 @@ import hu from 'react-intl/locale-data/hu';
 import uk from 'react-intl/locale-data/uk';
 import fi from 'react-intl/locale-data/fi';
 import eo from 'react-intl/locale-data/eo';
+import ru from 'react-intl/locale-data/ru';
+
 import getMessagesForLocale from '../locales';
 import { hydrateStore } from '../actions/store';
 import createStream from '../stream';
@@ -60,7 +62,9 @@ const browserHistory = useRouterHistory(createBrowserHistory)({
   basename: '/web'
 });
 
-addLocaleData([...en, ...de, ...es, ...fr, ...pt, ...hu, ...uk, ...fi, ...eo]);
+
+addLocaleData([...en, ...de, ...es, ...fr, ...pt, ...hu, ...uk, ...fi, ...eo, ...ru]);
+
 
 const Mastodon = React.createClass({
 
diff --git a/app/assets/javascripts/components/locales/index.jsx b/app/assets/javascripts/components/locales/index.jsx
index 1e7b8b548..f9e1fe5bd 100644
--- a/app/assets/javascripts/components/locales/index.jsx
+++ b/app/assets/javascripts/components/locales/index.jsx
@@ -7,6 +7,8 @@ import pt from './pt';
 import uk from './uk';
 import fi from './fi';
 import eo from './eo';
+import ru from './ru';
+
 
 const locales = {
   en,
@@ -17,7 +19,9 @@ const locales = {
   pt,
   uk,
   fi,
-  eo
+  eo,
+  ru
+
 };
 
 export default function getMessagesForLocale (locale) {
diff --git a/app/assets/javascripts/components/locales/ru.jsx b/app/assets/javascripts/components/locales/ru.jsx
new file mode 100644
index 000000000..e109005a7
--- /dev/null
+++ b/app/assets/javascripts/components/locales/ru.jsx
@@ -0,0 +1,68 @@
+const ru = {
+  "column_back_button.label": "Назад",
+  "lightbox.close": "Закрыть",
+  "loading_indicator.label": "Загрузка...",
+  "status.mention": "Упомянуть @{name}",
+  "status.delete": "Удалить",
+  "status.reply": "Ответить",
+  "status.reblog": "Продвинуть",
+  "status.favourite": "Нравится",
+  "status.reblogged_by": "{name} продвинул(а)",
+  "status.sensitive_warning": "Чувствительный контент",
+  "status.sensitive_toggle": "Нажмите для просмотра",
+  "video_player.toggle_sound": "Вкл./выкл. звук",
+  "account.mention": "Упомянуть @{name}",
+  "account.edit_profile": "Изменить профиль",
+  "account.unblock": "Разблокировать @{name}",
+  "account.unfollow": "Отписаться",
+  "account.block": "Блокировать @{name}",
+  "account.follow": "Подписаться",
+  "account.posts": "Посты",
+  "account.follows": "Подписки",
+  "account.followers": "Подписчики",
+  "account.follows_you": "Подписан(а) на Вас",
+  "account.requested": "Ожидает подтверждения",
+  "getting_started.heading": "Добро пожаловать",
+  "getting_started.about_addressing": "Вы можете подписаться на человека, зная имя пользователя и домен, на котором он находится, введя e-mail-подобный адрес в форму поиска.",
+  "getting_started.about_shortcuts": "Если пользователь находится на одном с Вами домене, можно использовать только имя. То же правило применимо к упоминанию пользователей в статусах.",
+  "getting_started.open_source_notice": "Mastodon - программа с открытым исходным кодом. Вы можете помочь проекту или сообщить о проблемах на GitHub по адресу {github}. {apps}.",
+  "column.home": "Главная",
+  "column.community": "Локальная лента",
+  "column.public": "Глобальная лента",
+  "column.notifications": "Уведомления",
+  "tabs_bar.compose": "Написать",
+  "tabs_bar.home": "Главная",
+  "tabs_bar.mentions": "Упоминания",
+  "tabs_bar.public": "Глобальная лента",
+  "tabs_bar.notifications": "Уведомления",
+  "compose_form.placeholder": "О чем Вы думаете?",
+  "compose_form.publish": "Протрубить",
+  "compose_form.sensitive": "Отметить как чувствительный контент",
+  "compose_form.spoiler": "Скрыть текст за предупреждением",
+  "compose_form.private": "Отметить как приватное",
+  "compose_form.privacy_disclaimer": "Ваш приватный статус будет доставлен упомянутым пользователям на доменах {domains}. Доверяете ли вы {domainsCount, plural, one {этому серверу} other {этим серверам}}? Приватность постов работает только на узлах Mastodon. Если {domains} {domainsCount, plural, one {не является узлом Mastodon} other {не являются узлами Mastodon}}, приватность поста не будет указана, и он может оказаться продвинут или иным образом показан не обозначенным Вами пользователям.",
+  "compose_form.unlisted": "Не отображать в публичных лентах",
+  "navigation_bar.edit_profile": "Изменить профиль",
+  "navigation_bar.preferences": "Опции",
+  "navigation_bar.community_timeline": "Локальная лента",
+  "navigation_bar.public_timeline": "Глобальная лента",
+  "navigation_bar.logout": "Выйти",
+  "reply_indicator.cancel": "Отмена",
+  "search.placeholder": "Поиск",
+  "search.account": "Аккаунт",
+  "search.hashtag": "Хэштег",
+  "upload_button.label": "Добавить медиаконтент",
+  "upload_form.undo": "Отменить",
+  "notification.follow": "{name} подписался(-лась) на Вас",
+  "notification.favourite": "{name} понравился Ваш статус",
+  "notification.reblog": "{name} продвинул(а) Ваш статус",
+  "notification.mention": "{name} упомянул(а) Вас",
+  "notifications.column_settings.alert": "Десктопные уведомления",
+  "notifications.column_settings.show": "Показывать в колонке",
+  "notifications.column_settings.follow": "Новые подписчики:",
+  "notifications.column_settings.favourite": "Нравится:",
+  "notifications.column_settings.mention": "Упоминания:",
+  "notifications.column_settings.reblog": "Продвижения:",
+};
+
+export default ru;
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index 74dc0e11d..327ca4e98 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -5,13 +5,15 @@ module SettingsHelper
     en: 'English',
     de: 'Deutsch',
     es: 'Español',
+    eo: 'Esperanto',
     pt: 'Português',
     fr: 'Français',
     hu: 'Magyar',
     uk: 'Українська',
     'zh-CN': '简体中文',
     fi: 'Suomi',
-    eo: 'Esperanto',
+    ru: 'Русский',
+
   }.freeze
 
   def human_locale(locale)
diff --git a/config/application.rb b/config/application.rb
index 9a5c0d0d3..dc937ca0e 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -24,7 +24,9 @@ module Mastodon
 
     # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
     # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
-    config.i18n.available_locales = [:en, :de, :es, :pt, :fr, :hu, :uk, 'zh-CN', :fi, :eo]
+
+    config.i18n.available_locales = [:en, :de, :es, :pt, :fr, :hu, :uk, 'zh-CN', :fi, :eo, :ru]
+
     config.i18n.default_locale    = :en
 
     # config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
diff --git a/config/locales/devise.ru.yml b/config/locales/devise.ru.yml
new file mode 100644
index 000000000..f829f9d8e
--- /dev/null
+++ b/config/locales/devise.ru.yml
@@ -0,0 +1,61 @@
+---
+ru:
+  devise:
+    confirmations:
+      confirmed: Ваш адрес e-mail был успешно подтвержден.
+      send_instructions: Вы получите e-mail с инструкцией по подтверждению Вашего адреса e-mail в течение нескольких минут.
+      send_paranoid_instructions: Если Ваш адрес e-mail есть в нашей базе данных, вы получите e-mail с инструкцией по подтверждению Вашего адреса в течение нескольких минут.
+    failure:
+      already_authenticated: Вы уже авторизованы.
+      inactive: Ваш аккаунт еще не активирован.
+      invalid: Неверно введены %{authentication_keys} или пароль.
+      last_attempt: У Вас есть последняя попытка, после чего вход будет заблокирован.
+      locked: Ваш аккаунт заблокирован.
+      not_found_in_database: Неверно введены %{authentication_keys} или пароль.
+      timeout: Ваша сессия истекла. Пожалуйста, войдите снова, чтобы продолжить.
+      unauthenticated: Вам необходимо войти или зарегистрироваться.
+      unconfirmed: Вам необходимо подтвердить ваш адрес e-mail для продолжения.
+    mailer:
+      confirmation_instructions:
+        subject: 'Mastodon: Инструкция по подтверждению'
+      password_change:
+        subject: 'Mastodon: Пароль изменен'
+      reset_password_instructions:
+        subject: 'Mastodon: Инструкция по сбросу пароля'
+      unlock_instructions:
+        subject: 'Mastodon: Инструкция по разблокировке'
+    omniauth_callbacks:
+      failure: Не получилось аутентифицировать Вас с помощью %{kind} по следующей причине - "%{reason}".
+      success: Аутентификация с помощью аккаунта %{kind} прошла успешно.
+    passwords:
+      no_token: Вы можете получить доступ к этой странице, только перейдя по ссылке в e-mail для сброса пароля. Если Вы действительно перешли по такой ссылке, пожалуйста, удостоверьтесь, что ссылка была введена полностью и без изменений.
+      send_instructions: Вы получите e-mail с инструкцией по сбросу пароля в течение нескольких минут.
+      send_paranoid_instructions: Если Ваш адрес e-mail есть в нашей базе данных, Вы получите e-mail со ссылкой для сброса пароля в течение нескольких минут.
+      updated: Ваш пароль был успешно изменен. Вход выполнен.
+      updated_not_active: Ваш пароль был успешно изменен.
+    registrations:
+      destroyed: До свидания! Ваш аккаунт был успешно удален. Мы надеемся скоро увидеть Вас снова.
+      signed_up: Добро пожаловать! Вы успешно зарегистрировались.
+      signed_up_but_inactive: Вы успешно зарегистрировались. Тем не менее, мы не можем авторизовать Вас, поскольку Ваш аккаунт еще не активирован.
+      signed_up_but_locked: Вы успешно зарегистрировались. Тем не менее, мы не можем авторизовать Вас, поскольку Ваш аккаунт заблокирован.
+      signed_up_but_unconfirmed: Сообщение со ссылкой для подтверждения было выслано на Ваш адрес e-mail. Пожалуйста, пройдите по ссылке для активации Вашего аккаунта.
+      update_needs_confirmation: Вы успешно обновили Ваш аккаунт, но нам нужно подтвердить ваш новый адрес e-mail. Пожалуйста, проверьте почту и пройдите по ссылке для подтверждения Вашего нового адреса.
+      updated: Ваш аккаунт был успешно обновлен.
+    sessions:
+      already_signed_out: Выход прошел успешно.
+      signed_in: Вход прошел успешно.
+      signed_out: Выход прошел успешно.
+    unlocks:
+      send_instructions: Вы получите e-mail с инструкцией по разблокировке Вашего аккаунта в течение нескольких минут.
+      send_paranoid_instructions: Если Ваш аккаунт существует, Вы получите e-mail с инструкцией по его разблокировке в течение нескольких минут.
+      unlocked: Ваш аккаунт был успешно разблокирован. пожалуйста, войдите для продолжения.
+  errors:
+    messages:
+      already_confirmed: уже подтвержден, пожалуйста, попробуйте войти
+      confirmation_period_expired: не был подтвержден в течение %{period}, пожалуйста, запросите новый
+      expired: истек, пожалуйста, запросите новый
+      not_found: не найден
+      not_locked: не был заблокирован
+      not_saved:
+        one: '1 ошибка помешала сохранению этого %{resource}:'
+        other: "%{count} ошибки помешали сохранению этого %{resource}:"
diff --git a/config/locales/doorkeeper.ru.yml b/config/locales/doorkeeper.ru.yml
new file mode 100644
index 000000000..8862936dc
--- /dev/null
+++ b/config/locales/doorkeeper.ru.yml
@@ -0,0 +1,113 @@
+---
+ru:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Название
+        redirect_uri: URI перенаправления
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: не может содержать фрагмент.
+              invalid_uri: должен быть правильным URI.
+              relative_uri: должен быть абсолютным URI.
+              secured_uri: должен быть HTTPS/SSL URI.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Авторизовать
+        cancel: Отменить
+        destroy: Удалить
+        edit: Изменить
+        submit: Принять
+      confirmations:
+        destroy: Вы уверены?
+      edit:
+        title: Изменить приложение
+      form:
+        error: Ой! Проверьте Вашу форму на возможные ошибки
+      help:
+        native_redirect_uri: Используйте %{native_redirect_uri} для локального тестирования
+        redirect_uri: Используйте по одной строке на URI
+        scopes: Разделяйте список разрешений пробелами. Оставьте незаполненным для использования разрешений по умолчанию.
+      index:
+        callback_url: Callback URL
+        name: Название
+        new: Новое Приложение
+        title: Ваши приложения
+      new:
+        title: Новое Приложение
+      show:
+        actions: Действия
+        application_id: Id приложения
+        callback_urls: Callback urls
+        scopes: Разрешения
+        secret: Секрет
+        title: 'Приложение: %{name}'
+    authorizations:
+      buttons:
+        authorize: Авторизовать
+        deny: Отказать
+      error:
+        title: Произошла ошибка
+      new:
+        able_to: Оно сможет
+        prompt: Приложение %{client_name} запрашивает доступ к Вашему аккаунту
+        title: Требуется авторизация
+      show:
+        title: Код авторизации
+    authorized_applications:
+      buttons:
+        revoke: Отозвать авторизацию
+      confirmations:
+        revoke: Вы уверены?
+      index:
+        application: Приложение
+        created_at: Авторизовано
+        date_format: "%Y-%m-%d %H:%M:%S"
+        scopes: Разрешения
+        title: Ваши авторизованные приложения
+    errors:
+      messages:
+        access_denied: Владелец ресурса или сервер авторизации ответил отказом на Ваш запрос.
+        credential_flow_not_configured: Поток с предоставлением клиенту пароля завершился неудачей, поскольку параметр Doorkeeper.configure.resource_owner_from_credentials не был сконфигурирован.
+        invalid_client: Клиентская аутентификация завершилась неудачей (неизвестный клиент, не включена клиентская аутентификация, или метод аутентификации не поддерживается.
+        invalid_grant: Предоставленный доступ некорректен, истек, отозван, не совпадает с URI перенаправления, использованным в запросе авторизации, или был выпущен для другого клиента.
+        invalid_redirect_uri: Включенный URI перенаправления некорректен.
+        invalid_request: В запросе не хватает обязательного параметра, присутствует неподдерживаемое значение параметра, либо он был сформирован неверно.
+        invalid_resource_owner: Предоставленные данные владельца ресурса некорректны, или владелец ресурса не может быть найден
+        invalid_scope: Запрошенное разрешение некорректно, неизвестно или неверно сформировано.
+        invalid_token:
+          expired: Токен доступа истек
+          revoked: Токен доступа был отменен
+          unknown: Токен доступа некорректен
+        resource_owner_authenticator_not_configured: Поиск владельца ресурса завершился неудачей, поскольку параметр Doorkeeper.configure.resource_owner_authenticator не был сконфигурирован.
+        server_error: Сервер авторизации встретился с неожиданной ошибкой, не позволившей ему выполнить запрос.
+        temporarily_unavailable: Сервер авторизации в данный момент не может выполнить запрос по причине временной перегрузки или профилактики.
+        unauthorized_client: Клиент не авторизован для выполнения этого запроса с использованием этого метода.
+        unsupported_grant_type: Тип авторизации не поддерживается сервером авторизации.
+        unsupported_response_type: Сервер авторизации не поддерживает этот тип ответа.
+    flash:
+      applications:
+        create:
+          notice: Приложение создано.
+        destroy:
+          notice: Приложение удалено.
+        update:
+          notice: Приложение обновлено.
+      authorized_applications:
+        destroy:
+          notice: Авторизация приложения отозвана.
+    layouts:
+      admin:
+        nav:
+          applications: Приложения
+          oauth2_provider: Провайдер OAuth2
+      application:
+        title: Требуется авторизация OAuth
+    scopes:
+      follow: подписываться, отписываться, блокировать и разблокировать аккаунты
+      read: читать данные Вашего аккаунта
+      write: отправлять за Вас посты
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
new file mode 100644
index 000000000..e5a9c0958
--- /dev/null
+++ b/config/locales/ru.yml
@@ -0,0 +1,165 @@
+---
+ru:
+  about:
+    about_mastodon: Mastodon - это <em>свободная</em> социальная сеть с <em>открытым исходным кодом</em>. Как <em>децентрализованная</em> альтернатива коммерческим платформам, Mastodon предотвращает риск монополизации Вашего общения одной компанией. Выберите сервер, которому Вы доверяете &mdash; что бы Вы ни выбрали, Вы сможете общаться со всеми остальными. Любой может запустить свой собственный узел Mastodon и участвовать в <em>социальной сети</em> совершенно бесшовно.
+    about_this: Об этом узле
+    apps: Приложения
+    business_email: 'Деловой e-mail:'
+    closed_registrations: В данный момент регистрация на этом узле закрыта.
+    contact: Связаться
+    description_headline: Что такое %{domain}?
+    domain_count_after: другими узлами
+    domain_count_before: Связывается с
+    features:
+      api: Открытый API для приложений и сервисов
+      blocks: Продвинутые инструменты блокирования и глушения
+      characters: 500 символов на пост
+      chronology: Хронологические ленты
+      ethics: 'Этичный дизайн: нет рекламы, нет слежения'
+      gifv: GIFV и короткие видео
+      privacy: Тонкие настройки приватности для каждого поста
+      public: Публичные ленты
+    features_headline: Что выделяет Mastodon
+    get_started: Начать
+    links: Ссылки
+    other_instances: Другие узлы
+    source_code: Исходный код
+    status_count_after: статусов
+    status_count_before: Автор
+    terms: Условия
+    user_count_after: пользователей
+    user_count_before: Здесь живет
+  accounts:
+    follow: Подписаться
+    followers: Подписчики
+    following: Подписан(а)
+    nothing_here: Здесь ничего нет!
+    people_followed_by: Люди, на которых подписан(а) %{name}
+    people_who_follow: Подписчики %{name}
+    posts: Посты
+    remote_follow: Подписаться на удаленном узле
+    unfollow: Отписаться
+  application_mailer:
+    settings: 'Изменить настройки e-mail: %{link}'
+    signature: Уведомления Mastodon от %{instance}
+    view: 'View:'
+  applications:
+    invalid_url: Введенный URL неверен
+  auth:
+    change_password: Изменить пароль
+    didnt_get_confirmation: Не получили инструкцию для подтверждения?
+    forgot_password: Забыли пароль?
+    login: Войти
+    logout: Выйти
+    register: Зарегистрироваться
+    resend_confirmation: Повторить отправку инструкции для подтверждения
+    reset_password: Сбросить пароль
+    set_new_password: Задать новый пароль
+  authorize_follow:
+    error: К сожалению, при поиске удаленного аккаунта возникла ошибка
+    follow: Подписаться
+    prompt_html: 'Вы (<strong>%{self}</strong>) запросили подписку:'
+    title: Подписаться на %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}ч"
+      about_x_months: "%{count}мес"
+      about_x_years: "%{count}г"
+      almost_x_years: "%{count}г"
+      half_a_minute: Только что
+      less_than_x_minutes: "%{count}мин"
+      less_than_x_seconds: Только что
+      over_x_years: "%{count}г"
+      x_days: "%{count}д"
+      x_minutes: "%{count}мин"
+      x_months: "%{count}мес"
+      x_seconds: "%{count}сек"
+  exports:
+    blocks: Вы заблокировали
+    csv: CSV
+    follows: Подписки
+    storage: Ваш медиаконтент
+  generic:
+    changes_saved_msg: Изменения успешно сохранены!
+    powered_by: работает на %{link}
+    save_changes: Сохранить изменения
+    validation_errors:
+      one: Что-то здесь не так! Пожалуйста, прочитайте об ошибке ниже
+      other: Что-то здесь не так! Пожалуйста, прочитайте о %{count} ошибках ниже
+  imports:
+    preface: Вы можете загрузить некоторые данные, например, списки людей, на которых Вы подписаны или которых блокируете, в Ваш аккаунт на этом узле из файлов, экспортированных с другого узла.
+    success: Ваши данные были успешно загружены и будут обработаны с должной скоростью
+    types:
+      blocking: Список блокируемых
+      following: Список подписок
+    upload: Загрузить
+  landing_strip_html: <strong>%{name}</strong> - пользователь на <strong>%{domain}</strong>. Вы можете подписаться на него/нее и общаться с ним/ней, если у Вас есть аккаунт на любом узле общей сети. Если у Вас его нет, вы можете <a href="%{sign_up_path}">зарегистрироваться здесь</a>.
+  notification_mailer:
+    digest:
+      body: 'Кратко о пропущенном Вами на %{instance} с Вашего последнего захода %{since}:'
+      mention: "%{name} упомянул(а) Вас в:"
+      new_followers_summary:
+        one: У Вас появился новый подписчик! Ура!
+        other: У Вас появилось %{count} новых подписчика(-ов)! Отлично!
+      subject:
+        one: "1 новое уведомление с Вашего последнего захода \U0001F418"
+        other: "%{count} новых уведомлений с Вашего последнего захода \U0001F418"
+    favourite:
+      body: 'Ваш статус понравился %{name}:'
+      subject: "%{name} понравился Ваш статус"
+    follow:
+      body: "%{name} теперь подписан(а) на Вас!"
+      subject: "%{name} теперь подписан(а) на Вас"
+    follow_request:
+      body: "%{name} запросил Вас о подписке"
+      subject: '%{name} хочет подписаться на Вас'
+    mention:
+      body: 'Вас упомянул(а) %{name} в:'
+      subject: Вы были упомянуты %{name}
+    reblog:
+      body: 'Ваш статус был продвинут %{name}:'
+      subject: "%{name} продвинул(а) Ваш статус"
+  pagination:
+    next: След
+    prev: Пред
+  remote_follow:
+    acct: Введите username@domain, откуда Вы хотите подписаться
+    missing_resource: Поиск требуемого перенаправления URL для Вашего аккаунта завершился неудачей
+    proceed: Продолжить подписку
+    prompt: 'Вы ходите подписаться на:'
+  settings:
+    authorized_apps: Авторизованные приложения
+    back: Назад в Mastodon
+    edit_profile: Изменить профиль
+    export: Экспорт данных
+    import: Импорт
+    preferences: Настройки
+    settings: Опции
+    two_factor_auth: Двухфакторная аутентификация
+  statuses:
+    open_in_web: Открыть в WWW
+    over_character_limit: превышен лимит символов (%{max})
+    show_more: Подробнее
+    visibilities:
+      private: Показывать только подписчикам
+      public: Публичный
+      unlisted: Публичный, но без отображения в публичных лентах
+  stream_entries:
+    click_to_show: Показать
+    reblogged: продвинул(а)
+    sensitive_content: Чувствительный контент
+  time:
+    formats:
+      default: "%b %d, %Y, %H:%M"
+  two_factor_auth:
+    description_html: При включении <strong>двухфакторной аутентификации</strong>, вход потребует от Вас использования Вашего телефона, который сгенерирует входные токены.
+    disable: Отключить
+    enable: Включить
+    instructions_html: "<strong>Отсканируйте этот QR-код с помощью Google Authenticator или другого подобного приложения на Вашем телефоне</strong>. С этого момента приложение будет генерировать токены, которые будет необходимо ввести для входа."
+    plaintext_secret_html: 'Секрет открытым текстом: <samp>%{secret}</samp>'
+    warning: Если сейчас у Вас не получается настроить аутентификатор, нажмите "отключить", иначе Вы не сможете войти!
+  users:
+    invalid_email: Введенный e-mail неверен
+    invalid_otp_token: Введен неверный код
+  will_paginate:
+    page_gap: "&hellip;"
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
new file mode 100644
index 000000000..6f4873bfd
--- /dev/null
+++ b/config/locales/simple_form.ru.yml
@@ -0,0 +1,46 @@
+---
+ru:
+  simple_form:
+    hints:
+      defaults:
+        avatar: PNG, GIF или JPG. Максимально 2MB. Будет уменьшено до 120x120px
+        display_name: Максимально 30 символов
+        header: PNG, GIF или JPG. Максимально 2MB. Будет уменьшено до 700x335px
+        locked: Потребует от Вас ручного подтверждения подписчиков, изменит приватность постов по умолчанию на "только для подписчиков"
+        note: Максимально 160 символов
+      imports:
+        data: Файл CSV, экспортированный с другого узла Mastodon
+    labels:
+      defaults:
+        avatar: Аватар
+        confirm_new_password: Повторите новый пароль
+        confirm_password: Повторите пароль
+        current_password: Текущий пароль
+        data: Данные
+        display_name: Показываемое имя
+        email: Адрес e-mail
+        header: Заголовок
+        locale: Язык
+        locked: Сделать аккаунт приватным
+        new_password: Новый пароль
+        note: О Вас
+        otp_attempt: Двухфакторный код
+        password: Пароль
+        setting_default_privacy: Приватность постов
+        type: Тип импорта
+        username: Имя пользователя
+      interactions:
+        must_be_follower: Заблокировать уведомления не от подписчиков
+        must_be_following: Заблокировать уведомления от людей, на которых Вы не подписаны
+      notification_emails:
+        digest: Присылать дайджест по e-mail
+        favourite: Уведомлять по e-mail, когда кому-то нравится Ваш статус
+        follow: Уведомлять по e-mail, когда кто-то подписался на Вас
+        follow_request: Уведомлять по e-mail, когда кто-то запрашивает разрешение на подписку
+        mention: Уведомлять по e-mail, когда кто-то упомянул Вас
+        reblog: Уведомлять по e-mail, когда кто-то продвинул Ваш статус
+    'no': 'Нет'
+    required:
+      mark: "*"
+      text: обязательно
+    'yes': 'Да'