Automating generation of qm files: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Add "cleanup" tag)
(Fix formatting)
 
(5 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}


h1. Automating Generation of QM Files
= Automating Generation of QM Files =
 
The [http://doc.qt.io/qt-5/qtlinguist-index.html Qt Linguist Manual] and [http://doc.qt.io/qt-5/internationalization.html Qt reference documentation] describe the localization process in detail. However, you can use an alternative (unofficial) way to register TS files for the languages listed in the .pro file and to generate the QM files from them. This method is used by the Qt Creator project and the Quick Forecast demo application, for example.
The "Qt Linguist Manual":http://doc.qt.io/qt-5/qtlinguist-index.html and "Qt reference documentation":http://doc.qt.io/qt-5/internationalization.html describe the localization process in detail. However, you can use an alternative (unofficial) way to register TS files for the languages listed in the .pro file and to generate the QM files from them. This method is used by the Qt Creator project and the Quick Forecast demo application, for example.


First, you specify the languages as values of the LANGUAGES variable using the language codes:
First, you specify the languages as values of the LANGUAGES variable using the language codes:


<code>LANGUAGES = de<code>
<code>LANGUAGES = de</code>


Second, you add a function to generate a TS file for each language. In the following code example, the application name is ''QuickForecast'':
Second, you add a function to generate a TS file for each language. In the following code example, the application name is ''QuickForecast'':
 
<syntaxhighlight lang="qmake">
</code>
# parameters: var, prepend, append
defineReplace(prependAll) {
defineReplace(prependAll) {
  for(a,$$1):result ''= $$2$${a}$$3
  for(a,$$1):result += $$2$${a}$$3
  return($$result)
  return($$result)
}
}


TRANSLATIONS = $$prependAll(LANGUAGES, $$PWD/translations/QuickForecast_, .ts)
TRANSLATIONS = $$prependAll(LANGUAGES, $$PWD/translations/QuickForecast_, .ts)
<code>
</syntaxhighlight>


Third, you add the TRANSLATIONS_FILES variable and run lrelease to generate the QM files and to embed them in the application resources:
Third, you add the TRANSLATIONS_FILES variable and run lrelease to generate the QM files and to embed them in the application resources:


</code>
<syntaxhighlight lang="qmake">
TRANSLATIONS_FILES =
TRANSLATIONS_FILES =


Line 35: Line 34:
  command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile
  command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile
  system($$command)|error("Failed to run: $$command")
  system($$command)|error("Failed to run: $$command")
  TRANSLATIONS_FILES''= $$qmfile
  TRANSLATIONS_FILES += $$qmfile
}
}
<code>
</syntaxhighlight>


== Adding qmake Targets for Convenience ==
== Adding qmake Targets for Convenience ==
Line 43: Line 42:
You can further automate the process for creating TS files and committing them to the Git version control system by adding qmake extra targets. The following code generates a generic TS file, using the QuickForecast application as an example. You need to rename the generated QuickForecast_untranslated.ts using the appropriate language code (for example, as QuickForecast_de.ts) and add the language code as a value of the LANGUAGES variable.
You can further automate the process for creating TS files and committing them to the Git version control system by adding qmake extra targets. The following code generates a generic TS file, using the QuickForecast application as an example. You need to rename the generated QuickForecast_untranslated.ts using the appropriate language code (for example, as QuickForecast_de.ts) and add the language code as a value of the LANGUAGES variable.


</code>
<syntaxhighlight lang="qmake">
wd = $$replace(PWD, /, $$QMAKE_DIR_SEP)
wd = $$replace(PWD, /, $$QMAKE_DIR_SEP)


qtPrepareTool(LUPDATE, lupdate)
qtPrepareTool(LUPDATE, lupdate)
LUPDATE ''= -locations relative -no-ui-lines
LUPDATE += -locations relative -no-ui-lines
TSFILES = $$files($$PWD/translations/QuickForecast_'''.ts) $$PWD/translations/QuickForecast_untranslated.ts
TSFILES = $$files($$PWD/translations/QuickForecast_'''.ts) $$PWD/translations/QuickForecast_untranslated.ts
for(file, TSFILES) {
for(file, TSFILES) {
  lang = $$replace(file, .'''_([^/]*).ts, 1)
  lang = $$replace(file, .'''_([^/]*).ts, 1)
  v = ts-$${lang}.commands
  v = ts-$${lang}.commands
  $$v = cd $$wd &amp;&amp; $$LUPDATE $$SOURCES $$APP_FILES -ts $$file
  $$v = cd $$wd && $$LUPDATE $$SOURCES $$APP_FILES -ts $$file
  QMAKE_EXTRA_TARGETS''= ts-$$lang
  QMAKE_EXTRA_TARGETS += ts-$$lang
}
}
ts-all.commands = cd $$PWD &amp;&amp; $$LUPDATE $$SOURCES $$APP_FILES -ts $$TSFILES
ts-all.commands = cd $$PWD && $$LUPDATE $$SOURCES $$APP_FILES -ts $$TSFILES
QMAKE_EXTRA_TARGETS ''= ts-all
QMAKE_EXTRA_TARGETS += ts-all
<code>
</syntaxhighlight>


