diff --git a/docs/markdown/Qt5-module.md b/docs/markdown/Qt5-module.md index aea2ae139..c7a2578a5 100644 --- a/docs/markdown/Qt5-module.md +++ b/docs/markdown/Qt5-module.md @@ -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). diff --git a/mesonbuild/modules/qt.py b/mesonbuild/modules/qt.py index c07a3615e..463bf0100 100644 --- a/mesonbuild/modules/qt.py +++ b/mesonbuild/modules/qt.py @@ -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) diff --git a/test cases/frameworks/4 qt/meson.build b/test cases/frameworks/4 qt/meson.build index 374707aac..7c33268a8 100644 --- a/test cases/frameworks/4 qt/meson.build +++ b/test cases/frameworks/4 qt/meson.build @@ -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', diff --git a/test cases/frameworks/4 qt/q5core.cpp b/test cases/frameworks/4 qt/q5core.cpp index 706e4dc87..25b80b8e3 100644 --- a/test cases/frameworks/4 qt/q5core.cpp +++ b/test cases/frameworks/4 qt/q5core.cpp @@ -1,8 +1,26 @@ #include +#include +#include +#include +#include +#include +#include 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(); diff --git a/test cases/frameworks/4 qt/qt4core_fr.ts b/test cases/frameworks/4 qt/qt4core_fr.ts new file mode 100644 index 000000000..0638bd5e9 --- /dev/null +++ b/test cases/frameworks/4 qt/qt4core_fr.ts @@ -0,0 +1,12 @@ + + + + + QObject + + + Translate me! + Traduisez moi! + + + diff --git a/test cases/frameworks/4 qt/qt5core_fr.ts b/test cases/frameworks/4 qt/qt5core_fr.ts new file mode 100644 index 000000000..4e3116bcf --- /dev/null +++ b/test cases/frameworks/4 qt/qt5core_fr.ts @@ -0,0 +1,12 @@ + + + + + QObject + + + Translate me! + Traduisez moi! + + +