2013-03-21 7 views
4

번역의 일부 측면에서 Qt 문서가 매우 장황하지 않은 것으로 나타났습니다. 나는 그들의 행동을 재판 & 오류를 사용하여 파악하려고 노력하면서 장난하고 있었다. 궁극적 인 목표는 런타임에 번역이 변경되도록하는 것이지만 QTranslator 객체를 어느 정도까지 재사용 할 수 있는지에 대해서는 매우 혼란 스럽습니다.qt Q 번역기 재사용

이가 (여기서 'A'응용 프로그램의 기본 인스턴스) 고려 :

QTranslator translator; 
translator.load("mytranslation_cz"); 
a.installTranslation(&translator); 

(...) 

a.removeTranslation(&translator) 

지금은 번역기가 응용 프로그램에서 제거하지만이 번역기 객체에 일어 났는가? 내 테스트에서

이 코드 위에 다시

translator.load("mytranslation_fr"); 
a.installTranslation(&translator); 

가 메인에서 아무것도()하지 않았다이 다음에하고 위젯 중 하나를 호출하면 응용 프로그램이 충돌 할 때 (주요 애플 리케이션에 대한 포인터를 사용) .

따라서 응용 프로그램에서로드 할 변환 당 하나의 QTranslator 개체를 만들어야한다고 의심하고 있습니다. QTranslator 개체를 다시 사용할 수 없습니다.. 이 가정에 내가 맞습니까?

그리고 부탁드립니다. QTranslator 객체가 removeTranslation()에 의해 영향을받지 않는다고 가정하면, 이것을 나중에 다시 설치할 수 있습니까? 내가 설치 및 QTranslation 객체가 어떻게 든 런타임에서 여러 번역을 위해 재사용 될 수있다 특히 응용 프로그램 및 에서 번역을 제거 할 때 QTranslation 객체에 무슨 일에 관해서는 다소 혼란 스러워요 어떠한 해명

QTranslator translator; 
QTranslator translator1; 
translator.load("mytranslation_cz"); 
translator1.load("mytranslation_fr"); 
a.installTranslation(&translator); 
(...) 
a.removeTranslation(&translator); 
a.installTranslation(&translator1); 
(...) 
a.removeTranslation(&translator1); 
a.installTranslation(&trasnlator); //Will this work? 

감사합니다?

답변

6

QTranslator::load은 기본적으로 주어진 .qm 파일을 열고, 모든 변환 된 값을 읽어 특정 언어로로드하는 기능으로 간주 할 수 있습니다.

이제는 일반 언어로 사용할 때마다 UI 언어를 전환 할 때마다 모든 단어에 대해이 .qm 파일을 구문 분석하는 오버 헤드를 추가하여 "재사용"(허용하더라도)으로 여러 언어에 대해이 코드를 다시 사용하고 싶지 않습니다. 이것은 기본적으로 당신이 필요로하지 않는 오버 헤드 일뿐입니다.

각 언어에 QTranslator을 작성한다고 가정하십시오. 귀하의 측면 질문에 관해서는 예, 당신은 또한 그것을 다시 사용할 수 있습니다. 번역 당 개별 객체가 QTranslator 인 이점이 있습니다. 현재 번역본이있는 qApp->removeTranslator()으로 전화 한 후 qApp->installTranslator()을 새로 번역하십시오. 이렇게하면로드 된 번역을 원하는 때에 다시 사용할 수 있습니다.

우리는이 구조 방법을 QApplication 서브 클래스라는 2 개 기능 지금이 함수는 애플리케이션의 바로 시작에서 호출

void Application::CreateTranslators() { 
    // translators_ is a QMap<QString, QTranslator*> 
    if (!translators_.isEmpty()) 
    return; 
    QStringList languages; 
    languages << "en" << "ar" << "zh"; 
    foreach(QString language, languages) { 
    QTranslator* translator = new QTranslator(instance()); 
    translator->load(language); 
    translators_.insert(language, translator); 
    } 
} 

를 추가한다.

두번째 기능은 그것 뿐이다

void Application::SwitchLanguage(QString language) { 
    // current_translator_ is a QTranslator* 
    if (current_translator_) 
    removeTranslator(current_translator_); 

    current_translator_ = translators_.value(language, nullptr); 
    if (current_translator_) 
    installTranslator(current_translator_); 
} 

을 다음과 같습니다. 두 번째 기능을 사용하면 런타임에 언어를 전환 할 수 있습니다.

변경 사항을 알고 있어야하는 몇 가지 사항 런타임시 QTranslator은 번역시 자동으로 표시된 파일 문자열 .ui에서 모든 번역을 업데이트하지만 코드에서 설정된 파일 문자열은 자동으로 번역되지 않습니다. 당신이 QWidget::changeEvent()를 무시하고 다음 이벤트 유형 QEvent::LanguageChange 인 경우 확인하고 그에 따라 그 QWidget에 필요한 문자열을 설정해야합니다 것을 얻으려면

(그렇게하는 동안 tr()을 잊지 마세요)