The following code makes a new target for lconvert and commits the TS files. Use lconvert to remove information about the location of strings in the TS files and thus save space:
The following code makes a new target for lconvert and commits the TS files. Use lconvert to remove information about the location of strings in the TS files and thus save space:


</code>
<syntaxhighlight lang="qmake">
qtPrepareTool(LCONVERT, lconvert)
qtPrepareTool(LCONVERT, lconvert)
LCONVERT''= -locations none
LCONVERT += -locations none
isEqual(QMAKE_DIR_SEP, /) {
isEqual(QMAKE_DIR_SEP, /) {
  commit-ts.commands =  cd $$wd;  git add -N translations/*''.ts &amp;&amp; for f in `git diff-files —name-only translations/*''.ts`; do  $$LCONVERT -i f -o f;  done;  git add translations/*_.ts &amp;&amp; git commit
  commit-ts.commands =  cd $$wd;  git add -N translations/*''.ts &&  for f in `git diff-files —name-only translations/*''.ts`; do  $$LCONVERT -i f -o f;  done;  git add translations/*_.ts && git commit
} else {
} else {
  commit-ts.commands =  cd $$wd &amp;&amp; git add -N translations/*''.ts &amp;&amp; for /f usebackq %%f in (`git diff-files —name-only — translations/*''.ts`) do  $$LCONVERT -i %f -o%f $$escape_expand(nt)  cd $$wd &amp;&amp; git add translations/*_.ts &amp;&amp; git commit
  commit-ts.commands =  cd $$wd &&  git add -N translations/*''.ts &&  for /f usebackq %%f in (`git diff-files —name-only — translations/*''.ts`) do  $$LCONVERT -i %f -o%f $$escape_expand(nt)  cd $$wd && git add translations/*_.ts && git commit
}
}
QMAKE_EXTRA_TARGETS += commit-ts
QMAKE_EXTRA_TARGETS += commit-ts
</syntaxhighlight>

Latest revision as of 11:10, 15 September 2021

This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

Automating Generation of QM Files

The Qt Linguist Manual and Qt reference documentation describe the localization process in detail. However, you can use an alternative (unofficial) way to register TS files for the languages listed in the .pro file and to generate the QM files from them. This method is used by the Qt Creator project and the Quick Forecast demo application, for example.

First, you specify the languages as values of the LANGUAGES variable using the language codes:

LANGUAGES = de

Second, you add a function to generate a TS file for each language. In the following code example, the application name is QuickForecast:

# parameters: var, prepend, append
defineReplace(prependAll) {
 for(a,$$1):result += $$2$${a}$$3
 return($$result)
}

TRANSLATIONS = $$prependAll(LANGUAGES, $$PWD/translations/QuickForecast_, .ts)

Third, you add the TRANSLATIONS_FILES variable and run lrelease to generate the QM files and to embed them in the application resources:

TRANSLATIONS_FILES =

qtPrepareTool(LRELEASE, lrelease)
for(tsfile, TRANSLATIONS) {
 qmfile = $$shadowed($$tsfile)
 qmfile ~= s,.ts$,.qm,
 qmdir = $$dirname(qmfile)
 !exists($$qmdir) {
 mkpath($$qmdir)|error("Aborting.")
 }
 command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile
 system($$command)|error("Failed to run: $$command")
 TRANSLATIONS_FILES += $$qmfile
}

Adding qmake Targets for Convenience

You can further automate the process for creating TS files and committing them to the Git version control system by adding qmake extra targets. The following code generates a generic TS file, using the QuickForecast application as an example. You need to rename the generated QuickForecast_untranslated.ts using the appropriate language code (for example, as QuickForecast_de.ts) and add the language code as a value of the LANGUAGES variable.

wd = $$replace(PWD, /, $$QMAKE_DIR_SEP)

qtPrepareTool(LUPDATE, lupdate)
LUPDATE += -locations relative -no-ui-lines
TSFILES = $$files($$PWD/translations/QuickForecast_'''.ts) $$PWD/translations/QuickForecast_untranslated.ts
for(file, TSFILES) {
 lang = $$replace(file, .'''_([^/]*).ts, 1)
 v = ts-$${lang}.commands
 $$v = cd $$wd && $$LUPDATE $$SOURCES $$APP_FILES -ts $$file
 QMAKE_EXTRA_TARGETS += ts-$$lang
}
ts-all.commands = cd $$PWD && $$LUPDATE $$SOURCES $$APP_FILES -ts $$TSFILES
QMAKE_EXTRA_TARGETS += ts-all

The following code makes a new target for lconvert and commits the TS files. Use lconvert to remove information about the location of strings in the TS files and thus save space:

qtPrepareTool(LCONVERT, lconvert)
LCONVERT += -locations none
isEqual(QMAKE_DIR_SEP, /) {
 commit-ts.commands =  cd $$wd;  git add -N translations/*''.ts &&  for f in `git diff-files —name-only translations/*''.ts`; do  $$LCONVERT -i f -o f;  done;  git add translations/*_.ts && git commit
} else {
 commit-ts.commands =  cd $$wd &&  git add -N translations/*''.ts &&  for /f usebackq %%f in (`git diff-files —name-only — translations/*''.ts`) do  $$LCONVERT -i %f -o%f $$escape_expand(nt)  cd $$wd && git add translations/*_.ts && git commit
}
QMAKE_EXTRA_TARGETS += commit-ts