Translation has been updated

This commit is contained in:
Arin Alexander 2017-08-05 01:38:19 +03:00
parent 881089fd2f
commit 8c5a9fcd91
21 changed files with 575 additions and 38 deletions

View File

@ -72,6 +72,7 @@ class LIMEREPORT_EXPORT ReportEngine : public QObject{
Q_OBJECT
friend class ReportDesignWidget;
friend class PreviewReportWidget;
friend class TranslationEditor;
public:
static void setSettings(QSettings *value){m_settings=value;}
public:

View File

@ -72,6 +72,7 @@ SOURCES += \
$$REPORT_PATH/items/lrtextitemeditor.cpp \
$$REPORT_PATH/items/lrshapeitem.cpp \
$$REPORT_PATH/items/lrtextitem.cpp \
$$REPORT_PATH/translationeditor/translationeditor.cpp \
$$REPORT_PATH/lrbanddesignintf.cpp \
$$REPORT_PATH/lrpageitemdesignintf.cpp \
$$REPORT_PATH/lrpagedesignintf.cpp \
@ -172,6 +173,7 @@ HEADERS += \
$$REPORT_PATH/items/lrshapeitem.h \
$$REPORT_PATH/items/lrimageitem.h \
$$REPORT_PATH/items/lrsimpletagparser.h \
$$REPORT_PATH/translationeditor/translationeditor.h \
$$REPORT_PATH/lrfactoryinitializer.h \
$$REPORT_PATH/lrbanddesignintf.h \
$$REPORT_PATH/lrpageitemdesignintf.h \
@ -229,12 +231,13 @@ FORMS += \
$$REPORT_PATH/lraboutdialog.ui \
$$REPORT_PATH/lrsettingdialog.ui \
$$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \
$$REPORT_PATH/items/lrchartitemeditor.ui
$$REPORT_PATH/items/lrchartitemeditor.ui \
$$REPORT_PATH/translationeditor/translationeditor.ui
RESOURCES += \
$$REPORT_PATH/objectinspector/lobjectinspector.qrc \
$$REPORT_PATH/databrowser/lrdatabrowser.qrc \
$$REPORT_PATH/report.qrc \
$$REPORT_PATH/items/items.qrc \
$$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc
$$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \
$$REPORT_PATH/translationeditor/translationeditor.qrc

View File

@ -86,7 +86,6 @@ contains(CONFIG,zint){
}
}
#######
####Automatically build required translation files (*.qm)
contains(CONFIG,build_translations){

View File

@ -34,6 +34,7 @@
#include "lrbasedesignintf.h"
#include "lrsettingdialog.h"
#include "dialogdesigner/lrdialogdesigner.h"
#include "translationeditor/translationeditor.h"
#include <QDebug>
#include <QObject>
@ -137,6 +138,7 @@ ReportDesignWidget::EditorTabType ReportDesignWidget::activeTabType()
QString tabType = m_tabWidget->tabWhatsThis(m_tabWidget->currentIndex());
if ( tabType.compare("dialog") == 0) return Dialog;
if ( tabType.compare("script") == 0) return Script;
if ( tabType.compare("translations") == 0) return Translations;
return Page;
}
@ -245,10 +247,13 @@ void ReportDesignWidget::createTabs(){
dialogDesigner = m_dialogDesignerManager->createFormEditor(dialogDesc->description());
pageIndex = m_tabWidget->addTab(dialogDesigner,QIcon(),dialogDesc->name());
m_tabWidget->setTabWhatsThis(pageIndex,"dialog");
}
#endif
m_traslationEditor = new TranslationEditor(this);
pageIndex = m_tabWidget->addTab(m_traslationEditor,QIcon(),tr("Translations"));
m_tabWidget->setTabWhatsThis(pageIndex,"translations");
}
#ifdef HAVE_QTDESIGNER_INTEGRATION
@ -771,6 +776,9 @@ void ReportDesignWidget::slotCurrentTabChanged(int index)
}
updateDialogs();
#endif
if (activeTabType() == Translations){
m_traslationEditor->setReportEngine(report());
}
emit activePageChanged();
}

