2011-02-03 3 views
8

XML 파일을 사용하는 Qt 프로젝트가 있습니다. 이러한 XML 파일에는 사람이 읽을 수있는 텍스트가 들어 있으며이 텍스트는 Qt 도구 (lupdate, lrelease, QtLinguist)를 사용하여 번역해야합니다.Qt 비 소스 파일에서 문자열 변환

질문은 QT_TR_NOOP() 매크로 및 친구를 사용하여 소스 코드 파일의 XML 파일에서 문자열을 복제하지 않고 lupdate를 통해 .ts 파일에 항목을 생성 할 수 있습니까? 또는 일반적으로 Qt 프로젝트의 비 소스 파일에서 문자열을 어떻게 변환합니까?

+0

lupdate가 파일 대신 문자열/문맥 쌍을 허용한다면 좋을 것입니다. 그러면 빌드 시스템에 이러한 것들을 포함시킬 수 있습니다. – Joey

+0

나는 쉬운 방법을 발견했다. 내 대답을 확인하십시오 : http://stackoverflow.com/questions/28166081/can-i-use-tr-and-lupdate-on-xml-files/28168782#28168782 –

답변

5

동일한 문제가있었습니다. 사람이 읽을 수있는 문자열이 포함 된 XML 파일입니다.

우리의 솔루션은 XML 파일의 사람이 읽을 수있는 문자열을 쉽게 추출 할 수 있도록했습니다 (우리는 이것을 LABEL 속성에 넣었습니다). 우리는 XML 파일을 구문 분석하고 문자열을 추출하고 컨텍스트 (XML 파일에서 데이터를 추출하여) QT_TR_NOOP() 목록을 포함하는 CPP 헤더 파일을 생성합니다.

이 파일은 lupdate이 (가) 사용하던 프로젝트 파일 (.pro)에 추가되었습니다.

이 솔루션은 우리를 위해 좋은 그러나 우리는 두 가지에 대해 매우 조심해야했다 :

  • 실행이 도구 XML 파일의 내용이 변경 될 때마다.
  • XML 파일이 UTF-8로 인코딩되었는지 확인하십시오.
+0

이것은 범용 솔루션처럼 들리며 비 XML 파일에도 적용됩니다. 나는 그런 것을 고려할 것이다. 고마워! – Sascha

+0

github에 도구를 게시하면이 대답이 유용 할 것입니다. – sashoalm

3

.qm 파일에 일치하는 변환/컨텍스트가있는 한 tr()을 사용하여 런타임에 원하는 모든 것을 번역 할 수 있습니다. lupdate가 추출했는지 여부에 상관없이 어떠한 차이도 없어야합니다.

lupdate를 임의의 XML에서 문자열을 추출하는 방법을 모르지만 언어학자가 사용할 수 없다는 것을 의미하지는 않습니다.

  1. .ts 파일도 XML입니다. XML을 .ts 파일로 변환하는 XSLT를 만드는 것은 쉽습니다. Qt 대신 표준 표준을 목표로하고 싶다면 lupdate (그리고 linguist)도 XLIFF 파일을 처리 할 수 ​​있습니다.
  2. 여러 .TS 파일을 가질 수 있습니다 당신이 정말로 번역기에 대한 하나 개의 파일에 모든 것을 갖고 싶어

을, (그냥 설정할 때 한 번 이상 QTranslator :: 용지를 더 전화) 당신의 XSLT의 복사본을 가지고 lupdate가 생성 한 파일을 출력합니다.

소스 코드에서 사용 된 내용을 복제하지 않는 컨텍스트 이름을 사용하는 한 많은 응용 프로그램이 각 DLL에 대해 .qm을로드하는 방식 (Qt의 관점에서 볼 때)과 다를 수 없습니다 그 GUI가 있습니다.

+0

XSLT 아이디어가 좋다. 고마워! 그러나 필자의 프로젝트는 실제로 더 복잡하고 사용자는 XML 파일을 포함 할 수있는 플러그인을 다른 사용자 정의 스키마로 통합 할 수 있습니다. 어떻게하면 XSLT가 사람이 읽을 수있는 것을 변환 할 수 있습니까? (사용자가 모든 XML 파일을 자신의 XSLT에 제공 할 수 있는지 여부는 모르겠다 ...) – Sascha

+0

스키마에 대해 잘 모르는 경우 lupdate가 무엇을 얻을지 알 수 있었으면 좋겠습니까?모든 공백이 아닌 텍스트 콘텐츠 또는 모든 속성 콘텐츠와 텍스트 노드를 추출 할 수는 있지만 번역사가 검색 할 수있는 많은 정크가 될 것으로 보입니다. 사용자가이 텍스트의 컨텍스트를 지정하는 요소에 특수 특성을 추가하게하고 이러한 요소의 텍스트 만 추출 할 수 있습니까? // * [@ tr : context]/text() 같은 노드를 선택합니다. – puetzk

+0

예, 컨벤션을 사용하려고 생각했습니다. 귀하의 제안은 의미가 있습니다. – Sascha