2011-10-06 17 views
7

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?

Odpowiedz

4

Podejrzewam, to ze względu na fakt, że:

m_pButton = new MyWidget(tr("TEST")); 

definiuje ciąg w kontekście MainWindow i spróbować przetłumaczyć TEST w kontekście MyWidget. Można tego uniknąć, stosując metodę statyczną tr() na QObject. To zdefiniuje TEST jako tłumaczenie w kontekście globalnym QObject. Można tego dokonać poprzez dostosowanie przycisk widget kod tworzenia następująco:

m_pButton = new MyWidget(QObject::tr("TEST")); 

aw MyWidget::retranslate():

setText(QObject::tr(name().toStdString().c_str())); 

Uwaga że trzeba regenerować swoje pliki tłumaczeniowe dla tej pracy!

+0

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

Powiązane problemy