Piszę API do wykorzystania w tworzeniu interfejsów w pracy. Interfejs API pozwala użytkownikowi wybierać z zestawu gotowych widgetów i układów, dzięki czemu w krótkim czasie można utworzyć wiele interfejsów dla różnych jednostek. Będą dwa pliki tłumaczeniowe; jeden dla widżetów API (które są dostarczane z biblioteką) i drugi, który programista utworzy dla niestandardowych danych w interfejsie. Aby ułatwić programistom, chciałem, aby interfejs API obsługiwał całe tłumaczenie, przekazując nazwę danych do interfejsu API, ale doszedłem do potknięcia; Nie mogę przekonać tłumacza do rozpoznania przetłumaczonego tekstu wysłanego do niego, ale rozpozna on lokalne ciągi literalne.Jak uzyskać tłumaczenie na pracę poza zajęciami?
Oto krótki przykład tego, o czym mówię.
class Object
{
public:
Object(QString name) { m_Name = name; };
QString name() { return m_Name; };
private:
QString m_Name;
};
class MyWidget : public QPushButton, public Object
{
Q_OBJECT
public:
MyWidget(QString name);
~MyWidget();
void retranslate();
protected slots:
void buttonPressed();
void changeEvent(QEvent* event);
private:
enum Language { ENGLISH, JAPANESE };
Language m_Language;
QTranslator* m_pTranslator;
};
MyWidget::MyWidget(QString name)
:Object(name) // this does not work, but :Object(tr("TEST")) does
{
m_pTranslator = new QTranslator();
m_Language = ENGLISH;
connect(this, SIGNAL(pressed()), this, SLOT(buttonPressed()));
retranslate();
}
MyWidget::~MyWidget()
{
delete m_pTranslator();
}
void MyWidget::buttonPressed()
{
std::string qm;
m_Language == ENGLISH ? m_Language = JAPANESE : m_Language = ENGLISH;
m_Language == ENGLISH ? qm = "lang_en" : qm = "lang_jp";
qApp->removeTranslator(m_pTranslator);
if(!m_pTranslator->load(qm.c_str()))
std::cout << "Error loading translation file\n";
qApp->installTranslator(m_pTranslator);
}
void MyWidget::retranslate()
{
setText(tr(name().toStdString().c_str()));
}
void MyWidget::changeEvent(QEvent* event)
{
if(event->type() == QEvent::LanguageChange)
retranslate();
else
QWidget::changeEvent(event);
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
~MainWindow();
private:
MyWidget* m_pButton;
};
MainWindow::MainWindow()
{
m_pButton = new MyWidget(tr("TEST")); // this is what I want to do, but this will not translate
setCentralWidget(m_pButton);
}
MainWindow::~MainWindow()
{
delete m_pButton;
}
// main.cpp
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
Wpisałem to się ręcznie, więc nie może być kilka literówek, ale koncepcja nadal jest prawdą - trzeba zadzwonić setText w tej samej klasie Twój Określ ciągiem znaków. Jeśli przekażesz literał do klasy, tak jak ja to robię, zostanie to zignorowane. Jeśli zrobię literał w klasie, to działa dobrze. Jest to problem, ponieważ chcę, aby programista przekazał literał do klasy, a następnie pozwolił mu wykonać tłumaczenie. Deweloper będzie nadal musiał tworzyć własne tłumaczenia, ale nie chcę, aby obawiali się obsługi tłumaczeń.
Czy robię coś nie tak, czy to jest ograniczenie Qt?
Tak, naprawiłem to! Linguist umieszcza teraz wszystkie tłumaczenia pod QObject, zamiast dzielić je na klasy takie jak wcześniej, ale to nie jest tak naprawdę ważny problem i jestem bardziej zadowolony z tego rozwiązania. – Richard