[Qt module] Added translation files compilation method

- Added a new compile_translations method since preprocess was already quite
full and translations compilation is quite different from ui, qrc, cpp files
preprocessing.
- Updated translation.
- Updated test case.

Signed-off-by: Alexis Jeandet <alexis.jeandet@member.fsf.org>
pull/2676/head
Alexis Jeandet 7 years ago
parent 1fd743e6ad
commit 5c5eac3571
  1. 14
      docs/markdown/Qt5-module.md
  2. 18
      mesonbuild/modules/qt.py
  3. 2
      test cases/frameworks/4 qt/meson.build
  4. 18
      test cases/frameworks/4 qt/q5core.cpp
  5. 12
      test cases/frameworks/4 qt/qt4core_fr.ts
  6. 12
      test cases/frameworks/4 qt/qt5core_fr.ts

@ -1,7 +1,7 @@
# Qt5 module
The Qt5 module provides tools to automatically deal with the various
tools and steps required for Qt. The module has one method.
tools and steps required for Qt. The module has two methods.
## preprocess
@ -12,6 +12,14 @@ This method takes the following keyword arguments:
It returns an opaque object that should be passed to a main build target.
## compile_translations
This method generates the necessary targets to build translation files with lrelease, it takes the following keyword arguments:
- `ts_files`, the list of input translation files produced by Qt's lupdate tool.
- `install` when true, this target is installed during the install step.
- `install_dir` directory to install to
- `build_by_default` when set to true, to have this target be built by default, that is, when invoking plain ninja; the default value is false.
A simple example would look like this:
```meson
@ -21,6 +29,7 @@ inc = include_directories('includes')
moc_files = qt5.preprocess(moc_headers : 'myclass.h',
moc_extra_arguments: ['-DMAKES_MY_MOC_HEADER_COMPILE'],
include_directories: inc)
translations = qt5.compile_translations(ts_files : 'myTranslation_fr.ts', build_by_default : true)
executable('myprog', 'main.cpp', 'myclass.cpp', moc_files,
include_directories: inc,
dependencies : qt5_dep)
@ -28,5 +37,4 @@ executable('myprog', 'main.cpp', 'myclass.cpp', moc_files,
The 'modules' argument is used to include Qt modules in the project.
See the Qt documentation for the [list of
modules](http://doc.qt.io/qt-5/qtmodules.html).
See the Qt documentation for the [list of modules](http://doc.qt.io/qt-5/qtmodules.html).

@ -144,3 +144,21 @@ class QtBaseModule:
moc_output = moc_gen.process_files('Qt{} moc source'.format(self.qt_version), moc_sources, state)
sources.append(moc_output)
return ModuleReturnValue(sources, sources)
@permittedKwargs({'ts_files', 'install', 'install_dir', 'build_by_default', 'method'})
def compile_translations(self, state, args, kwargs):
ts_files, install_dir = extract_as_list(kwargs, 'ts_files', 'install_dir', pop=True)
self._detect_tools(state.environment, kwargs.get('method', 'auto'))
translations = []
for ts in ts_files:
cmd = [self.lrelease, '@INPUT@', '-qm', '@OUTPUT@']
lrelease_kwargs = {'output': '@BASENAME@.qm',
'input': ts,
'install': kwargs.get('install', False),
'build_by_default': kwargs.get('build_by_default', False),
'command': cmd}
if install_dir is not None:
lrelease_kwargs['install_dir'] = install_dir
lrelease_target = build.CustomTarget('qt{}-compile-{}'.format(self.qt_version, ts), state.subdir, state.subproject, lrelease_kwargs)
translations.append(lrelease_target)
return ModuleReturnValue(translations, translations)

@ -59,6 +59,8 @@ foreach qt : ['qt4', 'qt5']
# We need a console test application because some test environments
# do not have an X server.
translations = qtmodule.compile_translations(ts_files : qt+'core_fr.ts', build_by_default : true)
qtcore = dependency(qt, modules : 'Core', method : get_option('method'))
qtcoreapp = executable(qt + 'core', 'q5core.cpp',

@ -1,8 +1,26 @@
#include <QCoreApplication>
#include <QtGlobal>
#include <QString>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
#include <QDebug>
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
QTranslator myappTranslator;
if(!myappTranslator.load("qt5core_fr") )
return 1;
app.installTranslator(&myappTranslator);
qDebug() << QObject::tr("Translate me!");
// Don't actually start the main loop so this
// can be run as a unit test.
//return app.exec();

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="fr_FR">
<context>
<name>QObject</name>
<message>
<location filename="q5core.cpp" line="23"/>
<source>Translate me!</source>
<translation>Traduisez moi!</translation>
</message>
</context>
</TS>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="fr_FR">
<context>
<name>QObject</name>
<message>
<location filename="q5core.cpp" line="23"/>
<source>Translate me!</source>
<translation>Traduisez moi!</translation>
</message>
</context>
</TS>
Loading…
Cancel
Save