diff --git a/src/components/LocaleSelectorModal.tsx b/src/components/LocaleSelectorModal.tsx
index 3d80d96..63c05da 100644
--- a/src/components/LocaleSelectorModal.tsx
+++ b/src/components/LocaleSelectorModal.tsx
@@ -24,6 +24,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 e45e28b..609a33d 100644
--- a/src/locales/LocaleTranslations.tsx
+++ b/src/locales/LocaleTranslations.tsx
@@ -7,4 +7,5 @@ export default {
de: require("./de.json") as Record,
tr: require("./tr.json") as Record,
ru: require("./ru.json") as Record,
+ ua: require("./ua.json") as Record,
};
diff --git a/src/locales/ua.json b/src/locales/ua.json
new file mode 100644
index 0000000..0eda993
--- /dev/null
+++ b/src/locales/ua.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": "Ви повинні зачекати завершення генерації подпису ноутбука"
+}