diff --git a/api/user_setting.go b/api/user_setting.go
index f3b272f4..3eaff207 100644
--- a/api/user_setting.go
+++ b/api/user_setting.go
@@ -36,7 +36,7 @@ func (key UserSettingKey) String() string {
 }
 
 var (
-	UserSettingLocaleValue                 = []string{"en", "zh", "vi", "fr", "nl", "sv", "de", "es", "uk"}
+	UserSettingLocaleValue                 = []string{"en", "zh", "vi", "fr", "nl", "sv", "de", "es", "uk", "ru"}
 	UserSettingAppearanceValue             = []string{"system", "light", "dark"}
 	UserSettingMemoVisibilityValue         = []Visibility{Private, Protected, Public}
 	UserSettingMemoDisplayTsOptionKeyValue = []string{"created_ts", "updated_ts"}
diff --git a/web/src/components/LocaleSelect.tsx b/web/src/components/LocaleSelect.tsx
index 2b7e6460..f48f6a60 100644
--- a/web/src/components/LocaleSelect.tsx
+++ b/web/src/components/LocaleSelect.tsx
@@ -31,6 +31,7 @@ const LocaleSelect: FC<Props> = (props: Props) => {
       <Option value="de">German</Option>
       <Option value="es">Español</Option>
       <Option value="uk">Українська</Option>
+      <Option value="ru">Русский</Option>
     </Select>
   );
 };
diff --git a/web/src/i18n.ts b/web/src/i18n.ts
index b0649c16..9000a979 100644
--- a/web/src/i18n.ts
+++ b/web/src/i18n.ts
@@ -9,6 +9,7 @@ import svLocale from "./locales/sv.json";
 import deLocale from "./locales/de.json";
 import esLocale from "./locales/es.json";
 import ukLocale from "./locales/uk.json";
