diff --git a/cmake/modules/FindQt5LinguistToolsMacros.cmake b/cmake/modules/FindQt5LinguistToolsMacros.cmake
new file mode 100644
index 0000000000..cd2d1eb74f
--- /dev/null
+++ b/cmake/modules/FindQt5LinguistToolsMacros.cmake
@@ -0,0 +1,114 @@
+#=============================================================================
+# Copyright 2005-2011 Kitware, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the name of Kitware, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#=============================================================================
+
+
+
+function(QT5_CREATE_TRANSLATION_CUSTOM _qm_files)
+ set(options)
+ set(oneValueArgs)
+ set(multiValueArgs OPTIONS)
+
+ cmake_parse_arguments(_LUPDATE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+ set(_lupdate_files ${_LUPDATE_UNPARSED_ARGUMENTS})
+ set(_lupdate_options ${_LUPDATE_OPTIONS})
+
+ set(_my_sources)
+ set(_my_tsfiles)
+ foreach(_file ${_lupdate_files})
+ get_filename_component(_ext ${_file} EXT)
+ get_filename_component(_abs_FILE ${_file} ABSOLUTE)
+ if(_ext MATCHES "ts")
+ list(APPEND _my_tsfiles ${_abs_FILE})
+ else()
+ list(APPEND _my_sources ${_abs_FILE})
+ endif()
+ endforeach()
+ set(_my_temptsfiles)
+ foreach(_ts_file ${_my_tsfiles})
+ if(_my_sources)
+ # make a list file to call lupdate on, so we don't make our commands too
+ # long for some systems
+ get_filename_component(_ts_name ${_ts_file} NAME_WE)
+ set(_ts_lst_file "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${_ts_name}_lst_file")
+ set(_lst_file_srcs)
+ foreach(_lst_file_src ${_my_sources})
+ set(_lst_file_srcs "${_lst_file_src}\n${_lst_file_srcs}")
+ endforeach()
+
+ get_directory_property(_inc_DIRS INCLUDE_DIRECTORIES)
+ foreach(_pro_include ${_inc_DIRS})
+ get_filename_component(_abs_include "${_pro_include}" ABSOLUTE)
+ set(_lst_file_srcs "-I${_pro_include}\n${_lst_file_srcs}")
+ endforeach()
+
+ file(WRITE ${_ts_lst_file} "${_lst_file_srcs}")
+ endif()
+ get_filename_component(_ts_nm ${_ts_file} NAME)
+ set(_tmpts_file "${CMAKE_CURRENT_BINARY_DIR}/${_ts_nm}")
+ list(APPEND _my_temptsfiles ${_tmpts_file})
+ get_source_file_property(_qm_output_location ${_ts_file} OUTPUT_LOCATION)
+ add_custom_command(
+ OUTPUT ${_tmpts_file}
+ COMMAND ${Qt5_LUPDATE_EXECUTABLE}
+ ARGS ${_lupdate_options} "@${_ts_lst_file}" -ts ${_ts_file}
+ COMMAND ${CMAKE_COMMAND} -E copy ${_ts_file} ${_tmpts_file}
+ DEPENDS ${_my_sources} ${_ts_lst_file} VERBATIM)
+ if( _qm_output_location )
+ set_property(SOURCE ${_tmpts_file} PROPERTY OUTPUT_LOCATION ${_qm_output_location})
+ endif()
+ endforeach()
+ qt5_add_translation(${_qm_files} ${_my_temptsfiles})
+ set(${_qm_files} ${${_qm_files}} PARENT_SCOPE)
+endfunction()
+
+
+function(QT5_ADD_TRANSLATION _qm_files)
+ foreach(_current_FILE ${ARGN})
+ get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE)
+ get_filename_component(qm ${_abs_FILE} NAME_WE)
+ get_source_file_property(output_location ${_abs_FILE} OUTPUT_LOCATION)
+ if(output_location)
+ file(MAKE_DIRECTORY "${output_location}")
+ set(qm "${output_location}/${qm}.qm")
+ else()
+ set(qm "${CMAKE_CURRENT_BINARY_DIR}/${qm}.qm")
+ endif()
+
+ add_custom_command(OUTPUT ${qm}
+ COMMAND ${Qt5_LRELEASE_EXECUTABLE}
+ ARGS ${_abs_FILE} -qm ${qm}
+ DEPENDS ${_abs_FILE} VERBATIM
+ )
+ list(APPEND ${_qm_files} ${qm})
+ endforeach()
+ set(${_qm_files} ${${_qm_files}} PARENT_SCOPE)
+endfunction()
diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt
index dd4e1dca18..d049fc0154 100644
--- a/interface/CMakeLists.txt
+++ b/interface/CMakeLists.txt
@@ -10,8 +10,6 @@ set(MACRO_DIR "${ROOT_DIR}/cmake/macros")
set(TARGET_NAME interface)
project(${TARGET_NAME})
-find_package(Qt5LinguistTools REQUIRED)
-
# setup for find modules
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/")
set(FACESHIFT_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/faceshift")
@@ -19,6 +17,9 @@ set(LIBOVR_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/oculus")
set(SIXENSE_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/Sixense")
set(VISAGE_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/visage")
+find_package(Qt5LinguistTools REQUIRED)
+find_package(Qt5LinguistToolsMacros)
+
if (DEFINED ENV{JOB_ID})
set(BUILD_SEQ $ENV{JOB_ID})
else ()
@@ -77,7 +78,7 @@ set(INTERFACE_SRCS ${INTERFACE_SRCS} "${QT_UI_HEADERS}")
set(QM ${TARGET_NAME}_en.qm)
set(TS ${TARGET_NAME}_en.ts)
-qt5_create_translation(${QM} ${INTERFACE_SRCS} ${QT_UI_FILES} ${TS})
+qt5_create_translation_custom(${QM} ${INTERFACE_SRCS} ${QT_UI_FILES} ${TS})
if (APPLE)
# configure CMake to use a custom Info.plist
diff --git a/interface/interface_en.ts b/interface/interface_en.ts
index ed8a2155e4..13ed5b968b 100644
--- a/interface/interface_en.ts
+++ b/interface/interface_en.ts
@@ -45,7 +45,7 @@
-
+ day%n day
@@ -53,7 +53,7 @@
-
+ hour%n hour
@@ -61,7 +61,7 @@
-
+ minute%n minute
@@ -76,7 +76,7 @@
-
+ %1 online now:
@@ -113,18 +113,18 @@
Menu
-
+ Open .ini config file
-
-
+
+ Text files (*.ini)
-
+ Save .ini config file