From 9dad1d79d7b4f636251d38845707d7544f9b0933 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 17 Sep 2023 01:40:25 +1000 Subject: [PATCH] CMake: Generate/copy qtbase translations on Linux/Mac --- .../workflows/scripts/linux/appimage-qt.sh | 3 +- cmake/CopyBaseTranslations.cmake | 53 +++++++++++++++++++ pcsx2-qt/CMakeLists.txt | 6 ++- pcsx2/CMakeLists.txt | 2 +- 4 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 cmake/CopyBaseTranslations.cmake diff --git a/.github/workflows/scripts/linux/appimage-qt.sh b/.github/workflows/scripts/linux/appimage-qt.sh index b5f27b3dbd..2c28ff4b19 100755 --- a/.github/workflows/scripts/linux/appimage-qt.sh +++ b/.github/workflows/scripts/linux/appimage-qt.sh @@ -142,8 +142,7 @@ rm -fr "$DEPSDIR" mv "$DEPSDIR.bak" "$DEPSDIR" # Fix up translations. -rm -fr "$OUTDIR/usr/bin/translations" -mv "$OUTDIR/usr/translations" "$OUTDIR/usr/bin" +rm -fr "$OUTDIR/usr/bin/translations" "$OUTDIR/usr/translations" cp -a "$BUILDDIR/bin/translations" "$OUTDIR/usr/bin" # Generate AppStream meta-info. diff --git a/cmake/CopyBaseTranslations.cmake b/cmake/CopyBaseTranslations.cmake new file mode 100644 index 0000000000..7b8a588ee2 --- /dev/null +++ b/cmake/CopyBaseTranslations.cmake @@ -0,0 +1,53 @@ +function(copy_base_translations target) + get_target_property(MOC_EXECUTABLE_LOCATION Qt6::moc IMPORTED_LOCATION) + get_filename_component(QT_BINARY_DIRECTORY "${MOC_EXECUTABLE_LOCATION}" DIRECTORY) + find_program(LCONVERT_EXE lconvert HINTS "${QT_BINARY_DIRECTORY}") + set(BASE_TRANSLATIONS_DIR "${QT_BINARY_DIRECTORY}/../translations") + + if(NOT APPLE) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E make_directory "$/translations") + endif() + + file(GLOB qmFiles "${BASE_TRANSLATIONS_DIR}/qt_*.qm") + foreach(path IN LISTS qmFiles) + get_filename_component(file ${path} NAME) + + # qt_help_ just has to ruin everything. + if(file MATCHES "qt_help_" OR NOT file MATCHES "qt_([^.]+).qm") + continue() + endif() + + # If qtbase_.qm exists, merge all qms for that language into a single qm. + set(lang "${CMAKE_MATCH_1}") + set(baseQmPath "${BASE_TRANSLATIONS_DIR}/qtbase_${lang}.qm") + if(EXISTS "${baseQmPath}") + set(outPath "${CMAKE_CURRENT_BINARY_DIR}/qt_${lang}.qm") + set(srcQmFiles) + file(GLOB langQmFiles "${BASE_TRANSLATIONS_DIR}/qt*${lang}.qm") + foreach(qmFile IN LISTS langQmFiles) + get_filename_component(file ${qmFile} NAME) + if(file STREQUAL "qt_${lang}.qm") + continue() + endif() + LIST(APPEND srcQmFiles "${qmFile}") + endforeach() + add_custom_command(OUTPUT ${outPath} + COMMAND "${LCONVERT_EXE}" -verbose -of qm -o "${outPath}" ${srcQmFiles} + DEPENDS ${srcQmFiles} + ) + set(path "${outPath}") + endif() + + target_sources(${target} PRIVATE ${path}) + if(APPLE) + set_source_files_properties(${path} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/translations) + elseif(WIN32) + # TODO: Set the correct binary instead of relying on make install on Windows... + install(FILES "${path}" DESTINATION "${CMAKE_SOURCE_DIR}/bin/translations") + else() + add_custom_command(TARGET ${target} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${path}" "$/translations") + endif() + endforeach() +endfunction() diff --git a/pcsx2-qt/CMakeLists.txt b/pcsx2-qt/CMakeLists.txt index 8ea29704f2..b35fe276f4 100644 --- a/pcsx2-qt/CMakeLists.txt +++ b/pcsx2-qt/CMakeLists.txt @@ -1,3 +1,5 @@ +include(CopyBaseTranslations) + set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) @@ -200,6 +202,7 @@ target_compile_definitions(pcsx2-qt PRIVATE QT_NO_EXCEPTIONS) if(WIN32) set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_SOURCE_DIR}/bin/translations") qt_add_lrelease(pcsx2-qt TS_FILES ${TS_FILES}) + copy_base_translations(pcsx2-qt) elseif(APPLE) qt_add_lrelease(pcsx2-qt TS_FILES ${TS_FILES} QM_FILES_OUTPUT_VARIABLE QM_FILES) set(PCSX2_MACOS_LOCALIZATIONS) @@ -218,8 +221,8 @@ elseif(APPLE) target_sources(pcsx2-qt PRIVATE ${QM_FILE}) set_source_files_properties(${QM_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/translations/) endforeach() + copy_base_translations(pcsx2-qt) else() - # TODO: Copy base translations. qt_add_lrelease(pcsx2-qt TS_FILES ${TS_FILES} QM_FILES_OUTPUT_VARIABLE QM_FILES) set(QM_OUTPUT_DIR "$/translations") add_custom_command(TARGET pcsx2-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${QM_OUTPUT_DIR}") @@ -227,6 +230,7 @@ else() get_filename_component(QM_FILE_NAME ${QM_FILE} NAME) add_custom_command(TARGET pcsx2-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${QM_FILE}" "${QM_OUTPUT_DIR}/${QM_FILE_NAME}") endforeach() + copy_base_translations(pcsx2-qt) endif() diff --git a/pcsx2/CMakeLists.txt b/pcsx2/CMakeLists.txt index 679b498de8..54faf5ec82 100644 --- a/pcsx2/CMakeLists.txt +++ b/pcsx2/CMakeLists.txt @@ -1274,7 +1274,7 @@ function(setup_main_executable target) endif() endif() find_program(WINDEPLOYQT_EXE windeployqt HINTS "${QT_BINARY_DIRECTORY}") - install(CODE "execute_process(COMMAND \"${WINDEPLOYQT_EXE}\" \"${CMAKE_SOURCE_DIR}/bin/$\" --plugindir \"${CMAKE_SOURCE_DIR}/bin/QtPlugins\" --no-compiler-runtime --no-system-d3d-compiler COMMAND_ERROR_IS_FATAL ANY)") + install(CODE "execute_process(COMMAND \"${WINDEPLOYQT_EXE}\" \"${CMAKE_SOURCE_DIR}/bin/$\" --plugindir \"${CMAKE_SOURCE_DIR}/bin/QtPlugins\" --no-compiler-runtime --no-system-d3d-compiler --no-translations COMMAND_ERROR_IS_FATAL ANY)") install(CODE "file(WRITE \"${CMAKE_SOURCE_DIR}/bin/qt.conf\" \"[Paths]\\nPlugins = ./QtPlugins\")") endif()