+import ruLocale from "./locales/ru.json";
 
 i18n.use(initReactI18next).init({
   resources: {
@@ -39,6 +40,9 @@ i18n.use(initReactI18next).init({
     uk: {
       translation: ukLocale,
     },
+    ru: {
+      translation: ruLocale,
+    },
   },
   lng: "nl",
   fallbackLng: "en",
diff --git a/web/src/locales/ru.json b/web/src/locales/ru.json
new file mode 100644
index 00000000..3685075d
--- /dev/null
+++ b/web/src/locales/ru.json
@@ -0,0 +1,256 @@
+{
+  "common": {
+    "about": "Про Memos",
+    "email": "Эл. почта",
+    "password": "Пароль",
+    "repeat-password-short": "Повторить",
+    "repeat-password": "Повторить пароль",
+    "new-password": "Новый пароль",
+    "repeat-new-password": "Повторить новый пароль",
+    "username": "Имя пользователя",
+    "nickname": "Псевдоним",
+    "save": "Сохранить",
+    "close": "Закрыть",
+    "cancel": "Отменить",
+    "create": "Создать",
+    "change": "Заменить",
+    "confirm": "Подтвердить",
+    "reset": "Стереть",
+    "language": "Язык",
+    "version": "Версия",
+    "pin": "Закрепить",
+    "unpin": "Открепить",
+    "edit": "Редактировать",
+    "restore": "Восстановить",
+    "delete": "Удалить",
+    "null": "Пусто",
+    "share": "Поделиться",
+    "archive": "Архивировать",
+    "basic": "Базовые",
+    "admin": "Администратор",
+    "explore": "Больше",
+    "sign-in": "Войти",
+    "sign-up": "Зарегистрироваться",
+    "sign-out": "Выйти",
+    "back-to-home": "Вернуться на главную",
+    "type": "Тип",
+    "shortcuts": "Ярлыки",
+    "title": "Заголовок",
+    "filter": "Фильтр",
+    "tags": "Теги",
+    "yourself": "Вы",
+    "archived-at": "Архив",
+    "changed": "изменено",
+    "update-on": "Обновлено",
+    "fold": "Свернуть",
+    "expand": "Развернуть",
+    "image": "Изображение",
+    "link": "Ссылка",
+    "vacuum": "Сжать",
+    "select": "Выбрать"
+  },
+  "slogan": "Self-hosted платформа с открытым исходным кодом для заметок и управления записями с поддержкой социальных функций.",
+  "auth": {
+    "signup-as-host": "Зарегистрироваться как владелец",
+    "host-tip": "Вы регистрируете владельца сайта.",
+    "not-host-tip": "Если у вас нет аккаунта, обратитесь к владельцу сайта."
+  },
+  "sidebar": {
+    "daily-review": "По дням",
+    "resources": "Ресурсы",
+    "setting": "Настройки",
+    "archived": "Заархивировано"
+  },
+  "daily-review": {
+    "oops-nothing": "Ой, здесь ничего нет."
+  },
+  "resources": {
+    "description": "Посмотреть ваши статические ресурсы в Memos (изображения и пр.)",
+    "no-resources": "Нет ресурсов.",
+    "fetching-data": "загрузка данных...",
+    "upload": "Загрузить",
+    "preview": "Предпросмотр",
+    "copy-link": "Скопировать ссылку",
+    "delete-resource": "Удалить ресурс",
+    "warning-text": "Вы уверены, что хотите удалить этот ресурс? ЭТО ДЕЙСТВИЕ НЕВОЗМОЖНО ОТМЕНИТЬ❗",
+    "linked-amount": "Количество записей",
+    "rename": "Переименовать",
+    "clear-unused-resources": "Удалить неиспользуемые ресурсы",
+    "warning-text-unused": "Вы уверены, что хотите удалить неиспользуемые ресурсы? ЭТО ДЕЙСТВИЕ НЕВОЗМОЖНО ОТМЕНИТЬ❗",
+    "no-unused-resources": "Нет неиспользуемых ресурсов",
+    "name": "Название"
+  },
+  "archived": {
+    "archived-memos": "Заархивированные записи",
+    "no-archived-memos": "Нет заархивированных записей.",
+    "fetching-data": "загрузка данных..."
+  },
+  "editor": {
+    "editing": "Редактирование...",
+    "cancel-edit": "Отменить",
+    "save": "Сохранить",
+    "placeholder": "Ваши мысли...",
+    "only-image-supported": "Поддерживаются только изображения.",
+    "cant-empty": "Содержимое не может быть пустым",
+    "local": "На устройстве",
+    "resources": "Ресурсы"
+  },
+  "memo": {
+    "view-detail": "Подробно",
+    "copy": "Копировать",
+    "visibility": {
+      "private": "Видно только вам",
+      "protected": "Видно только пользователям",
+      "public": "Видно всем"
+    }
+  },
+  "memo-list": {
+    "fetching-data": "загрузка данных...",
+    "fetch-more": "Загрузить больше"
+  },
+  "shortcut-list": {
+    "shortcut-title": "название ярлыка",
+    "create-shortcut": "Создать ярлык",
+    "edit-shortcut": "Редактировать ярлык",
+    "eligible-memo": "связанные записи",
+    "fill-previous": "Пожалуйста, заполните значение фильтра",
+    "title-required": "Название обязательно",
+    "value-required": "Значение фильтра обязательно"
+  },
+  "filter": {
+    "new-filter": "Новый фильтр",
+    "type": {
+      "tag": "Тег",
+      "type": "Тип",
+      "text": "Текст",
+      "display-time": "Время отображения",
+      "visibility": "Видимость"
+    },
+    "operator": {
+      "contains": "Содержит",
+      "not-contains": "Не содержит",
+      "is": "Только",
+      "is-not": "Кроме",
+      "before": "До",
+      "after": "После"
+    },
+    "value": {
+      "not-tagged": "Без тегов",
+      "linked": "Содержит ссылки"
+    },
+    "text-placeholder": "Начните с ^ чтобы использовать регулярные выражения"
+  },
+  "tag-list": {
+    "tip-text": "Введите `#tag` для создания"
+  },
+  "search": {
+    "quickly-filter": "Быстрый фильтр"
+  },
+  "setting": {
+    "my-account": "Мой аккаунт",
+    "preference": "Настройки",
+    "member": "Пользователи",
+    "member-list": "Список пользователей",
+    "system": "Системные",
+    "account-section": {
+      "title": "Информация об аккаунте",
+      "update-information": "Обновить информацию",
+      "change-password": "Изменить пароль"
+    },
+    "preference-section": {
+      "theme": "Тема",
+      "default-memo-visibility": "Видимость записей по умолчанию",
+      "enable-folding-memo": "Включить сворачивание записей",
+      "enable-powerful-editor": "Включить расширенный редактор",
+      "editor-font-style": "Стиль шрифта",
+      "mobile-editor-style": "Стиль мобильного редактора",
+      "default-memo-sort-option": "Отображаемое время записи",
+      "created_ts": "Время создания",
+      "updated_ts": "Время обновления"
+    },
+    "member-section": {
+      "create-a-member": "Создать пользователя"
+    },
+    "system-section": {
+      "server-name": "Имя сервера",
+      "customize-server": {
+        "title": "Настроить сервер",
+        "default": "По умолчанию: memos",
+        "icon-url": "URL иконки"
+      },
+      "database-file-size": "Размер файла базы данных",
+      "allow-user-signup": "Разрешить регистрацию пользователей",
+      "additional-style": "Настраиваемый стиль",
+      "additional-script": "Настраиваемый скрипт",
+      "additional-style-placeholder": "Настраиваемый код CSS",
+      "additional-script-placeholder": "Настраиваемый код JavaScript"
+    },
+    "apperance-option": {
+      "system": "Системная",
+      "light": "Светлая",
+      "dark": "Тёмная"
+    }
+  },
+  "amount-text": {
+    "memo_one": "ЗАПИСЬ",
+    "memo_other": "ЗАПИСИ",
+    "tag_one": "ТЕГ",
+    "tag_other": "ТЕГИ",
+    "day_one": "ДЕНЬ",
+    "day_other": "ДНИ"
+  },
+  "message": {
+    "no-memos": "нет записей 🌃",
+    "memos-ready": "больше записей нет 🎉",
+    "restored-successfully": "Успешно восстановлено.",
+    "memo-updated-datetime": "Время создания изменено.",
+    "invalid-created-datetime": "Неверное время создания.",
+    "change-memo-created-time": "Изменить время создания записи",
+    "memo-not-found": "Запись не найдена.",
+    "fill-all": "Пожалуйста, заполните все поля.",
+    "password-not-match": "Пароли не совпадают.",
+    "new-password-not-match": "Новый пароль не совпадает.",
+    "image-load-failed": "Ошибка загрузки изображения",
+    "fill-form": "Пожалуйста, заполните форму",
+    "login-failed": "Ошибка входа",
+    "signup-failed": "Помилка реєстрації",
+    "user-not-found": "Пользователь не найден",
+    "password-changed": "Пароль изменён",
+    "private-only": "Это частная заметка.",
+    "copied": "Скопировано",
+    "succeed-copy-content": "Скопировано в буфер обмена.",
+    "succeed-copy-link": "Ссылка скопирована в буфер обмена.",
+    "change-resource-filename": "Изменить имя файла",
+    "resource-filename-updated": "Имя файла изменено.",
+    "invalid-resource-filename": "Неверное имя файла.",
+    "click-to-save-the-image": "Нажмите для сохранения изображения",
+    "generating-the-screenshot": "Создание снимка...",
+    "count-selected-resources": "Всего выбрано",
+    "too-short": "Слишком короткое",
+    "too-long": "Слишком длинное",
+    "not-allow-space": "Пробел не разрешён",
+    "not-allow-chinese": "Китайские символы не разрешены",
+    "succeed-vacuum-database": "База данных успешно сжата",
+    "succeed-update-additional-style": "Настраиваемый стиль успешно обновлен",
+    "succeed-copy-resource-link": "Ссылка на файл скопирована в буфер обмена",
+    "succeed-update-customized-profile": "Собственный профиль успешно обновлён",
+    "succeed-update-additional-script": "Настраиваемый скрипт успешно обновлён",
+    "update-succeed": "Успешно обновлено"
+  },
+  "days": {
+    "monday": "Понедельник",
+    "mon": "Пон.",
+    "tuesday": "Вторник",
+    "tue": "Вт.",
+    "wednesday": "Среда",
+    "wed": "Ср.",
+    "thursday": "Четверг",
+    "thu": "Чт.",
+    "friday": "Пятница",
+    "fri": "Пт.",
+    "saturday": "Суббота",
+    "sat": "Сб.",
+    "sunday": "Воскресенье",
+    "sun": "Вс."
+  }
+}
diff --git a/web/src/types/i18n.d.ts b/web/src/types/i18n.d.ts
index a8771e89..d1be9be8 100644
--- a/web/src/types/i18n.d.ts
+++ b/web/src/types/i18n.d.ts
@@ -1 +1 @@
-type Locale = "en" | "zh" | "vi" | "fr" | "nl" | "sv" | "de" | "es" | "uk";
+type Locale = "en" | "zh" | "vi" | "fr" | "nl" | "sv" | "de" | "es" | "uk" | "ru";