A system of translations into different languages has been implemented. Added translations into Russian. Various UI fixes for valid internationalization

This commit is contained in:
Yury Shuvakin
2022-08-28 11:33:56 +03:00
parent 2a960893d0
commit 4a0f78c247
39 changed files with 3365 additions and 357 deletions

View File

@@ -5,7 +5,7 @@
#-------------------------------------------------
INCLUDEPATH += $$PWD
# Version
DT_VERSION = 1.3
DT_VERSION = 2.0
DEFINES += DT_VERSION=$$DT_VERSION
!android: {
@@ -21,13 +21,13 @@ CONFIG += c++14
# Bluetooth available
DEFINES += HAS_BLUETOOTH
#DEFINES += HAS_BLUETOOTH
QT += core gui
QT += widgets
QT += printsupport
#QT += widgets
#QT += printsupport
QT += network
QT += bluetooth
#QT += bluetooth
QT += quick
QT += quickcontrols2
QT += charts
@@ -75,96 +75,104 @@ build_mobile {
}
SOURCES += main.cpp\
akbmonitorpage.cpp \
bmsservicepage.cpp \
bmssettings.cpp \
bmssettingswidget.cpp \
cellsmonitorcheckboxdelegate.cpp \
cellsmonitorlabelvoltagedelegate.cpp \
cellsmonitorpage.cpp \
configparamsgetter.cpp \
configurationpage.cpp \
connectandenterpage.cpp \
customlefttabbarbutton.cpp \
debugprintpage.cpp \
historylineeditbox.cpp \
hoverablecombobox.cpp \
languageselectorbutton.cpp \
mainwindow.cpp \
mainwindownew.cpp \
# akbmonitorpage.cpp \
# bmsservicepage.cpp \
# bmssettings.cpp \
# bmssettingswidget.cpp \
# cellsmonitorcheckboxdelegate.cpp \
# cellsmonitorlabelvoltagedelegate.cpp \
# cellsmonitorpage.cpp \
# configparamsgetter.cpp \
# configurationpage.cpp \
# connectandenterpage.cpp \
# customlefttabbarbutton.cpp \
# debugprintpage.cpp \
# historylineeditbox.cpp \
# hoverablecombobox.cpp \
# languageselectorbutton.cpp \
# mainwindow.cpp \
# mainwindownew.cpp \
packet.cpp \
settingsextrapage.cpp \
# settingsextrapage.cpp \
vbytearray.cpp \
commands.cpp \
configparams.cpp \
configparam.cpp \
parametereditor.cpp \
digitalfiltering.cpp \
bleuart.cpp \
# parametereditor.cpp \
# digitalfiltering.cpp \
# bleuart.cpp \
utility.cpp \
bmsinterface.cpp \
visualizationchart.cpp \
visualizationpage.cpp
translator.cpp \
# visualizationchart.cpp \
# visualizationpage.cpp
HEADERS += mainwindow.h \
akbmonitorpage.h \
bmsservicepage.h \
bmssettings.h \
bmssettingswidget.h \
cellsmonitorcheckboxdelegate.h \
cellsmonitorlabelvoltagedelegate.h \
cellsmonitorpage.h \
configparamsgetter.h \
configurationpage.h \
connectandenterpage.h \
customlefttabbarbutton.h \
debugprintpage.h \
historylineedit.h \
historylineeditbox.h \
hoverablecombobox.h \
languageselectorbutton.h \
mainwindownew.h \
HEADERS += \ #mainwindow.h \
# akbmonitorpage.h \
# bmsservicepage.h \
# bmssettings.h \
# bmssettingswidget.h \
# cellsmonitorcheckboxdelegate.h \
# cellsmonitorlabelvoltagedelegate.h \
# cellsmonitorpage.h \
# configparamsgetter.h \
# configurationpage.h \
# connectandenterpage.h \
# customlefttabbarbutton.h \
# debugprintpage.h \
# historylineedit.h \
# historylineeditbox.h \
# hoverablecombobox.h \
# languageselectorbutton.h \
# mainwindownew.h \
packet.h \
settingsextrapage.h \
# settingsextrapage.h \
vbytearray.h \
commands.h \
datatypes.h \
configparams.h \
configparam.h \
parametereditor.h \
digitalfiltering.h \
bleuart.h \
# parametereditor.h \
# digitalfiltering.h \
# bleuart.h \
utility.h \
bmsinterface.h \
visualizationchart.h \
visualizationpage.h
translator.h \
# visualizationchart.h \
# visualizationpage.h
FORMS += mainwindow.ui \
akbmonitorpage.ui \
bmsservicepage.ui \
bmssettings.ui \
bmssettingswidget.ui \
cellsmonitorpage.ui \
configurationpage.ui \
connectandenterpage.ui \
debugprintpage.ui \
mainwindownew.ui \
parametereditor.ui \
settingsextrapage.ui \
visualizationpage.ui
#FORMS += mainwindow.ui \
# akbmonitorpage.ui \
# bmsservicepage.ui \
# bmssettings.ui \
# bmssettingswidget.ui \
# cellsmonitorpage.ui \
# configurationpage.ui \
# connectandenterpage.ui \
# debugprintpage.ui \
# mainwindownew.ui \
# parametereditor.ui \
# settingsextrapage.ui \
# visualizationpage.ui
include(pages/pages.pri)
include(widgets/widgets.pri)
include(mobile/mobile.pri)
#include(pages/pages.pri)
#include(widgets/widgets.pri)
#include(mobile/mobile.pri)
RESOURCES += res.qrc \
qml/qml_icons.qrc \
translations/translations.qrc
RESOURCES += qml/qml_icons.qrc \
qml/qml_items.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH *= $$PWD/qml
QML2_IMPORT_PATH *= $$PWD/qml
TRANSLATIONS = translations/cubo_en.ts \
translations/cubo_ru.ts \
translations/cubo_it.ts
DISTFILES += \
android/AndroidManifest.xml \
android/gradle/wrapper/gradle-wrapper.jar \

View File

@@ -89,8 +89,11 @@ BMSInterface::BMSInterface(QObject *parent) : QObject(parent)
// BLE
#ifdef HAS_BLUETOOTH
mBleUart = new BleUart(this);
mLastBleAddr = QSettings().value("ble_addr").toString();
connect(mBleUart, SIGNAL(dataRx(QByteArray)), this, SLOT(bleDataRx(QByteArray)));
#endif
int size = mSettings.beginReadArray("bleNames");
for (int i = 0; i < size; ++i) {
@@ -101,8 +104,6 @@ BMSInterface::BMSInterface(QObject *parent) : QObject(parent)
}
mSettings.endArray();
connect(mBleUart, SIGNAL(dataRx(QByteArray)), this, SLOT(bleDataRx(QByteArray)));
mCommands->setbmsConfig(mbmsConfig);
// Other signals/slots
@@ -280,9 +281,11 @@ bool BMSInterface::isPortConnected()
res = true;
}
#ifdef HAS_BLUETOOTH
if (mBleUart->isConnected()) {
res = true;
}
#endif
return res;
}
@@ -301,10 +304,12 @@ void BMSInterface::disconnectPort()
updateFwRx(false);
}
#ifdef HAS_BLUETOOTH
if (mBleUart->isConnected()) {
mBleUart->disconnectBle();
updateFwRx(false);
}
#endif
mFwRetries = 0;
}
@@ -321,8 +326,12 @@ bool BMSInterface::reconnectLastPort()
connectTcp(mLastTcpServer, mLastTcpPort);
return true;
} else if (mLastConnType == CONN_BLE) {
#ifdef HAS_BLUETOOTH
mBleUart->startConnect(mLastBleAddr);
return true;
#else
return false;
#endif
} else {
#ifdef HAS_SERIALPORT
QList<VSerialInfo_t> ports = listSerialPorts();
@@ -408,10 +417,12 @@ QString BMSInterface::getConnectedPortName()
connected = true;
}
#ifdef HAS_BLUETOOTH
if (mBleUart->isConnected()) {
res = tr("Connected (BLE) to %1").arg(mLastBleAddr);
connected = true;
}
#endif
if (connected && mCommands->isLimitedMode()) {
res += tr(", limited mode");
@@ -551,10 +562,12 @@ void BMSInterface::connectTcp(QString server, int port)
void BMSInterface::connectBle(QString address)
{
#ifdef HAS_BLUETOOTH
mBleUart->startConnect(address);
mLastConnType = CONN_BLE;
mLastBleAddr = address;
setLastConnectionType(CONN_BLE);
#endif
}
bool BMSInterface::isAutoconnectOngoing() const
@@ -629,7 +642,7 @@ void BMSInterface::serialPortError(QSerialPort::SerialPortError error)
break;
default:
message = "Serial port error: " + mSerialPort->errorString();
message = tr("Serial port error: ") + mSerialPort->errorString();
break;
}
@@ -762,9 +775,11 @@ void BMSInterface::packetDataToSend(QByteArray &data)
mTcpSocket->write(data);
}
#ifdef HAS_BLUETOOTH
if (mBleUart->isConnected()) {
mBleUart->writeData(data);
}
#endif
}
void BMSInterface::packetReceived(QByteArray &data)
@@ -846,15 +861,17 @@ void BMSInterface::fwVersionReceived(int major, int minor, QString hw, QByteArra
}
}
QString fwStr;
fwStr.sprintf("ENNOID-BMS Firmware Version %d.%d", major, minor);
if (!hw.isEmpty()) {
fwStr += ", Hardware: " + hw;
}
auto fwStr = tr("Firmware version: %1.%2, Hardware: %3, UUID: %4").arg(major).arg(minor).arg(hw).arg(strUuid);
if (!strUuid.isEmpty()) {
fwStr += ", UUID: " + strUuid;
}
// QString fwStr;
// fwStr.sprintf("ENNOID-BMS Firmware Version %d.%d", major, minor);
// if (!hw.isEmpty()) {
// fwStr += ", Hardware: " + hw;
// }
// if (!strUuid.isEmpty()) {
// fwStr += ", UUID: " + strUuid;
// }
emit statusMessage(fwStr, true);
#if 0

View File

@@ -141,7 +141,9 @@ private slots:
void tcpInputDataAvailable();
void tcpInputError(QAbstractSocket::SocketError socketError);
#ifdef HAS_BLUETOOTH
void bleDataRx(QByteArray data);
#endif
void timerSlot();
void packetDataToSend(QByteArray &data);

View File

@@ -234,7 +234,7 @@ void Commands::processPacket(QByteArray data)
break;
case COMM_SET_MCCONF:
emit ackReceived("BMS Write OK");
emit ackReceived(tr("BMS configuration is set"));
break;
case COMM_STORE_BMS_CONF:

View File

