mirror of
https://github.com/iNavFlight/inav-configurator.git
synced 2025-07-22 15:55:28 +03:00
Merge branch 'master' into ToshihiroMakuuchi/ja-fix01
This commit is contained in:
commit
5f25766fbc
19 changed files with 6549 additions and 73 deletions
18
index.html
18
index.html
|
@ -1,5 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<html i18n_lang="currentLanguage">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
@ -88,13 +88,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="header-wrapper">
|
||||
<div id="dataflash_wrapper_global">
|
||||
<div class="noflash_global" align="center" i18n="sensorDataFlashNotFound"></div>
|
||||
<ul class="dataflash-contents_global">
|
||||
<li class="dataflash-free_global">
|
||||
<div class="legend" i18n="sensorDataFlashFreeSpace"></div>
|
||||
</li>
|
||||
</ul>
|
||||
<div id="profiles_wrapper_global">
|
||||
<div id="profile_change">
|
||||
<div class="dropdown dropdown-dark">
|
||||
<form name="profile-change" id="profile-change">
|
||||
|
@ -130,6 +124,14 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="dataflash_wrapper_global">
|
||||
<div class="noflash_global" align="center" i18n="sensorDataFlashNotFound"></div>
|
||||
<ul class="dataflash-contents_global">
|
||||
<li class="dataflash-free_global">
|
||||
<div class="legend" i18n="sensorDataFlashFreeSpace"></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="sensor-status" class="sensor_state mode-connected">
|
||||
<ul>
|
||||
<li class="gyro" i18n_title="sensorStatusGyro">
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
var CONFIGURATOR = {
|
||||
// all versions are specified and compared using semantic versioning http://semver.org/
|
||||
'minfirmwareVersionAccepted': '7.0.0',
|
||||
'minfirmwareVersionAccepted': '8.0.0',
|
||||
'maxFirmwareVersionAccepted': '9.0.0', // Condition is < (lt) so we accept all in 8.x branch
|
||||
'connectionValid': false,
|
||||
'connectionValidCliOnly': false,
|
||||
|
|
|
@ -529,7 +529,7 @@ GUI_control.prototype.update_dataflash_global = function () {
|
|||
width: (100-(FC.DATAFLASH.totalSize - FC.DATAFLASH.usedSize) / FC.DATAFLASH.totalSize * 100) + "%",
|
||||
display: 'block'
|
||||
});
|
||||
$(".dataflash-free_global div").text('Dataflash: free ' + formatFilesize(FC.DATAFLASH.totalSize - FC.DATAFLASH.usedSize));
|
||||
$(".dataflash-free_global div").html(i18n.getMessage('sensorDataFlashFreeSpace') + formatFilesize(FC.DATAFLASH.totalSize - FC.DATAFLASH.usedSize));
|
||||
} else {
|
||||
$(".noflash_global").css({
|
||||
display: 'block'
|
||||
|
|
|
@ -10,7 +10,8 @@ const i18nextXHRBackend = require('i18next-xhr-backend');
|
|||
const Store = require('electron-store');
|
||||
const store = new Store();
|
||||
|
||||
const availableLanguages = ['en', 'ja', 'uk'];
|
||||
|
||||
const availableLanguages = ['en', 'ja', 'uk','zh_CN'];
|
||||
|
||||
const i18n = {};
|
||||
|
||||
|
@ -173,6 +174,11 @@ i18n.localize = function (reTranslate = false) {
|
|||
const element = $(this);
|
||||
element.attr('placeholder', translate(element.attr('i18n_placeholder')));
|
||||
});
|
||||
|
||||
$('[i18n_lang]').each(function() {
|
||||
const element = $(this);
|
||||
element.attr('lang', translate(element.attr('i18n_lang')));
|
||||
});
|
||||
} else {
|
||||
|
||||
$('[i18n]:not(.i18n-replaced)').each(function() {
|
||||
|
@ -234,6 +240,13 @@ i18n.localize = function (reTranslate = false) {
|
|||
element.attr('placeholder', translate(element.attr('i18n_placeholder')));
|
||||
element.addClass('i18n_placeholder-replaced');
|
||||
});
|
||||
|
||||
$('[i18n_lang]:not(.i18n_lang-replaced)').each(function() {
|
||||
const element = $(this);
|
||||
element.attr('lang', translate(element.attr('i18n_lang')));
|
||||
element.addClass('i18n_lang-replaced');
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
return localized;
|
||||
|
|
|
@ -462,6 +462,7 @@ var SerialBackend = (function () {
|
|||
$('#sensor-status').show();
|
||||
$('#portsinput').hide();
|
||||
$('#dataflash_wrapper_global').show();
|
||||
$('#profiles_wrapper_global').show();
|
||||
|
||||
/*
|
||||
* Init PIDs bank with a length that depends on the version
|
||||
|
@ -481,7 +482,6 @@ var SerialBackend = (function () {
|
|||
|
||||
interval.add('global_data_refresh', periodicStatusUpdater.run, periodicStatusUpdater.getUpdateInterval(CONFIGURATOR.connection.bitrate), false);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
privateScope.onClosed = function (result) {
|
||||
|
@ -497,6 +497,7 @@ var SerialBackend = (function () {
|
|||
$('#sensor-status').hide();
|
||||
$('#portsinput').show();
|
||||
$('#dataflash_wrapper_global').hide();
|
||||
$('#profiles_wrapper_global').hide();
|
||||
$('#quad-status_wrapper').hide();
|
||||
|
||||
//updateFirmwareVersion();
|
||||
|
|
|
@ -154,7 +154,11 @@ var ublox = (function () {
|
|||
|
||||
if (successCallback != null) {
|
||||
req.onload = (event) => {
|
||||
if(req.status == 200) {
|
||||
successCallback(req.response);
|
||||
} else {
|
||||
failCallback(event);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -164,13 +168,17 @@ var ublox = (function () {
|
|||
}
|
||||
}
|
||||
|
||||
try {
|
||||
req.send(null);
|
||||
} catch(error) {
|
||||
GUI.alert(i18n.getMessage("gpsAssistnowLoadDataError"));
|
||||
console.log(i18n.getMessage("gpsAssistnowLoadDataError") + ':' + error.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function loadError(event) {
|
||||
GUI.alert(i18n.getMessage("gpsAssistnowLoadDataError"));
|
||||
console.log(i18n.getMessage("gpsAssistnowLoadDataError") + ':' + event.toString());
|
||||
}
|
||||
|
||||
// For more info on assistnow, check:
|
||||
|
|
|
@ -18,6 +18,10 @@
|
|||
"message": "日本語",
|
||||
"_comment": "Don't translate!"
|
||||
},
|
||||
"language_zh_CN": {
|
||||
"message": "简体中文",
|
||||
"_comment": "Don't translate!"
|
||||
},
|
||||
"language": {
|
||||
"message": "Language"
|
||||
},
|
||||
|
@ -5704,7 +5708,7 @@
|
|||
"message": "No dataflash <br>chip found"
|
||||
},
|
||||
"sensorDataFlashFreeSpace": {
|
||||
"message": "Dataflash: free space"
|
||||
"message": "Dataflash: <br />free "
|
||||
},
|
||||
"mixerProfile1": {
|
||||
"message": "Mixer Profile 1"
|
||||
|
@ -6156,5 +6160,8 @@
|
|||
},
|
||||
"adsbHeartbeatTotalMessages": {
|
||||
"message": "Heartbeat msgs"
|
||||
},
|
||||
"currentLanguage": {
|
||||
"message": "en"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,10 @@
|
|||
"message": "日本語",
|
||||
"_comment": "Don't translate!"
|
||||
},
|
||||
"language_zh_CN": {
|
||||
"message": "简体中文",
|
||||
"_comment": "Don't translate!"
|
||||
},
|
||||
"language": {
|
||||
"message": "Мова"
|
||||
},
|
||||
|
@ -565,7 +569,7 @@
|
|||
"message": "Калібрувати Магнітометр"
|
||||
},
|
||||
"initialSetupCalibrateMagText": {
|
||||
"message": "Покрутіть мультиротор принаймні <strong>360</strong> градусів по всіх 3-х осях обертання, у вас є 30 секунд, щоб виконати це завдання"
|
||||
"message": "Покрутіть мультикоптер принаймні <strong>360</strong> градусів по всіх 3-х осях обертання, у вас є 30 секунд, щоб виконати це завдання"
|
||||
},
|
||||
"initialSetupButtonReset": {
|
||||
"message": "Скинути налаштування"
|
||||
|
@ -1153,7 +1157,7 @@
|
|||
"message": "Протокол"
|
||||
},
|
||||
"configurationGPSUseGalileo": {
|
||||
"message": "Використовувати супутники Galileo(ЄС)"
|
||||
"message": "Використовувати супутники Galileo (ЄС)"
|
||||
},
|
||||
"configurationGPSUseBeidou": {
|
||||
"message": "Використовувати супутники BeiDou (Китай)"
|
||||
|
@ -1755,6 +1759,9 @@
|
|||
"receiverRssiChannel": {
|
||||
"message": "Канал RSSI"
|
||||
},
|
||||
"receiverRssiSource": {
|
||||
"message": "Джерело RSSI"
|
||||
},
|
||||
"receiverRefreshRateTitle": {
|
||||
"message": "Частота оновлення графіків"
|
||||
},
|
||||
|
@ -2365,10 +2372,10 @@
|
|||
"message": "У вашому польотному контролері відсутній сумісний чіп пам'яті для зберігання даних."
|
||||
},
|
||||
"dataflashFirmwareUpgradeRequired": {
|
||||
"message": "Для використання флеш-пам'яті польотника необхідна прошивка >= 1.8.0."
|
||||
"message": "Для використання флешпам'яті польотника необхідна прошивка >= 1.8.0."
|
||||
},
|
||||
"dataflashButtonSaveFile": {
|
||||
"message": "Зберегти флеш-пам'ять в файл..."
|
||||
"message": "Зберегти флешпам'ять в файл..."
|
||||
},
|
||||
"dataflashButtonErase": {
|
||||
"message": "Стерти флешпамять"
|
||||
|
@ -2551,7 +2558,7 @@
|
|||
"message": "<strong>Відновлення / Втрата зв'язку<strong>"
|
||||
},
|
||||
"firmwareFlasherRecoveryText": {
|
||||
"message": "Якщо ви втратили зв'язок з вашою платою, дотримуйтесь цих кроків, щоб відновити зв'язок: <ul><li>Вимкніть живлення</li><li>Увімкніть 'Польотник уже в режимі завантажувача', увімкніть 'Повне стирання чипа'.</li><li>З'єднайте контакти BOOT або утримуйте кнопку BOOT.</li><li>Увімкніть живлення (індикатор активності НЕ буде блимати, якщо все зроблено правильно).</li><li>Встановіть усі драйвери STM32 і Zadig, якщо це необхідно (див. розділ <a href=\"https://github.com/iNavFlight/inav/blob/master/docs/USB%20Flashing.md\"target=\"_blank\">Прошивка через USB</a> в документації INAV).</li><li>Закрийте конфігуратор, закрийте всі запущені екземпляри Chrome, закрийте всі програми Chrome, перезапустіть конфігуратор.</li><li>Відпустіть кнопку BOOT, якщо вона є на вашому польотному контролері.</li><li>Прошивайте правильною прошивкою (використовуючи ручну швидкість передачі даних, якщо це вказано в керівництві до вашого польотного контролера).</li><li>Вимкніть живлення.</li><li>Видаліть перемичку BOOT.</li><li>Увімкніть живлення (індикатор активності має блимати).</li><li>Під'єднайте як зазвичай.</li></ul>"
|
||||
"message": "Якщо ви втратили зв'язок з вашою платою, дотримуйтесь цих кроків, щоб відновити його: <ul><li>Вимкніть живлення</li><li>Увімкніть 'Польотник уже в режимі завантажувача', увімкніть 'Повністю очистити мікроконтролер'.</li><li>З'єднайте контакти BOOT або утримуйте кнопку BOOT.</li><li>Увімкніть живлення (індикатор активності НЕ буде блимати, якщо все зроблено правильно).</li><li>Встановіть усі драйвери STM32 і Zadig, якщо це необхідно (див. розділ <a href=\"https://github.com/iNavFlight/inav/blob/master/docs/USB%20Flashing.md\"target=\"_blank\">Прошивка через USB</a> в документації INAV).</li><li>Закрийте конфігуратор, закрийте всі запущені екземпляри Chrome, закрийте всі програми Chrome, перезапустіть конфігуратор.</li><li>Відпустіть кнопку BOOT, якщо вона є на вашому польотному контролері.</li><li>Прошивайте правильною прошивкою (використовуючи ручну швидкість передачі даних, якщо це вказано в керівництві до вашого польотного контролера).</li><li>Вимкніть живлення.</li><li>Видаліть перемичку BOOT.</li><li>Увімкніть живлення (індикатор активності має блимати).</li><li>Під'єднайте як зазвичай.</li></ul>"
|
||||
},
|
||||
"firmwareFlasherButtonLeave": {
|
||||
"message": "Вийти з програматора"
|
||||
|
@ -3067,7 +3074,7 @@
|
|||
"message": "Визначає смугу фільтра. <br><br>Повинно бути нижче частоти режекторного фільтра."
|
||||
},
|
||||
"multiRotorNavigationConfiguration": {
|
||||
"message": "Налаштування навігації мультиротора"
|
||||
"message": "Налаштування навігації мультикоптера"
|
||||
},
|
||||
"userControlMode": {
|
||||
"message": "Режим керування користувачем"
|
||||
|
@ -3567,6 +3574,12 @@
|
|||
"osd_main_voltage_decimals": {
|
||||
"message": "Десяткові розряди напруги"
|
||||
},
|
||||
"osd_decimals_altitude": {
|
||||
"message": "Десяткові знаки висоти"
|
||||
},
|
||||
"osd_decimals_distance": {
|
||||
"message": "Десяткові знаки відстані"
|
||||
},
|
||||
"osd_mah_precision": {
|
||||
"message": "Точність мАг"
|
||||
},
|
||||
|
@ -3652,7 +3665,7 @@
|
|||
"message": "Нахил камери догори"
|
||||
},
|
||||
"osd_camera_uptilt_help": {
|
||||
"message": "Встановіть кут підйому FPV камери в градусах, позитивний - вгору, негативний - вниз, відносно горизонталі. Використовується для коректного відображення елементів HUD та індикатора штучного горизонту (коли увімкнено)."
|
||||
"message": "Встановіть кут підйому FPV камери в градусах відносно горизонталі, позитивний - вгору, негативний - вниз. Використовується для коректного відображення елементів HUD та індикатора штучного горизонту (коли увімкнено osd_ahi_camera_uptilt_comp=ON)."
|
||||
},
|
||||
"osd_camera_fov_h": {
|
||||
"message": "Кут горизонтального поля зору камери"
|
||||
|
@ -3787,19 +3800,19 @@
|
|||
"message": "Максимальна температура регулятора обертів"
|
||||
},
|
||||
"osd_snr_alarm": {
|
||||
"message": "Рівень сигналізації CRSF SNR"
|
||||
"message": "Рівень сигналізації SNR"
|
||||
},
|
||||
"osdalarmSNR_HELP": {
|
||||
"message": "SNR відображається лише нижче цього значення. 0dB (співвідношення 1:1) означає, що отриманий сигнал дорівнює рівню шумів."
|
||||
},
|
||||
"osd_link_quality_alarm": {
|
||||
"message": "Сигналізація якості зв'язку CRSF"
|
||||
"message": "Сигналізація якості зв'язку"
|
||||
},
|
||||
"osdalarmLQ_HELP": {
|
||||
"message": "Для Crossfire використовуйте 70%. Для Tracer використовуйте 50%."
|
||||
},
|
||||
"osd_rssi_dbm_alarm": {
|
||||
"message": "Cигналізація CRSF RSSI dBm"
|
||||
"message": "Cигналізація RSSI в дБм"
|
||||
},
|
||||
"osd_adsb_distance_warning": {
|
||||
"message": "Попередження про відстань ADSB"
|
||||
|
@ -3846,8 +3859,8 @@
|
|||
"osdGroupVTX": {
|
||||
"message": "Відеопередавач"
|
||||
},
|
||||
"osdGroupCRSF": {
|
||||
"message": "Статистика приймача CRSF"
|
||||
"osdGroupRx": {
|
||||
"message": "Статистика приймача RX"
|
||||
},
|
||||
"osdGroupMapsAndRadars": {
|
||||
"message": "Карти та радарні системи"
|
||||
|
@ -4074,23 +4087,29 @@
|
|||
"osdElement_VTX_CHANNEL_HELP": {
|
||||
"message": "Показує поточний діапазон і канал відеопередавача. Потребує або відеопередавач зі SmartAudio чи Tramp, або відеопередавач, інтегрований у польотний контролер."
|
||||
},
|
||||
"osdElement_CRSF_RSSI_DBM": {
|
||||
"message": "RX RSSI у дБм"
|
||||
"osdElement_RSSI_DBM": {
|
||||
"message": "Значення RX RSSI в дБм"
|
||||
},
|
||||
"osdElement_CRSF_LQ": {
|
||||
"message": "RX Якість з'єднання %"
|
||||
"osdElement_LQ_UPLINK": {
|
||||
"message": "Якість з'єднання від RX до TX %"
|
||||
},
|
||||
"osdElement_CRSF_LQ_HELP": {
|
||||
"message": "Використовуйте налаштування Формату Crossfire LQ для вибору типу формату."
|
||||
"osdElement_LQ_UPLINK_HELP": {
|
||||
"message": "Якщо використовується CRSF, використовуйте налаштування формату LQ Crossfire для вибору типу формату."
|
||||
},
|
||||
"osdElement_CRSF_SNR_DB": {
|
||||
"message": "RX Uplink SNR в дБ"
|
||||
"osdElement_LQ_DOWNLINK": {
|
||||
"message": "Якість каналу від TX до RX %"
|
||||
},
|
||||
"osdElement_CRSF_SNR_DB_HELP": {
|
||||
"message": "Показується лише при зниженні SNR нижче рівня попередження. При 0 дБ рівень прийнятого сигналу дорівнює рівню шуму."
|
||||
"osdElement_SNR_DB": {
|
||||
"message": "SNR каналу від RX до TX у дБ"
|
||||
},
|
||||
"osdElement_CRSF_TX_POWER": {
|
||||
"message": "Потужність TX у мВт"
|
||||
"osdElement_SNR_DB_HELP": {
|
||||
"message": "Показується лише коли SNR (співвідношення сигнал/шум) опускається нижче рівня попередження. При 0 дБ рівень прийнятого сигналу дорівнює рівню шуму."
|
||||
},
|
||||
"osdElement_TX_POWER_UPLINK": {
|
||||
"message": "Потужність передавача в мВт"
|
||||
},
|
||||
"osdElement_OSD_RX_POWER_DOWNLINK": {
|
||||
"message": "Потужність приймача в мВт"
|
||||
},
|
||||
"osdElement_MAP_NORTH": {
|
||||
"message": "Карта (північ вгорі)"
|
||||
|
@ -4156,16 +4175,16 @@
|
|||
"message": "Результати ПІД регулятора положення FW"
|
||||
},
|
||||
"osdElement_MC_VEL_X_PID_OUTPUTS": {
|
||||
"message": "Результати ПІД регулятора швидкості мультиротора по осі X"
|
||||
"message": "Результати ПІД регулятора швидкості мультикоптера по осі X"
|
||||
},
|
||||
"osdElement_MC_VEL_Y_PID_OUTPUTS": {
|
||||
"message": "Результати ПІД регулятора швидкості мультиротора по осі Y"
|
||||
"message": "Результати ПІД регулятора швидкості мультикоптера по осі Y"
|
||||
},
|
||||
"osdElement_MC_VEL_Z_PID_OUTPUTS": {
|
||||
"message": "Результати ПІД регулятора швидкості мультиротора по осі Z"
|
||||
"message": "Результати ПІД регулятора швидкості мультикоптера по осі Z"
|
||||
},
|
||||
"osdElement_MC_POS_XYZ_P_OUTPUTS": {
|
||||
"message": "Результати П регулятора положення XYZ мультиротора"
|
||||
"message": "Результати П регулятора положення XYZ мультикоптера"
|
||||
},
|
||||
"osdElement_IMU_TEMPERATURE": {
|
||||
"message": "Температура ІВП"
|
||||
|
@ -4275,6 +4294,15 @@
|
|||
"osdElement_OSD_RANGEFINDER": {
|
||||
"message": "Відстань далекоміра"
|
||||
},
|
||||
"osdElement_COURSE_NEXT_GEOZONE": {
|
||||
"message": "Курс до наступної геозони"
|
||||
},
|
||||
"osdElement_HOR_DIST_TO_NEXT_GEOZONE": {
|
||||
"message": "Горизонтальна відстань до наступної геозони"
|
||||
},
|
||||
"osdElement_VERT_DIST_TO_NEXT_GEOZONE": {
|
||||
"message": "Вертикальна відстань до наступної геозони"
|
||||
},
|
||||
"osdSettingPLUS_CODE_DIGITS_HELP": {
|
||||
"message": "Точність на екваторі: 10=13,9x13,9м; 11=2,8x3,5м; 12=56x87см; 13=11x22см."
|
||||
},
|
||||
|
@ -4635,6 +4663,171 @@
|
|||
"missionSafehomeMaxSafehomesReached": {
|
||||
"message": "Максимальна кількість безпечних точок досягнута."
|
||||
},
|
||||
"missionGeozoneHead": {
|
||||
"message": "Геозони"
|
||||
},
|
||||
"missionGeozoneEdit": {
|
||||
"message": "Редагувати геозону $1"
|
||||
},
|
||||
"missionGeozoneSaveAndReboot": {
|
||||
"message": "Записати Геозони в Eeprom та перезавантажити"
|
||||
},
|
||||
"missionGeozoneLoad": {
|
||||
"message": "Завантажити геозони з Eeprom"
|
||||
},
|
||||
"missionGeozone": {
|
||||
"message": "-Геозона "
|
||||
},
|
||||
"missionGezoneType": {
|
||||
"message": "Тип"
|
||||
},
|
||||
"missionGezoneShape": {
|
||||
"message": "Форма"
|
||||
},
|
||||
"missionGeozoneTypePolygon": {
|
||||
"message": "Багатокутна"
|
||||
},
|
||||
"missionGeozoneTypeCircular": {
|
||||
"message": "Кругова"
|
||||
},
|
||||
"missionGeozoneMaxZonesReached": {
|
||||
"message": "Досягнуто максимальної кількості геозон."
|
||||
},
|
||||
"missionGeozoneMaxVerticesReached": {
|
||||
"message": "Досягнуто максимальної кількості вершин геозони."
|
||||
},
|
||||
"missionGeozoneWarning": {
|
||||
"message": "Щонайменше одна місія та одна геозона налаштовані, будь ласка, переконайтеся, що місія не порушує межі геозони."
|
||||
},
|
||||
"geozoneEdit": {
|
||||
"message": "Редагувати геозону "
|
||||
},
|
||||
"geozoneShape": {
|
||||
"message": "Форма"
|
||||
},
|
||||
"geozoneInclusive": {
|
||||
"message": "Інклюзивна"
|
||||
},
|
||||
"geozoneExcusive": {
|
||||
"message": "Ексклюзивна"
|
||||
},
|
||||
"geozoneMinAlt": {
|
||||
"message": "Мін. вис. (см):"
|
||||
},
|
||||
"geozoneMaxAlt": {
|
||||
"message": "Макс. вис. (см):"
|
||||
},
|
||||
"geozoneInfiniteAlt": {
|
||||
"message": "0 = висота не обмежена"
|
||||
},
|
||||
"geozoneAction": {
|
||||
"message": "Дія:"
|
||||
},
|
||||
"geozoneActionNone": {
|
||||
"message": "Відсутня"
|
||||
},
|
||||
"geozoneActionAvoid": {
|
||||
"message": "Уникати"
|
||||
},
|
||||
"geozoneActionPosHold": {
|
||||
"message": "Утримувати позицію"
|
||||
},
|
||||
"geozoneActionRTH": {
|
||||
"message": "Повернення додому"
|
||||
},
|
||||
"geozoneRadius": {
|
||||
"message": "Радіус (см):"
|
||||
},
|
||||
"geozoneVerices": {
|
||||
"message": "Вершини:"
|
||||
},
|
||||
"": {
|
||||
"message": ""
|
||||
},
|
||||
"featureGEOZONE": {
|
||||
"message": "Геозона"
|
||||
},
|
||||
"geozone": {
|
||||
"message": "Геозона"
|
||||
},
|
||||
"featureGEOZONETip": {
|
||||
"message": "Віртуальні периметри для географічних зон (також називаються гео-огорожами) з автоматичною активацією дій у разі порушення цих периметрів."
|
||||
},
|
||||
"GeozoneSettings": {
|
||||
"message": "Налаштування геозони"
|
||||
},
|
||||
"geozoneDetectionDistance": {
|
||||
"message": "Відстань виявлення"
|
||||
},
|
||||
"geozoneDetectionDistanceHelp": {
|
||||
"message": "Відстань, з якої виявляється геозона"
|
||||
},
|
||||
"geozoneAvoidAltitudeRange": {
|
||||
"message": "Уникати діапазон висот"
|
||||
},
|
||||
"geozoneAvoidAltitudeRangeHelp": {
|
||||
"message": "Діапазон висот, в межах якого здійснюється спроба обійти геозону зверху"
|
||||
},
|
||||
"geozoneSafeAltitudeDistance": {
|
||||
"message": "Безпечна відстань по висоті"
|
||||
},
|
||||
"geozoneSafeAltitudeDistanceHelp": {
|
||||
"message": "Вертикальна відстань, яку необхідно утримувати до верхньої та нижньої межі зони."
|
||||
},
|
||||
"geozoneSafehomeAsInclusive": {
|
||||
"message": "Безпечна зона повернення інклюзивна"
|
||||
},
|
||||
"geozoneSafehomeAsInclusiveHelp": {
|
||||
"message": "Сприймати найближчу безпечну точку повернення як інклюзивну геозону"
|
||||
},
|
||||
"geozoneSafehomeZoneAction": {
|
||||
"message": "Дія зони безпечного повернення"
|
||||
},
|
||||
"geozoneSafehomeZoneActionHelp": {
|
||||
"message": "Межа дії для зони безпечної точки повернення"
|
||||
},
|
||||
"geozoneMrStopDistance": {
|
||||
"message": "Відстань зупинки мультикоптера"
|
||||
},
|
||||
"geozoneMrStopDistanceHelp": {
|
||||
"message": "Відстань до межі, на якій мультикоптер зупиняється"
|
||||
},
|
||||
"geozoneNoWayHomeAction": {
|
||||
"message": "Дія в разі відсутності можливості повернення додому"
|
||||
},
|
||||
"geozoneNoWayHomeActionHelp": {
|
||||
"message": "Дія, якщо Повернення додому RTH з активними геозонами не може розрахувати маршрут додому: \nRTH: Повернутися додому і ігнорувати всі геозони."
|
||||
},
|
||||
"missionGeozoneReboot": {
|
||||
"message": "Бажаєте зберегти та перезавантажити?"
|
||||
},
|
||||
"missionGeozoneAvailableZones": {
|
||||
"message": "Доступні геозони:"
|
||||
},
|
||||
"missionGeozoneAvailableVertices": {
|
||||
"message": "Доступні вершини:"
|
||||
},
|
||||
"geozoneInvalidzone": {
|
||||
"message": "Виявлено недійсні геозони:"
|
||||
},
|
||||
"geozoneInvalidLat": {
|
||||
"message": "Неприпустима широта"
|
||||
},
|
||||
"geozoneInvalidLon": {
|
||||
"message": "Неприпустима довгота"
|
||||
},
|
||||
"gezoneInvalidReasonNotCC": {
|
||||
"message": "Не проти годинникової стрілки"
|
||||
},
|
||||
"gezoneInvalidReasonComplex": {
|
||||
"message": "Складна"
|
||||
},
|
||||
"gezoneInvalidReasonMinMaxAlt": {
|
||||
"message": "Макс. вис. <= Мін. вис."
|
||||
},
|
||||
"geozoneUnableToSave": {
|
||||
"message": "Неможливо зберегти геозони: недійсні зони"
|
||||
},
|
||||
"missionMultiMissionHead": {
|
||||
"message": "Мультимісії"
|
||||
},
|
||||
|
@ -4743,6 +4936,9 @@
|
|||
"settings": {
|
||||
"message": "Налаштування"
|
||||
},
|
||||
"decimals": {
|
||||
"message": "Десяткові знаки"
|
||||
},
|
||||
"motorMixer": {
|
||||
"message": "Мікшер моторів"
|
||||
},
|
||||
|
@ -4897,7 +5093,7 @@
|
|||
"message": "Цикл ПІД може бути нестабільним, якщо використовуються GPS"
|
||||
},
|
||||
"gyroLpfSuggestedMessage": {
|
||||
"message": "Це рекомендоване налаштування для всіх мультироторів із розміром пропелерів менше 8 дюймів. Завжди перевіряйте температуру мотора після першого польоту"
|
||||
"message": "Це рекомендоване налаштування для всіх мультикоптерів із розміром пропелерів менше 8 дюймів. Завжди перевіряйте температуру мотора після першого польоту"
|
||||
},
|
||||
"gyroLpfNotAdvisedMessage": {
|
||||
"message": "Рекомендується вибрати вищу частоту зрізу"
|
||||
|
@ -5050,7 +5246,7 @@
|
|||
"message": "Швидкість I2C"
|
||||
},
|
||||
"configurationI2cSpeedHelp": {
|
||||
"message": "Швидкість I2C слід підтримувати на найвищому рівні, який дозволяє всім підключеним пристроям працювати. Значення за замовчуванням 400 кГц є безпечним, і рекомендується перемикати на 800 кГц у випадку з мультироторами."
|
||||
"message": "Швидкість I2C слід підтримувати на найвищому рівні, який дозволяє всім підключеним пристроям працювати. Значення за замовчуванням 400 кГц є безпечним, і рекомендується перемикати на 800 кГц у випадку з мультикоптерами."
|
||||
},
|
||||
"i2cSpeedSuggested800khz": {
|
||||
"message": "Будь ласка, перемкніть на 800 кГц, якщо підключене апаратне забезпечення це дозволяє"
|
||||
|
@ -5479,7 +5675,7 @@
|
|||
"message": "Чіп пам'яті <br>не знайдено"
|
||||
},
|
||||
"sensorDataFlashFreeSpace": {
|
||||
"message": "Доступна пам'ять"
|
||||
"message": "Флешпам'ять: <br />вільно "
|
||||
},
|
||||
"mixerProfile1": {
|
||||
"message": "Профіль мікшера 1"
|
||||
|
@ -5930,5 +6126,8 @@
|
|||
},
|
||||
"adsbHeartbeatTotalMessages": {
|
||||
"message": "Повід. сигналів перевірки"
|
||||
},
|
||||
"currentLanguage": {
|
||||
"message": "uk"
|
||||
}
|
||||
}
|
||||
|
|
6163
locale/zh_CN/messages.json
Normal file
6163
locale/zh_CN/messages.json
Normal file
File diff suppressed because it is too large
Load diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1696,11 +1696,11 @@ dialog {
|
|||
color: white;
|
||||
font-size: 10px;
|
||||
margin-top: 20px;
|
||||
width: 410px;
|
||||
width: 100px;
|
||||
float: right;
|
||||
margin-right: 10px;
|
||||
margin-right: 20px;
|
||||
line-height: 12px;
|
||||
height: 33px;
|
||||
height: 64px;
|
||||
border-radius: 5px;
|
||||
border: 1px solid #272727;
|
||||
box-shadow: 0 1px 0 rgba(92, 92, 92, 0.5);
|
||||
|
@ -1708,38 +1708,68 @@ dialog {
|
|||
padding-top: 5px;
|
||||
display: none;
|
||||
text-shadow: 0 1px rgba(0, 0, 0, 1.0);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1060px) {
|
||||
#dataflash_wrapper_global {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Profile selector styling*/
|
||||
|
||||
#profiles_wrapper_global {
|
||||
color: white;
|
||||
font-size: 10px;
|
||||
margin-top: 20px;
|
||||
width: 130px;
|
||||
float: right;
|
||||
margin-right: 10px;
|
||||
line-height: 12px;
|
||||
height: 64px;
|
||||
padding: 0px;
|
||||
display: none;
|
||||
text-shadow: 0 1px rgba(0, 0, 0, 1.0);
|
||||
}
|
||||
|
||||
#profile_change {
|
||||
color: white;
|
||||
margin-top: 16px;
|
||||
margin: 0px;
|
||||
width: 130px;
|
||||
float: left;
|
||||
margin-right: 10px;
|
||||
line-height: 12px;
|
||||
}
|
||||
|
||||
#profile_change > .dropdown {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
#mixer_profile_change {
|
||||
color: white;
|
||||
margin-top: 16px;
|
||||
margin: 0px;
|
||||
width: 130px;
|
||||
float: left;
|
||||
margin-right: 0;
|
||||
line-height: 12px;
|
||||
}
|
||||
|
||||
#mixer_profile_change > .dropdown {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
#battery_profile_change {
|
||||
color: white;
|
||||
margin-top: 16px;
|
||||
margin: 0px;
|
||||
width: 130px;
|
||||
float: right;
|
||||
margin-right: 0;
|
||||
line-height: 12px;
|
||||
}
|
||||
|
||||
#battery_profile_change > .dropdown {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.dataflash-contents_global {
|
||||
margin-top: 18px;
|
||||
margin-top: 30px;
|
||||
border: 1px solid #4A4A4A;
|
||||
background-color: #4A4A4A;
|
||||
display: flex;
|
||||
|
@ -1770,7 +1800,7 @@ dialog {
|
|||
|
||||
.dataflash-contents_global li div {
|
||||
position: absolute;
|
||||
top: -18px;
|
||||
top: -30px;
|
||||
margin-top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
|
|
|
@ -464,3 +464,17 @@
|
|||
.tab-motors .config-section .number input {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.tab-motors .mixerPreview {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.tab-motors .motorNumber {
|
||||
position: absolute;
|
||||
font-size: 1.4em;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.tab-motors .mixer-preview-image-numbers {
|
||||
width: fit-content;
|
||||
}
|
||||
|
|
|
@ -476,6 +476,7 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
|
|||
$("#motorNumber"+index).css("left", left_px + "px");
|
||||
$("#motorNumber"+index).css("top", top_px + "px");
|
||||
$("#motorNumber"+index).removeClass("is-hidden");
|
||||
$("#motorNumber"+index).css("visibility", "visible");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -610,7 +611,6 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
return (errorCount == 0);
|
||||
}
|
||||
|
||||
|
@ -661,7 +661,6 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
|
|||
const path = './resources/motor_order/'
|
||||
+ currentMixerPreset.image + (isReversed ? "_reverse" : "") + '.svg';
|
||||
$('.mixerPreview img').attr('src', path);
|
||||
|
||||
renderServoOutputImage();
|
||||
};
|
||||
|
||||
|
|
|
@ -152,7 +152,6 @@
|
|||
<div class="legend"></div>
|
||||
</li>
|
||||
</ul><bbr />
|
||||
<a class="require-msc-ready regular-button onboardLoggingRebootMsc" href="#" i18n="cliMscBtn"></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
12
tabs/osd.js
12
tabs/osd.js
|
@ -2799,7 +2799,7 @@ OSD.GUI.updateUnits = function() {
|
|||
});
|
||||
};
|
||||
|
||||
OSD.GUI.updateFields = function() {
|
||||
OSD.GUI.updateFields = function(event) {
|
||||
// display fields on/off and position
|
||||
var $tmpl = $('#osd_group_template').hide();
|
||||
// Clear previous groups, if any
|
||||
|
@ -2840,6 +2840,7 @@ OSD.GUI.updateFields = function() {
|
|||
});
|
||||
}
|
||||
var $displayFields = groupContainer.find('.display-fields');
|
||||
var osdSearch = $('.osd_search');
|
||||
for (var jj = 0; jj < groupItems.length; jj++) {
|
||||
var item = groupItems[jj];
|
||||
var itemData = OSD.data.items[item.id];
|
||||
|
@ -2853,7 +2854,7 @@ OSD.GUI.updateFields = function() {
|
|||
} else {
|
||||
name = inflection.titleize(name);
|
||||
}
|
||||
var searchTerm = $('.osd_search').val();
|
||||
var searchTerm = osdSearch.val();
|
||||
if (searchTerm.length > 0 && !name.toLowerCase().includes(searchTerm.toLowerCase())) {
|
||||
continue;
|
||||
}
|
||||
|
@ -2949,10 +2950,13 @@ OSD.GUI.updateFields = function() {
|
|||
// needs to be called after all of them have been set up
|
||||
GUI.switchery();
|
||||
|
||||
if(event != null && event.currentTarget !== osdSearch[0])
|
||||
{
|
||||
// Update the OSD preview
|
||||
refreshOSDSwitchIndicators();
|
||||
updatePilotAndCraftNames();
|
||||
updatePanServoPreview();
|
||||
}
|
||||
};
|
||||
|
||||
OSD.GUI.removeBottomLines = function(){
|
||||
|
@ -3367,8 +3371,8 @@ OSD.GUI.updateAll = function() {
|
|||
clear.off('change');
|
||||
}
|
||||
|
||||
$('.osd_search').on('input', function() {
|
||||
OSD.GUI.updateFields();
|
||||
$('.osd_search').on('input', function(event) {
|
||||
OSD.GUI.updateFields(event);
|
||||
});
|
||||
$('.supported').fadeIn();
|
||||
OSD.GUI.updateVideoMode();
|
||||
|
|
|
@ -117,7 +117,11 @@
|
|||
<div class="motors right">
|
||||
<div class="half">
|
||||
<div class="mixerPreview">
|
||||
<img src="./resources/motor_order/custom.svg" />
|
||||
<img src="./resources/motor_order/custom.svg" id="motor-mixer-preview-img" />
|
||||
<div class="motorNumber" id="motorNumber1">1</div>
|
||||
<div class="motorNumber" id="motorNumber2">2</div>
|
||||
<div class="motorNumber" id="motorNumber3">3</div>
|
||||
<div class="motorNumber" id="motorNumber4">4</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="half">
|
||||
|
|
|
@ -257,6 +257,7 @@ TABS.outputs.initialize = function (callback) {
|
|||
const path = './resources/motor_order/'
|
||||
+ mixer.getById(val).image + (isReversed ? "_reverse" : "") + '.svg';
|
||||
$('.mixerPreview img').attr('src', path);
|
||||
labelMotorNumbers();
|
||||
}
|
||||
|
||||
function process_servos() {
|
||||
|
@ -717,6 +718,38 @@ TABS.outputs.initialize = function (callback) {
|
|||
GUI.content_ready(callback);
|
||||
}
|
||||
|
||||
function labelMotorNumbers() {
|
||||
|
||||
if (mixer.getById(FC.MIXER_CONFIG.appliedMixerPreset).image != 'quad_x') {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
let index = 0;
|
||||
var rules = FC.MOTOR_RULES.get();
|
||||
|
||||
for (const i in rules) {
|
||||
if (rules.hasOwnProperty(i)) {
|
||||
const rule = rules[i];
|
||||
index++;
|
||||
|
||||
let top_px = 30;
|
||||
let left_px = 28;
|
||||
if (rule.getRoll() < -0.5) {
|
||||
left_px = $("#motor-mixer-preview-img").width() - 20;
|
||||
}
|
||||
|
||||
if (rule.getPitch() > 0.5) {
|
||||
top_px = $("#motor-mixer-preview-img").height() - 20;
|
||||
}
|
||||
$("#motorNumber"+index).css("left", left_px + "px");
|
||||
$("#motorNumber"+index).css("top", top_px + "px");
|
||||
$("#motorNumber"+index).css("visibility", "visible");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
TABS.outputs.cleanup = function (callback) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue