Search for and include Qt translations in static builds
authorManuel Nickschas <sputnick@quassel-irc.org>
Thu, 12 Feb 2009 09:33:00 +0000 (10:33 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 12 Feb 2009 09:33:00 +0000 (10:33 +0100)
When building statically, this looks for Qt translations at build-time
and embeds them in the binary. Thus, buttons and other standard elements
should be translated even with no Qt installed on the target system.

Fixes #508.

cmake/modules/FindQt4.cmake
i18n/CMakeLists.txt

index 170e04b..64a5ce4 100644 (file)
 #  
 #  QT_DOC_DIR                 Path to "doc" of Qt4
 #  QT_MKSPECS_DIR             Path to "mkspecs" of Qt4
+#  QT_TRANSLATIONS_DIR        Path to "translations" of Qt4
 #
 #
 # These are around for backwards compatibility 
@@ -482,6 +483,17 @@ IF (QT4_QMAKE_FOUND)
     FILE(TO_CMAKE_PATH "${qt_plugins_dir}" qt_plugins_dir)
     SET(QT_PLUGINS_DIR ${qt_plugins_dir} CACHE PATH "The location of the Qt plugins")
   ENDIF (QT_LIBRARY_DIR AND NOT QT_PLUGINS_DIR)
+
+  # ask qmake for the translations directory
+  IF (QT_LIBRARY_DIR AND NOT QT_TRANSLATIONS_DIR)
+    EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
+      ARGS "-query QT_INSTALL_TRANSLATIONS"
+      OUTPUT_VARIABLE qt_translations_dir )
+    # make sure we have / and not \ as qmake gives on windows
+    FILE(TO_CMAKE_PATH "${qt_translations_dir}" qt_translations_dir)
+    SET(QT_TRANSLATIONS_DIR ${qt_translations_dir} CACHE PATH "The location of the Qt translations")
+  ENDIF (QT_LIBRARY_DIR AND NOT QT_TRANSLATIONS_DIR)
+
   ########################################
   #
   #       Setting the INCLUDE-Variables
index 8f08cbf..a8b4068 100644 (file)
@@ -7,10 +7,10 @@ if(QT_LRELEASE_EXECUTABLE)
   set(qm_files ${QM})
 
   # Find more languages
-  file(GLOB avail_tsfiles quassel_*.ts)
+  file(GLOB avail_tsfiles quassel_*.ts qt_*.ts)
   foreach(TS_FILE ${avail_tsfiles})
     get_filename_component(basename ${TS_FILE} NAME_WE)
-    string(REGEX REPLACE "quassel_([a-zA-Z]+)(_.+)?$" "\\1" lang ${basename})
+    string(REGEX REPLACE "q[^_]+_([a-zA-Z]+)(_.+)?$" "\\1" lang ${basename})
     # test if we want this
     set(flg 1)
     if(LINGUAS)
@@ -18,15 +18,29 @@ if(QT_LRELEASE_EXECUTABLE)
     endif(LINGUAS)
     if(flg)
       generate_qm(QM ${basename})
-      set(qm_files ${qm_files} ${QM})
-      set(gen_linguas "${gen_linguas} ${lang}")
+      list(APPEND qm_files ${QM})
+      list(APPEND gen_linguas ${lang})
     endif(flg)
   endforeach(TS_FILE ${avail_tsfiles})
-  message(STATUS "Including languages:${gen_linguas}")
+  list(REMOVE_DUPLICATES gen_linguas)
+  message(STATUS "Including languages: ${gen_linguas}")
 else(QT_LRELEASE_EXECUTABLE)
   message(STATUS "WARNING: lrelease not found, you won't have translations!")
 endif(QT_LRELEASE_EXECUTABLE)
 
+# For a static build, we need to include Qt translations if available
+if(STATIC AND QT_TRANSLATIONS_DIR)
+  foreach(LANG ${gen_linguas})
+    file(GLOB lang_files ${QT_TRANSLATIONS_DIR}/qt_${LANG}*.qm)
+    foreach(absfile ${lang_files})
+      get_filename_component(filename ${absfile} NAME)
+      message(STATUS "Importing ${filename}")
+      configure_file(${absfile} ${CMAKE_CURRENT_BINARY_DIR}/${filename} COPYONLY)
+      list(APPEND qm_files ${CMAKE_CURRENT_BINARY_DIR}/${filename})
+    endforeach(absfile ${lang_files})
+  endforeach(LANG ${gen_linguas})
+endif(STATIC AND QT_TRANSLATIONS_DIR)
+
 # Write resource file
 set(resfile ${CMAKE_CURRENT_BINARY_DIR}/i18n.qrc)
 file(WRITE ${resfile} "<!DOCTYPE RCC><RCC version=\"1.0\">\n"