@@ -575,102 +575,102 @@ void ConfigParams::setParamValue(const QString &name, QVariant val)
}
QWidget *ConfigParams::getEditor(const QString &name, QWidget *parent)
{
QWidget *retVal = 0;
//QWidget *ConfigParams::getEditor(const QString &name, QWidget *parent)
//{
// QWidget *retVal = 0;
if (mParams.contains(name)) {
ConfigParam &p = mParams[name];
// if (mParams.contains(name)) {
// ConfigParam &p = mParams[name];
switch (p.type) {
case CFG_T_DOUBLE: {
ParamEditDouble *edit = new ParamEditDouble(parent);
edit->setName(name);
edit->setSuffix(p.suffix);
edit->setDecimals(p.editorDecimalsDouble);
edit->setShowAsPercentage(p.editAsPercentage);
edit->showDisplay(p.showDisplay);
// switch (p.type) {
// case CFG_T_DOUBLE: {
// ParamEditDouble *edit = new ParamEditDouble(parent);
// edit->setName(name);
// edit->setSuffix(p.suffix);
// edit->setDecimals(p.editorDecimalsDouble);
// edit->setShowAsPercentage(p.editAsPercentage);
// edit->showDisplay(p.showDisplay);
edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valDouble);
// edit->setProperty("type", int(p.type));
// edit->setProperty("suffix", p.suffix);
// edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
// edit->setProperty("editAsPercentage", p.editAsPercentage);
// edit->setProperty("value", p.valDouble);
edit->setConfig(this);
retVal = edit;
} break;
// edit->setConfig(this);
// retVal = edit;
// } break;
case CFG_T_INT: {
ParamEditInt *edit = new ParamEditInt(parent);
edit->setName(name);
edit->setSuffix(p.suffix);
edit->setShowAsPercentage(p.editAsPercentage);
edit->showDisplay(p.showDisplay);
// case CFG_T_INT: {
// ParamEditInt *edit = new ParamEditInt(parent);
// edit->setName(name);
// edit->setSuffix(p.suffix);
// edit->setShowAsPercentage(p.editAsPercentage);
// edit->showDisplay(p.showDisplay);
edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valInt);
// edit->setProperty("type", int(p.type));
// edit->setProperty("suffix", p.suffix);
// edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
// edit->setProperty("editAsPercentage", p.editAsPercentage);
// edit->setProperty("value", p.valInt);
edit->setConfig(this);
retVal = edit;
} break;
// edit->setConfig(this);
// retVal = edit;
// } break;
case CFG_T_QSTRING: {
ParamEditString *edit = new ParamEditString(parent);
edit->setName(name);
// case CFG_T_QSTRING: {
// ParamEditString *edit = new ParamEditString(parent);
// edit->setName(name);
edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valString);
// edit->setProperty("type", int(p.type));
// edit->setProperty("suffix", p.suffix);
// edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
// edit->setProperty("editAsPercentage", p.editAsPercentage);
// edit->setProperty("value", p.valString);
edit->setConfig(this);
retVal = edit;
} break;
// edit->setConfig(this);
// retVal = edit;
// } break;
case CFG_T_ENUM: {
ParamEditEnum *edit = new ParamEditEnum(parent);
edit->setName(name);
// case CFG_T_ENUM: {
// ParamEditEnum *edit = new ParamEditEnum(parent);
// edit->setName(name);
edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valInt);
// edit->setProperty("type", int(p.type));
// edit->setProperty("suffix", p.suffix);
// edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
// edit->setProperty("editAsPercentage", p.editAsPercentage);
// edit->setProperty("value", p.valInt);
edit->setConfig(this);
retVal = edit;
} break;
// edit->setConfig(this);
// retVal = edit;
// } break;
case CFG_T_BOOL: {
ParamEditBool *edit = new ParamEditBool(parent);
edit->setName(name);
// case CFG_T_BOOL: {
// ParamEditBool *edit = new ParamEditBool(parent);
// edit->setName(name);
edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valInt);
// edit->setProperty("type", int(p.type));
// edit->setProperty("suffix", p.suffix);
// edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
// edit->setProperty("editAsPercentage", p.editAsPercentage);
// edit->setProperty("value", p.valInt);
edit->setConfig(this);
retVal = edit;
} break;
// edit->setConfig(this);
// retVal = edit;
// } break;
default:
qWarning() << "no editor for" << name << "could be created";
break;
}
// default:
// qWarning() << "no editor for" << name << "could be created";
// break;
// }
} else {
qWarning() << name << "not found";
}
// } else {
// qWarning() << name << "not found";
// }
return retVal;
}
// return retVal;
//}
/*
QWidget *ConfigParams::getEditor(const QString &name, QWidget *parent)

View File

@@ -84,7 +84,7 @@ public:
QStringList getParamOrder() const;
void setParamOrder(const QStringList &order);
QWidget *getEditor(const QString &name, QWidget *parent = 0);
// QWidget *getEditor(const QString &name, QWidget *parent = 0);
void getParamSerial(VByteArray &vb, const QString &name);
void setParamSerial(VByteArray &vb, const QString &name, QObject *src = 0);

View File

@@ -20,7 +20,7 @@
#include "bmsinterface.h"
#include "utility.h"
#include "mobile/fwhelper.h"
#include "translator.h"
#include <QApplication>
#include <QFontDatabase>
@@ -40,9 +40,16 @@ QObject *utilitySingletontypeProvider(QQmlEngine */*engine*/, QJSEngine */*scrip
return utility;
}
QObject *translatorSingletontypeProvider(QQmlEngine *engine, QJSEngine */*scriptEngine*/)
{
auto *translator = new Translator(engine);
return translator;
}
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(res);
Q_INIT_RESOURCE(translations);
Q_INIT_RESOURCE(qml_icons);
Q_INIT_RESOURCE(qml_items);
@@ -59,16 +66,13 @@ int main(int argc, char *argv[])
font.setStyleStrategy(QFont::PreferAntialias);
app.setFont(font);
// app.setFont(QFont("Artifakt Element", 16, QFont::Medium));
QQmlApplicationEngine engine;
qmlRegisterSingletonType<BMSInterface>("Cubo", 1, 0, "BmsInterface", bmsInterfaceSingletontypeProvider);
qmlRegisterSingletonType<Utility>("Cubo", 1, 0, "Utility", utilitySingletontypeProvider);
qmlRegisterType<BleUart>("Cubo", 1, 0, "BleUart");
qmlRegisterSingletonType<Translator>("Cubo", 1, 0, "Translator", translatorSingletontypeProvider);
qmlRegisterType<Commands>("Cubo", 1, 0, "Commands");
qmlRegisterType<ConfigParams>("Cubo", 1, 0, "ConfigParams");
qmlRegisterType<FwHelper>("Cubo", 1, 0, "FwHelper");
engine.addImportPath(QStringLiteral("qrc:/"));
engine.load(QUrl(QStringLiteral("qrc:/MainWindow.qml")));

View File

@@ -0,0 +1,57 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
import Utils 1.0
BusyIndicator {
id: control
running: true
implicitWidth: 86
implicitHeight: 86
contentItem: Item {
id: item
width: parent.width
height: parent.height
opacity: control.running ? 1 : 0
Behavior on opacity {
OpacityAnimator {
duration: 250
}
}
RotationAnimator {
target: item
running: control.visible && control.running
from: 0
to: 360
loops: Animation.Infinite
duration: 5000
}
Repeater {
id: repeater
model: 6
Rectangle {
x: item.width / 2 - width / 2
y: item.height / 2 - height / 2
implicitWidth: 12
implicitHeight: 12
radius: 6
color: Palette.alternativeBackgroundColor
transform: [
Translate {
y: -Math.min(item.width, item.height) * 0.5 + 6
},
Rotation {
angle: index / repeater.count * 360
origin.x: 6
origin.y: 6
}
]
}
}
}
}

View File

