我正在编写一个API,用于在工作中创建接口。 API允许用户从一组预先构建的小部件和布局中进行选择,以便可以在短时间内为不同的单元创建多个接口。将有两个翻译文件;一个用于API小部件(随库一起提供),另一个用于开发人员将在界面中为自定义数据创建的小部件。为了使开发人员更容易,我希望API通过将数据名称传递给API来处理所有翻译,但我遇到了绊脚石;我无法让翻译人员识别发送给它的翻译文本,但它会识别本地文字字符串。
这是我正在谈论的一个简短例子。
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();
}
我手动输入了这个,所以可能会有一些拼写错误,但这个概念仍然适用 - 你必须在同一个类中调用setText设置你的文字字符串。如果你把一个文字传递给这个类,就像我在这里做的那样,它会被忽略。如果我在课堂上制作文字就行了。这是一个问题,因为我希望开发人员将文字传递给类,然后让它进行翻译。开发人员仍然需要自己翻译,但我不希望他们担心处理翻译。
我做错了什么或这是Qt限制?
答案 0 :(得分:5)
我怀疑这是因为:
m_pButton = new MyWidget(tr("TEST"));
在MainWindow
的上下文中定义了一个字符串,并尝试在TEST
的上下文中翻译MyWidget
。您可以使用tr()
上的静态QObject
方法来避免这种情况。这会将TEST
定义为全局QObject
上下文中的翻译。这可以通过调整按钮小部件创建代码来完成,如下所示:
m_pButton = new MyWidget(QObject::tr("TEST"));
和MyWidget::retranslate()
:
setText(QObject::tr(name().toStdString().c_str()));
请注意,您需要重新生成翻译文件才能使其正常工作!