Qt인터페이스에서 다국적 언어 전환 실례 실현

26415 단어
Qt인터페이스가 다국적 언어의 전환 실례를 실현하는 것은 본고에서 소개하고자 하는 내용으로 Qt인터페이스가 비교적 잘 실현된 개발이라고 여겨왔다.다중 국어 인터페이스의 실현은 MFC에서 매우 어색하다.이전에 MFC를 만들 때 다국적 언어의 인터페이스를 실현했고 자원 파일을 각 언어의 자원 DLL로 만들었을 뿐이다. 프로그램이 시작될 때 선택에 따라 어떤 DLL을 불러올지 선택해서 자원을 얻었다.MFC의 자원도 언어로 나뉘어 있기 때문에 자원을 만들 때 선택해야 하지만 이런 실현에는 폐단이 있다.가장 근본적인 원인은 MFC의 자원 파일이 유니코드 인코딩이 아니라 서로 다른 언어의 로컬 코드이기 때문이다. 적어도 VC6는 이렇다.이렇게 하면 중국어 시스템에 일본어 자원을 불러오고 인터페이스에 난코드가 나타난다.
Qt 내부에 적용된 전체 유니코드 인코딩은 근본적으로 다중 국어 인터페이스의 정확성과 편리성을 보장한다.Qt 자체가 제공하는 linguist 도구는 바로 이 번역 과정을 실현하는 것이다.다국어를 실현하는 절차는 대체로 이렇게 몇 가지가 있다.
1. 번역이 필요한 문자열 앞에tr를 표시한다. 예를 들어 QStringstr=tr("hello,world!");이것은 매우 중요하다. 번역 도구는 원본 코드에서tr표지의 문자열을 추출하여 다른 언어로 번역하기 때문에tr표지가 없으면 도구에서 추출하지 못한다.인터페이스에 입력한 문자는 기본적으로tr를 붙여서 번역할 때도 볼 수 있습니다.권장: 프로그램의 문자열은 영어, 중국어 등 다국어 번역을 통해 이루어지며 코드에 한자를 쓰지 마십시오.
2. 프로젝트 파일**.pro에 TRANSLATIONS+를 추가합니다.ts  ****.ts 확장자는 입니다.ts는 번역된 원본 파일로 이 몇 개의 파일을 생성하는 것을 나타낸다.일반적으로 우리는 명칭에 영역을 추가하여 이 파일들이 어떤 언어에 사용되는지 더 잘 설명할 수 있다. 예를 들어 중국어는 대부분 myapp 를 이렇게 명명한다.zh_CN.ts, zh_CN이 밝힌 것은 중국이다.
3. lupdate 도구를 사용하여 번역 원본 파일을 추출합니다. 명령은 다음과 같습니다. #lupdate***.pro, lupdate는 ***를 해석합니다.pro는 프로젝트 파일로 TRANSLATIONS의 ***를 생성합니다.ts 몇 개의 파일, 이 파일들은linguist 도구에 의해 열리고 힌트에 따라 하나하나 필요한 파일로 번역해서 저장하면 OK,
linguist의 사용은 매우 간단해서 인터페이스를 보면 기본적으로 할 수 있다.위에서 언급한 이 공구들은 모두Qt가 자체로 가지고 있는 것이다.
4, lrelease 도구를 사용하여 번역 파일의 바이너리 파일을 발표합니다. 이렇게 하면 프로그램이 실행될 때 불러오는 속도가 크게 빨라집니다.사용 방법은 #lrelease ***입니다.프로, 이 도구는 얼마나 많은 문장이 번역되었는지, 얼마나 무시되었는지 알려 줍니다.생성된 파일은 ***입니다.qm, 같은 이름의 ***.ts는 확장자만 바꿨습니다.이것이야말로 우리 프로그램이 사용해야 할 파일이다.
5, 사용***.qm 파일.이것에 관해서 나는 역시 책의 원문을 베껴서 설명하고 싶다.
전환 언어는
1. 프로그램이 불러올 때 현재 구역 설정에 따라 언어 패키지(.qm)를 자동으로 선택하면 됩니다.
2. 프로그램 실행 과정에서 언어를 동적으로 전환해야 하기 때문에 첫 번째 상황이 필요합니다. 일반적으로main 함수에서 프로그램이 시작되는 부분에 다음과 같은 코드를 추가합니다.

  
  
  
  
  1. connect(langCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLang(int)) );    
  2. //      
  3. void WizarDialog::changeLang( int langIndex )    
  4. {    
  5.   QTranslator *translator = new QTranslator(qApp);    
  6.   switch( langCombo->currentIndex() ){    
  7.   case 0:    
  8.     translator->load(QString("./language/pt_BR"));    
  9.     break;    
  10.   case 1:    
  11.     translator->load(QString("./language/en_US"));    
  12.     break;    
  13.   case 2:    
  14.     translator->load(QString("./language/zh_CN"));    
  15.   default:    
  16.     break;    
  17.   }    
  18.   qApp->installTranslator( translator );    
  19.   this->initGUI();    
  20. }   
  21. // initGUI()  tr     
  22. void WizarDialog::initGUI()    
  23. {    
  24.   this->setWindowTitle(tr("RTA04W"));    
  25.   /* ...... */    
  26. }  

