diff --git a/src/components/LocaleSelectorModal.tsx b/src/components/LocaleSelectorModal.tsx
index e6029a0..3d80d96 100644
--- a/src/components/LocaleSelectorModal.tsx
+++ b/src/components/LocaleSelectorModal.tsx
@@ -23,6 +23,7 @@ export default function LocaleSelectorModal() {
+
{/* Add language here with the name of the language in his native name */}
diff --git a/src/locales/LocaleTranslations.tsx b/src/locales/LocaleTranslations.tsx
index 38719d2..e45e28b 100644
--- a/src/locales/LocaleTranslations.tsx
+++ b/src/locales/LocaleTranslations.tsx
@@ -6,4 +6,5 @@ export default {
ch: require("./ch.json") as Record,
de: require("./de.json") as Record,
tr: require("./tr.json") as Record,
+ ru: require("./ru.json") as Record,
};
diff --git a/src/locales/ru.json b/src/locales/ru.json
new file mode 100644
index 0000000..2e6d652
--- /dev/null
+++ b/src/locales/ru.json
@@ -0,0 +1,119 @@
+{
+ "topbar.discord": "Присоединяйтесь к нам в Discord",
+ "topbar.beer": "На кружечку пива ❤️",
+ "presetButtons.applyPresetTooltip": "Пресет будет загружен в таблицы RyzenAdj и применен",
+ "presetButtons.loadPresetTooltip": "Пресет будет загружен в таблицы RyzenAdj, но не применен",
+ "presetAutoApply.whenSessionResume": "При продолжении сессии",
+ "presetAutoApply.whenRCStart": "При старте Ryzen Controller",
+ "presetAutoApply.whenLaptopPluggedIn": "Когда подключено питание ноутбука",
+ "presetAutoApply.whenLaptopPluggedOut": "При работе ноутбука от АКБ",
+ "presetButtons.confirmDeletion": "Вы уверены, что хотите удалить \"{preset}\"?",
+ "presetButtons.loadedPreset": "Пресет {preset} загружен",
+ "presetButtons.uploadPresetConfirmation": "Вы уверены, что хотите выгрузить {preset}?",
+ "presetListEmpty.youDontHaveAny": "У вас еще нет ни одного пресета",
+ "presetListEmpty.sentencePart1": "Вы можете создать пресет, используя кнопку",
+ "presetListEmpty.createPresetBtn": "Создать пресет",
+ "presetListEmpty.sentencePart2": ", которая доступна в таблицах настроек RyzenAdj (CPU, GPU, ...).",
+ "PresetOnline.listNotLoadedYet": "Список пресетов не загружен, либо онлайн-пресетов ещё нет",
+ "PresetOnline.loadPresetListBtn": "Загрузить список пресетов",
+ "PresetOnline.sentencePart1": "Вы можете поделиться собственным пресетом, нажав на кнопку",
+ "PresetOnline.uploadBtn": "Выгрузить",
+ "PresetOnline.sentencePart2": ", доступную при наличии ваших пресетов.",
+ "sceneSelector.cpuTitle": "ЦП",
+ "sceneSelector.gpuTitle": "ГП Vega",
+ "ryzenAdj.maxGfxclk.label": "Максимальная частота Vega iGPU (МГц)",
+ "ryzenAdj.stapmTime.desc": "Skin Temperature Aware Power Management (STAPM). Определяет период буста, который будет использоваться",
+ "ryzenAdj.slowLimit.desc": "Количество энергии, которое процессор может использовать при отключенных уровнях буста",
+ "appContext.minimizeOnLaunch.name": "Сворачивать при запуске",
+ "appContext.ryzenAdjPath.name": "Путь к RyzenAdj",
+ "sceneSelector.settingsTitle": "Настройки",
+ "sceneSelector.powerTitle": "Питание",
+ "ryzenAdj.slowTime.desc": "Определяет период времени, который будет использоваться вне периода буста, чтобы обеспечить постоянную мощность, которая должна быть подана от БП",
+ "ryzenAdj.slowTime.label": "Отслеживание мощности пакета (PPT) - медленный период времени",
+ "ryzenAdj.minFclkFrequency.desc": "Infinity Fabric - это маркетинговый термин AMD для моста, соединяющего процессоры (ГП / ЦП), определяющий ограничение мин. частоты шины",
+ "ryzenAdj.maxFclkFrequency.desc": "Infinity Fabric - это маркетинговый термин AMD для моста, соединяющего процессоры (ГП / ЦП), определяющий ограничение макс. частоты шины",
+ "ryzenAdj.stapmLimit.desc": "Skin Temperature Aware Power Management (STAPM). Определяет предел питания от БП, который используется для управления периодом буста устройства.",
+ "ryzenAdj.stapmTime.label": "Период буста ЦП",
+ "ryzenAdj.vrmmaxCurrent.desc": "Лимит подаваемой мощности для материнской платы на процессор",
+ "ryzenAdj.vrmmaxCurrent.label": "Предел тока VRM (A)",
+ "appContext.ryzenAdjPath.shortDesc": "Полный путь к бинарнику RyzenAdj",
+ "ryzenAdj.maxFclkFrequency.label": "Максимальная частота Infinity Fabric (МГц)",
+ "ryzenAdj.stapmLimit.label": "CPU TDP (Вт)",
+ "appContext.autoStartOnBoot.shortDesc": "Запускать Ryzen Controller при старте ОС",
+ "sceneSelector.presetsTitle": "Пресеты",
+ "ryzenAdj.psi0Current.label": "Текущее ограничение PSI0 (мА)",
+ "ryzenAdj.maxGfxclk.desc": "Максимальная частота (Vega) ГП, на котором он может работать",
+ "ryzenAdj.minFclkFrequency.label": "Минимальная частота Infinity Fabric (МГц)",
+ "ryzenAdj.slowLimit.label": "Мин. CPU TDP (Вт)",
+ "appContext.minimizeOnLaunch.shortDesc": "Запускать Ryzen Controller свёрнутым",
+ "ryzenAdj.minGfxclk.label": "Минимальная частота Vega iGPU (МГц)",
+ "ryzenAdj.fastLimit.desc": "Питание, которое CPU может использовать во время буста",
+ "appContext.minimizeToTray.name": "Свернуть в трей",
+ "ryzenAdj.psi0Current.desc": "Лимит подаваемой мощности для материнской платы на PSI0",
+ "ryzenAdj.minGfxclk.desc": "Минимальная частота (Vega) ГП, на котором он может работать",
+ "ryzenAdj.fastLimit.label": "CPU TDP при бусте (Вт)",
+ "appContext.autoStartOnBoot.name": "Автоматически запускаться при загрузке ОС",
+ "appContext.minimizeToTray.shortDesc": "Сворачивать Ryzen Controller в трей вместо панели задач",
+ "appContext.reApplyPeriodically.desc": "На некоторых ноутбуках BIOS порой сбрасывает те настройки, которые RyzenAdj пытается выставить. Вы можете использовать эту опцию, чтобы периодически переприменять настройки.",
+ "sceneSelector.releasesTitle": "Релизы",
+ "ryzenAdj.tctlTemp.desc": "Температура, до которой CPU может нагреться перед выключением буста",
+ "appContext.reApplyPeriodically.name": "Периодически переприменять",
+ "ryzenAdj.tctlTemp.label": "Лимит температуры (°C)",
+ "appContext.reApplyPeriodically.shortDesc": "Позволяет переприменять настройки RyzenAdj периодически (каждые X секунд)",
+ "PresetsScene.onlinePresetTitle": "Пресеты в сети",
+ "PresetsScene.localPresetTitle": "Локальные пресеты",
+ "PresetsScene.autoApplyTitle": "Применять пресет автоматически",
+ "SettingsScene.settingsTitle": "Настройки",
+ "settingForm.currentPath": "Текущий путь:",
+ "sysInfoCards.biosVersion": "Версия BIOS:",
+ "sysInfoCards.gpuPerfDesc": "{ram} МБ (Динамическая видеопамять: {dyn}).",
+ "SettingsScene.sysInfoTitle": "Информация о системе",
+ "sysInfoCards.basicInfoTitle": "Общая информация",
+ "settingForm.browseBtn": "Обзор",
+ "SettingsScene.systemHashDesc": "Это будет использоваться для обеспечения совместимости загруженных пресетов.",
+ "sysInfoCards.CPUInfoTitle": "Информация о ЦП",
+ "sysInfoCards.cpuPerfDesc": "{speedmax} ГГц с {physicalCores} ядрами и {cores} потоками.",
+ "sysInfoCards.GPUInfoTitle": "Информация о ГП #{index}",
+ "SettingsScene.loadingSysHash": "Загрузка...",
+ "ryzenAdjBottomBar.prompt": "Наименование нового пресета",
+ "ryzenAdjBottomBar.mustProvideName": "Вы должны указать наименование",
+ "ryzenAdjBottomBar.presetCreated": "Пресет \"{newPresetName}\" создан",
+ "ryzenAdjBottomBar.presetWithSameNameExist": "Пресет с наименованием \"{newPresetName}\" уже существует",
+ "presetButtons.apply": "Применить",
+ "presetButtons.delete": "Удалить",
+ "presetButtons.load": "Загрузить",
+ "presetAutoApply.nonePreset": "Отсутствует",
+ "presetButtons.upload": "Выгрузить",
+ "ryzenAdj.applySuccess": "RyzenAdj успешно применил настройки",
+ "presetButtons.uploadSucceed": "Пресет {preset} был выгружен",
+ "presetOnlineBtn.downloadTooltip": "Сохранит пресет в ваш локальный пресет",
+ "presetOnlineBtn.loadTooltip": "Без сохранения пресета будет загружен в таблицы RyzenAdj, но не применён",
+ "presetOnlineBtn.download": "Скачать",
+ "presetOnlineBtn.load": "Загрузить",
+ "presetButtons.presetWithSameNameAlreadyExistOnline": "Пресет с таким наименованием уже присутствует в сети",
+ "presetOnlineBtn.presetDownloaded": "Пресет \"{presetName}\" загружен",
+ "presetOnlineBtn.presetSameNameExist": "У вас уже есть пресет с таким же именем",
+ "PresetsScene.cantVoteTwiceSamePreset": "Вы не можете дважды голосовать за один и тот же пресет",
+ "PresetsScene.confirmVote": "Вы уверены, что хотите проголосовать {vote} за этот пресет?",
+ "PresetsScene.updatingVotes": "Обновление голосов...",
+ "notification.settingsSaveSuccess": "Настройки были успешно сохранены",
+ "ryzenAdjBottomBar.apply": "Применить",
+ "ryzenAdjBottomBar.createPreset": "Создать пресет",
+ "ryzenAdjBottomBar.reset": "Сброс",
+ "app.localeSelectorModalTitle": "Изменить язык",
+ "appContext.newReleaseAvailable": "Доступна новая версия, пожалуйста, проверьте вкладку 'Релизы'",
+ "PresetOnline.errorLoadingPresets": "Невозможно загрузить пресеты",
+ "PresetOnline.retryLoadingPresetListBtn": "Повторить",
+ "PresetOnline.pleaseCheckInternetConnection": "Пожалуйста, проверьте ваше интернет-соединение",
+ "presetButtons.uploadError": "Возникла ошибка во время выгрузки пресета.",
+ "presetLine.compatibility": "Совместимость:",
+ "appContext.invalidPreset": "Невозможно применить некорректный пресет",
+ "presetOnlineBtn.presetInvalidOrObsolete": "Пресет \"{presetName}\" некорректен, либо устарел",
+ "PresetsScene.errorWhileSendingVote": "Ошибка при отправке голоса",
+ "sysInfoCards.unableToGetSysInfo": "Невозможно получить информацию о системе:",
+ "settingForm.windowsBinFileType": "Исполняемый файл Windows",
+ "appContext.ryzenAdjPath.wrongPath": "Путь к ryzenadj.exe некорректен, пожалуйста, измените его в разделе 'Настройки'",
+ "ryzenAdjBottomBar.invalidPreset": "Невозможно применить некорректный пресет",
+ "presetOnlineBtn.presetLoaded": "Пресет \"{presetName}\" загружен",
+ "presetButtons.mustWaitForSignatureGen": "Вы должны подождать завершения генерации подписи ноутбука"
+}