Merge pull request #2676 from jeandet/add_qt_translations

Add qt translations
pull/2691/head
Jussi Pakkanen 7 years ago committed by GitHub
commit 2dab7c37df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      ciimage/Dockerfile
  2. 14
      docs/markdown/Qt5-module.md
  3. 4
      mesonbuild/dependencies/ui.py
  4. 28
      mesonbuild/modules/qt.py
  5. 2
      test cases/frameworks/4 qt/meson.build
  6. 18
      test cases/frameworks/4 qt/q5core.cpp
  7. 12
      test cases/frameworks/4 qt/qt4core_fr.ts
  8. 12
      test cases/frameworks/4 qt/qt5core_fr.ts

@ -12,4 +12,5 @@ RUN apt-get -y update && apt-get -y upgrade \
&& apt-get -y install fpga-icestorm arachne-pnr yosys \ && apt-get -y install fpga-icestorm arachne-pnr yosys \
&& apt-get -y install gtk-sharp2 gtk-sharp2-gapi libglib2.0-cil-dev \ && apt-get -y install gtk-sharp2 gtk-sharp2-gapi libglib2.0-cil-dev \
&& apt-get -y install libwmf-dev \ && apt-get -y install libwmf-dev \
&& apt-get -y install qt4-linguist-tools qttools5-dev-tools \
&& python3 -m pip install hotdoc codecov && python3 -m pip install hotdoc codecov

