diff --git a/web/i18n/ru/a11y/dialog.json b/web/i18n/ru/a11y/dialog.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/ru/a11y/dialog.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/ru/a11y/donate.json b/web/i18n/ru/a11y/donate.json
new file mode 100644
index 00000000..fcf93fad
--- /dev/null
+++ b/web/i18n/ru/a11y/donate.json
@@ -0,0 +1,4 @@
+{
+ "share.qr.expand": "qr-код. нажми, чтобы развернуть.",
+ "share.qr.collapse": "развернутый qr-код. нажми, чтобы свернуть."
+}
diff --git a/web/i18n/ru/a11y/save.json b/web/i18n/ru/a11y/save.json
index d6def5e5..d8b1c7a2 100644
--- a/web/i18n/ru/a11y/save.json
+++ b/web/i18n/ru/a11y/save.json
@@ -1,9 +1,9 @@
{
"link_area": "зона вставки ссылки",
- "clear_input": "clear input",
+ "clear_input": "",
"download": "скачать",
"download.think": "обрабатываю ссылку...",
"download.check": "проверяю загрузку...",
- "download.done": "загрузка завершена!",
+ "download.done": "загрузка завершена",
"download.error": "ошибка загрузки"
}
diff --git a/web/i18n/ru/about.json b/web/i18n/ru/about.json
new file mode 100644
index 00000000..0652a582
--- /dev/null
+++ b/web/i18n/ru/about.json
@@ -0,0 +1,34 @@
+{
+ "page.general": "что за кобальт?",
+ "heading.general": "",
+ "heading.saving": "",
+ "heading.encryption": "",
+ "heading.abuse": "",
+ "heading.motivation": "",
+ "heading.licenses": "",
+ "heading.summary": "",
+ "heading.privacy": "",
+ "page.faq": "",
+ "page.community": "",
+ "page.privacy": "",
+ "page.terms": "",
+ "page.credits": "",
+ "community.discord": "",
+ "community.twitter": "",
+ "community.github": "",
+ "community.email": "",
+ "community.telegram": "",
+ "heading.testers": "",
+ "heading.community": "",
+ "heading.local": "",
+ "heading.plausible": "",
+ "heading.cloudflare": "",
+ "heading.responsibility": "",
+ "support.github": "",
+ "support.discord": "",
+ "support.description.issue": "",
+ "support.description.help": "",
+ "support.twitter": "",
+ "support.telegram": "",
+ "support.description.best-effort": ""
+}
diff --git a/web/i18n/ru/about/credits.md b/web/i18n/ru/about/credits.md
new file mode 100644
index 00000000..b9ec1768
--- /dev/null
+++ b/web/i18n/ru/about/credits.md
@@ -0,0 +1,69 @@
+
+
+
+
+
+cobalt is made with love and care by the [imput](https://imput.net/) research
+and development team.
+
+you can support us on the [donate page](/donate)!
+
+
+
+
+
+huge shoutout to our thing breakers for testing updates early and making sure
+they're stable. they also helped us ship cobalt 10!
+
+all links are external and lead to their personal websites or social media.
+
+
+
+
+
+meowbalt is cobalt's speedy mascot. he is an extremely expressive cat that loves
+fast internet.
+
+all amazing drawings of meowbalt that you see in cobalt were made by
+[GlitchyPSI](https://glitchypsi.xyz/). he is also the original designer of the
+character.
+
+you cannot use or modify GlitchyPSI's artworks of meowbalt without his explicit
+permission.
+
+you cannot use or modify the meowbalt character design commercially or in any
+form that isn't fan art.
+
+
+
+
+
+cobalt processing server is open source and licensed under
+[AGPL-3.0]({docs.apiLicense}).
+
+cobalt frontend is [source first](https://sourcefirst.com/) and licensed under
+[CC-BY-NC-SA 4.0]({docs.webLicense}). we decided to use this license to stop
+grifters from profiting off our work & from creating malicious clones that
+deceive people and hurt our public identity.
+
+we rely on many open source libraries, create & distribute our own. you can see
+the full list of dependencies on [github]({contacts.github}).
+
diff --git a/web/i18n/ru/about/general.md b/web/i18n/ru/about/general.md
new file mode 100644
index 00000000..4850fa90
--- /dev/null
+++ b/web/i18n/ru/about/general.md
@@ -0,0 +1,87 @@
+
+
+
+
+
+cobalt helps you save anything from your favorite websites: video, audio, photos
+or gifs. just paste the link and you're ready to rock!
+
+no ads, trackers, paywalls, or other nonsense. just a convenient web app that
+works anywhere, whenever you need it.
+
+
+
+
+
+cobalt was created for public benefit, to protect people from ads and malware
+pushed by its alternatives. we believe that the best software is safe, open, and
+accessible.
+
+it's possible to keep the main instances up thanks to our long-standing
+infrastructure partner, [royalehosting.net]({partners.royalehosting})!
+
+
+
+
+
+all requests to the backend are anonymous and all information about tunnels is
+encrypted. we have a strict zero log policy and don't track *anything* about
+individual people.
+
+when a request needs additional processing, cobalt processes files on-the-fly.
+it's done by tunneling processed parts directly to the client, without ever
+saving anything to disk. for example, this method is used when the source
+service provides video and audio channels as separate files.
+
+additionally, you can [enable forced tunneling](/settings/privacy#tunnel) to
+protect your privacy. when enabled, cobalt will tunnel all downloaded files. no
+one will know where you download something from, even your network provider. all
+they'll see is that you're using a cobalt instance.
+
+
+
+
+
+
+
+newest features, such as [remuxing](/remux), work locally on your device.
+on-device processing is efficient and never sends anything over the internet. it
+perfectly aligns with our future goal of moving as much processing as possible
+to the client.
+
diff --git a/web/i18n/ru/about/privacy.md b/web/i18n/ru/about/privacy.md
new file mode 100644
index 00000000..6ddf12d3
--- /dev/null
+++ b/web/i18n/ru/about/privacy.md
@@ -0,0 +1,96 @@
+
+
+
+
+
+cobalt's privacy policy is simple: we don't collect or store anything about you.
+what you do is solely your business, not ours or anyone else's.
+
+these terms are applicable only when using the official cobalt instance. in
+other cases, you may need to contact the hoster for accurate info.
+
+
+
+
+
+tools that use on-device processing work offline, locally, and never send any
+data anywhere. they are explicitly marked as such whenever applicable.
+
+
+
+
+
+when using saving functionality, in some cases cobalt will encrypt & temporarily
+store information needed for tunneling. it's stored in processing server's RAM
+for 90 seconds and irreversibly purged afterwards. no one has access to it, even
+instance owners, as long as they don't modify the official cobalt image.
+
+processed/tunneled files are never cached anywhere. everything is tunneled live.
+cobalt's saving functionality is essentially a fancy proxy service.
+
+
+
+
+
+temporarily stored tunnel data is encrypted using the AES-256 standard.
+decryption keys are only included in the access link and never
+logged/cached/stored anywhere. only the end user has access to the link &
+encryption keys. keys are generated uniquely for each requested tunnel.
+
+
+{#if env.PLAUSIBLE_ENABLED}
+
+
+
+for sake of privacy, we use [plausible's anonymous traffic
+analytics](https://plausible.io/) to get an approximate number of active cobalt
+users. no identifiable information about you or your requests is ever stored.
+all data is anonymized and aggregated. the plausible instance we use is hosted &
+managed by us.
+
+plausible doesn't use cookies and is fully compliant with GDPR, CCPA, and PECR.
+
+[learn more about plausible's dedication to
+privacy.](https://plausible.io/privacy-focused-web-analytics)
+
+if you wish to opt out of anonymous analytics, you can do it in [privacy
+settings](/settings/privacy#analytics).
+
+{/if}
+
+
+
+
+we use cloudflare services for ddos & bot protection. we also use cloudflare
+pages for deploying & hosting the static web app. all of these are required to
+provide the best experience for everyone. it's the most private & reliable
+provider that we know of.
+
+cloudflare is fully compliant with GDPR and HIPAA.
+
+[learn more about cloudflare's dedication to
+privacy.](https://www.cloudflare.com/trust-hub/privacy-and-data-protection/)
+
diff --git a/web/i18n/ru/about/terms.md b/web/i18n/ru/about/terms.md
new file mode 100644
index 00000000..e2e0b478
--- /dev/null
+++ b/web/i18n/ru/about/terms.md
@@ -0,0 +1,64 @@
+
+
+
+
+
+these terms are applicable only when using the official cobalt instance. in
+other cases, you may need to contact the hoster for accurate info.
+
+
+
+
+
+saving functionality simplifies downloading content from the internet and takes
+zero liability for what the saved content is used for. processing servers work
+like advanced proxies and don't ever write any content to disk. everything is
+handled in RAM and permanently purged once the tunnel is done. we have no
+downloading logs and can't identify anyone.
+
+[you can read more about how tunnels work in our privacy
+policy.](/about/privacy)
+
+
+
+
+
+you (end user) are responsible for what you do with our tools, how you use and
+distribute resulting content. please be mindful when using content of others and
+always credit original creators. make sure you don't violate any terms or
+licenses.
+
+when used in educational purposes, always cite sources and credit original
+creators.
+
+fair use and credits benefit everyone.
+
+
+
+
+
+we have no way of detecting abusive behavior automatically because cobalt is
+100% anonymous. however, you can report such activities to us via email and
+we'll do our best to comply manually: abuse[at]imput.net
+
+**this email is not intended for user support, you will not get a response if
+your concern is not related to abuse.**
+
+if you're experiencing issues, contact us via any preferred method on [the
+support page](/about/community).
+
diff --git a/web/i18n/ru/button.json b/web/i18n/ru/button.json
new file mode 100644
index 00000000..95c829ae
--- /dev/null
+++ b/web/i18n/ru/button.json
@@ -0,0 +1,17 @@
+{
+ "download.audio": "скачать аудио",
+ "import": "импортировать",
+ "copied": "скопировано",
+ "copy": "скопировать",
+ "share": "поделиться",
+ "download": "скачать",
+ "no": "нет",
+ "yes": "да",
+ "save": "сохранить",
+ "continue": "продолжить",
+ "done": "готово",
+ "reset": "сбросить",
+ "cancel": "отменить",
+ "export": "экспортировать",
+ "gotit": "понятно"
+}
diff --git a/web/i18n/ru/dialog.json b/web/i18n/ru/dialog.json
new file mode 100644
index 00000000..d41a39d2
--- /dev/null
+++ b/web/i18n/ru/dialog.json
@@ -0,0 +1,7 @@
+{
+ "reset.title": "cбросить все настройки?",
+ "reset.body": "ты уверен что хочешь сбросить все настройки? это действие немедленно и необратимо.",
+ "picker.title": "укажи, что хочешь сохранить",
+ "saving.title": "выбери как хочешь сохранить",
+ "saving.timeout": "кобальт попытался сохранить файл автоматически, но твой браузер остановил это. выбери способ вручную."
+}
diff --git a/web/i18n/ru/donate.json b/web/i18n/ru/donate.json
new file mode 100644
index 00000000..0f94b23e
--- /dev/null
+++ b/web/i18n/ru/donate.json
@@ -0,0 +1,21 @@
+{
+ "card.once": "одноразовый донат",
+ "card.option.30": "обед для двоих",
+ "body.no_bullshit": "мы считаем, что интернет не должен быть пугающим, поэтому в кобальте никогда не будет рекламы или вредоносного контента. мы твёрдо выполняем это обещание. всё, что мы делаем, создаётся с учётом конфиденциальности, доступности и простоты использования, что делает кобальт доступным для всех.",
+ "card.custom": "своя сумма (начиная с $2)",
+ "card.processor": "через {{value}}",
+ "card.option.5": "чашка кофе",
+ "card.option.50": "10 кг кошачьего корма",
+ "card.option.1599": "обычный macbook pro",
+ "card.option.4900": "10,000 яблок",
+ "share.title": "поделись кобальтом с другом",
+ "alternative.title": "альтернативные способы доната",
+ "alt.copy": "{{ value }}. адрес криптокошелька. нажми, чтобы скопировать.",
+ "alt.open": "{{ value }}. нажми, чтобы открыть.",
+ "body.motivation": "кобальт помогает продюсерам, преподавателям, видеомейкерам и многим другим заниматься тем, что они любят. это особый сервис создающийся с любовью, а не ради прибыли.",
+ "body.keep_going": "если для тебя кобальт оказался полезным, пожалуйста, рассмотри возможность поддержать нашу работу! ты можешь помочь нам донатом, либо поделившись кобальтом с другом. каждый донат высоко ценится и помогает нам продолжать работу над кобальтом и другими проектами.",
+ "card.recurring": "постоянный донат",
+ "card.option.10": "большая пицца",
+ "card.option.15": "полный обед",
+ "card.custom.submit": "своя сумма"
+}
diff --git a/web/i18n/ru/error.json b/web/i18n/ru/error.json
new file mode 100644
index 00000000..0c93977f
--- /dev/null
+++ b/web/i18n/ru/error.json
@@ -0,0 +1,4 @@
+{
+ "api.link.invalid": "ваша ссылка недействительная либо этот сервис ещё не поддерживается. вы вставили правильную ссылку?",
+ "api.rate_exceeded": "вы делаете слишком много запросов. попробуйте снова через {{ limit }} секунд!"
+}
diff --git a/web/i18n/ru/general.json b/web/i18n/ru/general.json
index 90cbfef5..920f277d 100644
--- a/web/i18n/ru/general.json
+++ b/web/i18n/ru/general.json
@@ -2,6 +2,5 @@
"cobalt": "кобальт",
"meowbalt": "мяубальт",
"beta": "бета",
-
"embed.description": "сохраняй то, что любишь: без рекламы, трекеров и прочей чепухи. кобальт создан с любовью, а не с целью заработать."
}
diff --git a/web/i18n/ru/notification.json b/web/i18n/ru/notification.json
new file mode 100644
index 00000000..14822cf3
--- /dev/null
+++ b/web/i18n/ru/notification.json
@@ -0,0 +1,4 @@
+{
+ "update.title": "доступно обновление!",
+ "update.subtext": "нажми, чтобы обновить"
+}
diff --git a/web/i18n/ru/receiver.json b/web/i18n/ru/receiver.json
new file mode 100644
index 00000000..6864d1b9
--- /dev/null
+++ b/web/i18n/ru/receiver.json
@@ -0,0 +1,5 @@
+{
+ "accept": "поддерживаемые форматы: {{ formats }}.",
+ "title": "перетащи или выбери файл",
+ "title.drop": "скинь файл сюда!"
+}
diff --git a/web/i18n/ru/remux.json b/web/i18n/ru/remux.json
new file mode 100644
index 00000000..82faf1d0
--- /dev/null
+++ b/web/i18n/ru/remux.json
@@ -0,0 +1,3 @@
+{
+ "description": "ремукс помогает решить проблемы с совместимостью файлов в старых приложениях. файлы обрабатываются быстро, без потери качества и локально на устройстве."
+}
diff --git a/web/i18n/ru/save.json b/web/i18n/ru/save.json
index ce64917a..f45a956e 100644
--- a/web/i18n/ru/save.json
+++ b/web/i18n/ru/save.json
@@ -10,5 +10,13 @@
"services.title": "поддерживаемые сервисы",
"services.title_show": "показать поддерживаемые сервисы",
"services.title_hide": "скрыть поддерживаемые сервисы",
- "services.disclaimer": "кобальт не аффилирован ни с одним из перечисленных выше сервисов.\n\nдеятельность meta platforms (владельца facebook и instagram) запрещена на территории РФ и признана экстремистской."
+ "services.disclaimer": "кобальт не аффилирован ни с одним из перечисленных выше сервисов.\n\nдеятельность meta platforms (владельца facebook и instagram) запрещена на территории РФ и признана экстремистской.",
+ "tutorial.step.1": "добавь команды-компаньоны:",
+ "tutorial.step.2": "нажми кнопку \"поделиться\" в диалоге сохранения кобальта.",
+ "tutorial.step.3": "выбери нужную команду в окне обмена.",
+ "tutorial.shortcut.photos": "в фото",
+ "tutorial.shortcut.files": "в файлы",
+ "tutorial.title": "как сохранить на ios?",
+ "tutorial.intro": "чтобы удобно сохранять файлы на ios, придётся использовать команду siri из меню обмена.",
+ "tutorial.outro": "эти команды siri будут работать только из приложения кобальта, использовать их из других приложений не получится."
}
diff --git a/web/i18n/ru/settings.json b/web/i18n/ru/settings.json
new file mode 100644
index 00000000..4387622e
--- /dev/null
+++ b/web/i18n/ru/settings.json
@@ -0,0 +1,55 @@
+{
+ "theme.auto": "авто",
+ "theme.light": "белая",
+ "audio.bitrate.kbps": "кбит/с",
+ "theme.dark": "тёмная",
+ "audio.youtube.dub": "youtube",
+ "video.quality.max": "8k+",
+ "page.video": "видео",
+ "page.audio": "аудио",
+ "page.download": "скачивание",
+ "section.save": "сохранить",
+ "video.quality.1440": "1440p",
+ "video.quality.1080": "1080p",
+ "video.quality.720": "720p",
+ "video.quality.480": "480p",
+ "video.quality.360": "360p",
+ "video.quality.240": "240p",
+ "video.quality.144": "144p",
+ "metadata.file": "метаданные файла",
+ "saving.title": "метод сохранения",
+ "saving.ask": "спросить",
+ "saving.download": "скачать",
+ "saving.share": "поделиться",
+ "saving.copy": "скопировать",
+ "accessibility": "доступность",
+ "language": "язык",
+ "language.preferred.title": "предпочитаемый язык",
+ "privacy.analytics": "анонимная аналитика трафика",
+ "audio.tiktok.original.title": "скачать оригинальный звук",
+ "privacy.tunnel": "туннелирование",
+ "privacy.tunnel.title": "всегда туннелировать файлы",
+ "video.tiktok.h265": "tiktok",
+ "audio.format.mp3": "mp3",
+ "audio.format.ogg": "ogg",
+ "audio.format.wav": "wav",
+ "audio.format.opus": "opus",
+ "page.privacy": "конфиденциальность",
+ "theme": "тема",
+ "video.quality": "качество видео",
+ "video.twitter.gif": "twitter/x",
+ "video.quality.2160": "4k",
+ "audio.format": "формат аудио",
+ "audio.bitrate": "битрейт аудио",
+ "audio.tiktok.original": "tiktok",
+ "metadata.disable.title": "отключить метаданные файла",
+ "language.auto.title": "автоматический выбор",
+ "metadata.disable.description": "название, исполнитель и другая информация не будут добавлены в файл.",
+ "language.preferred.description": "этот язык будет использоваться когда автоматический выбор отключен. любой непереведённый текст будет отображаться на английском языке.\n\nмы используем переводы, предоставленные сообществом, для языков, отличных от английского, русского и чешского. они могут быть неточными или неполными.",
+ "audio.youtube.dub.description": "работает даже если кобальт не переведен на твой язык.",
+ "language.auto.description": "если доступен перевод, кобальт будет использовать язык твоего браузера, в ином случае будет использоваться английский.",
+ "theme.description": "",
+ "page.debug": "",
+ "section.general": "",
+ "page.appearance": ""
+}
diff --git a/web/i18n/ru/tabs.json b/web/i18n/ru/tabs.json
index 0b93cc7f..a8cdab96 100644
--- a/web/i18n/ru/tabs.json
+++ b/web/i18n/ru/tabs.json
@@ -1,5 +1,5 @@
{
- "save": "скачать",
+ "save": "сохранить",
"settings": "настройки",
"updates": "новости",
"donate": "донаты",
diff --git a/web/i18n/ru/updates.json b/web/i18n/ru/updates.json
new file mode 100644
index 00000000..3f6d5fd3
--- /dev/null
+++ b/web/i18n/ru/updates.json
@@ -0,0 +1,4 @@
+{
+ "button.next": "перейти к более старому обновлению ({{ value }})",
+ "button.previous": "перейти к более новому обновлению ({{ value }})"
+}