diff --git a/packages/ui/public/locales/ru.json b/packages/ui/public/locales/ru.json
new file mode 100644
index 000000000..cd7ea6f87
--- /dev/null
+++ b/packages/ui/public/locales/ru.json
@@ -0,0 +1,602 @@
+{
+ "2fa": "2ФА",
+ "2fa-description": "Второй уровень безопасности для вашего логина и приложений Umbrel",
+ "2fa.disable.success": "Двухфакторная аутентификация отключена",
+ "2fa.disable.title": "Отключить двухфакторную аутентификацию",
+ "2fa.enable.or-paste": "Или вставьте следующий код в приложение аутентификатора",
+ "2fa.enable.scan-this": "Отсканируйте этот QR-код с помощью приложения-аутентификатора, например Google Authenticator или Authy.",
+ "2fa.enable.success": "Двухфакторная аутентификация включена",
+ "2fa.enable.title": "Включить двухфакторную аутентификацию",
+ "2fa.enter-code": "Введите код, отображаемый в приложении аутентификатора.",
+ "account": "Аккаунт",
+ "account-description": "Ваше имя и пароль",
+ "advanced-settings": "Расширенные настройки",
+ "advanced-settings-description": "Терминал, программа бета-тестирования umbrelOS, DNS Cloudflare и многое другое",
+ "app-not-found": "Приложение не найдено: {{app}}",
+ "app-only-over-tor": "{{app}} можно использовать только через Tor. Чтобы открыть это приложение, зайдите в Umbrel через браузер Tor по URL-адресу удаленного доступа (Настройки > Удаленный доступ через Tor).",
+ "app-page.section.about": "О",
+ "app-page.section.credentials.title": "Данные по умолчанию",
+ "app-page.section.dependencies.n-alternatives": "Смотрите {{count}} альтернативы",
+ "app-page.section.info.compatibility": "Совместимость",
+ "app-page.section.info.compatibility-compatible": "Совместимо",
+ "app-page.section.info.compatibility-not-compatible": "Не совместимо",
+ "app-page.section.info.developer": "Разработчик",
+ "app-page.section.info.source-code": "Исходный код",
+ "app-page.section.info.source-code.public": "Публичный",
+ "app-page.section.info.submitted-by": "Представлен",
+ "app-page.section.info.support": "Получить поддержку",
+ "app-page.section.info.title": "Инфо",
+ "app-page.section.info.version": "Версия",
+ "app-page.section.recommendations.title": "Вам также может понравиться",
+ "app-page.section.release-notes.title": "Что нового",
+ "app-page.section.release-notes.version": "Версия {{version}}",
+ "app-page.section.requires": "Требует",
+ "app-picker.search": "Поиск...",
+ "app-picker.select-app": "Выбрать приложение...",
+ "app-settings.connected-to": "{{appName}} связан с этими приложениями",
+ "app-settings.save-changes": "Сохранить изменения",
+ "app-settings.title": "Настройки",
+ "app-store.browse-category-apps": "Просмотреть {{category}} приложений",
+ "app-store.category.ai": "ИИ",
+ "app-store.category.all": "Все приложения",
+ "app-store.category.automation": "Дом и Автоматизация",
+ "app-store.category.bitcoin": "Биткоин",
+ "app-store.category.developer": "Инструменты для разработки",
+ "app-store.category.discover": "Откройте для себя",
+ "app-store.category.files": "Файлы и производительность",
+ "app-store.category.finance": "Финансы",
+ "app-store.category.media": "Медиа",
+ "app-store.category.networking": "Сеть",
+ "app-store.category.social": "Социальные приложения",
+ "app-store.description": "Настройки обновления приложения",
+ "app-store.menu.community-app-stores": "Магазины приложений сообщества",
+ "app-store.search-apps": "Поиск приложений",
+ "app-store.search.no-results": "Нет результатов",
+ "app-store.search.results-for": "Результаты по",
+ "app-store.title": "App Store",
+ "app-updates.less": "меньше",
+ "app-updates.more": "больше",
+ "app-updates.no-updates": "Все приложения обновлены!",
+ "app-updates.update": "Обновить",
+ "app-updates.update-all": "Обновить все",
+ "app-updates.updates-available-count_one": "{{count}} обновление доступно",
+ "app-updates.updates-available-count_other": "{{count}} обновлений доступно",
+ "app-updates.updating": "Обновление...",
+ "app.install": "Установить",
+ "app.installed": "Установлено",
+ "app.installing": "Установка",
+ "app.offline": "Не запущено",
+ "app.open": "Открыть",
+ "app.optimized-for-umbrel-home": "Оптимизированно под Umbrel Home",
+ "app.os-update-required.confirm": "Проверить обновление umbrelOS",
+ "app.os-update-required.description": "{{appName}} требует umbrelOS {{version}} или новее",
+ "app.os-update-required.title": "Обновить umbrelOS",
+ "app.restarting": "Перезагрузка",
+ "app.starting": "Запуск",
+ "app.stopped": "Остановлено",
+ "app.stopping": "Остановка",
+ "app.uninstall.confirm.description": "Все данные, связанные с {{app}}, будут безвозвратно удалены. Это действие нельзя отменить.",
+ "app.uninstall.confirm.submit": "Удалить",
+ "app.uninstall.confirm.title": "Удалить {{app}}?",
+ "app.uninstall.deps.used-by.description_one": "Сначала удалите {{firstAppToUninstall}}, чтобы удалить {{app}}.",
+ "app.uninstall.deps.used-by.description_other": "Сначала удалите эти приложения, чтобы удалить {{app}}.",
+ "app.uninstall.deps.used-by.title": "{{app}} используется в",
+ "app.uninstalling": "Удаление",
+ "app.updating": "Обновление",
+ "app.view": "Просмотр",
+ "app_one": "приложение",
+ "app_other": "приложений",
+ "apps.uninstall.failed-to-get-required-apps": "Не удалось получить необходимые приложения",
+ "apps.uninstalled-all.success": "Все приложения удалены",
+ "auth.checking-backend-for-user": "Загрузка...",
+ "auth.failed-checking-if-user-logged-in": "Ошибка: не удалось проверить вход",
+ "auth.failed-to-check-if-user-exists": "Ошибка: не удалось проверить существование пользователя",
+ "beta-program": "Бета-программа umbrelOS",
+ "beta-program-description": "Подпишитесь на получение бета-обновлений umbrelOS, получите ранний доступ к новым функциям и помогите нам их улучшить, предоставляя обратную связь. Бета-версии могут быть нестабильными, а для устранения неполадок может потребоваться знание терминала.",
+ "cancel": "Отмена",
+ "change": "Изменить",
+ "change-name": "Изменить имя",
+ "change-name.failed.name-required": "Имя обязательно",
+ "change-name.input-placeholder": "Ваше имя",
+ "change-password": "Изменить пароль",
+ "change-password.callout": "Если вы потеряете пароль, вы не сможете войти в свой Umbrel. Убедитесь, что он надежно сохранен.",
+ "change-password.current-password": "Текущий пароль",
+ "change-password.failed.current-required": "Текущий пароль обязателен",
+ "change-password.failed.min-length": "Пароль должен содержать не менее {{characters}} символов",
+ "change-password.failed.must-be-unique": "Новый пароль должен отличаться от текущего",
+ "change-password.failed.new-required": "Новый пароль обязателен",
+ "change-password.failed.no-match": "Пароли не совпадают",
+ "change-password.failed.repeat-required": "Повтор пароля обязателен",
+ "change-password.new-password": "Новый пароль",
+ "change-password.repeat-password": "Повторите пароль",
+ "check-for-latest-version": "Проверить последнюю версию umbrelOS",
+ "clipboard.copied": "Скопировано",
+ "close": "Закрыть",
+ "cmdk.change-wallpaper": "Изменить обои",
+ "cmdk.frequent-apps": "Часто используемые",
+ "cmdk.input-placeholder": "Поиск приложений, настроек или действий",
+ "cmdk.live-usage": "Использование в реальном времени",
+ "cmdk.restart-umbrel": "Перезагрузить Umbrel",
+ "cmdk.shutdown-umbrel": "Выключить Umbrel",
+ "cmdk.update-all-apps": "Обновить все приложения",
+ "cmdk.widgets": "Виджеты",
+ "community-app-store": "Сообщество App Store",
+ "community-app-store.back-to-umbrel-app-store": "Вернуться в Umbrel App Store",
+ "community-app-store.open-button": "Открыть",
+ "community-app-store.remove-button": "Удалить",
+ "community-app-stores.add-button": "Добавить",
+ "community-app-stores.description": "Сообщества App Store позволяют устанавливать приложения на ваш Umbrel, которые могут быть недоступны в официальном Umbrel App Store. Они также облегчают тестирование бета-версий приложений Umbrel до их выпуска разработчиками в официальном Umbrel App Store.",
+ "community-app-stores.learn-more": "Узнать больше",
+ "community-app-stores.warning": "Сообщества App Store могут быть созданы кем угодно. Приложения, опубликованные в них, не проверяются и не контролируются командой официального Umbrel App Store и могут быть небезопасными или вредоносными. Будьте осторожны и добавляйте только магазины приложений от разработчиков, которым доверяете.",
+ "confirm": "Подтвердить",
+ "connecting": "Подключение...",
+ "continue": "Продолжить",
+ "continue-to-log-in": "Перейти к входу",
+ "cpu": "ЦП",
+ "cpu-core-count": "{{cores}} потоков",
+ "create-user": "Создать пользователя",
+ "default-credentials.close": "Понятно",
+ "default-credentials.description": "Вот учетные данные по умолчанию, которые вам понадобятся для входа в приложение.",
+ "default-credentials.dont-show-again": "Больше не показывать",
+ "default-credentials.dont-show-again-notice": "Вы можете получить доступ к этим учетным данным в любое время, щелкнув правой кнопкой мыши на значке приложения.",
+ "default-credentials.open": "Открыть {{app}}",
+ "default-credentials.password": "Пароль по умолчанию",
+ "default-credentials.title": "Учетные данные для {{app}}",
+ "default-credentials.username": "Имя пользователя по умолчанию",
+ "desktop.app.context.go-to-store-page": "Просмотреть в App Store",
+ "desktop.app.context.settings": "Настройки",
+ "desktop.app.context.show-default-credentials": "Показать учетные данные по умолчанию",
+ "desktop.app.context.uninstall": "Удалить",
+ "desktop.context-menu.change-wallpaper": "Изменить обои",
+ "desktop.context-menu.edit-widgets": "Редактировать виджеты",
+ "desktop.context-menu.logout": "Выйти",
+ "desktop.greeting.afternoon": "Добрый день, {{name}}",
+ "desktop.greeting.evening": "Добрый вечер, {{name}}",
+ "desktop.greeting.morning": "Доброе утро, {{name}}",
+ "desktop.install-first.for-the-bitcoiner": "Для биткоинеров",
+ "desktop.install-first.for-the-self-hoster": "Для самохостеров",
+ "desktop.install-first.for-the-streamer": "Для стримеров",
+ "desktop.install-first.link-to-app-store": "Найти больше в App Store",
+ "desktop.not-enough-room": "Используйте экран большего размера для просмотра приложений.",
+ "device": "Устройство",
+ "device-info": "Информация об устройстве",
+ "device-info-description": "Информация о вашем устройстве",
+ "device-info.device": "Устройство",
+ "device-info.model-number": "Модель",
+ "device-info.serial-number": "Серийный номер",
+ "device-info.view-info": "Просмотреть информацию",
+ "disable": "Отключить",
+ "done": "Готово",
+ "download-logs": "Скачать логи",
+ "external-dns": "DNS Cloudflare",
+ "external-dns-description": "DNS Cloudflare обеспечивает лучшую надежность сети. Отключите, чтобы использовать DNS-настройки вашего роутера.",
+ "factory-reset": "Сброс к заводским настройкам",
+ "factory-reset-description": "Удалить все ваши данные и приложения, восстановив umbrelOS к настройкам по умолчанию",
+ "factory-reset.confirm.body": "Подтвердите пароль для сброса",
+ "factory-reset.confirm.ethernet-required-warning": "Убедитесь, что ваше устройство подключено к роутеру через Ethernet (не Wi-Fi) и вы обращаетесь к нему из локальной сети (например, через http://umbrel.local или локальный IP-адрес устройства).",
+ "factory-reset.confirm.submit": "Удалить всё и сбросить",
+ "factory-reset.confirm.submit-callout": "Это действие нельзя отменить.",
+ "factory-reset.failed.message": "Произошла ошибка при сбросе",
+ "factory-reset.failed.retry": "Повторить сброс",
+ "factory-reset.failed.title": "Сброс не удался",
+ "factory-reset.resetting.dont-turn-off-device": "Не выключайте устройство до завершения сброса",
+ "factory-reset.review.account-info": "Учетная запись и пароль",
+ "factory-reset.review.apps": "Приложения",
+ "factory-reset.review.following-will-be-removed": "Следующее будет удалено с вашего устройства",
+ "factory-reset.review.installed-apps_one": "{{count}} установленное приложение",
+ "factory-reset.review.installed-apps_other": "{{count}} установленных приложений",
+ "factory-reset.review.submit": "Продолжить",
+ "factory-reset.review.total-data": "Всего данных",
+ "factory-reset.success.description": "Все ваши приложения, данные и учетная запись были удалены, а umbrelOS сброшена к настройкам по умолчанию.",
+ "factory-reset.success.title": "Сброс завершен",
+ "files-action.add-favorite": "Добавить в избранное",
+ "files-action.cancel-upload": "Отменить загрузку",
+ "files-action.compress": "Архивировать",
+ "files-action.copy": "Копировать",
+ "files-action.cut": "Вырезать",
+ "files-action.delete": "Удалить навсегда",
+ "files-action.download": "Скачать",
+ "files-action.download-items": "Скачать {{count}} элементов",
+ "files-action.drop-to-upload": "Перетащите для загрузки",
+ "files-action.eject-disk": "Извлечь диск",
+ "files-action.empty-trash": "Очистить корзину",
+ "files-action.go-to-path": "Перейти к...",
+ "files-action.new-folder": "Новая папка",
+ "files-action.open": "Открыть",
+ "files-action.paste": "Вставить",
+ "files-action.remove-favorite": "Удалить из избранного",
+ "files-action.rename": "Переименовать",
+ "files-action.restore": "Восстановить",
+ "files-action.select": "Выбрать",
+ "files-action.share": "Открыть доступ по сети...",
+ "files-action.sharing": "Доступ открывается...",
+ "files-action.show-in-folder": "Показать в родительской папке",
+ "files-action.trash": "Корзина",
+ "files-action.uncompress": "Распаковать",
+ "files-action.upload": "Загрузить",
+ "files-audio-island.now-playing": "Сейчас играет",
+ "files-audio-island.pause": "Пауза",
+ "files-audio-island.play": "Воспроизвести",
+ "files-collision.action.keep-both": "Оба файла",
+ "files-collision.action.replace": "Заменить",
+ "files-collision.action.skip": "Пропустить",
+ "files-collision.destination.original-location": "исходное расположение",
+ "files-collision.message": "Заменить существующий файл или оставить оба?",
+ "files-collision.title": "\"{{itemName}}\" уже существует в {{destinationName}}",
+ "files-download.confirm": "Скачать",
+ "files-download.description": "Файлы не могут открыть этот тип файла. Хотите скачать его?",
+ "files-download.title": "Скачать {{name}}?",
+ "files-empty-trash.confirm": "Очистить",
+ "files-empty-trash.description": "Вы уверены, что хотите навсегда удалить все элементы из корзины? Это действие нельзя отменить.",
+ "files-empty-trash.title": "Очистить корзину?",
+ "files-empty.directory": "В этой папке нет элементов",
+ "files-error.add-favorite": "Ошибка добавления в избранное: {{message}}",
+ "files-error.add-share": "Ошибка открытия доступа: {{message}}",
+ "files-error.compress": "Ошибка архивирования: {{message}}",
+ "files-error.copy": "Ошибка копирования: {{message}}",
+ "files-error.create-folder": "Ошибка создания папки: {{message}}",
+ "files-error.delete": "Ошибка удаления: {{message}}",
+ "files-error.eject-disk": "Ошибка извлечения диска: {{message}}",
+ "files-error.empty-trash": "Ошибка очистки корзины: {{message}}",
+ "files-error.extract": "Ошибка распаковки: {{message}}",
+ "files-error.move": "Ошибка перемещения: {{message}}",
+ "files-error.remove-favorite": "Ошибка удаления из избранного: {{message}}",
+ "files-error.remove-share": "Ошибка закрытия доступа: {{message}}",
+ "files-error.rename": "Ошибка переименования: {{message}}",
+ "files-error.restore": "Ошибка восстановления: {{message}}",
+ "files-error.trash": "Ошибка перемещения в корзину: {{message}}",
+ "files-error.upload": "Ошибка загрузки: {{message}}",
+ "files-extension-change.confirm": "Продолжить",
+ "files-extension-change.description-add": "Вы уверены, что хотите изменить расширение файла '{{fileName}}' на '{{extension}}'? Это может сделать файл нечитаемым.",
+ "files-extension-change.description-remove": "Вы уверены, что хотите удалить расширение у файла '{{fileName}}'?",
+ "files-extension-change.title-add": "Изменить расширение на '{{extension}}'?",
+ "files-extension-change.title-remove": "Удалить расширение?",
+ "files-external-storage.unsupported.description": "Подключенный внешний диск не может быть использован с этим устройством. Функция внешнего хранилища доступна только на Umbrel Home.",
+ "files-external-storage.unsupported.title": "Внешнее хранилище не поддерживается",
+ "files-folder": "Папка",
+ "files-listing.empty": "Нет элементов",
+ "files-listing.error": "Произошла ошибка",
+ "files-listing.item-count-truncated": "{{formattedCount}}+ элементов",
+ "files-listing.item-count_one": "{{formattedCount}} элемент",
+ "files-listing.item-count_other": "{{formattedCount}} элементов",
+ "files-listing.loading": "Загрузка...",
+ "files-listing.no-such-file": "Файл или папка не найдены",
+ "files-listing.selected-count": "Выбрано {{selectedCount}} из {{totalCount}}",
+ "files-listing.selected-count-truncated": "Выбрано {{selectedCount}} из {{totalCount}}+",
+ "files-name-drawer.new-folder": "Новая папка",
+ "files-name-drawer.new-folder-description": "Введите имя для новой папки.",
+ "files-name-drawer.new-folder-input": "Имя папки",
+ "files-name-drawer.rename-file": "Переименовать файл",
+ "files-name-drawer.rename-file-description": "Введите новое имя для этого файла.",
+ "files-name-drawer.rename-file-input": "Имя файла",
+ "files-name-drawer.rename-folder": "Переименовать папку",
+ "files-name-drawer.rename-folder-description": "Введите новое имя для этой папки.",
+ "files-name-drawer.rename-folder-input": "Имя папки",
+ "files-operations-island.copying": "Копирование \"{{from}}\" в \"{{to}}\"",
+ "files-operations-island.moving": "Перемещение \"{{from}}\" в \"{{to}}\"",
+ "files-path.input-group": "Ввод пути",
+ "files-path.input-label": "Текущий путь",
+ "files-permanently-delete.confirm": "Удалить навсегда",
+ "files-permanently-delete.description-multiple": "Вы уверены, что хотите навсегда удалить эти {{count}} элементов? Это действие нельзя отменить.",
+ "files-permanently-delete.description-single": "Вы уверены, что хотите навсегда удалить \"{{fileName}}\"? Это действие нельзя отменить.",
+ "files-permanently-delete.title-multiple": "Удалить {{count}} элементов навсегда?",
+ "files-permanently-delete.title-single": "Удалить навсегда?",
+ "files-search.default": "Поиск файлов и папок",
+ "files-search.no-results": "Ничего не найдено по запросу \"{{query}}\"",
+ "files-search.placeholder": "Поиск",
+ "files-share.first-prompt-description": "Вы можете поделиться только \"{{folderName}}\" или выбрать общий доступ ко всей домашней папке. Вы всегда можете переключиться на общий доступ к домашней папке позже, щелкнув правой кнопкой мыши \"{{homeDirectoryName}}\" в боковой панели.",
+ "files-share.first-prompt-share-folder": "Поделиться только \"{{folderName}}\"",
+ "files-share.first-prompt-share-home": "Поделиться \"{{homeDirectoryName}}\"",
+ "files-share.first-prompt-title": "Поделиться только этой папкой или всей домашней папкой?",
+ "files-share.home-description": "Доступ ко всем файлам в \"{{homeDirectoryName}}\" с других устройств в вашей сети",
+ "files-share.home-title": "Открыть доступ к \"{{homeDirectoryName}}\" по сети",
+ "files-share.instructions.how-to-access": "Как получить доступ",
+ "files-share.instructions.ios.enter-password": "Введите {{password}} как пароль.",
+ "files-share.instructions.ios.enter-server": "Введите {{smbUrl}} как адрес сервера.",
+ "files-share.instructions.ios.enter-username": "Введите {{username}} как имя пользователя.",
+ "files-share.instructions.ios.install-files": "Установите приложение \"Файлы\" из App Store, если оно не установлено.",
+ "files-share.instructions.ios.tap-connect": "Нажмите \"Подключиться\" для доступа.",
+ "files-share.instructions.ios.tap-dots": "Нажмите на три точки (...) в правом верхнем углу и выберите \"Подключиться к серверу\".",
+ "files-share.instructions.macos.click-connect": "Нажмите \"Подключиться\" для доступа.",
+ "files-share.instructions.macos.enter-password": "Введите {{password}} как пароль.",
+ "files-share.instructions.macos.enter-url": "Введите {{smbUrl}} и нажмите Подключиться.",
+ "files-share.instructions.macos.enter-username": "Введите {{username}} как имя пользователя.",
+ "files-share.instructions.macos.open-finder": "Откройте \"Finder\" и нажмите ⌘ + K.",
+ "files-share.instructions.macos.select-registered": "Выберите \"Зарегистрированный пользователь\" при запросе.",
+ "files-share.instructions.macos.time-machine": "Использовать эту папку для резервных копий Time Machine",
+ "files-share.instructions.macos.time-machine.choose-encryption": "Выберите между зашифрованными или незашифрованными резервными копиями.",
+ "files-share.instructions.macos.time-machine.disk-limit": "Для 'Лимита использования диска' укажите максимальный объем пространства, который вы хотите выделить на вашем Umbrel для резервных копий Time Machine, затем нажмите \"Готово\".",
+ "files-share.instructions.macos.time-machine.follow-steps": "Выполните вышеуказанные шаги и откройте Системные настройки на вашем Mac.",
+ "files-share.instructions.macos.time-machine.go-settings": "Перейдите в Time Machine, нажмите \"Добавить диск для резервного копирования...\".",
+ "files-share.instructions.macos.time-machine.select-disk": "Выберите \"{{name}}\" и нажмите \"Настроить диск...\".",
+ "files-share.instructions.windows.enter-password": "Введите {{password}} как пароль.",
+ "files-share.instructions.windows.enter-url": "Введите {{smbUrl}} и нажмите Enter.",
+ "files-share.instructions.windows.enter-username": "Введите {{username}} как имя пользователя.",
+ "files-share.instructions.windows.open-run": "Нажмите Windows + R, чтобы открыть диалоговое окно \"Выполнить\".",
+ "files-share.instructions.windows.remember-credentials": "Отметьте \"Запомнить мои учетные данные\" и нажмите OK.",
+ "files-share.regular-description": "Откройте доступ к этой папке для доступа с других устройств в вашей сети",
+ "files-share.regular-title": "Открыть доступ к папке по сети",
+ "files-share.toggle": "Открыть доступ к \"{{name}}\" по вашей сети",
+ "files-sidebar.apps": "Приложения",
+ "files-sidebar.external-storage": "Внешнее хранилище",
+ "files-sidebar.favorites": "Избранное",
+ "files-sidebar.home": "Домашняя папка",
+ "files-sidebar.navigation": "Навигация по файлам",
+ "files-sidebar.recents": "Недавние",
+ "files-sidebar.shared-folders": "Общие папки",
+ "files-sidebar.trash": "Корзина",
+ "files-sidebar.trash.open": "Открыть",
+ "files-sort.created": "Дата создания",
+ "files-sort.modified": "Дата изменения",
+ "files-sort.name": "Имя",
+ "files-sort.size": "Размер",
+ "files-sort.type": "Тип",
+ "files-state.uploading": "Загрузка...",
+ "files-state.waiting": "Ожидание...",
+ "files-type.3gp": "Видео 3GP",
+ "files-type.3gp2": "Видео 3GP2",
+ "files-type.7z": "Архив 7Z",
+ "files-type.aac": "Аудио AAC",
+ "files-type.ai": "Файл Illustrator",
+ "files-type.aiff": "Аудио AIFF",
+ "files-type.au": "Аудио AU",
+ "files-type.avi": "Видео AVI",
+ "files-type.avif": "Изображение AVIF",
+ "files-type.bmp": "Изображение BMP",
+ "files-type.bzip2": "Архив BZIP2",
+ "files-type.caf": "Аудио CAF",
+ "files-type.compressed": "Архив",
+ "files-type.csv": "Файл CSV",
+ "files-type.directory": "Папка",
+ "files-type.dmg": "Образ диска",
+ "files-type.dv": "Видео DV",
+ "files-type.epub": "Книга EPUB",
+ "files-type.excel": "Таблица Excel",
+ "files-type.exe": "Исполняемый файл Windows",
+ "files-type.executable": "Исполняемый файл",
+ "files-type.external-drive": "Диск",
+ "files-type.flac": "Аудио FLAC",
+ "files-type.flv": "Видео FLV",
+ "files-type.gif": "Изображение GIF",
+ "files-type.gzip": "Архив GZIP",
+ "files-type.heic": "Изображение HEIC",
+ "files-type.ico": "Иконка ICO",
+ "files-type.iso": "Образ ISO",
+ "files-type.jpeg": "Изображение JPEG",
+ "files-type.keynote": "Презентация Keynote",
+ "files-type.lzip": "Архив LZIP",
+ "files-type.lzma": "Архив LZMA",
+ "files-type.lzop": "Архив LZOP",
+ "files-type.m3u": "Плейлист M3U",
+ "files-type.m4a": "Аудио M4A",
+ "files-type.m4v": "Видео M4V",
+ "files-type.midi": "Аудио MIDI",
+ "files-type.mka": "Аудио MKA",
+ "files-type.mkv": "Видео MKV",
+ "files-type.mng": "Видео MNG",
+ "files-type.mobi": "Книга MOBI",
+ "files-type.mp3": "Аудио MP3",
+ "files-type.mp4": "Видео MP4",
+ "files-type.mp4-audio": "Аудио MP4",
+ "files-type.mpeg": "Видео MPEG",
+ "files-type.mpeg-ts": "Транспортный поток MPEG",
+ "files-type.numbers": "Таблица Numbers",
+ "files-type.ogg": "Аудио OGG",
+ "files-type.ogv": "Видео OGV",
+ "files-type.pages": "Документ Pages",
+ "files-type.pdf": "Документ PDF",
+ "files-type.png": "Изображение PNG",
+ "files-type.powerpoint": "Презентация PowerPoint",
+ "files-type.psd": "Документ Photoshop",
+ "files-type.quicktime": "Видео QuickTime",
+ "files-type.rar": "Архив RAR",
+ "files-type.sgi": "Видео SGI",
+ "files-type.svg": "Изображение SVG",
+ "files-type.tar": "Архив TAR",
+ "files-type.tiff": "Изображение TIFF",
+ "files-type.ts": "Видео TS",
+ "files-type.txt": "Текстовый файл",
+ "files-type.wav": "Аудио WAV",
+ "files-type.webm": "Видео WebM",
+ "files-type.webm-audio": "Аудио WebM",
+ "files-type.webp": "Изображение WebP",
+ "files-type.wma": "Аудио WMA",
+ "files-type.wmv": "Видео WMV",
+ "files-type.word": "Документ Word",
+ "files-type.xz": "Архив XZ",
+ "files-type.zip": "Архив ZIP",
+ "files-upload-island.uploading-count": "Загрузка {{count}} элементов",
+ "files-view.icons": "Значки",
+ "files-view.list": "Список",
+ "files-view.sort-by": "Сортировать по",
+ "files-view.view-as": "Вид",
+ "files-widgets.favorites.no-items-text": "Добавьте папку в избранное, чтобы увидеть её здесь",
+ "files-widgets.recents.no-items-text": "Нет недавних файлов",
+ "generic-in": "в",
+ "hello": "Привет",
+ "install-first.install-app": "Установить {{app}}",
+ "install-first.title": "Для {{app}} требуется установка этих приложений",
+ "install-your-first-app": "Установите первое приложение",
+ "language": "Язык",
+ "language-description": "Предпочитаемый язык umbrelOS",
+ "language.select-description": "Выберите предпочитаемый язык umbrelOS",
+ "live-usage": "Использование в реальном времени",
+ "loading": "Загрузка",
+ "local-ip": "Локальный IP",
+ "login-2fa.subtitle": "Введите код 2FA из вашего приложения-аутентификатора",
+ "login-2fa.title": "Аутентификация",
+ "login-with-umbrel.description": "Введите пароль от Umbrel для открытия {{app}}",
+ "login-with-umbrel.title": "Войти через Umbrel",
+ "login.password-label": "Пароль",
+ "login.password.submit": "Войти",
+ "login.subtitle": "Введите пароль от Umbrel для входа",
+ "login.title": "С возвращением",
+ "logout": "Выйти",
+ "logout-error-generic": "Ошибка: не удалось выйти",
+ "logout.confirm.submit": "Выйти",
+ "logout.confirm.title": "Вы уверены, что хотите выйти?",
+ "memory": "Память",
+ "memory.low": "Мало памяти",
+ "migrate": "Перенести",
+ "migrate.callout": "Не выключайте Umbrel до завершения переноса",
+ "migrate.failed.retry": "Повторить",
+ "migrate.failed.title": "Ошибка переноса",
+ "migrate.success.description": "Все ваши приложения, данные и учетная запись были перенесены на Umbrel Home.",
+ "migrate.success.title": "Перенос завершен",
+ "migration-assistant": "Помощник миграции",
+ "migration-assistant-description": "Перенос всех приложений и данных с Raspberry Pi на Umbrel Home",
+ "migration-assistant-unsupported-device-description": "Помощник миграции поддерживает перенос данных и приложений с Raspberry Pi с umbrelOS на Umbrel Home. Откройте Помощник миграции на вашем Umbrel Home, чтобы начать.",
+ "migration-assistant.continue-migration.ready.submit": "Начать перенос",
+ "migration-assistant.failed": "Что-то пошло не так...",
+ "migration-assistant.failed.retrying-message": "Повторная попытка...",
+ "migration-assistant.mobile.start-button": "Начать перенос",
+ "migration-assistant.prep.body": "Подготовка к переносу",
+ "migration-assistant.prep.button-continue": "Продолжить",
+ "migration-assistant.prep.callout": "Данные на вашем Umbrel Home (если есть) будут безвозвратно удалены.",
+ "migration-assistant.prep.connect-disk-to-home": "Подключите внешний диск к любому USB-порту на Umbrel Home.",
+ "migration-assistant.prep.prep-done-continue-message": "После завершения нажмите '{{button}}' ниже.",
+ "migration-assistant.prep.shut-down-rpi": "Выключите ваш Raspberry Pi Umbrel.",
+ "migration-assistant.ready.description": "Все ваши данные и приложения готовы к переносу на Umbrel Home",
+ "migration-assistant.ready.hint-header": "Важные моменты",
+ "migration-assistant.ready.hint-keep-pi-off.description": "Это поможет избежать проблем с такими приложениями как Lightning Node",
+ "migration-assistant.ready.hint-keep-pi-off.title": "Не включайте Raspberry Pi после переноса",
+ "migration-assistant.ready.hint-use-same-password.description": "Используйте пароль от Raspberry Pi Umbrel для входа на Umbrel Home",
+ "migration-assistant.ready.hint-use-same-password.title": "Используйте тот же пароль",
+ "migration-assistant.ready.title": "Всё готово к переносу!",
+ "name": "Имя",
+ "no-forgot-password-message": "Если вы потеряете пароль, вы не сможете войти в Umbrel. Обязательно сохраните его надежно.",
+ "no-results-found": "Ничего не найдено",
+ "not-found-404": "Ошибка 404",
+ "not-found-404.back": "Назад",
+ "not-found-404.home": "На главную",
+ "notifications.cpu.too-hot": "Высокая температура процессора",
+ "notifications.memory.low": "На устройстве мало памяти",
+ "notifications.new-version-available": "Доступно обновление {{update}}",
+ "notifications.storage.full": "На устройстве закончилось место",
+ "notifications.view": "Просмотр",
+ "ok": "OK",
+ "onboarding.account-created.by-clicking-button-you-agree": "Нажимая 'Далее', вы соглашаетесь с Условиями использования umbrelOS",
+ "onboarding.account-created.next": "Далее",
+ "onboarding.account-created.subtitle": "Ваш Umbrel готов к использованию.",
+ "onboarding.account-created.youre-all-set-name": "Всё готово, {{name}}.",
+ "onboarding.contact-support": "Поддержка",
+ "onboarding.create-account": "Создать аккаунт",
+ "onboarding.create-account.confirm-password.input-label": "Подтвердите пароль",
+ "onboarding.create-account.failed.name-required": "Требуется имя",
+ "onboarding.create-account.failed.passwords-dont-match": "Пароли не совпадают",
+ "onboarding.create-account.name.input-placeholder": "Ваше имя",
+ "onboarding.create-account.password.input-label": "Пароль",
+ "onboarding.create-account.submit": "Создать",
+ "onboarding.create-account.submitting": "Создание",
+ "onboarding.create-account.subtitle": "Данные вашей учетной записи хранятся только на вашем Umbrel. Обязательно сохраните пароль, так как его нельзя восстановить.",
+ "onboarding.start.continue": "Начать",
+ "onboarding.start.subtitle": "Ваш домашний облачный сервер готов к настройке.",
+ "onboarding.start.title": "Добро пожаловать в umbrelOS",
+ "open": "Открыть",
+ "open-live-usage": "Открыть мониторинг",
+ "password": "Пароль",
+ "preferences": "Настройки",
+ "read-less": "Свернуть",
+ "read-more": "Читать далее",
+ "redirect.to-home": "Загрузка...",
+ "redirect.to-login": "Загрузка...",
+ "redirect.to-onboarding": "Загрузка...",
+ "remote-tor-access": "Удаленный доступ через Tor",
+ "reset": "Сброс",
+ "restart": "Перезагрузка",
+ "restart.confirm.submit": "Перезагрузить",
+ "restart.confirm.title": "Вы уверены, что хотите перезагрузить Umbrel?",
+ "restart.restarting": "Перезагрузка",
+ "restart.restarting-message": "Не обновляйте страницу и не выключайте Umbrel во время перезагрузки.",
+ "retry": "Повторить",
+ "search": "Поиск",
+ "settings": "Настройки",
+ "settings.app-store-preferences.title": "Настройки App Store",
+ "settings.contact-support": "Нужна помощь? Свяжитесь с поддержкой.",
+ "shut-down": "Выключение",
+ "shut-down.complete": "Выключение завершено",
+ "shut-down.complete-text": "Теперь можно отключить устройство от питания.",
+ "shut-down.confirm.submit": "Выключить",
+ "shut-down.confirm.title": "Вы уверены, что хотите выключить Umbrel?",
+ "shut-down.shutting-down": "Выключение",
+ "shut-down.shutting-down-message": "Не обновляйте страницу и не выключайте Umbrel во время завершения работы.",
+ "software-update.callout": "Не обновляйте страницу и не выключайте Umbrel во время обновления.",
+ "software-update.check": "Проверить обновления",
+ "software-update.checking": "Проверка обновлений...",
+ "software-update.current-running": "Текущая версия",
+ "software-update.failed": "Ошибка обновления",
+ "software-update.failed-to-check": "Не удалось проверить обновления",
+ "software-update.failed.retry": "Повторить",
+ "software-update.install-now": "Установить сейчас",
+ "software-update.new-version": "Доступно новое обновление {{name}}",
+ "software-update.on-latest": "У вас последняя версия umbrelOS",
+ "software-update.title": "Обновление ПО",
+ "software-update.updating-to": "Обновление до {{name}}",
+ "software-update.view": "Просмотр",
+ "something-left": "Осталось {{left}}",
+ "something-went-wrong": "⚠ Что-то пошло не так",
+ "start": "Запустить",
+ "stop": "Остановить",
+ "storage": "Хранилище",
+ "storage.full": "Хранилище заполнено",
+ "storage.low": "Мало места",
+ "temperature": "Температура",
+ "temperature.dangerously-hot": "Очень горячо",
+ "temperature.nice": "Нормально",
+ "temperature.normal": "Нормальная",
+ "temperature.too-hot-suggestion": "Рекомендуем изменить условия эксплуатации устройства.",
+ "temperature.warm": "Тепло",
+ "terminal": "Терминал",
+ "terminal-description": "Выполнение команд в umbrelOS или приложениях",
+ "terminal.app": "Приложение",
+ "terminal.app-description": "Выполнение команд в конкретном приложении",
+ "terminal.umbrelos-description": "Выполнение команд в umbrelOS",
+ "tor-description": "Доступ к Umbrel из любой точки через браузер Tor",
+ "tor.disable.description": "Это может занять несколько минут",
+ "tor.disable.progress": "Отключение удаленного доступа через Tor",
+ "tor.disable.success": "Удаленный доступ через Tor отключен",
+ "tor.enable.description": "Это может занять несколько минут",
+ "tor.enable.mobile.switch-label": "Включить удаленный доступ через Tor",
+ "tor.enable.submit": "Включить",
+ "tor.enable.success": "Удаленный доступ через Tor включен",
+ "tor.enable.title": "Включить удаленный доступ через Tor",
+ "tor.hidden-service": "Скрытый URL-адрес Tor",
+ "troubleshoot": "Диагностика",
+ "troubleshoot-description": "Диагностика проблем umbrelOS или приложений",
+ "troubleshoot-no-logs-yet": "Логи пока отсутствуют",
+ "troubleshoot-pick-title": "Диагностика",
+ "troubleshoot.app": "Приложение",
+ "troubleshoot.app-description": "Просмотр логов приложения",
+ "troubleshoot.app-download": "Скачать логи {{app}}",
+ "troubleshoot.share-with-umbrel-support": "Поделиться с поддержкой Umbrel",
+ "troubleshoot.system-download": "Скачать {{label}}",
+ "troubleshoot.umbrelos-description": "Просмотр логов umbrelOS",
+ "troubleshoot.umbrelos-logs": "Логи umbrelOS",
+ "trpc.backend-unavailable": "Ошибка: Не удалось подключиться к системному API",
+ "trpc.checking-backend": "Загрузка...",
+ "try-again": "Попробовать снова",
+ "umbrel": "Umbrel",
+ "umbrelos": "umbrelOS",
+ "unknown": "Неизвестно",
+ "unknown-app": "Неизвестное приложение",
+ "unknown-error": "Неизвестная ошибка",
+ "uptime": "Время работы",
+ "wallpaper": "Обои",
+ "wallpaper-description": "Обои и тема оформления Umbrel",
+ "widget.progress.in-progress": "В процессе",
+ "widgets.edit.select-up-to-3-widgets": "Выберите до 3 виджетов",
+ "widgets.install-an-app-before-using-widgets": "Установите приложение, чтобы начать настраивать домашний экран с виджетами.",
+ "wifi": "Wi-Fi",
+ "wifi-connect-insecure-message": "Открытые сети могут быть небезопасны",
+ "wifi-connection-failed": "Не удалось подключиться",
+ "wifi-dangerous-change-confirmation-description": "Смена Wi-Fi сети может разорвать соединение с Umbrel. Для повторного подключения убедитесь, что Umbrel и ваше устройство находятся в одной сети.",
+ "wifi-dangerous-change-confirmation-title": "Вы уверены, что хотите сменить Wi-Fi сеть?",
+ "wifi-dangerous-disable-confirmation-description": "Отключение Wi-Fi может разорвать соединение с Umbrel. Для повторного подключения используйте Ethernet кабель и убедитесь, что устройства в одной сети.",
+ "wifi-dangerous-disable-confirmation-title": "Вы уверены, что хотите отключить Wi-Fi?",
+ "wifi-description": "Подключение к Wi-Fi сети",
+ "wifi-description-long": "Ваше устройство остается подключенным к выбранной Wi-Fi сети, даже если Ethernet кабель отключен, и автоматически переподключается при запуске.",
+ "wifi-no-networks-message": "Wi-Fi сети не найдены",
+ "wifi-searching": "Поиск Wi-Fi сетей...",
+ "wifi-unsupported-device-description": "Wi-Fi не поддерживается на этом устройстве. Возможно отсутствует или несовместимый беспроводной адаптер.",
+ "wifi-view-networks": "Просмотр сетей"
+}
diff --git a/packages/ui/src/utils/date-time.ts b/packages/ui/src/utils/date-time.ts
index f917b71f0..e6b41fb81 100644
--- a/packages/ui/src/utils/date-time.ts
+++ b/packages/ui/src/utils/date-time.ts
@@ -1,5 +1,5 @@
import {formatDistanceStrict, Locale} from 'date-fns'
-import {de, enUS, es, fr, hu, it, ja, ko, nl, pt, tr, uk} from 'date-fns/locale'
+import {de, enUS, es, fr, hu, it, ja, ko, nl, pt, tr, uk, ru} from 'date-fns/locale' // Added 'ru' here
import {UNKNOWN} from '@/constants'
import {SupportedLanguageCode} from '@/utils/language'
@@ -21,6 +21,7 @@ export const languageCodeToDateLocale: Record = {
tr: tr,
ja: ja,
ko: ko,
+ ru: ru,
}
export function duration(seconds: number | undefined, languageCode: SupportedLanguageCode) {
diff --git a/packages/ui/src/utils/language.ts b/packages/ui/src/utils/language.ts
index 6a83f3253..7b683858b 100644
--- a/packages/ui/src/utils/language.ts
+++ b/packages/ui/src/utils/language.ts
@@ -2,6 +2,7 @@ import {map} from 'remeda'
export const languages = [
{name: 'English', code: 'en'},
+ {name: 'Русский', code: 'ru'},
{name: 'Deutsch', code: 'de'},
{name: 'Español', code: 'es'},
{name: 'Français', code: 'fr'},
diff --git a/packages/ui/update-translations.js b/packages/ui/update-translations.js
index 35761eb4c..eab8903e0 100644
--- a/packages/ui/update-translations.js
+++ b/packages/ui/update-translations.js
@@ -25,6 +25,7 @@ const englishReferenceFilePath = path.join(localesDirectory, 'en.json')
const languageMapping = {
en: 'English',
+ ru: 'Russian',
de: 'German',
es: 'Spanish',
fr: 'French',