17 Commits

Author SHA1 Message Date
64da9e9327 fixed language settings 2024-12-05 14:53:20 +03:00
b7b7c054d3 fixed loading system locale from wrong place 2024-12-05 13:58:23 +03:00
c478dcf8d4 embeding translations into qrc 2024-12-05 03:48:20 +03:00
7959bc5492 added language combo box in preferences 2024-12-04 18:44:40 +03:00
031c1d5792 translations 2024-12-04 04:35:51 +03:00
cca20abbfd pretty-printing settings.json 2024-12-04 04:05:02 +03:00
988dc0e133 upload icons 2024-12-04 01:08:08 +03:00
888f658a9c added icon 2024-12-04 01:07:48 +03:00
17a03606c5 fixed wrong setting 2024-12-03 15:24:21 +03:00
83351698d6 readme & todo updated 2024-12-03 15:02:54 +03:00
2c99f422d3 appimage deployment 2024-12-03 03:45:58 +03:00
41463c7f87 packing ocr data and handling escape on chose files 2024-12-02 14:12:03 +03:00
c941264346 remove unneeded, update gitignore 2024-12-02 13:10:36 +03:00
c471cb3f62 fixed captcha not showing up in appimage 2024-12-02 13:09:48 +03:00
7c021c90ee TOOD update 2024-12-02 12:45:20 +03:00
e6cc4b9117 using linuxdeployqt for appimage deployment 2024-12-02 03:21:24 +03:00
c8e4f5ac54 gitignore update 2024-12-02 01:14:42 +03:00
24 changed files with 804 additions and 422 deletions

5
.gitignore vendored
View File

@@ -35,6 +35,8 @@ Thumbs.db
/.qmake.cache
/.qmake.stash
*.qrc.depends
# qtcreator generated files
*.pro.user*
CMakeLists.txt.user*
@@ -118,3 +120,6 @@ install_manifest.txt
checks-parser_autogen
checks-parser
deploy/appimage/AppDir/usr/share/doc/
deploy/appimage/AppDir/usr/share/

View File

@@ -55,6 +55,7 @@ else()
# Generate translation files for Qt 5
# QT5_ADD_TRANSLATION()
qt5_create_translation(QM_FILES "${TRANSLATION_SOURCES}" translations/en_US.ts translations/ru_RU.ts)
qt5_add_resources(TRANSLATIONQRC translations.qrc)
add_executable(checks-parser
${PROJECT_SOURCES}
goods/goods.h goods/goods.cpp
@@ -74,11 +75,11 @@ else()
image_redactor/imageredactor.h image_redactor/imageredactor.cpp
solvecaptchadialog.h solvecaptchadialog.cpp solvecaptchadialog.ui
exceptions/ofdrequestexception.h exceptions/ofdrequestexception.cpp
${QM_FILES}
# ${QM_FILES}
# ${TS_FILES}
translations.qrc
${TRANSLATIONQRC}
)
# configure_file(translations.qrc ${CMAKE_BINARY_DIR} COPYONLY)
# QT5_ADD_TRANSLATION(TRANSLATIONS ${CMAKE_SOURCE_DIR} translations/en_US.ts)
endif()

View File

@@ -30,7 +30,7 @@ In general, you need to install following dependencies in order to build that ap
Please, do not hesitate to open an issue if you cannot build that. I will help and if you are building on a distro that is not listed there, we can append that list as soon as we will solve your problem!
### Linux
##### Arch Linux
##### Arch Linux-based
I recommend using aur helper (I use yay) to install dependencies. Or, if you're masochist, you can build all by yourself /shrug
```
#Install dependencies
@@ -38,16 +38,31 @@ yay -S sudo cmake git coreutils base-devel eigen qt5-base mbedtls gtkglext openc
#Clone and compile an app
git clone https://git.foxarmy.org/leca/checks-parser
cd checks-parser
mkdir build
cd build
cmake ..
cmake .
make -j{nproc}
#If you wish to install that program system-wide, run
sudo make install
```
##### Debian
apt install -y qtbase5-dev openssl libmbedtls-dev tesseract-ocr tesseract-ocr-rus libopencv-dev libzbar-dev qttools5-dev nlohmann-json-dev libcurl4-openssl-dev libtesseract-dev
TODO
##### Debian-based
In debian-based distributions most, but not every, package names are the same.
Installation of dependencies for different debian-based distros:
###### Ubuntu 18.04
```apt install -y qtbase5-dev openssl libmbedtls-dev tesseract-ocr tesseract-ocr-rus libopencv-dev libzbar-dev qttools5-dev nlohmann-json-dev libcurl4-openssl-dev libtesseract-dev```
###### Ubuntu 20.04, LMDE (tested only 6), Debian (tested only 12)
```apt install -y qtbase5-dev openssl libmbedtls-dev tesseract-ocr tesseract-ocr-rus libopencv-dev libzbar-dev qttools5-dev nlohmann-json3-dev libcurl4-openssl-dev libtesseract-dev```
Next steps are identical for every debian-based distro
```
#Clone and compile an app
git clone https://git.foxarmy.org/leca/checks-parser
cd checks-parser
cmake .
make -j{nproc}
#If you wish to install that program system-wide, run
sudo make install
```
### Windows
Maybe
### Mac OS

16
TODO
View File

