@@ -67,7 +67,7 @@ function(SlicerMacroTranslation)
6767 foreach (language ${MY_TS_LANGUAGES} )
6868 set (ts_file "${MY_TS_DIR} /${MY_TS_BASEFILENAME} _${language} .ts" )
6969
70- if (NOT Slicer_UPDATE_TRANSLATION AND NOT EXISTS ${ts_file} )
70+ if (NOT EXISTS ${ts_file} )
7171 continue ()
7272 endif ()
7373
@@ -79,6 +79,7 @@ function(SlicerMacroTranslation)
7979 # ---------------------------------------------------------------------------------
8080 set_property (GLOBAL APPEND PROPERTY Slicer_TS_BASEFILENAMES ${MY_TS_BASEFILENAME} )
8181 set_property (GLOBAL PROPERTY Slicer_${MY_TS_BASEFILENAME} _FILES_TO_TRANSLATE "${FILES_TO_TRANSLATE} " )
82+ set_property (GLOBAL PROPERTY Slicer_${MY_TS_BASEFILENAME} _TS_DIR "${MY_TS_DIR} " )
8283 set_property (GLOBAL PROPERTY Slicer_${MY_TS_BASEFILENAME} _TS_FILES "${TS_FILES} " )
8384 set_property (GLOBAL PROPERTY Slicer_${MY_TS_BASEFILENAME} _QM_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR} " )
8485
@@ -108,13 +109,15 @@ function(SlicerFunctionAddGenerateSlicerTranslationQMFilesTarget)
108109
109110 # ---------------------------------------------------------------------------------
110111 set (qm_output_dirs)
112+ set (untranslated_ts_files)
111113
112114 # ---------------------------------------------------------------------------------
113115 # UPDATE or ADD translation
114116 # ---------------------------------------------------------------------------------
115117 get_property (ts_basefilenames GLOBAL PROPERTY Slicer_TS_BASEFILENAMES)
116118 foreach (ts_basefilename IN LISTS ts_basefilenames)
117119 get_property (files_to_translate GLOBAL PROPERTY Slicer_${ts_basefilename} _FILES_TO_TRANSLATE)
120+ get_property (ts_dir GLOBAL PROPERTY Slicer_${ts_basefilename} _TS_DIR)
118121 get_property (ts_files GLOBAL PROPERTY Slicer_${ts_basefilename} _TS_FILES)
119122 get_property (qm_output_dir GLOBAL PROPERTY Slicer_${ts_basefilename} _QM_OUTPUT_DIR)
120123
@@ -147,8 +150,15 @@ function(SlicerFunctionAddGenerateSlicerTranslationQMFilesTarget)
147150 endforeach ()
148151 endif ()
149152
150- set_source_files_properties (${ts_files} PROPERTIES OUTPUT_LOCATION ${qm_output_dir} )
153+ # Add custom commands for creating or updating "*_untranslated.ts" files.
154+ set (untranslated_ts_dir "${CMAKE_BINARY_DIR} /TranslationTemplates" )
155+ set (untranslated_ts_file ${untranslated_ts_dir} /${ts_basefilename} _untranslated.ts)
156+ SLICER_CREATE_TRANSLATION_ONLY(
157+ ${srcs_to_translate} ${rewritten_scripts_to_translate_for_context} ${untranslated_ts_file}
158+ OPTIONS -source -language en_US -no -ui-lines
159+ )
151160
161+ set_source_files_properties (${ts_files} PROPERTIES OUTPUT_LOCATION ${qm_output_dir} )
152162 if (Slicer_UPDATE_TRANSLATION)
153163 # Add custom command for creating or updating "*_<lang>.ts" translation files, and for
154164 # generating the associated "*_<lang>.qm" files.
@@ -161,13 +171,22 @@ function(SlicerFunctionAddGenerateSlicerTranslationQMFilesTarget)
161171 QT5_ADD_TRANSLATION(QM_OUTPUT_FILES ${ts_files} )
162172 endif ()
163173
174+ list (APPEND untranslated_ts_files ${untranslated_ts_file} )
164175 list (APPEND qm_output_dirs ${qm_output_dir} )
165176 endforeach ()
166177
167178 # ---------------------------------------------------------------------------------
168179 # Targets
169180 # ---------------------------------------------------------------------------------
170181
182+ set (_all)
183+ if (Slicer_UPDATE_TRANSLATION)
184+ set (_all ALL )
185+ endif ()
186+ add_custom_target (GenerateSlicerTranslationTemplates ${_all} DEPENDS
187+ ${untranslated_ts_files}
188+ )
189+
171190 add_custom_target (GenerateSlicerTranslationQMFiles ALL DEPENDS
172191 ${QM_OUTPUT_FILES}
173192 )
@@ -187,3 +206,53 @@ function(SlicerFunctionAddGenerateSlicerTranslationQMFilesTarget)
187206 set (${MY_QM_OUTPUT_DIRS_VAR} ${qm_output_dirs} PARENT_SCOPE)
188207
189208endfunction ()
209+
210+
211+ function (SLICER_CREATE_TRANSLATION_ONLY)
212+ # Adapted from QT5_CREATE_TRANSLATION:
213+ # - remove call to "qt5_add_translation"
214+ # - remove setting of "_qm_files" output variable
215+ set (options )
216+ set (oneValueArgs)
217+ set (multiValueArgs OPTIONS )
218+
219+ cmake_parse_arguments (_LUPDATE "${options} " "${oneValueArgs} " "${multiValueArgs} " ${ARGN} )
220+ set (_lupdate_files ${_LUPDATE_UNPARSED_ARGUMENTS} )
221+ set (_lupdate_options ${_LUPDATE_OPTIONS} )
222+
223+ set (_my_sources)
224+ set (_my_tsfiles)
225+ foreach (_file ${_lupdate_files} )
226+ get_filename_component (_ext ${_file} EXT )
227+ get_filename_component (_abs_FILE ${_file} ABSOLUTE )
228+ if (_ext MATCHES "ts" )
229+ list (APPEND _my_tsfiles ${_abs_FILE} )
230+ else ()
231+ list (APPEND _my_sources ${_abs_FILE} )
232+ endif ()
233+ endforeach ()
234+ foreach (_ts_file ${_my_tsfiles} )
235+ if (_my_sources)
236+ # make a list file to call lupdate on, so we don't make our commands too
237+ # long for some systems
238+ get_filename_component (_ts_name ${_ts_file} NAME_WE )
239+ set (_ts_lst_file "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY} /${_ts_name} _lst_file" )
240+ set (_lst_file_srcs)
241+ foreach (_lst_file_src ${_my_sources} )
242+ set (_lst_file_srcs "${_lst_file_src} \n ${_lst_file_srcs} " )
243+ endforeach ()
244+
245+ get_directory_property (_inc_DIRS INCLUDE_DIRECTORIES )
246+ foreach (_pro_include ${_inc_DIRS} )
247+ get_filename_component (_abs_include "${_pro_include} " ABSOLUTE )
248+ set (_lst_file_srcs "-I${_pro_include} \n ${_lst_file_srcs} " )
249+ endforeach ()
250+
251+ file (WRITE ${_ts_lst_file} "${_lst_file_srcs} " )
252+ endif ()
253+ add_custom_command (OUTPUT ${_ts_file}
254+ COMMAND ${Qt5_LUPDATE_EXECUTABLE}
255+ ARGS ${_lupdate_options} "@${_ts_lst_file} " -ts ${_ts_file}
256+ DEPENDS ${_my_sources} ${_ts_lst_file} VERBATIM )
257+ endforeach ()
258+ endfunction ()
0 commit comments