继续接着上面一篇文章---cloudcompare源码编译遇到的问题,这篇文章介绍怎么制作汉化包(需说明的是,我是cmake小白,我下面的教程虽然能得到结果,但不一定是最好的)。
原理很简单,就是cmake创建Qt的翻译文件,试了Qt安装目录D:\Qt\Qt5.8.0\5.8\msvc2015_64\lib\cmake\Qt5LinguistTools中的文件
Qt5LinguistToolsMacros.cmake中的函数QT5_CREATE_TRANSLATION,想用它创建.ts文件,然后通过Qt的linguist进行翻译并发布,但是一直不能生成.ts文件,不知道什么原因,后面搜索才发现这是Qt的一个bug, 因此在Qt5LinguistToolsMacros.cmake中的函数QT5_CREATE_TRANSLATION后面新增了一个函数QT5_UPDATE_TRANSLATION(用法和QT5_CREATE_TRANSLATION是一样的):
function(QT5_UPDATE_TRANSLATION_qm_files)
set(options)
set(oneValueArgs) #compared toQT5_CREATE_TRANSLATION we are also looking for a target need
set(multiValueArgs OPTIONS)
cmake_parse_arguments(_LUPDATE "${options}""${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(_lupdate_files${_LUPDATE_UNPARSED_ARGUMENTS})
set(_lupdate_options ${_LUPDATE_OPTIONS})
#message("files: ${_lupdate_files}\n\n")
#message("options: ${_lupdate_options}\n\n")
set(_my_sources)
set(_my_tsfiles)
set(_lupdate_target) #here the target to use for the customcommand will be stored
foreach(_file ${_lupdate_files})
get_filename_component(_ext ${_file}EXT)
get_filename_component(_abs_FILE${_file} ABSOLUTE)
if(TARGET ${_file}) #gets the target that should be added
set(_lupdate_target ${_file}) #store the target we'll usefor the custom command
elseif(_ext MATCHES "ts")
list(APPEND _my_tsfiles${_abs_FILE})
else()
list(APPEND _my_sources ${_abs_FILE})
endif()
endforeach()
foreach(_ts_file ${_my_tsfiles})
if(_my_sources)
# make a list file to call lupdateon, 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_DIRSINCLUDE_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()
add_custom_command(TARGET ${_lupdate_target} # make the customcommand depend on the given target
PRE_BUILD # I thinkit's a good idea to let this execute early
COMMAND${Qt5_LUPDATE_EXECUTABLE}
ARGS ${_lupdate_options}"@${_ts_lst_file}" -ts ${_ts_file}
VERBATIM)
endforeach()
qt5_add_translation(${_qm_files} ${_my_tsfiles})
set(${_qm_files} ${${_qm_files}}PARENT_SCOPE)
endfunction()
有了这个之后,就能生成新的.ts文件啦.
如果想要自己编译的cloudcompare双击就加载语言包(.qm文件),那么需要修改源码,即修改CloudCompare的main函数(在CloudCompare-master-CC\qCC下的main.cpp中),其中有下面这两句:
QTranslator translator;
if (commandLine)
可以在if (commandLine)后面加个else,在不是从命令行启动的时候就加载当前目录下的CloudCompare.qm文档,如下:
else {// If not command line mode, search CloudCompare.qm file inprogram directory
QString fullFilePath = QCoreApplication::applicationDirPath()+ QObject::tr("/CloudCompare.qm");
QFileInfo fiInfo(fullFilePath);
if (fiInfo.exists())
{
translator.load(fullFilePath);
app.installTranslator(&translator);
}
else
{
ccLog::Print(QObject::tr("Unable to find translationfile CloudCompare.qm in the program directory!"));
}
}在上面步骤结束后,修改CloudCompare-master\qCC下的CMakeLists.txt文件(要先改main函数,然后再编译),从第45行开始(如果你对cmake很熟悉,应该可以随便选择从哪添加,我是cmake小白。这里提一下,我用的是CloudCompare v2.9的源码编译的,如果后面更新了,可能对应的行数也得变,自己灵机应变吧)
qt5_wrap_ui(generated_ui_list ${ui_list} )#这是第45行
qt5_add_resources(generated_qrc_list ${qrc_list} )
# 自己添加下面两行
find_package(Qt5CoreREQUIRED)
find_package(Qt5LinguistToolsREQUIRED)
if( MSVC )
# App icon with MSVC
set( rc_list images/icon/cc_icon.rc )
#to get rid of the (system) console
add_executable( ${PROJECT_NAME} WIN32 ${header_list}${source_list} ${generated_ui_list} ${generated_qrc_list} ${rc_list}${txt_list} )
#自己添加下面两行
qt5_use_modules(CloudCompare Core)
qt5_update_translation(QMs CloudCompare${header_list} ${source_list} ${generated_ui_list} CloudCompare.ts)后面就只剩下用cmake编译了,网上很多教程,这里就不啰嗦了!如果遇到难解决的问题,可以看看是不是我之前遇到的问题(点这里)。
这里附上我已经做好的.ts文件(点击跳转到下载页),通过Qt的linguist进行翻译并发布并发布!