如何让翻译在课外工作?

时间:2011-10-06 17:18:34

标签: qt translation

我正在编写一个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限制?

1 个答案:

答案 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()));

请注意,您需要重新生成翻译文件才能使其正常工作!