View File

@ -50,6 +50,7 @@ class DataBrowser;
class ReportDesignWindow;
class DialogDesignerManager;
class DialogDesigner;
class TranslationEditor;
class ReportDesignWidget : public QWidget
{
@ -67,7 +68,8 @@ public:
enum EditorTabType{
Page,
Dialog,
Script
Script,
Translations
};
ReportDesignWidget(ReportEngine* report, QMainWindow *mainWindow, QWidget *parent = 0);
~ReportDesignWidget();
@ -186,6 +188,7 @@ private:
ReportEnginePrivate* m_report;
QGraphicsView *m_view;
QTextEdit* m_scriptEditor;
TranslationEditor* m_traslationEditor;
#ifdef HAVE_QTDESIGNER_INTEGRATION
DialogDesignerManager* m_dialogDesignerManager;
#endif

View File

@ -167,6 +167,15 @@ void ReportEnginePrivate::showError(QString message)
QMessageBox::critical(0,tr("Error"),message);
}
void ReportEnginePrivate::updateTranslations()
{
foreach(ReportTranslation* translation, m_translations.values()){
foreach(PageDesignIntf* page, m_pages){
translation->updatePageTranslation(page);
}
}
}
void ReportEnginePrivate::slotDataSourceCollectionLoaded(const QString &collectionName)
{
emit datasourceCollectionLoadFinished(collectionName);
@ -775,11 +784,11 @@ bool ReportEnginePrivate::setReportLanguage(QLocale::Language language){
foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){
PageDesignIntf* page = getPageByName(pageTranslation->pageName);
if (page){
foreach(ItemTranslation itemTranslation, pageTranslation->itemsTranslation){
BaseDesignIntf* item = page->pageItem()->childByName(itemTranslation.itemName);
foreach(ItemTranslation* itemTranslation, pageTranslation->itemsTranslation){
BaseDesignIntf* item = page->pageItem()->childByName(itemTranslation->itemName);
if (item) {
foreach(PropertyTranslation propertyTranslation, itemTranslation.propertyesTranslation){
item->setProperty(propertyTranslation.propertyName.toLatin1(),propertyTranslation.value);
foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){
item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value);
}
}
}

View File

@ -72,6 +72,7 @@ class LIMEREPORT_EXPORT ReportEngine : public QObject{
Q_OBJECT
friend class ReportDesignWidget;
friend class PreviewReportWidget;
friend class TranslationEditor;
public:
static void setSettings(QSettings *value){m_settings=value;}
public:

View File

@ -135,7 +135,6 @@ public:
bool setReportLanguage(QLocale::Language language);
QList<QLocale::Language> aviableLanguages();
ReportTranslation* reportTranslation(QLocale::Language language);
signals:
void pagesLoadFinished();
void datasourceCollectionLoadFinished(const QString& collectionName);
@ -166,6 +165,7 @@ private:
//ICollectionContainer
//ITranslationContainer
Translations* translations(){ return &m_translations;}
void updateTranslations();
//ITranslationContainer
ReportPages renderToPages();
QString renderToString();

View File

@ -34,22 +34,65 @@ PageTranslation* ReportTranslation::createPageTranslation(PageDesignIntf* page)
PageTranslation* pageTranslation = new PageTranslation;
pageTranslation->pageName = page->objectName();
foreach(BaseDesignIntf* item, page->pageItem()->allChildBaseItems()){
QMap<QString,QString> stringsForTranslation = item->getStringForTranslation();
if (!stringsForTranslation.isEmpty()){
ItemTranslation itemTranslation;
itemTranslation.itemName = item->objectName();
foreach(QString propertyName, stringsForTranslation.keys()){
PropertyTranslation propertyTranslation;
propertyTranslation.propertyName = propertyName;
propertyTranslation.value = stringsForTranslation.value(propertyName);
itemTranslation.propertyesTranslation.append(propertyTranslation);
}
pageTranslation->itemsTranslation.append(itemTranslation);
}
createItemTranslation(item, pageTranslation);
}
return pageTranslation;
}
void ReportTranslation::createItemTranslation(BaseDesignIntf* item, PageTranslation* pageTranslation){
QMap<QString,QString> stringsForTranslation = item->getStringForTranslation();
if (!stringsForTranslation.isEmpty()){
ItemTranslation* itemTranslation = new ItemTranslation;
itemTranslation->itemName = item->objectName();
foreach(QString propertyName, stringsForTranslation.keys()){
PropertyTranslation* propertyTranslation = new PropertyTranslation;
propertyTranslation->propertyName = propertyName;
propertyTranslation->value = stringsForTranslation.value(propertyName);
propertyTranslation->sourceValue = stringsForTranslation.value(propertyName);
propertyTranslation->checked = false;
propertyTranslation->sourceHasBeenChanged = false;
itemTranslation->propertyesTranslation.append(propertyTranslation);
}
pageTranslation->itemsTranslation.insert(itemTranslation->itemName, itemTranslation);
}
}
PageTranslation* ReportTranslation::findPageTranslation(const QString& page_name)
{
foreach(PageTranslation* page, m_pagesTranslation){
if (page->pageName.compare(page_name) == 0){
return page;
}
}
return 0;
}
void ReportTranslation::updatePageTranslation(PageDesignIntf* page)
{
PageTranslation* pageTranslation = findPageTranslation(page->objectName());
if (!pageTranslation){
pageTranslation = createPageTranslation(page);
m_pagesTranslation.append(pageTranslation);
}
if (pageTranslation){
foreach(BaseDesignIntf* item, page->pageItem()->allChildBaseItems()){
QMap<QString,QString> stringsForTranslation = item->getStringForTranslation();
if (!stringsForTranslation.isEmpty()){
ItemTranslation* itemTranslation = pageTranslation->itemsTranslation.value(item->objectName());
if (itemTranslation){
foreach(QString propertyName, stringsForTranslation.keys()){
PropertyTranslation* propertyTranslation = itemTranslation->findProperty(propertyName);
propertyTranslation->sourceValue = stringsForTranslation.value(propertyName);
propertyTranslation->sourceHasBeenChanged = propertyTranslation->value != propertyTranslation->sourceValue;
}
} else {
createItemTranslation(item, pageTranslation);
}
}
}
}
}
QList<PageTranslation*> ReportTranslation::pagesTranslation() const
{
return m_pagesTranslation;
@ -67,4 +110,28 @@ QLocale::Language ReportTranslation::language() const
return m_language;
}
PropertyTranslation* ItemTranslation::findProperty(const QString& propertyName)
{
foreach(PropertyTranslation* propertyTranslation, propertyesTranslation){
if (propertyTranslation->propertyName.compare(propertyName) == 0){
return propertyTranslation;
}
}
return 0;
}
ItemTranslation::~ItemTranslation()
{
foreach(PropertyTranslation* property, propertyesTranslation){
delete property;
}
}
PageTranslation::~PageTranslation()
{
foreach(ItemTranslation* item, itemsTranslation){
delete item;
}
}
} //namespace LimeReport

View File

@ -24,16 +24,22 @@ namespace LimeReport{
struct PropertyTranslation{
QString propertyName;
QString value;
QString sourceValue;
bool checked;
bool sourceHasBeenChanged;
};
struct ItemTranslation{
QString itemName;
QList<PropertyTranslation> propertyesTranslation;
PropertyTranslation* findProperty(const QString& propertyName);
~ItemTranslation();
QList<PropertyTranslation*> propertyesTranslation;
};
struct PageTranslation{
QString pageName;
QList<ItemTranslation> itemsTranslation;
~PageTranslation();
QHash<QString,ItemTranslation*> itemsTranslation;
};
class ReportTranslation{
@ -45,6 +51,9 @@ public:
QLocale::Language language() const;
QList<PageTranslation*> pagesTranslation() const;
PageTranslation* createEmptyPageTranslation();
void updatePageTranslation(PageDesignIntf* page);
PageTranslation* findPageTranslation(const QString& page_name);
void createItemTranslation(BaseDesignIntf* item, PageTranslation* pageTranslation);
private:
PageTranslation* createPageTranslation(PageDesignIntf* page);
private:
@ -58,6 +67,7 @@ typedef QMap<QLocale::Language, ReportTranslation*> Translations;
class ITranslationContainer{
public:
virtual Translations* translations() = 0;
virtual void updateTranslations() = 0;
};
} // namespace LimeReport

View File

@ -217,16 +217,18 @@ void XMLReader::readTranslation(QObject* item, QDomElement* node)
pageTranslation->pageName = pageNode.nodeName();
for (int itemIndex = 0; itemIndex < pageNode.childNodes().count(); ++itemIndex){
QDomElement itemNode = pageNode.childNodes().at(itemIndex).toElement();
ItemTranslation itemTranslation;
itemTranslation.itemName = itemNode.nodeName();
ItemTranslation* itemTranslation = new ItemTranslation();
itemTranslation->itemName = itemNode.nodeName();
for (int propertyIndex = 0; propertyIndex < itemNode.childNodes().count(); ++propertyIndex){
QDomElement propertyNode = itemNode.childNodes().at(propertyIndex).toElement();
PropertyTranslation propertyTranslation;
propertyTranslation.propertyName = propertyNode.nodeName();
propertyTranslation.value = propertyNode.attribute("Value");
itemTranslation.propertyesTranslation.append(propertyTranslation);
PropertyTranslation* propertyTranslation = new PropertyTranslation;
propertyTranslation->propertyName = propertyNode.nodeName();
propertyTranslation->value = propertyNode.attribute("Value");
propertyTranslation->sourceValue = propertyNode.attribute("SourceValue");
propertyTranslation->checked = propertyNode.attribute("Checked").compare("Y") == 0;
itemTranslation->propertyesTranslation.append(propertyTranslation);
}
pageTranslation->itemsTranslation.append(itemTranslation);
pageTranslation->itemsTranslation.insert(itemTranslation->itemName, itemTranslation);
}
}
translations->insert(curTranslation->language(),curTranslation);

View File

@ -230,12 +230,14 @@ void XMLWriter::saveTranslation(QString propertyName, QObject* item, QDomElement
foreach(PageTranslation* page, curTranslation->pagesTranslation()){
QDomElement pageNode = m_doc->createElement(page->pageName);
languageNode.appendChild(pageNode);
foreach(ItemTranslation item, page->itemsTranslation){
QDomElement itemNode = m_doc->createElement(item.itemName);
foreach(ItemTranslation* item, page->itemsTranslation){
QDomElement itemNode = m_doc->createElement(item->itemName);
pageNode.appendChild(itemNode);
foreach(PropertyTranslation property, item.propertyesTranslation){
QDomElement propertyNode = m_doc->createElement(property.propertyName);
propertyNode.setAttribute("Value",property.value);
foreach(PropertyTranslation* property, item->propertyesTranslation){
QDomElement propertyNode = m_doc->createElement(property->propertyName);
propertyNode.setAttribute("Value",property->value);
propertyNode.setAttribute("SourceValue", property->sourceValue);
propertyNode.setAttribute("Checked", property->checked ? "Y":"N");
itemNode.appendChild(propertyNode);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

View File

@ -0,0 +1,165 @@
#include "translationeditor.h"
#include "ui_translationeditor.h"
#include "lrreportengine.h"
#include "lrreportengine_p.h"
#include "lrreporttranslation.h"
namespace LimeReport {
TranslationEditor::TranslationEditor(QWidget *parent) :
QWidget(parent),
ui(new Ui::TranslationEditor), m_translationContainer(0)
{
ui->setupUi(this);
ui->splitter_3->setStretchFactor(1,10);
ui->splitter_3->setStretchFactor(0,2);
ui->splitter_2->setStretchFactor(1,2);
ui->splitter->setStretchFactor(0,2);
QTableWidgetItem* item = new QTableWidgetItem();
item->setIcon(QIcon(":/translationeditor/images/checked.png"));
ui->tbStrings->setColumnCount(4);
ui->tbStrings->setColumnWidth(0,30);
ui->tbStrings->setColumnWidth(1,100);
ui->tbStrings->setColumnWidth(2,100);
ui->tbStrings->setHorizontalHeaderItem(0,item);
ui->tbStrings->setHorizontalHeaderItem(1,new QTableWidgetItem(tr("Report Item")));
ui->tbStrings->setHorizontalHeaderItem(2,new QTableWidgetItem(tr("Property")));
ui->tbStrings->setHorizontalHeaderItem(3,new QTableWidgetItem(tr("Source text")));
//ui->tbStrings->setSortingEnabled(true);
}
void TranslationEditor::setReportEngine(ITranslationContainer* translationContainer)
{
m_translationContainer = translationContainer;
if (m_translationContainer){
m_translationContainer->updateTranslations();
updateUi();
}
}
TranslationEditor::~TranslationEditor()
{
delete ui;
}
void TranslationEditor::updateUi()
{
ui->lvLanguages->clear();
Q_ASSERT(m_translationContainer != 0);
if (m_translationContainer){
Translations* translations = m_translationContainer->translations();
Q_ASSERT(translations != 0);
if (translations){
foreach(QLocale::Language language, translations->keys()){
ui->lvLanguages->addItem(QLocale::languageToString(language));
}
if (!translations->keys().isEmpty()){
ui->lvLanguages->item(0)->setSelected(true);
activateLanguage(translations->keys().at(0));
}
}
}
}
void TranslationEditor::activateLanguage(QLocale::Language language)
{
ui->teTranslation->setEnabled(false);
ui->cbChecked->setEnabled(false);
ui->twPages->clear();
Translations* translations = m_translationContainer->translations();
Q_ASSERT(translations != 0);
if (translations){
m_currentReportTranslation = translations->value(language);
Q_ASSERT(m_currentReportTranslation != 0);
if (m_currentReportTranslation){
foreach(PageTranslation* pageTranslation, m_currentReportTranslation->pagesTranslation()){
QTreeWidgetItem* pageItem = new QTreeWidgetItem();
pageItem->setText(0,pageTranslation->pageName);
ui->twPages->addTopLevelItem(pageItem);
}
}
if (ui->twPages->topLevelItem(0)){
ui->twPages->topLevelItem(0)->setSelected(true);
activatePage(m_currentReportTranslation->findPageTranslation(ui->twPages->topLevelItem(0)->text(0)));
}
}
}
void TranslationEditor::activatePage(PageTranslation* pageTranslation)
{
ui->teTranslation->setEnabled(false);
ui->cbChecked->setEnabled(false);
Q_ASSERT(pageTranslation != 0);
if(pageTranslation){
ui->tbStrings->clearContents();
ui->tbStrings->setRowCount(0);
m_currentPageTranslation = pageTranslation;
QStringList items = pageTranslation->itemsTranslation.keys();
items.sort();
foreach(QString itemName, items){
ItemTranslation* itemTranslation = pageTranslation->itemsTranslation.value(itemName);
int rowIndex = ui->tbStrings->rowCount();
ui->tbStrings->setRowCount(rowIndex+1);
foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){
QTableWidgetItem* checkItem = new QTableWidgetItem();
if (propertyTranslation->checked)
checkItem->setIcon(QIcon(":/translationeditor/images/checked.png"));
ui->tbStrings->setItem(rowIndex,0,checkItem);
ui->tbStrings->setItem(rowIndex,1,new QTableWidgetItem(itemTranslation->itemName));
ui->tbStrings->setItem(rowIndex,2,new QTableWidgetItem(propertyTranslation->propertyName));
ui->tbStrings->setItem(rowIndex,3,new QTableWidgetItem(propertyTranslation->sourceValue));
}
}
}
}
void TranslationEditor::activateTranslation(const QString& itemName, const QString& propertyName)
{
Q_ASSERT(m_currentPageTranslation != 0);
if (m_currentPageTranslation){
ItemTranslation* itemTranslation = m_currentPageTranslation->itemsTranslation.value(itemName);
Q_ASSERT(itemTranslation !=0 );
if (itemTranslation){
m_currentPropertyTranslation = m_currentPageTranslation->itemsTranslation.value(itemName)->findProperty(propertyName);
Q_ASSERT(m_currentPropertyTranslation != 0);
if (m_currentPropertyTranslation){
ui->teTranslation->setEnabled(true);
ui->cbChecked->setEnabled(true);
ui->teTranslation->setText(m_currentPropertyTranslation->value);
ui->cbChecked->setChecked(m_currentPropertyTranslation->checked);
}
}
}
}
void TranslationEditor::on_tbStrings_itemSelectionChanged()
{
activateTranslation(ui->tbStrings->item(ui->tbStrings->currentRow(),1)->text(), ui->tbStrings->item(ui->tbStrings->currentRow(),2)->text());
}
void TranslationEditor::on_teTranslation_textChanged()
{
m_currentPropertyTranslation->value = ui->teTranslation->toPlainText();
}
void TranslationEditor::on_cbChecked_toggled(bool checked)
{
m_currentPropertyTranslation->checked = checked;
ui->tbStrings->item(ui->tbStrings->currentRow(),0)->setIcon(checked ? QIcon(":/translationeditor/images/checked.png"):QIcon());
}
void TranslationEditor::on_twPages_itemSelectionChanged()
{
if (!ui->twPages->selectedItems().isEmpty()){
activatePage(m_currentReportTranslation->findPageTranslation(ui->twPages->selectedItems().at(0)->text(0)));
}
}
} //namespace LimeReport

View File

@ -0,0 +1,45 @@
#ifndef TRANSLATIONEDITOR_H
#define TRANSLATIONEDITOR_H
#include <QWidget>
#include <QLocale>
#include <QTreeWidgetItem>
#include "lrreporttranslation.h"
namespace LimeReport {
namespace Ui {
class TranslationEditor;
}
class TranslationEditor : public QWidget
{
Q_OBJECT
public:
explicit TranslationEditor(QWidget *parent = 0);
void setReportEngine(ITranslationContainer* translationContainer);
~TranslationEditor();
void updateUi();
void activateLanguage(QLocale::Language language);
void activatePage(PageTranslation* pageTranslation);
void activateTranslation(const QString& itemName, const QString& propertyName);
private slots:
void on_tbStrings_itemSelectionChanged();
void on_teTranslation_textChanged();
void on_cbChecked_toggled(bool checked);
void on_twPages_itemSelectionChanged();
private:
Ui::TranslationEditor *ui;
ITranslationContainer* m_translationContainer;
QMap<QString, ReportTranslation*> m_reportTranslations;
QMap<QString, PageTranslation> m_pageTranslations;
ReportTranslation* m_currentReportTranslation;
PageTranslation* m_currentPageTranslation;
PropertyTranslation* m_currentPropertyTranslation;
};
} //namespace LimeReport
#endif // TRANSLATIONEDITOR_H

View File

@ -0,0 +1,8 @@
<RCC>
<qresource prefix="/translationeditor">
<file>images/add.png</file>
<file>images/remove.png</file>
<file>images/checked.png</file>
<file>images/question.png</file>
</qresource>
</RCC>

View File

@ -0,0 +1,214 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LimeReport::TranslationEditor</class>
<widget class="QWidget" name="LimeReport::TranslationEditor">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>873</width>
<height>525</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QSplitter" name="splitter_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QFrame" name="frame_2">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QSplitter" name="splitter_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Languages</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="toolButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="translationeditor.qrc">
<normaloff>:/translationeditor/images/add.png</normaloff>:/translationeditor/images/add.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="toolButton_2">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="translationeditor.qrc">
<normaloff>:/translationeditor/images/remove.png</normaloff>:/translationeditor/images/remove.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QListWidget" name="lvLanguages"/>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Pages</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeWidget" name="twPages">
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Strings</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QTableWidget" name="tbStrings">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="columnCount">
<number>2</number>
</property>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string/>
</property>
</column>
<column>
<property name="text">
<string>Source Text</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Translation</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QTextEdit" name="teTranslation"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="cbChecked">
<property name="text">
<string>Checked</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="translationeditor.qrc"/>
</resources>
<connections/>
</ui>