@ -1,7 +1,7 @@
# Qt5 module # Qt5 module
The Qt5 module provides tools to automatically deal with the various 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 ## 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. It returns an opaque object that should be passed to a main build target.
## compile_translations (since v0.44.0)
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 (optional).
- `install_dir` directory to install to (optional).
- `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 (optional).
A simple example would look like this: A simple example would look like this:
```meson ```meson
@ -21,6 +29,7 @@ inc = include_directories('includes')
moc_files = qt5.preprocess(moc_headers : 'myclass.h', moc_files = qt5.preprocess(moc_headers : 'myclass.h',
moc_extra_arguments: ['-DMAKES_MY_MOC_HEADER_COMPILE'], moc_extra_arguments: ['-DMAKES_MY_MOC_HEADER_COMPILE'],
include_directories: inc) include_directories: inc)
translations = qt5.compile_translations(ts_files : 'myTranslation_fr.ts', build_by_default : true)
executable('myprog', 'main.cpp', 'myclass.cpp', moc_files, executable('myprog', 'main.cpp', 'myclass.cpp', moc_files,
include_directories: inc, include_directories: inc,
dependencies : qt5_dep) 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. The 'modules' argument is used to include Qt modules in the project.
See the Qt documentation for the [list of See the Qt documentation for the [list of modules](http://doc.qt.io/qt-5/qtmodules.html).
modules](http://doc.qt.io/qt-5/qtmodules.html).

@ -207,13 +207,15 @@ class QtBaseDependency(ExternalDependency):
moc = ExternalProgram(os.path.join(self.bindir, 'moc'), silent=True) moc = ExternalProgram(os.path.join(self.bindir, 'moc'), silent=True)
uic = ExternalProgram(os.path.join(self.bindir, 'uic'), silent=True) uic = ExternalProgram(os.path.join(self.bindir, 'uic'), silent=True)
rcc = ExternalProgram(os.path.join(self.bindir, 'rcc'), silent=True) rcc = ExternalProgram(os.path.join(self.bindir, 'rcc'), silent=True)
lrelease = ExternalProgram(os.path.join(self.bindir, 'lrelease'), silent=True)
else: else:
# We don't accept unsuffixed 'moc', 'uic', and 'rcc' because they # We don't accept unsuffixed 'moc', 'uic', and 'rcc' because they
# are sometimes older, or newer versions. # are sometimes older, or newer versions.
moc = ExternalProgram('moc-' + self.name, silent=True) moc = ExternalProgram('moc-' + self.name, silent=True)
uic = ExternalProgram('uic-' + self.name, silent=True) uic = ExternalProgram('uic-' + self.name, silent=True)
rcc = ExternalProgram('rcc-' + self.name, silent=True) rcc = ExternalProgram('rcc-' + self.name, silent=True)
return moc, uic, rcc lrelease = ExternalProgram('lrelease-' + self.name, silent=True)
return moc, uic, rcc, lrelease
def _pkgconfig_detect(self, mods, kwargs): def _pkgconfig_detect(self, mods, kwargs):
# We set the value of required to False so that we can try the # We set the value of required to False so that we can try the

@ -43,13 +43,13 @@ class QtBaseModule:
kwargs = {'required': 'true', 'modules': 'Core', 'silent': 'true', 'method': method} kwargs = {'required': 'true', 'modules': 'Core', 'silent': 'true', 'method': method}
qt = _QT_DEPS_LUT[self.qt_version](env, kwargs) qt = _QT_DEPS_LUT[self.qt_version](env, kwargs)
# Get all tools and then make sure that they are the right version # Get all tools and then make sure that they are the right version
self.moc, self.uic, self.rcc = qt.compilers_detect() self.moc, self.uic, self.rcc, self.lrelease = qt.compilers_detect()
# Moc, uic and rcc write their version strings to stderr. # Moc, uic and rcc write their version strings to stderr.
# Moc and rcc return a non-zero result when doing so. # Moc and rcc return a non-zero result when doing so.
# What kind of an idiot thought that was a good idea? # What kind of an idiot thought that was a good idea?
for compiler, compiler_name in ((self.moc, "Moc"), (self.uic, "Uic"), (self.rcc, "Rcc")): for compiler, compiler_name in ((self.moc, "Moc"), (self.uic, "Uic"), (self.rcc, "Rcc"), (self.lrelease, "lrelease")):
if compiler.found(): if compiler.found():
stdout, stderr = Popen_safe(compiler.get_command() + ['-v'])[1:3] stdout, stderr = Popen_safe(compiler.get_command() + ['-version'])[1:3]
stdout = stdout.strip() stdout = stdout.strip()
stderr = stderr.strip() stderr = stderr.strip()
if 'Qt {}'.format(self.qt_version) in stderr: if 'Qt {}'.format(self.qt_version) in stderr:
@ -62,7 +62,7 @@ class QtBaseModule:
raise MesonException('{name} preprocessor is not for Qt {version}. Output:\n{stdo}\n{stderr}'.format( raise MesonException('{name} preprocessor is not for Qt {version}. Output:\n{stdo}\n{stderr}'.format(
name=compiler_name, version=self.qt_version, stdo=stdout, stderr=stderr)) name=compiler_name, version=self.qt_version, stdo=stdout, stderr=stderr))
mlog.log(' {}:'.format(compiler_name.lower()), mlog.green('YES'), '({path}, {version})'.format( mlog.log(' {}:'.format(compiler_name.lower()), mlog.green('YES'), '({path}, {version})'.format(
path=self.moc.get_path(), version=compiler_ver.split()[-1])) path=compiler.get_path(), version=compiler_ver.split()[-1]))
else: else:
mlog.log(' {}:'.format(compiler_name.lower()), mlog.red('NO')) mlog.log(' {}:'.format(compiler_name.lower()), mlog.red('NO'))
self.tools_detected = True self.tools_detected = True
@ -137,10 +137,28 @@ class QtBaseModule:
moc_output = moc_gen.process_files('Qt{} moc header'.format(self.qt_version), moc_headers, state) moc_output = moc_gen.process_files('Qt{} moc header'.format(self.qt_version), moc_headers, state)
sources.append(moc_output) sources.append(moc_output)
if len(moc_sources) > 0: if len(moc_sources) > 0:
arguments = moc_extra_arguments + ['@INPUT@', '-o', '@OUTPUT@'] arguments = moc_extra_arguments + inc + ['@INPUT@', '-o', '@OUTPUT@']
moc_kwargs = {'output': '@BASENAME@.moc', moc_kwargs = {'output': '@BASENAME@.moc',
'arguments': arguments} 'arguments': arguments}
moc_gen = build.Generator([self.moc], moc_kwargs) moc_gen = build.Generator([self.moc], moc_kwargs)
moc_output = moc_gen.process_files('Qt{} moc source'.format(self.qt_version), moc_sources, state) moc_output = moc_gen.process_files('Qt{} moc source'.format(self.qt_version), moc_sources, state)
sources.append(moc_output) sources.append(moc_output)
return ModuleReturnValue(sources, sources) 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 # We need a console test application because some test environments
# do not have an X server. # 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')) qtcore = dependency(qt, modules : 'Core', method : get_option('method'))
qtcoreapp = executable(qt + 'core', 'q5core.cpp', qtcoreapp = executable(qt + 'core', 'q5core.cpp',

@ -1,8 +1,26 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <QtGlobal>
#include <QString>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
#include <QDebug>
int main(int argc, char **argv) { int main(int argc, char **argv) {
QCoreApplication app(argc, 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 // Don't actually start the main loop so this
// can be run as a unit test. // can be run as a unit test.
//return app.exec(); //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