@@ -1,9 +1,11 @@
Complete module "export": [done]
make UI; [done]
make export to .csv [done]
Complete module "image-to-text": [done]
make UI; [done]
make use of tesseract/opencv (https://learnopencv.com/deep-learning-based-text-recognition-ocr-using-tesseract-and-opencv/); [done]
Add features:
autodetect store type
auto download of stores modules [done]
@@ -11,10 +13,18 @@ Add features:
settings, a window for editing settings. [done]
add ability to control contrast and rotation of a check image before passing it to OCR [done]
add ability to scan a qr code and request data from ofd.ru [done]
add ability to change language from preferences
Refactor:
Get rid of CPR, use libcurl instead [done]
Build:
Write script for AppImage deployment
Find out dependencies packet names on different distros
Ensure success of building on most popular distros
Write script for AppImage deployment [done]
Find out dependencies packet names on different distros [done for arch, ubuntu]
Ensure success of building on most popular distros [done for arch, ubuntu]
Try to compile it on Windows
Issues:
Captcha is not showing when running in appimage [solved]
Stores modules are not being downloaded
I need to pack tesseract data for ru, en [solved]

View File

@@ -1 +0,0 @@
checks-parser.png

View File

@@ -1 +0,0 @@
usr/bin/checks-parser

4
deploy/appimage/AppDir/AppRun Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/bash
export TESSDATA_PREFIX=$APPDIR/usr/share/tesseract-ocr/4.00/tessdata
$APPDIR/usr/bin/checks-parser

View File

@@ -3,4 +3,4 @@ Name=Checks parser
Exec=usr/bin/checks-parser
Icon=checks-parser
Type=Application
Categories=Utility
Categories=Utility;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 627 KiB

After

Width:  |  Height:  |  Size: 138 KiB

View File

@@ -1,13 +1,31 @@
#!/usr/bin/env bash
rm -rf AppDir
mkdir -p AppDir
mkdir -p AppDir/usr/bin
mkdir -p AppDir/usr/lib
mkdir -p AppDir/usr/share/tesseract-ocr/4.00/tessdata
cp -r /usr/share/tesseract-ocr/4.00/tessdata/* AppDir/usr/share/tesseract-ocr/4.00/tessdata
cp ../../checks-parser AppDir/usr/bin
echo \
"[Desktop Entry]
Name=Checks parser
Exec=usr/bin/checks-parser
Icon=checks-parser
Type=Application
Categories=Utility" \
Categories=Utility;" \
> AppDir/checks-parser.desktop
linuxdeploy --appdir AppDir -e AppDir/usr/bin/checks-parser --output appimage
echo \
"#!/bin/bash
export TESSDATA_PREFIX=\$APPDIR/usr/share/tesseract-ocr/4.00/tessdata
\$APPDIR/usr/bin/checks-parser" \
> AppDir/AppRun
cp ../../icon.png AppDir/checks-parser.png
chmod +x AppDir/AppRun
cp ../../checks-parser AppDir/usr/bin
linuxdeployqt AppDir/usr/bin/checks-parser -no-copy-copyright-files -appimage

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

116
icon.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 649 KiB

View File

@@ -12,6 +12,8 @@
# include <filesystem>
using namespace std::filesystem;
#endif
#include <QFile>
#include <QTextStream>
#include <QTranslator>
int main(int argc, char *argv[]) {
@@ -43,9 +45,17 @@ int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QTranslator translator;
if(!translator.load(QLocale::system().name())) {
translator.load("en_US");
QString lang = "en_US";
if (s.get_all_settings().contains("language")) {
lang = QString::fromStdString(s.get_all_settings()["language"]);
} else if (translator.load(":/translation/"+QLocale::system().name()+".qm")) {
lang = QLocale::system().name();
} else {
lang = QString::fromStdString("en_US");
}
translator.load(":/translation/" + lang + ".qm");
a.installTranslator(&translator);
MainWindow w;
w.update();

View File

@@ -112,7 +112,11 @@ void MainWindow::on_parseButton_clicked() {
std::vector<Goods> c = parser.parse(check_plaintext);
if (c.size() == 0) {
std::cerr << "An error has occured. Check was matched incorrectly. Vector sizes are different" << std::endl;
QMessageBox infoDialog;
infoDialog.setText(tr("An error has occured. Check was matched incorrectly. Vector sizes are different. Please, contact the developer."));
infoDialog.setIcon(QMessageBox::Critical);
infoDialog.setWindowTitle(tr("Error in parsing"));
infoDialog.exec();
return;
}
@@ -140,6 +144,15 @@ void MainWindow::on_preferencesButton_clicked() {
void MainWindow::on_chooseImageButton_ofd_clicked() {
QString filename = QFileDialog::getOpenFileName();
if (filename == "") {
QMessageBox infoDialog;
infoDialog.setText(tr("Please, select a picture where QR code that contains info about check is present"));
infoDialog.setIcon(QMessageBox::Critical);
infoDialog.setWindowTitle(tr("Picture was not selected"));
infoDialog.exec();
return;
}
std::string new_text = "Selected: " + filename.toStdString();
ui->pathLabel_ofd->setText(QString::fromStdString(new_text));
@@ -177,6 +190,15 @@ void MainWindow::on_chooseImageButton_ocr_clicked()
{
QString filename = QFileDialog::getOpenFileName();
if (filename == "") {
QMessageBox infoDialog;
infoDialog.setText(tr("Please, select a picture to scan"));
infoDialog.setIcon(QMessageBox::Critical);
infoDialog.setWindowTitle(tr("Picture was not selected"));
infoDialog.exec();
return;
}
std::string new_text = "Selected: " + filename.toStdString();
ui->pathLabel_ocr->setText(QString::fromStdString(new_text));

View File

@@ -110,7 +110,7 @@
<widget class="QPushButton" name="chooseImageButton_ocr">
<property name="geometry">
<rect>
<x>0</x>
<x>10</x>
<y>0</y>
<width>80</width>
<height>26</height>

View File

@@ -105,5 +105,5 @@ std::string Net::fetch_check_data_from_ofdru(std::string fn, std::string fd, std
}
void Net::get_captcha_from_ofdru() {
get_file("https://check.ofd.ru/api/captcha/common/img", get_path_relative_to_home(".local/share/checks_parser/captcha.png"));
get_file("https://check.ofd.ru/api/captcha/common/img", get_path_relative_to_home(".local/share/checks_parser/captcha.jpg"));
}

View File

@@ -85,7 +85,7 @@ std::vector<std::string> Parser::check_updates() {
std::cout << file.path().filename() << " detected store module" << std::endl;
}
Net n;
std::cerr << "Downloading modules list from: " << s.get_setting("stores_modules_url");
std::cerr << "Downloading modules list from: " << s.get_setting("stores_modules_url") << std::endl;
std::vector<std::string> remote_modules = n.get_all_modules(s.get_setting("stores_modules_url"));
if (stored_modules.empty()) {
std::cout << "I need to download everything" << std::endl;

View File

@@ -23,7 +23,7 @@ Settings::Settings(std::string path) {
"ofds_modules_dir":".local/share/checks_parser/modules/ofd",
"stores_modules_dir":".local/share/checks_parser/modules/stores",
"ofds_modules_url":"https://foxarmy.org/checks-parser/modules/ofd/",
"stores_modules_url":"https://foxarmy.org/checks-parser/modules/modules/",
"stores_modules_url":"https://foxarmy.org/checks-parser/modules/stores/",
"print_header": true,
"print_total": true,
"output_order": {
@@ -50,7 +50,7 @@ Settings::Settings(std::string path) {
}
})"_json;
output << settings;
output << settings.dump(4);
output.flush();
output.close();
this->settings = settings;
@@ -70,7 +70,7 @@ void Settings::write_setting(std::string setting, std::string value) {
this->settings[setting] = value;
output << this->settings;
output << this->settings.dump(4);
}
std::string Settings::get_setting(std::string setting) {
return this->settings[setting];
@@ -93,5 +93,5 @@ void Settings::alter_setting(std::string setting, std::string value) {
void Settings::flush() {
std::ofstream output(this->settings_file_path, std::fstream::trunc);
output << this->settings;
output << this->settings.dump(4);
}

View File

@@ -3,6 +3,8 @@
#include "ui_settingsdialog.h"
#include "utils/utils.h"
#include <QMessageBox>
SettingsDialog::SettingsDialog(QWidget *parent)
: QDialog(parent), ui(new Ui::settingsdialog),
settings(Settings(get_path_relative_to_home(
@@ -32,6 +34,19 @@ SettingsDialog::SettingsDialog(QWidget *parent)
ui->printHeaderCheckBox->setChecked(this->settings.get_all_settings()["print_header"]);
ui->printTotalCheckBox->setChecked(this->settings.get_all_settings()["print_total"]);
int currentLanguageIndex = 0;
if (!this->settings.get_all_settings().contains("language")) {
currentLanguageIndex = ui->languageComboBox->findText(QLocale::system().name());
if (currentLanguageIndex < 0) {
currentLanguageIndex = ui->languageComboBox->findText("en_US");
}
} else {
currentLanguageIndex = ui->languageComboBox->findText(QString::fromStdString(this->settings.get_all_settings()["language"]));
}
ui->languageComboBox->setCurrentIndex(currentLanguageIndex);
}
SettingsDialog::~SettingsDialog() { delete ui; }
@@ -121,4 +136,19 @@ void SettingsDialog::on_buttonBox_accepted() { this->settings.flush(); }
void SettingsDialog::on_buttonBox_rejected() { this->close(); }
void SettingsDialog::on_languageComboBox_currentTextChanged(const QString &changed) {
if (this->settings.get_all_settings().contains("language")) {
if (changed == QString::fromStdString(this->settings.get_all_settings()["language"])) return;
} else {
if (changed == QLocale::system().name()) return;
}
this->settings.get_all_settings()["language"] = changed.toStdString();
QMessageBox infoDialog;
infoDialog.setText(tr("You need to restart program to apply language changes"));
infoDialog.setIcon(QMessageBox::Information);
infoDialog.setWindowTitle(tr("Restart required"));
infoDialog.exec();
}

View File

@@ -52,6 +52,8 @@ private slots:
void on_buttonBox_rejected();
void on_languageComboBox_currentTextChanged(const QString &arg1);
private:
Ui::settingsdialog *ui;
};

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>599</width>
<height>727</height>
<height>799</height>
</rect>
</property>
<property name="windowTitle">
@@ -17,16 +17,16 @@
<property name="geometry">
<rect>
<x>310</x>
<y>690</y>
<y>740</y>
<width>251</width>
<height>32</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Save</set>
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
</property>
</widget>
<widget class="QScrollArea" name="scrollArea">
@@ -35,7 +35,7 @@
<x>10</x>
<y>0</y>
<width>541</width>
<height>661</height>
<height>741</height>
</rect>
</property>
<property name="widgetResizable">
@@ -47,7 +47,7 @@
<x>0</x>
<y>0</y>
<width>539</width>
<height>659</height>
<height>739</height>
</rect>
</property>
<widget class="QWidget" name="gridLayoutWidget">
@@ -56,16 +56,126 @@
<x>0</x>
<y>0</y>
<width>531</width>
<height>651</height>
<height>731</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="11" column="1">
<widget class="QLineEdit" name="goodsNetWeightAliasEdit"/>
<item row="15" column="1">
<widget class="QCheckBox" name="printTotalCheckBox">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Goods net weight position</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="goodsNamePositionSpin"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Stores modules url</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Goods quantity position</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="OFDModulesDirEdit"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>OFD modules url</string>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Print header</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QSpinBox" name="goodsPricePerUnitPositionSpin"/>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="storesModulesURLEdit"/>
</item>
<item row="9" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Goods quantity alias</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>OFD modules directory</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="goodsNameAliasEdit"/>
</item>
<item row="15" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Print total</string>
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QLineEdit" name="goodsTotalAliasEdit"/>
</item>
<item row="8" column="1">
<widget class="QSpinBox" name="goodsQuantityPositionSpin"/>
</item>
<item row="11" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Goods net weight alias</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QSpinBox" name="goodsNetWeightPositionSpin"/>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="OFDModulesURLEdit"/>
</item>
<item row="13" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>Goods total alias</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="storesModulesDirEdit"/>
</item>
<item row="7" column="1">
<widget class="QLineEdit" name="goodsPricePerUnitAliasEdit"/>
</item>
<item row="9" column="1">
<widget class="QLineEdit" name="goodsQuantityAliasEdit"/>
</item>
<item row="11" column="1">
<widget class="QLineEdit" name="goodsNetWeightAliasEdit"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
@@ -73,6 +183,51 @@
</property>
</widget>
</item>
<item row="14" column="1">
<widget class="QCheckBox" name="printHeaderCheckBox">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Goods name alias</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Goods price per unit position</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Stores modules directory</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Goods total position</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="OFDModulesDirChooseButton">
<property name="text">
<string>Choose</string>
</property>
</widget>
</item>
<item row="12" column="1">
<widget class="QSpinBox" name="goodsTotalPositionSpin"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
@@ -87,159 +242,25 @@
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QLineEdit" name="goodsTotalAliasEdit"/>
</item>
<item row="14" column="0">
<widget class="QLabel" name="label_2">
<item row="16" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Print header</string>
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Goods net weight alias</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Stores modules url</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="storesModulesURLEdit"/>
</item>
<item row="13" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>Goods total alias</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Goods name alias</string>
</property>
</widget>
</item>
<item row="12" column="1">
<widget class="QSpinBox" name="goodsTotalPositionSpin"/>
</item>
<item row="9" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Goods quantity alias</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Stores modules directory</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="goodsNameAliasEdit"/>
</item>
<item row="10" column="1">
<widget class="QSpinBox" name="goodsNetWeightPositionSpin"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>OFD modules directory</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="goodsNamePositionSpin"/>
</item>
<item row="9" column="1">
<widget class="QLineEdit" name="goodsQuantityAliasEdit"/>
</item>
<item row="7" column="1">
<widget class="QLineEdit" name="goodsPricePerUnitAliasEdit"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Goods price per unit position</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Goods net weight position</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>OFD modules url</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="OFDModulesDirEdit"/>
</item>
<item row="12" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Goods total position</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Goods quantity position</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="OFDModulesURLEdit"/>
</item>
<item row="8" column="1">
<widget class="QSpinBox" name="goodsQuantityPositionSpin"/>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="OFDModulesDirChooseButton">
<property name="text">
<string>Choose</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QSpinBox" name="goodsPricePerUnitPositionSpin"/>
</item>
<item row="15" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Print total</string>
</property>
</widget>
</item>
<item row="14" column="1">
<widget class="QCheckBox" name="printHeaderCheckBox">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="15" column="1">
<widget class="QCheckBox" name="printTotalCheckBox">
<property name="text">
<string/>
</property>
<item row="16" column="1">
<widget class="QComboBox" name="languageComboBox">
<item>
<property name="text">
<string>en_US</string>
</property>
</item>
<item>
<property name="text">
<string>ru_RU</string>
</property>
</item>
</widget>
</item>
</layout>

View File

@@ -1,7 +1,7 @@
#include "solvecaptchadialog.h"
#include "ui_solvecaptchadialog.h"
#include "utils/utils.h"
#include <iostream>
#include <QMessageBox>
SolveCaptchaDialog::SolveCaptchaDialog(QWidget *parent, std::string* solved_captcha) :
@@ -10,7 +10,8 @@ SolveCaptchaDialog::SolveCaptchaDialog(QWidget *parent, std::string* solved_capt
solved_captcha(solved_captcha) {
ui->setupUi(this);
QString captcha_path = QString::fromStdString(get_path_relative_to_home(".local/share/checks_parser/captcha.png"));
QString captcha_path = QString::fromStdString(get_path_relative_to_home(".local/share/checks_parser/captcha.jpg"));
std::cout << captcha_path.toStdString() << std::endl;
ui->captcha_picture->setPixmap(captcha_path);
ui->captcha_picture->setScaledContents(true);
}

7
translations.qrc Normal file
View File

@@ -0,0 +1,7 @@
<RCC>
<qresource prefix="/translation">
<file>en_US.qm</file>
<file>ru_RU.qm</file>
</qresource>
<qresource prefix="/translations"/>
</RCC>

View File

@@ -1,27 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<TS version="2.1" language="en_US">
<context>
<name>AdjustPictureDialog</name>
<message>
<location filename="../adjustpicturedialog.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
<translation>Dialog</translation>
</message>
<message>
<location filename="../adjustpicturedialog.ui" line="58"/>
<source>Please, zoom to qr code and adjust contrast so that qr code looks sharp</source>
<translation type="unfinished"></translation>
<translation>Please, zoom to qr code and adjust contrast so that qr code looks sharp</translation>
</message>
<message>
<location filename="../adjustpicturedialog.cpp" line="39"/>
<source>QR code was not detected on that image. Please edit it again or enter data manually</source>
<translation type="unfinished"></translation>
<translation>QR code was not detected on that image. Please edit it again or enter data manually</translation>
</message>
<message>
<location filename="../adjustpicturedialog.cpp" line="41"/>
<source>No QR code</source>
<translation type="unfinished"></translation>
<translation>No QR code</translation>
</message>
</context>
<context>
@@ -29,135 +29,170 @@
<message>
<location filename="../mainwindow.ui" line="14"/>
<source>MainWindow</source>
<translation type="unfinished"></translation>
<translation>Главное окно</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="37"/>
<source>Store type</source>
<translation type="unfinished"></translation>
<translation>Store type</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="50"/>
<source>Parse</source>
<translation type="unfinished"></translation>
<translation>Parse</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="63"/>
<source>Preferences</source>
<translation type="unfinished"></translation>
<translation>Preferences</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="80"/>
<source>Text</source>
<translation type="unfinished"></translation>
<translation>Text</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="92"/>
<source>Check content</source>
<translation type="unfinished"></translation>
<translation>Check content</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="108"/>
<source>OCR</source>
<translation type="unfinished"></translation>
<translatorcomment>OCR = Optical Character Recognition</translatorcomment>
<translation>OCR</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="120"/>
<location filename="../mainwindow.ui" line="213"/>
<source>Choose</source>
<translation type="unfinished"></translation>
<translation>Choose</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="143"/>
<location filename="../mainwindow.ui" line="200"/>
<source>Path to image: </source>
<translation type="unfinished"></translation>
<translation>Path to image: </translation>
</message>
<message>
<location filename="../mainwindow.ui" line="156"/>
<source>Here is recognised check text. Please, edit it if something&apos;s wrong:</source>
<translation type="unfinished"></translation>
<translation>Here is recognised check text. Please, edit it if something&apos;s wrong:</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="175"/>
<source>OFD</source>
<translation type="unfinished"></translation>
<translatorcomment>OFD = Оператор Фискальных Данных</translatorcomment>
<translation>OFD</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="226"/>
<source>0000000000000000</source>
<translation type="unfinished"></translation>
<translation>0000000000000000</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="245"/>
<source>FN (Fiscal Number)</source>
<translation type="unfinished"></translation>
<translatorcomment>FN = Фискальный Номер</translatorcomment>
<translation>FN (Fiscal Number)</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="264"/>
<source>FD (Fiscal Document)</source>
<translation type="unfinished"></translation>
<translatorcomment>FD = Фискальный Документ</translatorcomment>
<translation>FD (Fiscal Document)</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="277"/>
<location filename="../mainwindow.ui" line="309"/>
<source>0000000000</source>
<translation type="unfinished"></translation>
<translation>000000000</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="296"/>
<source>FI (Fiscal Identifier)</source>
<translation type="unfinished"></translation>
<translatorcomment>FI = Фискальный Признак</translatorcomment>
<translation>FI (Fiscal Identifier)</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="333"/>
<source>Funds income</source>
<translation type="unfinished"></translation>
<translatorcomment>Приход средств</translatorcomment>
<translation>Funds incode</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="338"/>
<source>Funds return</source>
<translation type="unfinished"></translation>
<translatorcomment>Возврат средств</translatorcomment>
<translation>Funds return</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="343"/>
<source>Funds spend</source>
<translation type="unfinished"></translation>
<translatorcomment>Расход средств</translatorcomment>
<translation>Funds spend</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="348"/>
<source>Spends return</source>
<translation type="unfinished"></translation>
<translatorcomment>Возврат расхода</translatorcomment>
<translation>Spends return</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="375"/>
<source>Total</source>
<translation type="unfinished"></translation>
<translation>Total</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="392"/>
<source>checks parser</source>
<translation type="unfinished"></translation>
<translation>checks parser</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="85"/>
<source>Captcha was not solved correctly!</source>
<translation type="unfinished"></translation>
<translation>Captcha was not solved correctly!</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="87"/>
<source>Captcha is incorrect</source>
<translation type="unfinished"></translation>
<translation>Captcha is incorrect</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="92"/>
<source>Check not found. Please, ensure correctness of entered data.</source>
<translation type="unfinished"></translation>
<translation>Check not found. Please, ensure correctness of entered data.</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="94"/>
<source>Check was not found</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="116"/>
<source>An error has occured. Check was matched incorrectly. Vector sizes are different. Please, contact the developer.</source>
<translation>An error has occured. Check was matched incorrectly. Vector sizes are different. Please, contact the developer.</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="118"/>
<source>Error in parsing</source>
<translation>Error in parsing</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="149"/>
<source>Please, select a picture where QR code that contains info about check is present</source>
<translation>Please, select a picture where QR code that contains info about check is present</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="151"/>
<location filename="../mainwindow.cpp" line="197"/>
<source>Picture was not selected</source>
<translation>Picture was not selected</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="195"/>
<source>Please, select a picture to scan</source>
<translation>Please, select a picture to scan</translation>
</message>
</context>
<context>
@@ -165,112 +200,125 @@
<message>
<location filename="../outputdialog.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
<translation>Dialog</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="42"/>
<source>Path to export: </source>
<translation type="unfinished"></translation>
<translation>Path to export: </translation>
</message>
<message>
<location filename="../outputdialog.ui" line="55"/>
<source>Choose</source>
<translation type="unfinished"></translation>
<translation>Choose</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="68"/>
<source>Print header</source>
<translation type="unfinished"></translation>
<translation>Print header</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="82"/>
<source>Goods name</source>
<translation type="unfinished"></translation>
<translation>Goods name</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="87"/>
<source>Goods price</source>
<translation type="unfinished"></translation>
<translation>Goods price</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="92"/>
<source>Goods quantity</source>
<translation type="unfinished"></translation>
<translation>Goods quality</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="97"/>
<source>Goods net weight</source>
<translation type="unfinished"></translation>
<translation>Goods net weight</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="102"/>
<source>Goods total</source>
<translation type="unfinished"></translation>
<translation>Goods total</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="107"/>
<source>position</source>
<translation type="unfinished"></translation>
<translation>position</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="112"/>
<source>name</source>
<translation type="unfinished"></translation>
<translation>name</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="117"/>
<source>1</source>
<translation type="unfinished"></translation>
<translation>1</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="122"/>
<source>Name</source>
<translation type="unfinished"></translation>
<translation>Name</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="127"/>
<source>2</source>
<translation type="unfinished"></translation>
<translation>2</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="132"/>
<source>Price</source>
<translation type="unfinished"></translation>
<translation>Price</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="137"/>
<source>3</source>
<translation type="unfinished"></translation>
<translation>3</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="142"/>
<source>Quantity</source>
<translation type="unfinished"></translation>
<translation>Quantity</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="147"/>
<source>4</source>
<translation type="unfinished"></translation>
<translation>4</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="152"/>
<source>Net weight</source>
<translation type="unfinished"></translation>
<translation>Net Weight</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="157"/>
<source>5</source>
<translation type="unfinished"></translation>
<translation>5</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="162"/>
<source>Total price</source>
<translation type="unfinished"></translation>
<translation>Total price</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="176"/>
<source>Print total</source>
<translation type="unfinished"></translation>
<translation>Print total</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settingsdialog.cpp" line="149"/>
<source>You need to restart program to apply language changes</source>
<translation>You need to restart program to apply language changes</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="151"/>
<source>Restart required</source>
<translation>Restart required</translation>
</message>
</context>
<context>
@@ -278,17 +326,17 @@
<message>
<location filename="../solvecaptchadialog.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
<translation>Dialog</translation>
</message>
<message>
<location filename="../solvecaptchadialog.cpp" line="22"/>
<location filename="../solvecaptchadialog.cpp" line="23"/>
<source>Please, enter a valid captcha</source>
<translation type="unfinished"></translation>
<translation>Please, enter a valid captcha</translation>
</message>
<message>
<location filename="../solvecaptchadialog.cpp" line="24"/>
<location filename="../solvecaptchadialog.cpp" line="25"/>
<source>No captcha</source>
<translation type="unfinished"></translation>
<translation>No captcha</translation>
</message>
</context>
<context>
@@ -296,93 +344,108 @@
<message>
<location filename="../settingsdialog.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
<translation>Dialog</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="72"/>
<location filename="../settingsdialog.ui" line="182"/>
<source>Goods name position</source>
<translation type="unfinished"></translation>
<translation>Goods name position</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="79"/>
<location filename="../settingsdialog.ui" line="234"/>
<source>Goods price per unit alias</source>
<translation type="unfinished"></translation>
<translation>Goods price per unit alias</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="86"/>
<location filename="../settingsdialog.ui" line="217"/>
<location filename="../settingsdialog.ui" line="248"/>
<source>TextLabel</source>
<translation>Language</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="256"/>
<source>en_US</source>
<translation>en_US</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="261"/>
<source>ru_RU</source>
<translation>ru_RU</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="224"/>
<location filename="../settingsdialog.ui" line="241"/>
<source>Choose</source>
<translation type="unfinished"></translation>
<translation>Choose</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="96"/>
<location filename="../settingsdialog.ui" line="107"/>
<source>Print header</source>
<translation type="unfinished"></translation>
<translation>Print header</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="103"/>
<location filename="../settingsdialog.ui" line="150"/>
<source>Goods net weight alias</source>
<translation type="unfinished"></translation>
<translation>Goods net weight alias</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="110"/>
<location filename="../settingsdialog.ui" line="83"/>
<source>Stores modules url</source>
<translation type="unfinished"></translation>
<translation>Stores modules url</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="163"/>
<source>Goods total alias</source>
<translation>Goods total alias</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="196"/>
<source>Goods name alias</source>
<translation>Goods name alias</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="120"/>
<source>Goods total alias</source>
<translation type="unfinished"></translation>
<source>Goods quantity alias</source>
<translation>Goods quantity alias</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="210"/>
<source>Stores modules directory</source>
<translation>Stores modules directory</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="127"/>
<source>Goods name alias</source>
<translation type="unfinished"></translation>
<source>OFD modules directory</source>
<translation>OFD modules directory</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="203"/>
<source>Goods price per unit position</source>
<translation>Goods price per unit position</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="73"/>
<source>Goods net weight position</source>
<translation>Goods net weight position</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="100"/>
<source>OFD modules url</source>
<translation>OFD modules url</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="217"/>
<source>Goods total position</source>
<translation>Goods total position</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="90"/>
<source>Goods quantity position</source>
<translation>Goods quantity position</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="137"/>
<source>Goods quantity alias</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="144"/>
<source>Stores modules directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="157"/>
<source>OFD modules directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="173"/>
<source>Goods price per unit position</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="180"/>
<source>Goods net weight position</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="187"/>
<source>OFD modules url</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="197"/>
<source>Goods total position</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="204"/>
<source>Goods quantity position</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="227"/>
<source>Print total</source>
<translation type="unfinished"></translation>
<translation>Print total</translation>
</message>
</context>
</TS>

View File

@@ -6,22 +6,22 @@
<message>
<location filename="../adjustpicturedialog.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
<translation>Диалог</translation>
</message>
<message>
<location filename="../adjustpicturedialog.ui" line="58"/>
<source>Please, zoom to qr code and adjust contrast so that qr code looks sharp</source>
<translation type="unfinished"></translation>
<translation>Пожалуйста, приблизьте QR код и настройте контраст, чтобы он читался</translation>
</message>
<message>
<location filename="../adjustpicturedialog.cpp" line="39"/>
<source>QR code was not detected on that image. Please edit it again or enter data manually</source>
<translation type="unfinished"></translation>
<translation>QR код не найден на этом изображении. Пожалуйста, попытайтесь снова или введите данные вручную</translation>
</message>
<message>
<location filename="../adjustpicturedialog.cpp" line="41"/>
<source>No QR code</source>
<translation type="unfinished"></translation>
<translation>QR код не найден</translation>
</message>
</context>
<context>
@@ -29,135 +29,166 @@
<message>
<location filename="../mainwindow.ui" line="14"/>
<source>MainWindow</source>
<translation type="unfinished"></translation>
<translation>ГлавноеОкно</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="37"/>
<source>Store type</source>
<translation type="unfinished"></translation>
<translation>Магазин</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="50"/>
<source>Parse</source>
<translation type="unfinished"></translation>
<translation>Парсить</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="63"/>
<source>Preferences</source>
<translation type="unfinished"></translation>
<translation>Настройки</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="80"/>
<source>Text</source>
<translation type="unfinished"></translation>
<translation>Текст</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="92"/>
<source>Check content</source>
<translation type="unfinished"></translation>
<translation>Контент чека</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="108"/>
<source>OCR</source>
<translation type="unfinished"></translation>
<translatorcomment>Оптическое Распознавание Символов</translatorcomment>
<translation>ОСР</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="120"/>
<location filename="../mainwindow.ui" line="213"/>
<source>Choose</source>
<translation type="unfinished"></translation>
<translation>Выбрать</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="143"/>
<location filename="../mainwindow.ui" line="200"/>
<source>Path to image: </source>
<translation type="unfinished"></translation>
<translation>Путь к изображению: </translation>
</message>
<message>
<location filename="../mainwindow.ui" line="156"/>
<source>Here is recognised check text. Please, edit it if something&apos;s wrong:</source>
<translation type="unfinished"></translation>
<translation>Ниже приведён распознанный текст. Пожалуйста, отредактируйте его:</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="175"/>
<source>OFD</source>
<translation type="unfinished"></translation>
<translatorcomment>Оператор Фискальных Данных</translatorcomment>
<translation>ОФД</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="226"/>
<source>0000000000000000</source>
<translation type="unfinished"></translation>
<translation>0000000000000000</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="245"/>
<source>FN (Fiscal Number)</source>
<translation type="unfinished"></translation>
<translatorcomment>Фискальный Норма</translatorcomment>
<translation>ФН</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="264"/>
<source>FD (Fiscal Document)</source>
<translation type="unfinished"></translation>
<translatorcomment>Фискальный Документ</translatorcomment>
<translation>ФД</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="277"/>
<location filename="../mainwindow.ui" line="309"/>
<source>0000000000</source>
<translation type="unfinished"></translation>
<translation>000000000</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="296"/>
<source>FI (Fiscal Identifier)</source>
<translation type="unfinished"></translation>
<translatorcomment>Фискальный Признак</translatorcomment>
<translation>ФП</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="333"/>
<source>Funds income</source>
<translation type="unfinished"></translation>
<translation>Приход средств</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="338"/>
<source>Funds return</source>
<translation type="unfinished"></translation>
<translation>Возврат средств</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="343"/>
<source>Funds spend</source>
<translation type="unfinished"></translation>
<translation>Расход средств</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="348"/>
<source>Spends return</source>
<translation type="unfinished"></translation>
<translation>Возврат расхода</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="375"/>
<source>Total</source>
<translation type="unfinished"></translation>
<translation>Итого</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="392"/>
<source>checks parser</source>
<translation type="unfinished"></translation>
<translation>Парсер чеков</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="85"/>
<source>Captcha was not solved correctly!</source>
<translation type="unfinished"></translation>
<translation>Капча была решена неверно!</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="87"/>
<source>Captcha is incorrect</source>
<translation type="unfinished"></translation>
<translation>Капча введена неверно</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="92"/>
<source>Check not found. Please, ensure correctness of entered data.</source>
<translation type="unfinished"></translation>
<translation>Чек не найден. Пожалуйста, убедитесь в правильности введённых данных.</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="94"/>
<source>Check was not found</source>
<translation type="unfinished"></translation>
<translation>Чек не найден</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="116"/>
<source>An error has occured. Check was matched incorrectly. Vector sizes are different. Please, contact the developer.</source>
<translation>Произошла ошибка. Чек был прочитан неверно. Размеры векторов различаются. Пожалуйста, сообщите об этом разработчику.</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="118"/>
<source>Error in parsing</source>
<translation>Ошибка в парсинге</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="149"/>
<source>Please, select a picture where QR code that contains info about check is present</source>
<translation>Пожалуйста, выберете изображение, содержащее QR код с информацией о чеке</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="151"/>
<location filename="../mainwindow.cpp" line="197"/>
<source>Picture was not selected</source>
<translation>Изображение не было выбрано</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="195"/>
<source>Please, select a picture to scan</source>
<translation>Пожалуйста, выберете изображение для сканирования</translation>
</message>
</context>
<context>
@@ -165,112 +196,125 @@
<message>
<location filename="../outputdialog.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
<translation>Диалог</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="42"/>
<source>Path to export: </source>
<translation type="unfinished"></translation>
<translation>Путь для экспорта: </translation>
</message>
<message>
<location filename="../outputdialog.ui" line="55"/>
<source>Choose</source>
<translation type="unfinished"></translation>
<translation>Выбрать</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="68"/>
<source>Print header</source>
<translation type="unfinished"></translation>
<translation>Печатать заголовок</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="82"/>
<source>Goods name</source>
<translation type="unfinished"></translation>
<translation>Имя товара</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="87"/>
<source>Goods price</source>
<translation type="unfinished"></translation>
<translation>Цена товара</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="92"/>
<source>Goods quantity</source>
<translation type="unfinished"></translation>
<translation>Количество товара</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="97"/>
<source>Goods net weight</source>
<translation type="unfinished"></translation>
<translation>Масса нетто товара</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="102"/>
<source>Goods total</source>
<translation type="unfinished"></translation>
<translation>Всего за товар</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="107"/>
<source>position</source>
<translation type="unfinished"></translation>
<translation>позиция</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="112"/>
<source>name</source>
<translation type="unfinished"></translation>
<translation>алиас</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="117"/>
<source>1</source>
<translation type="unfinished"></translation>
<translation>1</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="122"/>
<source>Name</source>
<translation type="unfinished"></translation>
<translation>Имя</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="127"/>
<source>2</source>
<translation type="unfinished"></translation>
<translation>2</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="132"/>
<source>Price</source>
<translation type="unfinished"></translation>
<translation>Цена</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="137"/>
<source>3</source>
<translation type="unfinished"></translation>
<translation>3</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="142"/>
<source>Quantity</source>
<translation type="unfinished"></translation>
<translation>Количество</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="147"/>
<source>4</source>
<translation type="unfinished"></translation>
<translation>4</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="152"/>
<source>Net weight</source>
<translation type="unfinished"></translation>
<translation>Масса нетто</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="157"/>
<source>5</source>
<translation type="unfinished"></translation>
<translation>5</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="162"/>
<source>Total price</source>
<translation type="unfinished"></translation>
<translation>Всего</translation>
</message>
<message>
<location filename="../outputdialog.ui" line="176"/>
<source>Print total</source>
<translation type="unfinished"></translation>
<translation>Печатать Итого</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settingsdialog.cpp" line="149"/>
<source>You need to restart program to apply language changes</source>
<translation>Требуется перезагрузить программу, чтобы применить изменения языка</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="151"/>
<source>Restart required</source>
<translation>Требуется перезагрузка</translation>
</message>
</context>
<context>
@@ -278,17 +322,17 @@
<message>
<location filename="../solvecaptchadialog.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
<translation>Диалог</translation>
</message>
<message>
<location filename="../solvecaptchadialog.cpp" line="22"/>
<location filename="../solvecaptchadialog.cpp" line="23"/>
<source>Please, enter a valid captcha</source>
<translation type="unfinished"></translation>
<translation>Пожалуйста, введите верную капчу</translation>
</message>
<message>
<location filename="../solvecaptchadialog.cpp" line="24"/>
<location filename="../solvecaptchadialog.cpp" line="25"/>
<source>No captcha</source>
<translation type="unfinished"></translation>
<translation>Нет капчи</translation>
</message>
</context>
<context>
@@ -296,93 +340,108 @@
<message>
<location filename="../settingsdialog.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
<translation>Диалог</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="72"/>
<location filename="../settingsdialog.ui" line="182"/>
<source>Goods name position</source>
<translation type="unfinished"></translation>
<translation>Позиция имени товара</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="79"/>
<location filename="../settingsdialog.ui" line="234"/>
<source>Goods price per unit alias</source>
<translation type="unfinished"></translation>
<translation>Алиас цены товара</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="86"/>
<location filename="../settingsdialog.ui" line="217"/>
<location filename="../settingsdialog.ui" line="248"/>
<source>TextLabel</source>
<translation>Язык</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="256"/>
<source>en_US</source>
<translation>en_US</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="261"/>
<source>ru_RU</source>
<translation>ru_RU</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="224"/>
<location filename="../settingsdialog.ui" line="241"/>
<source>Choose</source>
<translation type="unfinished"></translation>
<translation>Выбрать</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="96"/>
<location filename="../settingsdialog.ui" line="107"/>
<source>Print header</source>
<translation type="unfinished"></translation>
<translation>Печатать заголовок</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="103"/>
<location filename="../settingsdialog.ui" line="150"/>
<source>Goods net weight alias</source>
<translation type="unfinished"></translation>
<translation>Алиас массы нетто товара</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="110"/>
<location filename="../settingsdialog.ui" line="83"/>
<source>Stores modules url</source>
<translation type="unfinished"></translation>
<translation>URL модулей магазина</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="163"/>
<source>Goods total alias</source>
<translation>Алиас всего за продукт</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="196"/>
<source>Goods name alias</source>
<translation>Алиас имени товара</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="120"/>
<source>Goods total alias</source>
<translation type="unfinished"></translation>
<source>Goods quantity alias</source>
<translation>Алиас количества товара</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="210"/>
<source>Stores modules directory</source>
<translation>Директория модулей магазина</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="127"/>
<source>Goods name alias</source>
<translation type="unfinished"></translation>
<source>OFD modules directory</source>
<translation>Директория модулей ОФД</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="203"/>
<source>Goods price per unit position</source>
<translation>Позиция центы товара</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="73"/>
<source>Goods net weight position</source>
<translation>Позиция массы нетто товара</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="100"/>
<source>OFD modules url</source>
<translation>URL модулей ОФД</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="217"/>
<source>Goods total position</source>
<translation>Позиция всего за товар</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="90"/>
<source>Goods quantity position</source>
<translation>Позиция количества товара</translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="137"/>
<source>Goods quantity alias</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="144"/>
<source>Stores modules directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="157"/>
<source>OFD modules directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="173"/>
<source>Goods price per unit position</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="180"/>
<source>Goods net weight position</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="187"/>
<source>OFD modules url</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="197"/>
<source>Goods total position</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="204"/>
<source>Goods quantity position</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.ui" line="227"/>
<source>Print total</source>
<translation type="unfinished"></translation>
<translation>Печатать Итого</translation>
</message>
</context>
</TS>