이 두 가지 상황도 복합해서 쓸 수 있다.
설명이 필요할 때 일반적으로 우리는 디자이너를 사용하여 인터페이스 UI, 즉 프로그램 원본에서 우리가 본 ***를 설계한다.ii 파일, 번역기를 불러온 후 ui->retranslateUi () 를 호출해야 합니다. 이 함수는 실제적으로 인터페이스 컨트롤의text를 다시 불러옵니다. ui **.cpp에서 이 함수의 실현을 보았습니다.
5. 도움말 문서에서 QTranslator::load에 대해 이런 말이 있습니다.
The data is not copied. The caller must be able to guarantee that data will not be deleted or modifiled.
이 말은 QTranslator가load 이후 qm 파일의 데이터를 복사하지 않고 필요할 때 문자열을 조회한다는 것을 명확하게 설명한다.만약 qm가 이 기간에 삭제되거나 수정된다면 프로그램에 영향을 미칠 것입니다.확장되면 QTranslator는 항상 유효해야 합니다. 함수에 정의된 국부 변수가 함수가 끝난 후에 자동으로 방출되면 번역 작업이 정상적으로 진행되지 않습니다.그러니 private에서 구성원 변수를 정의하는 것을 권장합니다 QTranslator* apptranslator;전체 번역 업무의 정확성을 확보하다.
소결:Qt인터페이스에서 다국적 언어의 전환 실례를 실현하는 내용을 소개했습니다. 이 글이 당신에게 도움이 되었으면 좋겠습니다!!!
---------------------------------------------------------------------------------------------------------------------------

QT 팁 배우기


출처http://software.intel.com/zh-cn/blogs/2011/10/31/qt-3
경기에서 코드를 쓸 때 발견한 몇 개의 쓰기 프로그램에 유용한 작은 코드를 공유했는데 비록 작지만 나의 소프트웨어에서 나를 많이 도와주었다.이 코드들은 프로그램과 소프트웨어 개발에서 직접 사용할 수 있어 당신의 프로그램 개발에 많은 번거로움을 소개할 것입니다.단지 개인의 견해일 뿐이니, 일치하지 않는 점이 있으면 벽돌을 치십시오.첫 번째 단락: 주요한 기능은 중국어 디스플레이 문제를 해결하는 것이다. 이 세 단락은 때로는 한 단락이면 되고 때로는 세 단락이 모두 써야 한다.일을 절약하기 위해서 나는 보통 세 단락을 함께 쓴다. 우리 팀은 소프트웨어 개발에서 이 세 단락을main 함수에 넣었다.QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));실례: int main(int argc, char *argv[]) {QText Codec: setCodecForTr(QText argc, char *argv[]): setCodec: setCodecCodecForLocale (QTextCodecCodec: 코드c: 코드 (FodecForName("GB2312")::코드extexTextecCodecCodecCodec: (QTextCodecCodecCodec::코드 Codec::codecCodec::codecCodec::codecCodecCodecCodec::212121212121212121212"(QTextar;setup setupwindow;setupwindow.show(), return app.exec(),}이렇게 하면 소프트웨어 개발 과정과 프로그램 작성 과정에서 거의 모든 난자 문제는 걱정할 필요도 없고 전문적으로 주의할 필요도 없다.두 번째 단락: 주로 그림, 파일 등 기본 이름 중복 문제를 해결하는 데 쓰인다.우리 팀은 개발 과정에서 시간을 파일의 기본 이름으로 고려했다. 어느 순간의 시간은 절대 중복되지 않기 때문에 명명된 파일도 절대 중복되지 않고 덮어쓰기로 인한 파일, 이미지 문제의 실례 응용도 발생하지 않는다. QStringstr = QTime(QTime).currentTime().toString(); picname= QString(tr("IMG%1%2%3")) .arg(QDate().currentDate().year()%100) .arg(QDate().currentDate().month()) .arg(QDate().currentDate().day(),2) +str.mid(0,2)+str.mid(3,2)+str.mid(6,2)+".jpg"; fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "/home/meego/Pictures/"+picname, tr("Images (*.jpg *.png *.xpm *.jpg)")); 세 번째 단락: 소프트웨어 인터페이스를 위한 배경 이미지 코드: QPalette palette;palette.setBrush(QPalette::Background,QBrush(QPixmap(":/img/butterflynew.jpg"))); this->setPalette(palette); ":/img/butterfly new.jpg"를 간단하게 수정하고 교체하면 소프트웨어나 프로그램 인터페이스를 원하는 효과로 바꿀 수 있습니다.그리고 소프트웨어를 디자인할 때 우리는 두 가지 방식을 사용한다. 하나는 순수한 코드로 완성하는 것이고, 다른 하나는 컨트롤러의 드래그에 적당한 코드를 추가하는 것이다.이 과정에서 우리는 코드를 작성하고 추가하는 과정에서 순수한 컨트롤을 끌어다 놓으면 많은 작업을 완성할 수 있다는 것을 발견했다.구체적인 실현 방법은 다음과 같다. 새 QT GUI Application이 만들어진 후에 기본 프로그램으로 구성된다. (네트워크 속도 등으로 인해 그림이 계속 들어오지 않고, 만들 때 기본 단추를 계속 누르면 된다.) 우리는 UI 파일에서 컨트롤을 드래그하고 조립할 수 있다.그리고 컴파일을 클릭하면 실행하지 않아도 되지만 효과를 보려면 실행할 수 있습니다.mainwindow로 돌아갑니다.cpp 보기 헤더 파일은 #include "ui mainwindow.h"를 보고 커서를 #include "ui mainwindow.h"중간에 놓고 F2를 누르면 프로그램 인터페이스가 ui 로 넘어갑니다mainwindow.h에서 드래그한 컨트롤러가 순수한 코드로 어떻게 이루어지는지 볼 수 있습니다.이 방법은 컨트롤의 위치 정의에서 많은 시간을 절약할 수 있다.이상은 제가 QT를 공부하면서 얻은 작은 총결산입니다. 실수할 수 있는 부분이 있으면 벽돌을 치세요!남창대학[email protected]팀명: Ncu0901 하보령

좋은 웹페이지 즐겨찾기