@@ -15,6 +15,8 @@ Button {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
maximumLineCount: 2
wrapMode: Text.Wrap
}
background: Rectangle {

View File

@@ -1,5 +0,0 @@
import QtQuick 2.0
Item {
}

View File

@@ -5,13 +5,15 @@ import Utils 1.0
Shape {
id: shape
implicitWidth: 1
implicitHeight: 1
property bool horizontal: true
ShapePath {
strokeColor: Palette.borderColor
strokeStyle: ShapePath.SolidLine
startX: 0
startY: 0
PathLine { x: shape.width; y: 0 }
PathLine { x: horizontal ? shape.width : 0; y: horizontal ? 0 : shape.height }
}
}

View File

@@ -0,0 +1,59 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtGraphicalEffects 1.0
import Utils 1.0
ItemDelegate {
id: control
implicitHeight: 52
padding: 0
leftPadding: control.minimized ? 0 : 40
font.weight: Font.Bold
icon.color: "transparent"
icon.width: 24
icon.height: 24
property bool minimized: false
contentItem: RowLayout {
spacing: control.minimized ? 0 : 25
Item {
visible: control.minimized
Layout.fillWidth: true
}
Image {
source: control.icon.source
sourceSize.width: control.icon.width
sourceSize.height: control.icon.height
Layout.alignment: Qt.AlignCenter
ColorOverlay {
anchors.fill: parent
source: parent
color: icon.color
visible: icon.color !== "transparent"
}
}
Label {
text: control.text
font: control.font
color: Palette.alternativeTextColor
visible: !control.minimized
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
}
Item {
Layout.fillWidth: true
}
}
background: Rectangle {
color: control.pressed ? Palette.pressedButtonColor :
control.hovered ? Palette.hoveredButtonColor : Palette.buttonColor
}
}

View File

@@ -15,6 +15,8 @@ Button {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
maximumLineCount: 2
wrapMode: Text.Wrap
}
background: Rectangle {

View File

@@ -1,5 +0,0 @@
import QtQuick 2.0
Item {
}

View File

@@ -6,6 +6,6 @@ import Utils 1.0
TextArea {
color: Palette.textColor
selectByMouse: true
selectionColor: Palette.alternativeBackgroundColor
selectionColor: Palette.selectedTextBackgroundColor
font.pixelSize: 16
}

View File

@@ -7,7 +7,7 @@ TextField {
implicitHeight: 58
color: Palette.textColor
selectByMouse: true
selectionColor: Palette.alternativeBackgroundColor
selectionColor: Palette.selectedTextBackgroundColor
background: Rectangle {
color: enabled ? Palette.backgroundColor : Palette.hoveredBackgroundColor

View File

@@ -1,7 +1,5 @@
module Controls
Label 1.0 Label.qml
ComboBox 1.0 ComboBox.qml
PaneItem 1.0 PaneItem.qml
ScrollBar 1.0 ScrollBar.qml
Button 1.0 Button.qml
OutlineButton 1.0 OutlineButton.qml
@@ -22,3 +20,5 @@ ChartView 1.0 ChartView.qml
TextArea 1.0 TextArea.qml
DialogHeader 1.0 DialogHeader.qml
DialogBackground 1.0 DialogBackground.qml
BusyIndicator 1.0 BusyIndicator.qml
MenuItemDelegate 1.0 MenuItemDelegate.qml

View File

@@ -1,18 +1,18 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="path-1-inside-1_973_566" fill="white">
<rect x="1.5" y="1" width="10" height="14" rx="1"/>
<rect x="1" y="1" width="9" height="13" rx="1"/>
</mask>
<rect x="1.5" y="1" width="10" height="14" rx="1" stroke="white" stroke-width="4" mask="url(#path-1-inside-1_973_566)"/>
<rect x="1" y="1" width="9" height="13" rx="1" stroke="white" stroke-width="2" mask="url(#path-1-inside-1_973_566)"/>
<mask id="path-2-inside-2_973_566" fill="white">
<rect x="12.5" y="1" width="10" height="7" rx="1"/>
<rect x="13" y="1" width="9" height="7" rx="1"/>
</mask>
<rect x="12.5" y="1" width="10" height="7" rx="1" stroke="white" stroke-width="4" mask="url(#path-2-inside-2_973_566)"/>
<rect x="13" y="1" width="9" height="7" rx="1" stroke="white" stroke-width="2" mask="url(#path-2-inside-2_973_566)"/>
<mask id="path-3-inside-3_973_566" fill="white">
<rect x="12.5" y="9" width="10" height="14" rx="1"/>
<rect x="13" y="11" width="9" height="12" rx="1"/>
</mask>
<rect x="12.5" y="9" width="10" height="14" rx="1" stroke="white" stroke-width="4" mask="url(#path-3-inside-3_973_566)"/>
<rect x="13" y="11" width="9" height="12" rx="1" stroke="white" stroke-width="2" mask="url(#path-3-inside-3_973_566)"/>
<mask id="path-4-inside-4_973_566" fill="white">
<rect x="1.5" y="16" width="10" height="7" rx="1"/>
<rect x="1" y="17" width="9" height="6" rx="1"/>
</mask>
<rect x="1.5" y="16" width="10" height="7" rx="1" stroke="white" stroke-width="4" mask="url(#path-4-inside-4_973_566)"/>
<rect x="1" y="17" width="9" height="6" rx="1" stroke="white" stroke-width="2" mask="url(#path-4-inside-4_973_566)"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1003 B

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#41479B;" d="M473.655,88.276H38.345C17.167,88.276,0,105.443,0,126.621V385.38
c0,21.177,17.167,38.345,38.345,38.345h435.31c21.177,0,38.345-17.167,38.345-38.345V126.621
C512,105.443,494.833,88.276,473.655,88.276z"/>
<path style="fill:#F5F5F5;" d="M511.469,120.282c-3.022-18.159-18.797-32.007-37.814-32.007h-9.977l-163.54,107.147V88.276h-88.276
v107.147L48.322,88.276h-9.977c-19.017,0-34.792,13.847-37.814,32.007l139.778,91.58H0v88.276h140.309L0.531,391.717
c3.022,18.159,18.797,32.007,37.814,32.007h9.977l163.54-107.147v107.147h88.276V316.577l163.54,107.147h9.977
c19.017,0,34.792-13.847,37.814-32.007l-139.778-91.58H512v-88.276H371.691L511.469,120.282z"/>
<g>
<polygon style="fill:#FF4B55;" points="282.483,88.276 229.517,88.276 229.517,229.517 0,229.517 0,282.483 229.517,282.483
229.517,423.724 282.483,423.724 282.483,282.483 512,282.483 512,229.517 282.483,229.517 "/>
<path style="fill:#FF4B55;" d="M24.793,421.252l186.583-121.114h-32.428L9.224,410.31
C13.377,415.157,18.714,418.955,24.793,421.252z"/>
<path style="fill:#FF4B55;" d="M346.388,300.138H313.96l180.716,117.305c5.057-3.321,9.277-7.807,12.287-13.075L346.388,300.138z"
/>
<path style="fill:#FF4B55;" d="M4.049,109.475l157.73,102.387h32.428L15.475,95.842C10.676,99.414,6.749,104.084,4.049,109.475z"/>
<path style="fill:#FF4B55;" d="M332.566,211.862l170.035-110.375c-4.199-4.831-9.578-8.607-15.699-10.86L300.138,211.862H332.566z"
/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#73AF00;" d="M38.345,88.273C17.167,88.273,0,105.44,0,126.618v258.759c0,21.177,17.167,38.345,38.345,38.345
h132.322V88.273H38.345z"/>
<rect x="170.67" y="88.277" style="fill:#F5F5F5;" width="170.67" height="335.45"/>
<path style="fill:#FF4B55;" d="M473.655,88.273H341.333v335.448h132.322c21.177,0,38.345-17.167,38.345-38.345V126.618
C512,105.44,494.833,88.273,473.655,88.273z"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 894 B

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#F5F5F5;" d="M473.655,88.276H38.345C17.167,88.276,0,105.443,0,126.621v73.471h512v-73.471
C512,105.443,494.833,88.276,473.655,88.276z"/>
<path style="fill:#FF4B55;" d="M0,385.379c0,21.177,17.167,38.345,38.345,38.345h435.31c21.177,0,38.345-17.167,38.345-38.345
v-73.471H0V385.379z"/>
<rect y="200.09" style="fill:#41479B;" width="512" height="111.81"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 867 B

View File

@@ -1,7 +1,6 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtGraphicalEffects 1.0
import Controls 1.0 as Controls
import Screens 1.0 as Screens
@@ -10,7 +9,7 @@ import Utils 1.0
ApplicationWindow {
id: window
title: qsTr("Cubo Verde BMS Tool")
title: qsTr("Cubo Verde BMS tool")
width: 1366
height: 768
visible: true
@@ -45,38 +44,11 @@ ApplicationWindow {
Layout.preferredHeight: pane.minimized ? 85 : 40
}
ItemDelegate {
leftPadding: pane.minimized ? 0 : 40
contentItem: RowLayout {
height: 50
spacing: 25
Item {
visible: pane.minimized
Layout.fillWidth: true
}
Image {
source: "qrc:/Icons/hide-menu.svg"
mirror: pane.minimized
Layout.alignment: Qt.AlignCenter
}
Label {
text: qsTr("Hide menu")
color: Palette.alternativeTextColor
visible: !pane.minimized
}
Item {
Layout.fillWidth: true
}
}
background: Rectangle {
color: "transparent"
}
Controls.MenuItemDelegate {
text: qsTr("Hide menu")
font.weight: Font.Normal
icon.source: "qrc:/Icons/hide-menu.svg"
minimized: pane.minimized
onClicked: if (pane.implicitWidth === 300) {
animation.from = 300
@@ -90,7 +62,6 @@ ApplicationWindow {
pane.minimized = false
}
Layout.preferredHeight: 52
Layout.fillWidth: true
}
@@ -100,101 +71,36 @@ ApplicationWindow {
ListView {
id: menuView
model: [
property var menuModel: [
{"text": qsTr("AKB monitor"), "icon": "qrc:/Icons/akb-monitor.svg"},
{"text": qsTr("Cell monitor"), "icon": "qrc:/Icons/cell-monitor.svg"},
{"text": qsTr("Configuration"), "icon": "qrc:/Icons/bms-configuration.svg"},
{"text": qsTr("Visualization"), "icon": "qrc:/Icons/visualization.svg"},
{"text": qsTr("History"), "icon": "qrc:/Icons/history.svg"},
{"text": qsTr("BMS service"), "icon": "qrc:/Icons/bms-service.svg"},
// {"text": qsTr("Exit"), "icon": "qrc:/Icons/exit.svg"},
{"text": qsTr("BMS service"), "icon": "qrc:/Icons/bms-service.svg"}
]
delegate: ItemDelegate {
id: menuDelegate
model: menuModel.length
delegate: Controls.MenuItemDelegate {
width: ListView.view.width
height: 52
leftPadding: pane.minimized ? 0 : 40
highlighted: ListView.isCurrentItem
text: menuView.menuModel[modelData].text
icon.source: menuView.menuModel[modelData].icon
minimized: pane.minimized
onClicked: menuView.currentIndex = index
contentItem: RowLayout {
spacing: pane.minimized ? 0 : 25
height: 50
Item {
visible: pane.minimized
Layout.fillWidth: true
}
Image {
source: modelData.icon
Layout.alignment: Qt.AlignCenter
}
Label {
text: modelData.text
font.weight: Font.Bold
color: Palette.alternativeTextColor
visible: !pane.minimized
}
Item {
Layout.fillWidth: true
}
}
background: Rectangle {
color: menuDelegate.highlighted ? Palette.pressedButtonColor : Palette.buttonColor
}
}
Layout.fillHeight: true
Layout.fillWidth: true
}
ItemDelegate {
leftPadding: pane.minimized ? 0 : 40
Controls.MenuItemDelegate {
text: qsTr("Connection")
icon.source: "qrc:/Icons/connection.svg"
icon.color: "#FFFFFF"
minimized: pane.minimized
onClicked: connectionDialog.open()
contentItem: RowLayout {
spacing: pane.minimized ? 0 : 25
height: 50
Item {
visible: pane.minimized
Layout.fillWidth: true
}
Image {
source: "qrc:/Icons/connection.svg"
sourceSize.width: 24
sourceSize.height: 24
Layout.alignment: Qt.AlignCenter
ColorOverlay {
anchors.fill: parent
source: parent
color: "#FFFFFF"
}
}
Label {
text: qsTr("Connection")
font.weight: Font.Bold
color: Palette.alternativeTextColor
visible: !pane.minimized
}
Item {
Layout.fillWidth: true
}
}
background: Rectangle {
color: parent.down ? Palette.pressedButtonColor : Palette.buttonColor
}
Layout.fillWidth: true
}
@@ -216,6 +122,8 @@ ApplicationWindow {
}
ColumnLayout {
spacing: 0
RowLayout {
id: topBar
@@ -226,13 +134,13 @@ ApplicationWindow {
qsTr("Visualization"),
qsTr("Information output"),
qsTr("Terminal"),
qsTr("Exit"),
]
Label {
text: topBar.labels[stack.currentIndex]
font.pixelSize: 38
font.weight: Font.Bold
color: Palette.textColor
}
Item {
@@ -240,8 +148,14 @@ ApplicationWindow {
}
RowLayout {
spacing: 20
ColumnLayout {
spacing: 5
RowLayout {
spacing: 7
Controls.ContentLabel {
id: connectionStatusLabel
text: qsTr("Disconnected")
@@ -264,6 +178,8 @@ ApplicationWindow {
}
RowLayout {
spacing: 5
Controls.ContentLabel {
text: qsTr("Serial number") + ":"
Layout.alignment: Qt.AlignRight
@@ -277,11 +193,111 @@ ApplicationWindow {
Layout.alignment: Qt.AlignRight
}
Layout.topMargin: 15
Layout.bottomMargin: 15
Layout.fillHeight: true
}
Controls.LineSeparator {
horizontal: false
Layout.fillHeight: true
Layout.topMargin: 15
Layout.bottomMargin: 15
}
Item {
RowLayout {
id: languagesLayout
anchors.fill: parent
spacing: 10
Controls.ContentLabel {
text: Translator.currentLanguageName
}
Image {
source: Translator.currentLanguageIcon
sourceSize.width: 30
sourceSize.height: 26
}
}
MouseArea {
anchors.fill: parent
onClicked: languagesPopup.open()
}
Popup {
id: languagesPopup
width: 90
contentHeight: languagesList.contentHeight
padding: 1
x: -(width - languagesLayout.width) / 2
y: languagesLayout.height + 2
background: Rectangle {
color: Palette.backgroundColor
radius: 6
border.width: 1
border.color: Palette.borderColor
}
contentItem: ListView {
id: languagesList
model: [Translator.Russian, Translator.English, Translator.Italian]
width: languagesPopup.width
height: 120
clip: true
spacing: 0
delegate: Rectangle {
width: ListView.view.width
height: 40
color: Palette.backgroundColor
RowLayout {
anchors.fill: parent
spacing: 10
Controls.ContentLabel {
text: Translator.languageName(modelData)
Layout.fillWidth: true
Layout.leftMargin: 10
}
Image {
source: Translator.languageIcon(modelData)
sourceSize.width: 30
sourceSize.height: 26
Layout.rightMargin: 10
}
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onPressed: parent.color = Palette.selectedBackgroundColor
onReleased: parent.color = Palette.backgroundColor
onEntered: parent.color = Palette.hoveredBackgroundColor
onExited: parent.color = Palette.backgroundColor
onClicked: {
languagesPopup.close()
Translator.currentLanguage = modelData
}
}
}
}
}
Layout.preferredWidth: languagesLayout.implicitWidth
Layout.fillHeight: true
}
}
Layout.leftMargin: 45
Layout.rightMargin: 45
Layout.maximumHeight: 90
}
StackLayout {
@@ -301,6 +317,14 @@ ApplicationWindow {
}
Screens.BmsSettingsScreen {
onNeedWait: {
if (active) {
busyPopup.text = text
busyPopup.open()
} else {
busyPopup.close()
}
}
}
Screens.VisualizationScreen {
@@ -319,7 +343,7 @@ ApplicationWindow {
target: BmsInterface
onPortConnectedChanged: {
connectionStatusLabel.text = BmsInterface.isPortConnected() ? qsTr("Connected") : qsTr("Disconnected")
connectionStatusLabel.text = Qt.binding(function(){ return BmsInterface.isPortConnected() ? qsTr("Connected") : qsTr("Disconnected") })
connectionStatusIndicator.enabled = BmsInterface.isPortConnected()
if (BmsInterface.isPortConnected()) {
BmsInterface.commands().getBMSconf()
@@ -351,7 +375,6 @@ ApplicationWindow {
statusPopup.text = msg
statusPopup.good = isGood
statusPopup.open()
hideStatusTimer.start()
} else {
if (statusPopup.text !== msg) {
statusPopup.queue.push({"text": msg, "good": isGood})
@@ -395,7 +418,7 @@ ApplicationWindow {
Screens.StatusPopup {
id: statusPopup
property var filteredStatuses: []//[qsTr("BMS configuration updated")]
property var filteredStatuses: []
property var queue: []
onClosed: {
@@ -404,9 +427,13 @@ ApplicationWindow {
statusPopup.text = message.text
statusPopup.good = message.good
statusPopup.open()
hideStatusTimer.start()
}
}
onOpened: {
hideStatusTimer.start()
busyPopup.close()
}
}
Timer {
@@ -415,13 +442,57 @@ ApplicationWindow {
onTriggered: statusPopup.close()
}
Popup {
id: busyPopup
x: (parent.width - width) / 2
y: (parent.height - height) / 2
modal: true
closePolicy: Popup.NoAutoClose
property string text: ""
background: Rectangle {
color: "transparent"
}
ColumnLayout {
Controls.BusyIndicator {
running: true
Layout.alignment: Qt.AlignCenter
}
Controls.SubtitleLabel {
text: busyPopup.text
color: Palette.alternativeTextColor
maximumLineCount: 3
wrapMode: Text.Wrap
font.pixelSize: 20
Layout.alignment: Qt.AlignCenter
horizontalAlignment: Text.AlignHCenter
background: Rectangle {
color: Palette.textColor
opacity: 0.3
radius: 6
}
}
}
onOpened: hideBusyTimer.start()
onClosed: hideBusyTimer.stop()
}
Timer {
id: hideBusyTimer
interval: 30000
onTriggered: busyPopup.close()
}
background: Rectangle {
color: Palette.screenBackgroundColor
}
Component.onCompleted: {
// BmsInterface.bmsConfig().loadParamsXml("://res/config.xml")
// BmsInterface.infoConfig().loadParamsXml("://res/info.xml")
connectionDialog.open()
}
}

View File

@@ -16,7 +16,7 @@ Item {
Layout.fillWidth: true
RowLayout {
spacing: 90
spacing: 70
anchors.fill: parent
Controls.TitleLabel {
@@ -41,14 +41,14 @@ Item {
GridLayout {
columns: 2
columnSpacing: 90
columnSpacing: 70
rowSpacing: 20
anchors.fill: parent
RowLayout {
spacing: 10
Controls.ContentLabel {
text: qsTr("Battery charge level, V")
text: qsTr("Battery charge level, %")
Layout.fillWidth: true
Layout.maximumWidth: implicitWidth
}
@@ -222,7 +222,7 @@ Item {
GridLayout {
columns: 2
columnSpacing: 90
columnSpacing: 70
rowSpacing: 20
anchors.fill: parent

View File

@@ -12,6 +12,8 @@ RowLayout {
property real contentRowSpacing: 20
property real contentColumnSpacing: 35
signal needWait(bool active, string text)
spacing: contentColumnSpacing
Flickable {
@@ -163,12 +165,16 @@ RowLayout {
Controls.SubtitleLabel {
text: qsTr("Maximum charge current, A")
maximumLineCount: 2
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
}
Controls.SubtitleLabel {
text: qsTr("Maximum load current, A")
maximumLineCount: 2
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
}
@@ -189,6 +195,8 @@ RowLayout {
Controls.SubtitleLabel {
text: qsTr("Maximum temperature, °C")
maximumLineCount: 2
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
Layout.columnSpan: 2
@@ -224,12 +232,16 @@ RowLayout {
Controls.SubtitleLabel {
text: qsTr("Lower disable threshold, V")
maximumLineCount: 2
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
}
Controls.SubtitleLabel {
text: qsTr("Upper disable threshold, V")
maximumLineCount: 2
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
}
@@ -250,14 +262,16 @@ RowLayout {
Controls.SubtitleLabel {
text: qsTr("Lower enable threshold (should be higher than disable), V")
maximumLineCount: 2
maximumLineCount: 3
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
}
Controls.SubtitleLabel {
text: qsTr("Upper enable threshold (should be higher than disable), V")
maximumLineCount: 2
maximumLineCount: 3
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
}
@@ -328,6 +342,8 @@ RowLayout {
Controls.SubtitleLabel {
text: qsTr("Cell balancing interval, ms")
maximumLineCount: 2
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
Layout.columnSpan: 2
@@ -367,13 +383,13 @@ RowLayout {
spacing: 20
Controls.LabelWithBackground {
text: qsTr(" 1")
text: qsTr("# 1")
Layout.preferredWidth: outputSettingsFrame.outputNumberSize
Layout.preferredHeight: outputSettingsFrame.outputNumberSize
}
Controls.CheckBox {
text: qsTr("Use for management")
text: qsTr("Use for storage management")
Layout.fillWidth: true
Layout.preferredHeight: outputSettingsFrame.outputNumberSize
}
@@ -391,7 +407,7 @@ RowLayout {
spacing: 20
Controls.LabelWithBackground {
text: qsTr(" 2")
text: qsTr("# 2")
Layout.preferredWidth: outputSettingsFrame.outputNumberSize
Layout.preferredHeight: outputSettingsFrame.outputNumberSize
}
@@ -408,6 +424,8 @@ RowLayout {
Controls.SubtitleLabel {
text: qsTr("Change in value during SOC")
maximumLineCount: 2
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
Layout.columnSpan: 2
@@ -429,7 +447,7 @@ RowLayout {
spacing: 20
Controls.LabelWithBackground {
text: qsTr(" 3")
text: qsTr("# 3")
Layout.preferredWidth: outputSettingsFrame.outputNumberSize
Layout.preferredHeight: outputSettingsFrame.outputNumberSize
}
@@ -476,7 +494,7 @@ RowLayout {
spacing: 20
Controls.LabelWithBackground {
text: qsTr(" 4")
text: qsTr("# 4")
Layout.preferredWidth: outputSettingsFrame.outputNumberSize
Layout.preferredHeight: outputSettingsFrame.outputNumberSize
}
@@ -534,7 +552,7 @@ RowLayout {
anchors.fill: parent
Controls.SubtitleLabel {
text: qsTr("Current sensor value «0»")
text: qsTr("Current sensor value \"0\"")
Layout.fillWidth: true
Layout.columnSpan: 2
}
@@ -549,7 +567,7 @@ RowLayout {
Controls.Button {
id: zeroSensorValueCalibrationButton
text: qsTr("Calibrate «0»")
text: qsTr("Calibrate \"0\"")
Layout.fillWidth: true
Layout.maximumWidth: (parent.width - parent.columnSpacing) / 2
Layout.columnSpan: 2
@@ -561,6 +579,7 @@ RowLayout {
Controls.OutlineButton {
text: qsTr("Load settings from file")
onClicked: loadFileDialog.open()
Layout.preferredWidth: 270
FileDialog {
id: loadFileDialog
@@ -576,6 +595,7 @@ RowLayout {
Controls.OutlineButton {
text: qsTr("Save settings to file")
onClicked: saveFileDialog.open()
Layout.preferredWidth: 270
FileDialog {
id: saveFileDialog
@@ -637,7 +657,7 @@ RowLayout {
}
Controls.LinkLabel {
text: qsTr("Current sensor value «0»")
text: qsTr("Current sensor value \"0\"")
onClicked: settingsFlickable.contentY = zeroSensorSettingsFrame.mapToItem(settingsFlickable.contentItem, 0, 0).y
}
@@ -649,7 +669,7 @@ RowLayout {
spacing: 15
Controls.OutlineButton {
text: qsTr("Read settings from file")
text: qsTr("Read default settings")
Layout.fillWidth: true
onClicked: BmsInterface.commands().getBMSconfDefault()
}
@@ -661,15 +681,6 @@ RowLayout {
}
Controls.OutlineButton {
text: qsTr("Write to non-volatile memory of BMS")
Layout.fillWidth: true
onClicked: {
writeValuesToConfig()
BmsInterface.commands().storeBMSConfig()
}
}
Controls.Button {
text: qsTr("Write current values to BMS")
Layout.fillWidth: true
onClicked: {
@@ -678,10 +689,20 @@ RowLayout {
}
}
Controls.Button {
text: qsTr("Write to non-volatile memory of BMS")
Layout.fillWidth: true
onClicked: {
needWait(true, qsTr("The settings are written to non-volatile memory.\nWait, please."))
writeValuesToConfig()
BmsInterface.commands().storeBMSConfig()
}
}
Layout.fillWidth: true
}
Layout.maximumWidth: 320
Layout.maximumWidth: 280
Layout.fillHeight: true
}

View File

@@ -21,7 +21,7 @@ Item {
Layout.fillWidth: true
Controls.SubtitleLabel {
text: qsTr("")
text: qsTr("#")
color: Palette.tableHeaderTextColor
anchors.centerIn: parent
}

View File

@@ -9,7 +9,7 @@ import Utils 1.0
Dialog {
id: root
title: qsTr("Connection screen")
width: 400
width: 470
height: 320
modal: true
closePolicy: Popup.CloseOnEscape
@@ -79,7 +79,7 @@ Dialog {
Connections {
target: BmsInterface
onPortConnectedChanged: {
connectButton.text = BmsInterface.isPortConnected() ? qsTr("Disconnect") : qsTr("Connect")
connectButton.text = Qt.binding(function() { return BmsInterface.isPortConnected() ? qsTr("Disconnect") : qsTr("Connect") })
serialBox.enabled = !BmsInterface.isPortConnected()
}
}

View File

@@ -37,27 +37,27 @@ ColumnLayout {
Controls.TabButton {
text: qsTr("Current")
width: bar.width / 6 * 0.9
}
Controls.TabButton {
text: qsTr("Battery temperature")
width: bar.width / 6 * 1.2
}
Controls.TabButton {
text: qsTr("BMS temperature")
width: bar.width / 6 * 1.2
}
Controls.TabButton {
text: qsTr("Cell voltage")
width: bar.width / 6 * 0.8
}
Controls.TabButton {
text: qsTr("Battery temperature")
width: bar.width / 6 * 1.3
}
Controls.TabButton {
text: qsTr("BMS temperature")
width: bar.width / 6 * 1.1
}
Controls.TabButton {
text: qsTr("Cell voltage")
width: bar.width / 6 * 1
}
Controls.TabButton {
text: qsTr("Cell list")
width: bar.width / 6 * 0.9
width: bar.width / 6 * 0.85
}
Layout.fillWidth: true
@@ -81,6 +81,8 @@ ColumnLayout {
Controls.CheckBox {
id: checkSeries
checked: true
spacing: 10
onCheckedChanged: {
if (checked) {
chartItem.series(modelData).color = seriesColor
@@ -103,7 +105,7 @@ ColumnLayout {
chartItem = ListView.view ? ListView.view.chartItem : parent.chartItem
horizontal = !ListView.view
seriesColor = chartItem.series(modelData).color
checkSeries.text = chartItem.series(modelData).name
checkSeries.text = Qt.binding(function(){ return chartItem.series(modelData).name })
}
}
}
@@ -145,7 +147,7 @@ ColumnLayout {
RowLayout {
visible: horizontalLegend
spacing: 20
spacing: 0
property Controls.ChartView chartItem: chart
@@ -170,7 +172,7 @@ ColumnLayout {
property Controls.ChartView chartItem: chart
Layout.preferredWidth: 180
Layout.preferredWidth: 200
Layout.fillHeight: true
}
}
@@ -362,6 +364,15 @@ ColumnLayout {
}
}
Connections {
target: Translator
onCurrentLanguageChanged: {
for (var i = 0; i < cellListLoader.item.chart.count; ++i) {
cellListLoader.item.chart.series(i).name = qsTr("Cell #") + (i + 1).toString()
}
}
}
Connections {
target: BmsInterface.commands()
@@ -461,38 +472,53 @@ ColumnLayout {
Component.onCompleted: {
voltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Voltage indicator"),
voltageLoader.item.chart.xAxis, voltageLoader.item.chart.yAxis)
voltageLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Voltage indicator") })
voltageLoader.item.chart.axes[0].max = 10
voltageLoader.item.seriesCount = voltageLoader.item.chart.count
////////////////////////////////////////////////////////////////////////////////////////////////////////////
currentLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Current indicator"),
currentLoader.item.chart.xAxis, currentLoader.item.chart.yAxis)
currentLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Current indicator") })
currentLoader.item.chart.axes[0].max = 10
currentLoader.item.seriesCount = currentLoader.item.chart.count
////////////////////////////////////////////////////////////////////////////////////////////////////////////
batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Maximum temperature"),
batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis)
batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Average temperature"),
batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis)
batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum temperature"),
batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis)
batteryTemperatureLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Maximum temperature") })
batteryTemperatureLoader.item.chart.series(1).name = Qt.binding(function(){ return qsTr("Average temperature") })
batteryTemperatureLoader.item.chart.series(2).name = Qt.binding(function(){ return qsTr("Minimum temperature") })
batteryTemperatureLoader.item.chart.axes[0].max = 10
batteryTemperatureLoader.item.seriesCount = batteryTemperatureLoader.item.chart.count
///////////////////////////////////////////////////////////////////////////////////////////////////////////
bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Maximum temperature"),
bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis)
bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Average temperature"),
bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis)
bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum temperature"),
bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis)
bmsTemperatureLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Maximum temperature") })
bmsTemperatureLoader.item.chart.series(1).name = Qt.binding(function(){ return qsTr("Average temperature") })
bmsTemperatureLoader.item.chart.series(2).name = Qt.binding(function(){ return qsTr("Minimum temperature") })
bmsTemperatureLoader.item.chart.axes[0].max = 10
bmsTemperatureLoader.item.seriesCount = bmsTemperatureLoader.item.chart.count
///////////////////////////////////////////////////////////////////////////////////////////////////////////
cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Maximum voltage"),
cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis)
cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Average voltage"),
cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis)
cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum voltage"),
cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis)
cellVoltageLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Maximum voltage") })
cellVoltageLoader.item.chart.series(1).name = Qt.binding(function(){ return qsTr("Average voltage") })
cellVoltageLoader.item.chart.series(2).name = Qt.binding(function(){ return qsTr("Minimum voltage") })
cellVoltageLoader.item.chart.axes[0].max = 10
cellVoltageLoader.item.seriesCount = cellVoltageLoader.item.chart.count
}

View File

@@ -14,6 +14,7 @@ QtObject {
property color alternativeBackgroundColor: "#009352"
property color screenBackgroundColor: "#F7F8FC"
property color tableHeaderBackgroundColor: "#F0F1F4"
property color selectedTextBackgroundColor: "#009150"
property color borderColor: "#DFE0EB"

View File

@@ -14,5 +14,8 @@
<file>Icons/close.svg</file>
<file>Icons/info.svg</file>
<file>Icons/warning.svg</file>
<file>Icons/english-flag.svg</file>
<file>Icons/italian-flag.svg</file>
<file>Icons/russian-flag.svg</file>
</qresource>
</RCC>

View File

@@ -5,8 +5,6 @@
<file>Screens/AkbMonitorScreen.qml</file>
<file>Screens/CellMonitorScreen.qml</file>
<file>Controls/ComboBox.qml</file>
<file>Controls/PaneItem.qml</file>
<file>Controls/Label.qml</file>
<file>Utils/Palette.qml</file>
<file>Controls/qmldir</file>
<file>Screens/qmldir</file>
@@ -38,5 +36,7 @@
<file>Screens/MessageDialog.qml</file>
<file>Screens/StatusPopup.qml</file>
<file>Utils/MathHelper.qml</file>
<file>Controls/BusyIndicator.qml</file>
<file>Controls/MenuItemDelegate.qml</file>
</qresource>
</RCC>

BIN
translations/cubo_en.qm Normal file

Binary file not shown.

818
translations/cubo_en.ts Normal file
View File

@@ -0,0 +1,818 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>AkbMonitorScreen</name>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="23"/>
<source>Serial number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="51"/>
<source>Battery charge level, %</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="72"/>
<source>Number of modules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="93"/>
<source>Battery voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="114"/>
<source>Number of cells</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="135"/>
<source>Nominal capacity, A/h</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="156"/>
<source>Actual capacity, A/h</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="177"/>
<source>Battery temperature, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="198"/>
<source>BMS temperature, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="232"/>
<source>Maximum cell voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="253"/>
<source>Minimum cell voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="274"/>
<source>Current</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BMSInterface</name>
<message>
<location filename="../bmsinterface.cpp" line="341"/>
<location filename="../bmsinterface.cpp" line="345"/>
<source>Reconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="341"/>
<source>No ports found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="346"/>
<source>Please specify the connection manually the first time you are connecting.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="405"/>
<source>Not connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="410"/>
<source>Connected (serial) to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="416"/>
<source>Connected (TCP) to %1:%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="422"/>
<source>Connected (BLE) to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="428"/>
<source>, limited mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="450"/>
<source>Invalid serial port: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="463"/>
<source>Serial port is not writable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="494"/>
<source>Connect serial</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="495"/>
<source>Serial port support is not enabled in this build of ENNOID-BMS Tool.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="645"/>
<source>Serial port error: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="687"/>
<source>TCP Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="724"/>
<source>No firmware read response</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="725"/>
<source>Read Firmware Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="726"/>
<source>Could not read firmware version. Make sure that selected port really belongs to the ENNOID-BMS. </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="802"/>
<source>Not Supported Firmwares</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="803"/>
<source>This version of ENNOID-BMS Tool does not seem to have any supported firmwares. Something is probably wrong with the BMS configuration file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="823"/>
<location filename="../bmsinterface.cpp" line="851"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="823"/>
<location filename="../bmsinterface.cpp" line="851"/>
<source>The firmware on the connected ENNOID-BMS is too old. Please update it using a programmer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="828"/>
<location filename="../bmsinterface.cpp" line="840"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="828"/>
<source>The connected ENNOID-BMS has newer firmware than this version of the ENNOID-BMS Tool supports. It is recommended that you update the ENNOID-BMS Tool to the latest version. Alternatively, the firmware on the connected ENNOID-BMS can be downgraded in the firmware page. Until then, limited communication mode will be used where only the firmware can be changed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="840"/>
<source>The connected ENNOID-BMS has too old firmware. Since the connected ENNOID-BMS has firmware with bootloader support, it can be updated from the Firmware page. Until then, limited communication mode will be used where only the firmware can be changed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="864"/>
<source>Firmware version: %1.%2, Hardware: %3, UUID: %4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="896"/>
<source>BMS configuration updated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="900"/>
<source>BMS configuration stored to Flash</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BmsServiceScreen</name>
<message>
<location filename="../qml/Screens/BmsServiceScreen.qml" line="29"/>
<source>Clear</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsServiceScreen.qml" line="42"/>
<source>Send</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsServiceScreen.qml" line="51"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BmsSettingsScreen</name>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="40"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="625"/>
<source>Serial number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="67"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="630"/>
<source>Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="73"/>
<source>Number of boards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="79"/>
<source>Number of cells</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="113"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="635"/>
<source>SOC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="119"/>
<source>Number of cells connected in parallel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="127"/>
<source>Battery capacity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="161"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="640"/>
<source>Limits</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="167"/>
<source>Maximum charge current, A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="175"/>
<source>Maximum load current, A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="197"/>
<source>Maximum temperature, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="228"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="645"/>
<source>Cell configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="234"/>
<source>Lower disable threshold, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="242"/>
<source>Upper disable threshold, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="264"/>
<source>Lower enable threshold (should be higher than disable), V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="272"/>
<source>Upper enable threshold (should be higher than disable), V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="308"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="650"/>
<source>Balancing configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="314"/>
<source>Balancing start voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="322"/>
<source>Cell voltage delta to start balancing, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="344"/>
<source>Cell balancing interval, ms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="377"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="655"/>
<source>Output settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="386"/>
<source># 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="392"/>
<source>Use for storage management</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="410"/>
<source># 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="450"/>
<source># 3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="497"/>
<source># 4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="672"/>
<source>Read default settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="696"/>
<source>The settings are written to non-volatile memory.
Wait, please.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="416"/>
<source>Normally closed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="426"/>
<source>Change in value during SOC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="465"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="512"/>
<source>Closes at t&lt;, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="471"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="518"/>
<source>Opens at t&gt;, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="555"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="660"/>
<source>Current sensor value &quot;0&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="570"/>
<source>Calibrate &quot;0&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="580"/>
<source>Load settings from file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="586"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="602"/>
<source>Select configuration file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="588"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="605"/>
<source>Configuration files (*.xml)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="588"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="605"/>
<source>All files (*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="596"/>
<source>Save settings to file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="678"/>
<source>Read current settings from BMS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="693"/>
<source>Write to non-volatile memory of BMS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="684"/>
<source>Write current values to BMS</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CellMonitorScreen</name>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="24"/>
<source>#</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="37"/>
<source>Voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="50"/>
<source>Balancing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="84"/>
<source>V</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Commands</name>
<message>
<location filename="../commands.cpp" line="237"/>
<source>BMS configuration is set</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfigParams</name>
<message>
<location filename="../configparams.cpp" line="42"/>
<location filename="../configparams.cpp" line="1150"/>
<location filename="../configparams.cpp" line="1178"/>
<location filename="../configparams.cpp" line="1381"/>
<location filename="../configparams.cpp" line="1407"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../configparams.cpp" line="1154"/>
<location filename="../configparams.cpp" line="1384"/>
<source>tag &lt;b&gt;%1&lt;/b&gt; not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../configparams.cpp" line="1164"/>
<location filename="../configparams.cpp" line="1394"/>
<location filename="../configparams.cpp" line="1432"/>
<source>Could not open %1 for writing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../configparams.cpp" line="1186"/>
<location filename="../configparams.cpp" line="1415"/>
<source>Could not open %1 for reading</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConnectionDialog</name>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="11"/>
<source>Connection screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="36"/>
<source>Select serial port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="50"/>
<location filename="../qml/Screens/ConnectionDialog.qml" line="82"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="82"/>
<source>Disconnect</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DebugInformationScreen</name>
<message>
<location filename="../qml/Screens/DebugInformationScreen.qml" line="23"/>
<source>Clear</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../qml/MainWindow.qml" line="12"/>
<source>Cubo Verde BMS tool</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="48"/>
<source>Hide menu</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="76"/>
<location filename="../qml/MainWindow.qml" line="131"/>
<source>AKB monitor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="77"/>
<location filename="../qml/MainWindow.qml" line="132"/>
<source>Cell monitor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="78"/>
<source>Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="79"/>
<location filename="../qml/MainWindow.qml" line="134"/>
<source>Visualization</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="80"/>
<source>History</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="81"/>
<source>BMS service</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="99"/>
<source>Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="133"/>
<source>BMS settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="135"/>
<source>Information output</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="136"/>
<source>Terminal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="161"/>
<location filename="../qml/MainWindow.qml" line="346"/>
<source>Disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="184"/>
<source>Serial number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="346"/>
<source>Connected</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDialog</name>
<message>
<location filename="../qml/Screens/MessageDialog.qml" line="48"/>
<source>Ok</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../utility.cpp" line="126"/>
<source>Autoconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../utility.cpp" line="127"/>
<source>Could not autoconnect. Make sure that the USB cable is plugged in and that the ENNOID-BMS is powered.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Translator</name>
<message>
<location filename="../translator.cpp" line="16"/>
<source>EN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../translator.cpp" line="17"/>
<source>RU</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../translator.cpp" line="18"/>
<source>IT</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Utility</name>
<message>
<location filename="../utility.cpp" line="187"/>
<source>&lt;b&gt;ENNOID-BMS Tool V%1&lt;/b&gt;&lt;br&gt;&amp;copy; Kevin Dionne 2019&lt;br&gt;&lt;a href=&quot;mailto:kevin.dionne@ennoid.me&quot;&gt;kevin.dionne@ennoid.me&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.ennoid.me/&quot;&gt;https://www.ennoid.me/&lt;/a&gt;&lt;br&gt;Based on: DieBieMS-tool&lt;br&gt;&lt;br&gt;&lt;b&gt;DieBieMS Tool &lt;/b&gt;&lt;br&gt;&amp;copy; Danny Bokma 2018&lt;br&gt;&lt;a href=&quot;mailto:bms@diebie.nl&quot;&gt;bms@diebie.nl&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://diebie.nl/&quot;&gt;https://diebie.nl/&lt;/a&gt;&lt;br&gt;Based on: VESC-tool&lt;br&gt;&lt;br&gt;&lt;b&gt;VESC Tool &lt;/b&gt;&lt;br&gt;&amp;copy; Benjamin Vedder 2018&lt;br&gt;&lt;a href=&quot;mailto:benjamin@vedder.se&quot;&gt;benjamin@vedder.se&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://vesc-project.com/&quot;&gt;https://vesc-project.com/&lt;/a&gt;&lt;br&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualizationScreen</name>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="34"/>
<source>Voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="39"/>
<source>Current</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="44"/>
<source>Battery temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="49"/>
<source>BMS temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="54"/>
<source>Cell voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="59"/>
<source>Cell list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="189"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="202"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="215"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="228"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="241"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="254"/>
<source>Time, s</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="190"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="242"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="255"/>
<source>Voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="203"/>
<source>Current, A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="216"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="229"/>
<source>Temperature, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="273"/>
<source>Pause data collection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="273"/>
<source>Resume data collection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="283"/>
<source>Clear data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="312"/>
<source>Reset zoom</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="371"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="398"/>
<source>Cell #</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="473"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="475"/>
<source>Voltage indicator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="480"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="482"/>
<source>Current indicator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="487"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="493"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="500"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="506"/>
<source>Maximum temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="489"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="494"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="502"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="507"/>
<source>Average temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="491"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="495"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="504"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="508"/>
<source>Minimum temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="513"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="519"/>
<source>Maximum voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="515"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="520"/>
<source>Average voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="517"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="521"/>
<source>Minimum voltage</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

BIN
translations/cubo_it.qm Normal file

Binary file not shown.

818
translations/cubo_it.ts Normal file
View File

@@ -0,0 +1,818 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="it_IT">
<context>
<name>AkbMonitorScreen</name>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="23"/>
<source>Serial number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="51"/>
<source>Battery charge level, %</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="72"/>
<source>Number of modules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="93"/>
<source>Battery voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="114"/>
<source>Number of cells</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="135"/>
<source>Nominal capacity, A/h</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="156"/>
<source>Actual capacity, A/h</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="177"/>
<source>Battery temperature, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="198"/>
<source>BMS temperature, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="232"/>
<source>Maximum cell voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="253"/>
<source>Minimum cell voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="274"/>
<source>Current</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BMSInterface</name>
<message>
<location filename="../bmsinterface.cpp" line="341"/>
<location filename="../bmsinterface.cpp" line="345"/>
<source>Reconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="341"/>
<source>No ports found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="346"/>
<source>Please specify the connection manually the first time you are connecting.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="405"/>
<source>Not connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="410"/>
<source>Connected (serial) to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="416"/>
<source>Connected (TCP) to %1:%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="422"/>
<source>Connected (BLE) to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="428"/>
<source>, limited mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="450"/>
<source>Invalid serial port: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="463"/>
<source>Serial port is not writable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="494"/>
<source>Connect serial</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="495"/>
<source>Serial port support is not enabled in this build of ENNOID-BMS Tool.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="645"/>
<source>Serial port error: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="687"/>
<source>TCP Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="724"/>
<source>No firmware read response</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="725"/>
<source>Read Firmware Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="726"/>
<source>Could not read firmware version. Make sure that selected port really belongs to the ENNOID-BMS. </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="802"/>
<source>Not Supported Firmwares</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="803"/>
<source>This version of ENNOID-BMS Tool does not seem to have any supported firmwares. Something is probably wrong with the BMS configuration file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="823"/>
<location filename="../bmsinterface.cpp" line="851"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="823"/>
<location filename="../bmsinterface.cpp" line="851"/>
<source>The firmware on the connected ENNOID-BMS is too old. Please update it using a programmer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="828"/>
<location filename="../bmsinterface.cpp" line="840"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="828"/>
<source>The connected ENNOID-BMS has newer firmware than this version of the ENNOID-BMS Tool supports. It is recommended that you update the ENNOID-BMS Tool to the latest version. Alternatively, the firmware on the connected ENNOID-BMS can be downgraded in the firmware page. Until then, limited communication mode will be used where only the firmware can be changed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="840"/>
<source>The connected ENNOID-BMS has too old firmware. Since the connected ENNOID-BMS has firmware with bootloader support, it can be updated from the Firmware page. Until then, limited communication mode will be used where only the firmware can be changed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="864"/>
<source>Firmware version: %1.%2, Hardware: %3, UUID: %4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="896"/>
<source>BMS configuration updated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="900"/>
<source>BMS configuration stored to Flash</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BmsServiceScreen</name>
<message>
<location filename="../qml/Screens/BmsServiceScreen.qml" line="29"/>
<source>Clear</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsServiceScreen.qml" line="42"/>
<source>Send</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsServiceScreen.qml" line="51"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BmsSettingsScreen</name>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="40"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="625"/>
<source>Serial number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="67"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="630"/>
<source>Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="73"/>
<source>Number of boards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="79"/>
<source>Number of cells</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="113"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="635"/>
<source>SOC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="119"/>
<source>Number of cells connected in parallel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="127"/>
<source>Battery capacity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="161"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="640"/>
<source>Limits</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="167"/>
<source>Maximum charge current, A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="175"/>
<source>Maximum load current, A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="197"/>
<source>Maximum temperature, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="228"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="645"/>
<source>Cell configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="234"/>
<source>Lower disable threshold, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="242"/>
<source>Upper disable threshold, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="264"/>
<source>Lower enable threshold (should be higher than disable), V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="272"/>
<source>Upper enable threshold (should be higher than disable), V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="308"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="650"/>
<source>Balancing configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="314"/>
<source>Balancing start voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="322"/>
<source>Cell voltage delta to start balancing, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="344"/>
<source>Cell balancing interval, ms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="377"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="655"/>
<source>Output settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="386"/>
<source># 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="392"/>
<source>Use for storage management</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="410"/>
<source># 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="450"/>
<source># 3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="497"/>
<source># 4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="672"/>
<source>Read default settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="696"/>
<source>The settings are written to non-volatile memory.
Wait, please.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="416"/>
<source>Normally closed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="426"/>
<source>Change in value during SOC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="465"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="512"/>
<source>Closes at t&lt;, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="471"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="518"/>
<source>Opens at t&gt;, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="555"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="660"/>
<source>Current sensor value &quot;0&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="570"/>
<source>Calibrate &quot;0&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="580"/>
<source>Load settings from file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="586"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="602"/>
<source>Select configuration file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="588"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="605"/>
<source>Configuration files (*.xml)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="588"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="605"/>
<source>All files (*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="596"/>
<source>Save settings to file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="678"/>
<source>Read current settings from BMS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="693"/>
<source>Write to non-volatile memory of BMS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="684"/>
<source>Write current values to BMS</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CellMonitorScreen</name>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="24"/>
<source>#</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="37"/>
<source>Voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="50"/>
<source>Balancing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="84"/>
<source>V</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Commands</name>
<message>
<location filename="../commands.cpp" line="237"/>
<source>BMS configuration is set</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfigParams</name>
<message>
<location filename="../configparams.cpp" line="42"/>
<location filename="../configparams.cpp" line="1150"/>
<location filename="../configparams.cpp" line="1178"/>
<location filename="../configparams.cpp" line="1381"/>
<location filename="../configparams.cpp" line="1407"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../configparams.cpp" line="1154"/>
<location filename="../configparams.cpp" line="1384"/>
<source>tag &lt;b&gt;%1&lt;/b&gt; not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../configparams.cpp" line="1164"/>
<location filename="../configparams.cpp" line="1394"/>
<location filename="../configparams.cpp" line="1432"/>
<source>Could not open %1 for writing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../configparams.cpp" line="1186"/>
<location filename="../configparams.cpp" line="1415"/>
<source>Could not open %1 for reading</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConnectionDialog</name>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="11"/>
<source>Connection screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="36"/>
<source>Select serial port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="50"/>
<location filename="../qml/Screens/ConnectionDialog.qml" line="82"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="82"/>
<source>Disconnect</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DebugInformationScreen</name>
<message>
<location filename="../qml/Screens/DebugInformationScreen.qml" line="23"/>
<source>Clear</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../qml/MainWindow.qml" line="12"/>
<source>Cubo Verde BMS tool</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="48"/>
<source>Hide menu</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="76"/>
<location filename="../qml/MainWindow.qml" line="131"/>
<source>AKB monitor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="77"/>
<location filename="../qml/MainWindow.qml" line="132"/>
<source>Cell monitor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="78"/>
<source>Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="79"/>
<location filename="../qml/MainWindow.qml" line="134"/>
<source>Visualization</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="80"/>
<source>History</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="81"/>
<source>BMS service</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="99"/>
<source>Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="133"/>
<source>BMS settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="135"/>
<source>Information output</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="136"/>
<source>Terminal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="161"/>
<location filename="../qml/MainWindow.qml" line="346"/>
<source>Disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="184"/>
<source>Serial number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="346"/>
<source>Connected</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDialog</name>
<message>
<location filename="../qml/Screens/MessageDialog.qml" line="48"/>
<source>Ok</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../utility.cpp" line="126"/>
<source>Autoconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../utility.cpp" line="127"/>
<source>Could not autoconnect. Make sure that the USB cable is plugged in and that the ENNOID-BMS is powered.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Translator</name>
<message>
<location filename="../translator.cpp" line="16"/>
<source>EN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../translator.cpp" line="17"/>
<source>RU</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../translator.cpp" line="18"/>
<source>IT</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Utility</name>
<message>
<location filename="../utility.cpp" line="187"/>
<source>&lt;b&gt;ENNOID-BMS Tool V%1&lt;/b&gt;&lt;br&gt;&amp;copy; Kevin Dionne 2019&lt;br&gt;&lt;a href=&quot;mailto:kevin.dionne@ennoid.me&quot;&gt;kevin.dionne@ennoid.me&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.ennoid.me/&quot;&gt;https://www.ennoid.me/&lt;/a&gt;&lt;br&gt;Based on: DieBieMS-tool&lt;br&gt;&lt;br&gt;&lt;b&gt;DieBieMS Tool &lt;/b&gt;&lt;br&gt;&amp;copy; Danny Bokma 2018&lt;br&gt;&lt;a href=&quot;mailto:bms@diebie.nl&quot;&gt;bms@diebie.nl&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://diebie.nl/&quot;&gt;https://diebie.nl/&lt;/a&gt;&lt;br&gt;Based on: VESC-tool&lt;br&gt;&lt;br&gt;&lt;b&gt;VESC Tool &lt;/b&gt;&lt;br&gt;&amp;copy; Benjamin Vedder 2018&lt;br&gt;&lt;a href=&quot;mailto:benjamin@vedder.se&quot;&gt;benjamin@vedder.se&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://vesc-project.com/&quot;&gt;https://vesc-project.com/&lt;/a&gt;&lt;br&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualizationScreen</name>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="34"/>
<source>Voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="39"/>
<source>Current</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="44"/>
<source>Battery temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="49"/>
<source>BMS temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="54"/>
<source>Cell voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="59"/>
<source>Cell list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="189"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="202"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="215"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="228"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="241"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="254"/>
<source>Time, s</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="190"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="242"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="255"/>
<source>Voltage, V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="203"/>
<source>Current, A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="216"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="229"/>
<source>Temperature, °C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="273"/>
<source>Pause data collection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="273"/>
<source>Resume data collection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="283"/>
<source>Clear data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="312"/>
<source>Reset zoom</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="371"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="398"/>
<source>Cell #</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="473"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="475"/>
<source>Voltage indicator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="480"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="482"/>
<source>Current indicator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="487"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="493"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="500"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="506"/>
<source>Maximum temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="489"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="494"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="502"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="507"/>
<source>Average temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="491"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="495"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="504"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="508"/>
<source>Minimum temperature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="513"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="519"/>
<source>Maximum voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="515"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="520"/>
<source>Average voltage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="517"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="521"/>
<source>Minimum voltage</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

BIN
translations/cubo_ru.qm Normal file

Binary file not shown.

827
translations/cubo_ru.ts Normal file
View File

@@ -0,0 +1,827 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<context>
<name>AkbMonitorScreen</name>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="23"/>
<source>Serial number</source>
<translation>Серийный номер</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="51"/>
<source>Battery charge level, %</source>
<translation>Степень заряда батареи, %</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="72"/>
<source>Number of modules</source>
<translation>Количество модулей</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="93"/>
<source>Battery voltage, V</source>
<translation>Напряжение батареи, В</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="114"/>
<source>Number of cells</source>
<translation>Количество ячеек</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="135"/>
<source>Nominal capacity, A/h</source>
<translation>Номинальная ёмкость, А/ч</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="156"/>
<source>Actual capacity, A/h</source>
<translation>Реальная ёмкость, А/ч</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="177"/>
<source>Battery temperature, °C</source>
<translation>Температура батареи, °C</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="198"/>
<source>BMS temperature, °C</source>
<translation>Температура BMS, °C</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="232"/>
<source>Maximum cell voltage, V</source>
<translation>Максимальное напряжение на ячейке, В</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="253"/>
<source>Minimum cell voltage, V</source>
<translation>Минимальное напряжение на ячейке, В</translation>
</message>
<message>
<location filename="../qml/Screens/AkbMonitorScreen.qml" line="274"/>
<source>Current</source>
<translation>Ток</translation>
</message>
</context>
<context>
<name>BMSInterface</name>
<message>
<location filename="../bmsinterface.cpp" line="341"/>
<location filename="../bmsinterface.cpp" line="345"/>
<source>Reconnect</source>
<translation>Переподключение</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="341"/>
<source>No ports found</source>
<translation>Порты не найдены</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="346"/>
<source>Please specify the connection manually the first time you are connecting.</source>
<translation>Укажите тип подключения вручную при первом подключении.</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="405"/>
<source>Not connected</source>
<translation>Не подключено</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="410"/>
<source>Connected (serial) to %1</source>
<translation>Подключено (последовательный порт) к %1</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="416"/>
<source>Connected (TCP) to %1:%2</source>
<translation>Подключено (TCP) к %1:%2</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="422"/>
<source>Connected (BLE) to %1</source>
<translation>Подключено (BLE) к %1</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="428"/>
<source>, limited mode</source>
<translation>, ограниченный режим</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="450"/>
<source>Invalid serial port: %1</source>
<translation>Недопустимый последовательный порт: %1</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="463"/>
<source>Serial port is not writable</source>
<translation>Последовательный порт недоступен для записи</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="494"/>
<source>Connect serial</source>
<translation>Подключение последовательного порта</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="495"/>
<source>Serial port support is not enabled in this build of ENNOID-BMS Tool.</source>
<translation>Поддержка последовательного порта не включена в этой сборке утилиты.</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="645"/>
<source>Serial port error: </source>
<translation>Ошибка последовательного порта: </translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="687"/>
<source>TCP Error</source>
<translation>Ошибка TCP</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="724"/>
<source>No firmware read response</source>
<translation>Нет ответа на чтение прошивки</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="725"/>
<source>Read Firmware Version</source>
<translation>Чтение версии прошивки</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="726"/>
<source>Could not read firmware version. Make sure that selected port really belongs to the ENNOID-BMS. </source>
<translation>Не удалось прочитать версию прошивки. Убедитесь, что выбранный порт действительно принадлежит ENNOID-BMS. </translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="802"/>
<source>Not Supported Firmwares</source>
<translation>Не поддерживаемые прошивки</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="803"/>
<source>This version of ENNOID-BMS Tool does not seem to have any supported firmwares. Something is probably wrong with the BMS configuration file.</source>
<translation>Эта версия утилиты не имеет поддерживаемых прошивок. Вероятно, что-то не так с файлом конфигурации BMS.</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="823"/>
<location filename="../bmsinterface.cpp" line="851"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="823"/>
<location filename="../bmsinterface.cpp" line="851"/>
<source>The firmware on the connected ENNOID-BMS is too old. Please update it using a programmer.</source>
<translation>Прошивка подключенного ENNOID-BMS устарела. Пожалуйста, обновите его с помощью программатора.</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="828"/>
<location filename="../bmsinterface.cpp" line="840"/>
<source>Warning</source>
<translation>Внимание</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="828"/>
<source>The connected ENNOID-BMS has newer firmware than this version of the ENNOID-BMS Tool supports. It is recommended that you update the ENNOID-BMS Tool to the latest version. Alternatively, the firmware on the connected ENNOID-BMS can be downgraded in the firmware page. Until then, limited communication mode will be used where only the firmware can be changed.</source>
<translation>Подключенный ENNOID-BMS имеет более новую прошивку, чем поддерживает эта версия инструмента ENNOID-BMS. Рекомендуется обновить инструмент ENNOID-BMS до последней версии. Кроме того, прошивку подключенного ENNOID-BMS можно понизить на странице прошивки. До тех пор будет использоваться ограниченный режим связи, при котором можно будет изменить только прошивку.</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="840"/>
<source>The connected ENNOID-BMS has too old firmware. Since the connected ENNOID-BMS has firmware with bootloader support, it can be updated from the Firmware page. Until then, limited communication mode will be used where only the firmware can be changed.</source>
<translation>Подключенный ENNOID-BMS имеет слишком старую прошивку. Поскольку подключенный ENNOID-BMS имеет встроенное ПО с поддержкой загрузчика, его можно обновить со страницы встроенного ПО. До тех пор будет использоваться ограниченный режим связи, при котором можно будет изменить только прошивку.</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="864"/>
<source>Firmware version: %1.%2, Hardware: %3, UUID: %4</source>
<translation>Версия прошивки: %1.%2, Оборудование: %3, UUID: %4</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="896"/>
<source>BMS configuration updated</source>
<translation>Конфигурация BMS обновлена</translation>
</message>
<message>
<location filename="../bmsinterface.cpp" line="900"/>
<source>BMS configuration stored to Flash</source>
<translation>Конфигурация BMS сохранена во флэш-памяти</translation>
</message>
</context>
<context>
<name>BmsServiceScreen</name>
<message>
<location filename="../qml/Screens/BmsServiceScreen.qml" line="29"/>
<source>Clear</source>
<translation>Очистить</translation>
</message>
<message>
<location filename="../qml/Screens/BmsServiceScreen.qml" line="42"/>
<source>Send</source>
<translation>Отправить</translation>
</message>
<message>
<location filename="../qml/Screens/BmsServiceScreen.qml" line="51"/>
<source>Help</source>
<translation>Помощь</translation>
</message>
</context>
<context>
<name>BmsSettingsScreen</name>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="40"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="625"/>
<source>Serial number</source>
<translation>Серийный номер</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="67"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="630"/>
<source>Configuration</source>
<translation>Конфигурация</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="73"/>
<source>Number of boards</source>
<translation>Количество плат</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="79"/>
<source>Number of cells</source>
<translation>Количество ячеек</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="113"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="635"/>
<source>SOC</source>
<translation>SOC</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="119"/>
<source>Number of cells connected in parallel</source>
<translation>Количество параллельно включенных ячеек</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="127"/>
<source>Battery capacity</source>
<translation>Ёмкость батареи</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="161"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="640"/>
<source>Limits</source>
<translation>Ограничения</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="167"/>
<source>Maximum charge current, A</source>
<translation>Максимальный ток заряда, A</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="175"/>
<source>Maximum load current, A</source>
<translation>Максимальный ток нагрузки, A</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="197"/>
<source>Maximum temperature, °C</source>
<translation>Максимальная температура, C</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="228"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="645"/>
<source>Cell configuration</source>
<translation>Конфигурация ячеек</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="234"/>
<source>Lower disable threshold, V</source>
<translation>Нижний порог отключения, В</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="242"/>
<source>Upper disable threshold, V</source>
<translation>Верхний порог отключения, В</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="264"/>
<source>Lower enable threshold (should be higher than disable), V</source>
<translation>Нижний порог включения (должен быть выше отключения), В</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="272"/>
<source>Upper enable threshold (should be higher than disable), V</source>
<translation>Верхний порог включения (должен быть выше отключения), В</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="308"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="650"/>
<source>Balancing configuration</source>
<translation>Конфигурация балансировки</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="314"/>
<source>Balancing start voltage, V</source>
<translation>Напряжение старта балансировки, В</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="322"/>
<source>Cell voltage delta to start balancing, V</source>
<translation>Дельта напряжения ячеек для старта балансировки, В</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="344"/>
<source>Cell balancing interval, ms</source>
<translation>Интервал балансировки ячейки, мс</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="377"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="655"/>
<source>Output settings</source>
<translation>Настройка выходов</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="386"/>
<source># 1</source>
<translation> 1</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="392"/>
<source>Use for storage management</source>
<translation>Использовать для управления ЗУ</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="410"/>
<source># 2</source>
<translation> 2</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="450"/>
<source># 3</source>
<translation> 3</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="497"/>
<source># 4</source>
<translation> 4</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="672"/>
<source>Read default settings</source>
<translation>Загрузить настройки по-умолчанию</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="696"/>
<source>The settings are written to non-volatile memory.
Wait, please.</source>
<translation>Выполняется запись настроек в энергонезависимую память.
Пожалуйста подождите.</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="416"/>
<source>Normally closed</source>
<translation>Нормально замкнут</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="426"/>
<source>Change in value during SOC</source>
<translation>Изменение значения при SOC</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="465"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="512"/>
<source>Closes at t&lt;, °C</source>
<translation>Замыкается при t&lt;, °C</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="471"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="518"/>
<source>Opens at t&gt;, °C</source>
<translation>Размыкается при t&gt;, °C</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="555"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="660"/>
<source>Current sensor value &quot;0&quot;</source>
<translation>Значение датчика тока «0»</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="570"/>
<source>Calibrate &quot;0&quot;</source>
<translation>Калибровать «0»</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="580"/>
<source>Load settings from file</source>
<translation>Загрузить настройки из файла</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="586"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="602"/>
<source>Select configuration file</source>
<translation>Выберите файл конфигурации</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="588"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="605"/>
<source>Configuration files (*.xml)</source>
<translation>Файлы конфигурации (*.xml)</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="588"/>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="605"/>
<source>All files (*)</source>
<translation>Все файлы (*)</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="596"/>
<source>Save settings to file</source>
<translation>Сохранить настройки в файл</translation>
</message>
<message>
<source>Read settings from file</source>
<translation type="vanished">Загрузить настройки из файла</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="678"/>
<source>Read current settings from BMS</source>
<translation>Загрузить текущие настройки из BMS</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="693"/>
<source>Write to non-volatile memory of BMS</source>
<translation>Записать в энергонезависимую память BMS</translation>
</message>
<message>
<location filename="../qml/Screens/BmsSettingsScreen.qml" line="684"/>
<source>Write current values to BMS</source>
<translation>Записать текущие значения в BMS</translation>
</message>
</context>
<context>
<name>CellMonitorScreen</name>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="24"/>
<source>#</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="37"/>
<source>Voltage</source>
<translation>Напряжение</translation>
</message>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="50"/>
<source>Balancing</source>
<translation>Балансировка</translation>
</message>
<message>
<location filename="../qml/Screens/CellMonitorScreen.qml" line="84"/>
<source>V</source>
<translation>V</translation>
</message>
</context>
<context>
<name>Commands</name>
<message>
<location filename="../commands.cpp" line="237"/>
<source>BMS configuration is set</source>
<translation>Конфигурация BMS установлена</translation>
</message>
</context>
<context>
<name>ConfigParams</name>
<message>
<location filename="../configparams.cpp" line="42"/>
<location filename="../configparams.cpp" line="1150"/>
<location filename="../configparams.cpp" line="1178"/>
<location filename="../configparams.cpp" line="1381"/>
<location filename="../configparams.cpp" line="1407"/>
<source>OK</source>
<translation>Ок</translation>
</message>
<message>
<location filename="../configparams.cpp" line="1154"/>
<location filename="../configparams.cpp" line="1384"/>
<source>tag &lt;b&gt;%1&lt;/b&gt; not found</source>
<translation>тэг &lt;b&gt;%1&lt;/b&gt; не найден</translation>
</message>
<message>
<location filename="../configparams.cpp" line="1164"/>
<location filename="../configparams.cpp" line="1394"/>
<location filename="../configparams.cpp" line="1432"/>
<source>Could not open %1 for writing</source>
<translation>Не удалось открыть %1 для записи</translation>
</message>
<message>
<location filename="../configparams.cpp" line="1186"/>
<location filename="../configparams.cpp" line="1415"/>
<source>Could not open %1 for reading</source>
<translation>Не удалось открыть %1 для чтения</translation>
</message>
</context>
<context>
<name>ConnectionDialog</name>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="11"/>
<source>Connection screen</source>
<translation>Экран подключения</translation>
</message>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="36"/>
<source>Select serial port</source>
<translation>Выберите последовательный порт</translation>
</message>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="50"/>
<location filename="../qml/Screens/ConnectionDialog.qml" line="82"/>
<source>Connect</source>
<translation>Подключение</translation>
</message>
<message>
<location filename="../qml/Screens/ConnectionDialog.qml" line="82"/>
<source>Disconnect</source>
<translation>Отключение</translation>
</message>
</context>
<context>
<name>DebugInformationScreen</name>
<message>
<location filename="../qml/Screens/DebugInformationScreen.qml" line="23"/>
<source>Clear</source>
<translation>Очистить</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../qml/MainWindow.qml" line="12"/>
<source>Cubo Verde BMS tool</source>
<translation>Cubo Verde утилита для BMS</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="48"/>
<source>Hide menu</source>
<translation>Скрыть меню</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="76"/>
<location filename="../qml/MainWindow.qml" line="131"/>
<source>AKB monitor</source>
<translation>Монитор АКБ</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="77"/>
<location filename="../qml/MainWindow.qml" line="132"/>
<source>Cell monitor</source>
<translation>Монитор ячеек</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="78"/>
<source>Configuration</source>
<translation>Конфигурация</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="79"/>
<location filename="../qml/MainWindow.qml" line="134"/>
<source>Visualization</source>
<translation>Визуализация</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="80"/>
<source>History</source>
<translation>История</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="81"/>
<source>BMS service</source>
<translation>Сервис BMS</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="99"/>
<source>Connection</source>
<translation>Подключение</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="133"/>
<source>BMS settings</source>
<translation>Настройка BMS</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="135"/>
<source>Information output</source>
<translation>Вывод информации</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="136"/>
<source>Terminal</source>
<translation>Терминал</translation>
</message>
<message>
<source>Exit</source>
<translation type="vanished">Выход</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="161"/>
<location filename="../qml/MainWindow.qml" line="346"/>
<source>Disconnected</source>
<translation>Отключено</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="184"/>
<source>Serial number</source>
<translation>Серийный номер</translation>
</message>
<message>
<location filename="../qml/MainWindow.qml" line="346"/>
<source>Connected</source>
<translation>Подключено</translation>
</message>
</context>
<context>
<name>MessageDialog</name>
<message>
<location filename="../qml/Screens/MessageDialog.qml" line="48"/>
<source>Ok</source>
<translation>Ок</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../utility.cpp" line="126"/>
<source>Autoconnect</source>
<translation>Автоподключение</translation>
</message>
<message>
<location filename="../utility.cpp" line="127"/>
<source>Could not autoconnect. Make sure that the USB cable is plugged in and that the ENNOID-BMS is powered.</source>
<translation>Не удалось автоматически подключиться. Убедитесь, что USB-кабель подключен и ENNOID-BMS включен.</translation>
</message>
</context>
<context>
<name>Translator</name>
<message>
<location filename="../translator.cpp" line="16"/>
<source>EN</source>
<translation></translation>
</message>
<message>
<location filename="../translator.cpp" line="17"/>
<source>RU</source>
<translation></translation>
</message>
<message>
<location filename="../translator.cpp" line="18"/>
<source>IT</source>
<translation></translation>
</message>
</context>
<context>
<name>Utility</name>
<message>
<location filename="../utility.cpp" line="187"/>
<source>&lt;b&gt;ENNOID-BMS Tool V%1&lt;/b&gt;&lt;br&gt;&amp;copy; Kevin Dionne 2019&lt;br&gt;&lt;a href=&quot;mailto:kevin.dionne@ennoid.me&quot;&gt;kevin.dionne@ennoid.me&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.ennoid.me/&quot;&gt;https://www.ennoid.me/&lt;/a&gt;&lt;br&gt;Based on: DieBieMS-tool&lt;br&gt;&lt;br&gt;&lt;b&gt;DieBieMS Tool &lt;/b&gt;&lt;br&gt;&amp;copy; Danny Bokma 2018&lt;br&gt;&lt;a href=&quot;mailto:bms@diebie.nl&quot;&gt;bms@diebie.nl&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://diebie.nl/&quot;&gt;https://diebie.nl/&lt;/a&gt;&lt;br&gt;Based on: VESC-tool&lt;br&gt;&lt;br&gt;&lt;b&gt;VESC Tool &lt;/b&gt;&lt;br&gt;&amp;copy; Benjamin Vedder 2018&lt;br&gt;&lt;a href=&quot;mailto:benjamin@vedder.se&quot;&gt;benjamin@vedder.se&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://vesc-project.com/&quot;&gt;https://vesc-project.com/&lt;/a&gt;&lt;br&gt;&lt;br&gt;</source>
<translation></translation>
</message>
</context>
<context>
<name>VisualizationScreen</name>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="34"/>
<source>Voltage</source>
<translation>Напряжение</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="39"/>
<source>Current</source>
<translation>Ток</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="44"/>
<source>Battery temperature</source>
<translation>Температура батареи</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="49"/>
<source>BMS temperature</source>
<translation>Температура BMS</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="54"/>
<source>Cell voltage</source>
<translation>Вольтаж ячейки</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="59"/>
<source>Cell list</source>
<translation>Список ячеек</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="189"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="202"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="215"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="228"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="241"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="254"/>
<source>Time, s</source>
<translation>Время, c</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="190"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="242"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="255"/>
<source>Voltage, V</source>
<translation>Напряжение, В</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="203"/>
<source>Current, A</source>
<translation>Ток, А</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="216"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="229"/>
<source>Temperature, °C</source>
<translation>Температура, °C</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="273"/>
<source>Pause data collection</source>
<translation>Приостановить сбор данных</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="273"/>
<source>Resume data collection</source>
<translation>Продолжить сбор данных</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="283"/>
<source>Clear data</source>
<translation>Очистить данные</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="312"/>
<source>Reset zoom</source>
<translation>Сбросить масштаб</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="371"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="398"/>
<source>Cell #</source>
<translation>Ячейка </translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="473"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="475"/>
<source>Voltage indicator</source>
<translation>Показатель вольтажа</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="480"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="482"/>
<source>Current indicator</source>
<translation>Показатель тока</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="487"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="493"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="500"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="506"/>
<source>Maximum temperature</source>
<translation>Максимальная температура</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="489"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="494"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="502"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="507"/>
<source>Average temperature</source>
<translation>Средняя температура</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="491"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="495"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="504"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="508"/>
<source>Minimum temperature</source>
<translation>Минимальная температура</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="513"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="519"/>
<source>Maximum voltage</source>
<translation>Максимальное напряжение</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="515"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="520"/>
<source>Average voltage</source>
<translation>Среднее напряжение</translation>
</message>
<message>
<location filename="../qml/Screens/VisualizationScreen.qml" line="517"/>
<location filename="../qml/Screens/VisualizationScreen.qml" line="521"/>
<source>Minimum voltage</source>
<translation>Минимальное напряжение</translation>
</message>
</context>
</TS>

View File

@@ -0,0 +1,7 @@
<RCC>
<qresource prefix="/">
<file>cubo_en.qm</file>
<file>cubo_it.qm</file>
<file>cubo_ru.qm</file>
</qresource>
</RCC>

87
translator.cpp Normal file
View File

@@ -0,0 +1,87 @@
#include "translator.h"
#include <QTranslator>
#include <QCoreApplication>
#include <QQmlEngine>
#include <QLocale>
#include <QTimer>
Translator::Translator(QQmlEngine *engine, QObject *parent) :
QObject(parent),
mQmlEngine(engine),
mCurrentTranslator(new QTranslator(this))
{
mNamesMap =
{
{Language::English, tr("EN")},
{Language::Russian, tr("RU")},
{Language::Italian, tr("IT")}
};
mIconsMap =
{
{Language::English, "qrc:/Icons/english-flag.svg"},
{Language::Russian, "qrc:/Icons/russian-flag.svg"},
{Language::Italian, "qrc:/Icons/italian-flag.svg"}
};
mTranslationsMap =
{
{Language::English, ":/cubo_en.qm"},
{Language::Russian, ":/cubo_ru.qm"},
{Language::Italian, ":/cubo_it.qm"}
};
QCoreApplication::installTranslator(mCurrentTranslator);
if (QLocale::system().language() == QLocale::Russian)
{
setCurrentLanguage(Language::Russian);
}
else if (QLocale::system().language() == QLocale::Italian)
{
setCurrentLanguage(Language::Italian);
}
else
{
setCurrentLanguage(Language::English);
}
}
QString Translator::languageName(Language language) const
{
return mNamesMap.value(language);
}
QString Translator::languageIcon(Language language) const
{
return mIconsMap.value(language);
}
Translator::Language Translator::currentLanguage() const
{
return mCurrentLanguage;
}
void Translator::setCurrentLanguage(Language language)
{
if (mCurrentTranslator->load(mTranslationsMap.value(language)))
{
QTimer::singleShot(0, this, [this]{ mQmlEngine->retranslate();} );
}
mCurrentLanguage = language;
emit currentLanguageChanged();
emit currentLanguageNameChanged();
emit currentLanguageIconChanged();
}
QString Translator::currentLanguageName() const
{
return languageName(mCurrentLanguage);
}
QString Translator::currentLanguageIcon() const
{
return languageIcon(mCurrentLanguage);
}

53
translator.h Normal file
View File

@@ -0,0 +1,53 @@
#ifndef TRANSLATOR_H
#define TRANSLATOR_H
#include <QObject>
#include <QMap>
class QQmlEngine;
class QTranslator;
class Translator : public QObject
{
Q_OBJECT
Q_PROPERTY(Language currentLanguage READ currentLanguage WRITE setCurrentLanguage NOTIFY currentLanguageChanged)
Q_PROPERTY(QString currentLanguageName READ currentLanguageName NOTIFY currentLanguageNameChanged)
Q_PROPERTY(QString currentLanguageIcon READ currentLanguageIcon NOTIFY currentLanguageNameChanged)
public:
enum class Language {
English,
Russian,
Italian
};
Q_ENUM(Language)
explicit Translator(QQmlEngine* engine, QObject *parent = nullptr);
public slots:
QString languageName(Language language) const;
QString languageIcon(Language language) const;
public:
Language currentLanguage() const;
void setCurrentLanguage(Language language);
QString currentLanguageName() const;
QString currentLanguageIcon() const;
signals:
void currentLanguageChanged();
void currentLanguageNameChanged();
void currentLanguageIconChanged();
private:
Language mCurrentLanguage = Language::English;
QQmlEngine* mQmlEngine = nullptr;
QTranslator* mCurrentTranslator = nullptr;
QMap<Language, QString> mNamesMap;
QMap<Language, QString> mIconsMap;
QMap<Language, QString> mTranslationsMap;
};
#endif // TRANSLATOR_H