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

View File

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

View File

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

View File

@@ -234,7 +234,7 @@ void Commands::processPacket(QByteArray data)
break; break;
case COMM_SET_MCCONF: case COMM_SET_MCCONF:
emit ackReceived("BMS Write OK"); emit ackReceived(tr("BMS configuration is set"));
break; break;
case COMM_STORE_BMS_CONF: 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 *ConfigParams::getEditor(const QString &name, QWidget *parent)
{ //{
QWidget *retVal = 0; // QWidget *retVal = 0;
if (mParams.contains(name)) { // if (mParams.contains(name)) {
ConfigParam &p = mParams[name]; // ConfigParam &p = mParams[name];
switch (p.type) { // switch (p.type) {
case CFG_T_DOUBLE: { // case CFG_T_DOUBLE: {
ParamEditDouble *edit = new ParamEditDouble(parent); // ParamEditDouble *edit = new ParamEditDouble(parent);
edit->setName(name); // edit->setName(name);
edit->setSuffix(p.suffix); // edit->setSuffix(p.suffix);
edit->setDecimals(p.editorDecimalsDouble); // edit->setDecimals(p.editorDecimalsDouble);
edit->setShowAsPercentage(p.editAsPercentage); // edit->setShowAsPercentage(p.editAsPercentage);
edit->showDisplay(p.showDisplay); // edit->showDisplay(p.showDisplay);
edit->setProperty("type", int(p.type)); // edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix); // edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble); // edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage); // edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valDouble); // edit->setProperty("value", p.valDouble);
edit->setConfig(this); // edit->setConfig(this);
retVal = edit; // retVal = edit;
} break; // } break;
case CFG_T_INT: { // case CFG_T_INT: {
ParamEditInt *edit = new ParamEditInt(parent); // ParamEditInt *edit = new ParamEditInt(parent);
edit->setName(name); // edit->setName(name);
edit->setSuffix(p.suffix); // edit->setSuffix(p.suffix);
edit->setShowAsPercentage(p.editAsPercentage); // edit->setShowAsPercentage(p.editAsPercentage);
edit->showDisplay(p.showDisplay); // edit->showDisplay(p.showDisplay);
edit->setProperty("type", int(p.type)); // edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix); // edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble); // edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage); // edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valInt); // edit->setProperty("value", p.valInt);
edit->setConfig(this); // edit->setConfig(this);
retVal = edit; // retVal = edit;
} break; // } break;
case CFG_T_QSTRING: { // case CFG_T_QSTRING: {
ParamEditString *edit = new ParamEditString(parent); // ParamEditString *edit = new ParamEditString(parent);
edit->setName(name); // edit->setName(name);
edit->setProperty("type", int(p.type)); // edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix); // edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble); // edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage); // edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valString); // edit->setProperty("value", p.valString);
edit->setConfig(this); // edit->setConfig(this);
retVal = edit; // retVal = edit;
} break; // } break;
case CFG_T_ENUM: { // case CFG_T_ENUM: {
ParamEditEnum *edit = new ParamEditEnum(parent); // ParamEditEnum *edit = new ParamEditEnum(parent);
edit->setName(name); // edit->setName(name);
edit->setProperty("type", int(p.type)); // edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix); // edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble); // edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage); // edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valInt); // edit->setProperty("value", p.valInt);
edit->setConfig(this); // edit->setConfig(this);
retVal = edit; // retVal = edit;
} break; // } break;
case CFG_T_BOOL: { // case CFG_T_BOOL: {
ParamEditBool *edit = new ParamEditBool(parent); // ParamEditBool *edit = new ParamEditBool(parent);
edit->setName(name); // edit->setName(name);
edit->setProperty("type", int(p.type)); // edit->setProperty("type", int(p.type));
edit->setProperty("suffix", p.suffix); // edit->setProperty("suffix", p.suffix);
edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble); // edit->setProperty("editorDecimalsDouble", p.editorDecimalsDouble);
edit->setProperty("editAsPercentage", p.editAsPercentage); // edit->setProperty("editAsPercentage", p.editAsPercentage);
edit->setProperty("value", p.valInt); // edit->setProperty("value", p.valInt);
edit->setConfig(this); // edit->setConfig(this);
retVal = edit; // retVal = edit;
} break; // } break;
default: // default:
qWarning() << "no editor for" << name << "could be created"; // qWarning() << "no editor for" << name << "could be created";
break; // break;
} // }
} else { // } else {
qWarning() << name << "not found"; // qWarning() << name << "not found";
} // }
return retVal; // return retVal;
} //}
/* /*
QWidget *ConfigParams::getEditor(const QString &name, QWidget *parent) QWidget *ConfigParams::getEditor(const QString &name, QWidget *parent)

View File

@@ -84,7 +84,7 @@ public:
QStringList getParamOrder() const; QStringList getParamOrder() const;
void setParamOrder(const QStringList &order); 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 getParamSerial(VByteArray &vb, const QString &name);
void setParamSerial(VByteArray &vb, const QString &name, QObject *src = 0); void setParamSerial(VByteArray &vb, const QString &name, QObject *src = 0);

View File

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

View File

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

View File

@@ -5,13 +5,15 @@ import Utils 1.0
Shape { Shape {
id: shape id: shape
implicitWidth: 1
implicitHeight: 1 implicitHeight: 1
property bool horizontal: true
ShapePath { ShapePath {
strokeColor: Palette.borderColor strokeColor: Palette.borderColor
strokeStyle: ShapePath.SolidLine strokeStyle: ShapePath.SolidLine
startX: 0 startX: 0
startY: 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 horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight elide: Text.ElideRight
maximumLineCount: 2
wrapMode: Text.Wrap
} }
background: Rectangle { background: Rectangle {

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,5 @@
module Controls module Controls
Label 1.0 Label.qml
ComboBox 1.0 ComboBox.qml ComboBox 1.0 ComboBox.qml
PaneItem 1.0 PaneItem.qml
ScrollBar 1.0 ScrollBar.qml ScrollBar 1.0 ScrollBar.qml
Button 1.0 Button.qml Button 1.0 Button.qml
OutlineButton 1.0 OutlineButton.qml OutlineButton 1.0 OutlineButton.qml
@@ -22,3 +20,5 @@ ChartView 1.0 ChartView.qml
TextArea 1.0 TextArea.qml TextArea 1.0 TextArea.qml
DialogHeader 1.0 DialogHeader.qml DialogHeader 1.0 DialogHeader.qml
DialogBackground 1.0 DialogBackground.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"> <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"> <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> </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"> <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> </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"> <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> </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"> <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> </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> </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 2.12
import QtQuick.Controls 2.12 import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12 import QtQuick.Layouts 1.12
import QtGraphicalEffects 1.0
import Controls 1.0 as Controls import Controls 1.0 as Controls
import Screens 1.0 as Screens import Screens 1.0 as Screens
@@ -10,7 +9,7 @@ import Utils 1.0
ApplicationWindow { ApplicationWindow {
id: window id: window
title: qsTr("Cubo Verde BMS Tool") title: qsTr("Cubo Verde BMS tool")
width: 1366 width: 1366
height: 768 height: 768
visible: true visible: true
@@ -45,38 +44,11 @@ ApplicationWindow {
Layout.preferredHeight: pane.minimized ? 85 : 40 Layout.preferredHeight: pane.minimized ? 85 : 40
} }
ItemDelegate { Controls.MenuItemDelegate {
leftPadding: pane.minimized ? 0 : 40 text: qsTr("Hide menu")
font.weight: Font.Normal
contentItem: RowLayout { icon.source: "qrc:/Icons/hide-menu.svg"
height: 50 minimized: pane.minimized
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"
}
onClicked: if (pane.implicitWidth === 300) { onClicked: if (pane.implicitWidth === 300) {
animation.from = 300 animation.from = 300
@@ -90,7 +62,6 @@ ApplicationWindow {
pane.minimized = false pane.minimized = false
} }
Layout.preferredHeight: 52
Layout.fillWidth: true Layout.fillWidth: true
} }
@@ -100,101 +71,36 @@ ApplicationWindow {
ListView { ListView {
id: menuView id: menuView
model: [
property var menuModel: [
{"text": qsTr("AKB monitor"), "icon": "qrc:/Icons/akb-monitor.svg"}, {"text": qsTr("AKB monitor"), "icon": "qrc:/Icons/akb-monitor.svg"},
{"text": qsTr("Cell monitor"), "icon": "qrc:/Icons/cell-monitor.svg"}, {"text": qsTr("Cell monitor"), "icon": "qrc:/Icons/cell-monitor.svg"},
{"text": qsTr("Configuration"), "icon": "qrc:/Icons/bms-configuration.svg"}, {"text": qsTr("Configuration"), "icon": "qrc:/Icons/bms-configuration.svg"},
{"text": qsTr("Visualization"), "icon": "qrc:/Icons/visualization.svg"}, {"text": qsTr("Visualization"), "icon": "qrc:/Icons/visualization.svg"},
{"text": qsTr("History"), "icon": "qrc:/Icons/history.svg"}, {"text": qsTr("History"), "icon": "qrc:/Icons/history.svg"},
{"text": qsTr("BMS service"), "icon": "qrc:/Icons/bms-service.svg"}, {"text": qsTr("BMS service"), "icon": "qrc:/Icons/bms-service.svg"}
// {"text": qsTr("Exit"), "icon": "qrc:/Icons/exit.svg"},
] ]
delegate: ItemDelegate { model: menuModel.length
id: menuDelegate
delegate: Controls.MenuItemDelegate {
width: ListView.view.width width: ListView.view.width
height: 52 text: menuView.menuModel[modelData].text
leftPadding: pane.minimized ? 0 : 40 icon.source: menuView.menuModel[modelData].icon
highlighted: ListView.isCurrentItem minimized: pane.minimized
onClicked: menuView.currentIndex = index 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.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
} }
ItemDelegate { Controls.MenuItemDelegate {
leftPadding: pane.minimized ? 0 : 40 text: qsTr("Connection")
icon.source: "qrc:/Icons/connection.svg"
icon.color: "#FFFFFF"
minimized: pane.minimized
onClicked: connectionDialog.open() 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 Layout.fillWidth: true
} }
@@ -216,6 +122,8 @@ ApplicationWindow {
} }
ColumnLayout { ColumnLayout {
spacing: 0
RowLayout { RowLayout {
id: topBar id: topBar
@@ -226,13 +134,13 @@ ApplicationWindow {
qsTr("Visualization"), qsTr("Visualization"),
qsTr("Information output"), qsTr("Information output"),
qsTr("Terminal"), qsTr("Terminal"),
qsTr("Exit"),
] ]
Label { Label {
text: topBar.labels[stack.currentIndex] text: topBar.labels[stack.currentIndex]
font.pixelSize: 38 font.pixelSize: 38
font.weight: Font.Bold font.weight: Font.Bold
color: Palette.textColor
} }
Item { Item {
@@ -240,8 +148,14 @@ ApplicationWindow {
} }
RowLayout { RowLayout {
spacing: 20
ColumnLayout { ColumnLayout {
spacing: 5
RowLayout { RowLayout {
spacing: 7
Controls.ContentLabel { Controls.ContentLabel {
id: connectionStatusLabel id: connectionStatusLabel
text: qsTr("Disconnected") text: qsTr("Disconnected")
@@ -264,6 +178,8 @@ ApplicationWindow {
} }
RowLayout { RowLayout {
spacing: 5
Controls.ContentLabel { Controls.ContentLabel {
text: qsTr("Serial number") + ":" text: qsTr("Serial number") + ":"
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
@@ -277,11 +193,111 @@ ApplicationWindow {
Layout.alignment: Qt.AlignRight 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.leftMargin: 45
Layout.rightMargin: 45 Layout.rightMargin: 45
Layout.maximumHeight: 90
} }
StackLayout { StackLayout {
@@ -301,6 +317,14 @@ ApplicationWindow {
} }
Screens.BmsSettingsScreen { Screens.BmsSettingsScreen {
onNeedWait: {
if (active) {
busyPopup.text = text
busyPopup.open()
} else {
busyPopup.close()
}
}
} }
Screens.VisualizationScreen { Screens.VisualizationScreen {
@@ -319,7 +343,7 @@ ApplicationWindow {
target: BmsInterface target: BmsInterface
onPortConnectedChanged: { 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() connectionStatusIndicator.enabled = BmsInterface.isPortConnected()
if (BmsInterface.isPortConnected()) { if (BmsInterface.isPortConnected()) {
BmsInterface.commands().getBMSconf() BmsInterface.commands().getBMSconf()
@@ -351,7 +375,6 @@ ApplicationWindow {
statusPopup.text = msg statusPopup.text = msg
statusPopup.good = isGood statusPopup.good = isGood
statusPopup.open() statusPopup.open()
hideStatusTimer.start()
} else { } else {
if (statusPopup.text !== msg) { if (statusPopup.text !== msg) {
statusPopup.queue.push({"text": msg, "good": isGood}) statusPopup.queue.push({"text": msg, "good": isGood})
@@ -395,7 +418,7 @@ ApplicationWindow {
Screens.StatusPopup { Screens.StatusPopup {
id: statusPopup id: statusPopup
property var filteredStatuses: []//[qsTr("BMS configuration updated")] property var filteredStatuses: []
property var queue: [] property var queue: []
onClosed: { onClosed: {
@@ -404,9 +427,13 @@ ApplicationWindow {
statusPopup.text = message.text statusPopup.text = message.text
statusPopup.good = message.good statusPopup.good = message.good
statusPopup.open() statusPopup.open()
hideStatusTimer.start()
} }
} }
onOpened: {
hideStatusTimer.start()
busyPopup.close()
}
} }
Timer { Timer {
@@ -415,13 +442,57 @@ ApplicationWindow {
onTriggered: statusPopup.close() 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 { background: Rectangle {
color: Palette.screenBackgroundColor color: Palette.screenBackgroundColor
} }
Component.onCompleted: { Component.onCompleted: {
// BmsInterface.bmsConfig().loadParamsXml("://res/config.xml")
// BmsInterface.infoConfig().loadParamsXml("://res/info.xml")
connectionDialog.open() connectionDialog.open()
} }
} }

View File

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

View File

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

View File

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

View File

@@ -9,7 +9,7 @@ import Utils 1.0
Dialog { Dialog {
id: root id: root
title: qsTr("Connection screen") title: qsTr("Connection screen")
width: 400 width: 470
height: 320 height: 320
modal: true modal: true
closePolicy: Popup.CloseOnEscape closePolicy: Popup.CloseOnEscape
@@ -79,7 +79,7 @@ Dialog {
Connections { Connections {
target: BmsInterface target: BmsInterface
onPortConnectedChanged: { 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() serialBox.enabled = !BmsInterface.isPortConnected()
} }
} }

View File

@@ -37,27 +37,27 @@ ColumnLayout {
Controls.TabButton { Controls.TabButton {
text: qsTr("Current") 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 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 { Controls.TabButton {
text: qsTr("Cell list") text: qsTr("Cell list")
width: bar.width / 6 * 0.9 width: bar.width / 6 * 0.85
} }
Layout.fillWidth: true Layout.fillWidth: true
@@ -81,6 +81,8 @@ ColumnLayout {
Controls.CheckBox { Controls.CheckBox {
id: checkSeries id: checkSeries
checked: true checked: true
spacing: 10
onCheckedChanged: { onCheckedChanged: {
if (checked) { if (checked) {
chartItem.series(modelData).color = seriesColor chartItem.series(modelData).color = seriesColor
@@ -103,7 +105,7 @@ ColumnLayout {
chartItem = ListView.view ? ListView.view.chartItem : parent.chartItem chartItem = ListView.view ? ListView.view.chartItem : parent.chartItem
horizontal = !ListView.view horizontal = !ListView.view
seriesColor = chartItem.series(modelData).color 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 { RowLayout {
visible: horizontalLegend visible: horizontalLegend
spacing: 20 spacing: 0
property Controls.ChartView chartItem: chart property Controls.ChartView chartItem: chart
@@ -170,7 +172,7 @@ ColumnLayout {
property Controls.ChartView chartItem: chart property Controls.ChartView chartItem: chart
Layout.preferredWidth: 180 Layout.preferredWidth: 200
Layout.fillHeight: true 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 { Connections {
target: BmsInterface.commands() target: BmsInterface.commands()
@@ -461,38 +472,53 @@ ColumnLayout {
Component.onCompleted: { Component.onCompleted: {
voltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Voltage indicator"), voltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Voltage indicator"),
voltageLoader.item.chart.xAxis, voltageLoader.item.chart.yAxis) 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.chart.axes[0].max = 10
voltageLoader.item.seriesCount = voltageLoader.item.chart.count voltageLoader.item.seriesCount = voltageLoader.item.chart.count
////////////////////////////////////////////////////////////////////////////////////////////////////////////
currentLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Current indicator"), currentLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Current indicator"),
currentLoader.item.chart.xAxis, currentLoader.item.chart.yAxis) 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.chart.axes[0].max = 10
currentLoader.item.seriesCount = currentLoader.item.chart.count currentLoader.item.seriesCount = currentLoader.item.chart.count
////////////////////////////////////////////////////////////////////////////////////////////////////////////
batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Maximum temperature"), batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Maximum temperature"),
batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis) batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis)
batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Average temperature"), batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Average temperature"),
batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis) batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis)
batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum temperature"), batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum temperature"),
batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis) 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.chart.axes[0].max = 10
batteryTemperatureLoader.item.seriesCount = batteryTemperatureLoader.item.chart.count batteryTemperatureLoader.item.seriesCount = batteryTemperatureLoader.item.chart.count
///////////////////////////////////////////////////////////////////////////////////////////////////////////
bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Maximum temperature"), bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Maximum temperature"),
bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis) bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis)
bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Average temperature"), bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Average temperature"),
bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis) bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis)
bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum temperature"), bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum temperature"),
bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis) 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.chart.axes[0].max = 10
bmsTemperatureLoader.item.seriesCount = bmsTemperatureLoader.item.chart.count bmsTemperatureLoader.item.seriesCount = bmsTemperatureLoader.item.chart.count
///////////////////////////////////////////////////////////////////////////////////////////////////////////
cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Maximum voltage"), cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Maximum voltage"),
cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis) cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis)
cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Average voltage"), cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Average voltage"),
cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis) cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis)
cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum voltage"), cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum voltage"),
cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis) 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.chart.axes[0].max = 10
cellVoltageLoader.item.seriesCount = cellVoltageLoader.item.chart.count cellVoltageLoader.item.seriesCount = cellVoltageLoader.item.chart.count
} }

View File

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

View File

@@ -14,5 +14,8 @@
<file>Icons/close.svg</file> <file>Icons/close.svg</file>
<file>Icons/info.svg</file> <file>Icons/info.svg</file>
<file>Icons/warning.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> </qresource>
</RCC> </RCC>

View File

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