Change version in about window and installer name (#2570)
* Change version in about window and installer name * Change version in about window and installer name * Cmake get version updates * dev snapshot format changed * alignment changes
This commit is contained in:
parent
5f3a3f535a
commit
3356b2ede7
5 changed files with 202 additions and 25 deletions
2
.github/CONTRIBUTING.md
vendored
2
.github/CONTRIBUTING.md
vendored
|
@ -236,7 +236,7 @@ upstream - git@github.com:Cockatrice/Cockatrice.git
|
||||||
$COCKATRICE_REPO - /Location/of/repository/cockatrice.git
|
$COCKATRICE_REPO - /Location/of/repository/cockatrice.git
|
||||||
$TAG_NAME
|
$TAG_NAME
|
||||||
- If full release, YYYY-MM-DD-Release-MAJ.MIN.PATCH
|
- If full release, YYYY-MM-DD-Release-MAJ.MIN.PATCH
|
||||||
- If dev snapshot, cockatrice-MAJ.MIN.PATCH-beta###
|
- If dev snapshot, YYYY-MM-DD-Development-MAJ.MIN.PATCH-betaXYZ
|
||||||
- MAJ.MIN.PATCH will be the NEXT release version
|
- MAJ.MIN.PATCH will be the NEXT release version
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,10 @@ if(POLICY CMP0064)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(PROJECT_NAME "Cockatrice")
|
set(PROJECT_NAME "Cockatrice")
|
||||||
|
# Can be overriden by git tags, see cmake/getversion.cmake
|
||||||
|
set(PROJECT_VERSION_MAJOR "2")
|
||||||
|
set(PROJECT_VERSION_MINOR "3")
|
||||||
|
set(PROJECT_VERSION_PATCH "17")
|
||||||
|
|
||||||
# Default to "Release" build type
|
# Default to "Release" build type
|
||||||
# User-provided value for CMAKE_BUILD_TYPE must be checked before the PROJECT() call
|
# User-provided value for CMAKE_BUILD_TYPE must be checked before the PROJECT() call
|
||||||
|
@ -162,6 +166,7 @@ set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
|
||||||
set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
|
set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
|
||||||
set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
|
set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
|
||||||
set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}")
|
set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}")
|
||||||
|
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_VERSION_FILENAME}")
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
@ -170,7 +175,6 @@ if(UNIX)
|
||||||
set(CPACK_DMG_FORMAT "UDBZ")
|
set(CPACK_DMG_FORMAT "UDBZ")
|
||||||
set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}")
|
set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}")
|
||||||
set(CPACK_SYSTEM_NAME "OSX")
|
set(CPACK_SYSTEM_NAME "OSX")
|
||||||
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
|
|
||||||
set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/cockatrice/resources/appicon.icns")
|
set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/cockatrice/resources/appicon.icns")
|
||||||
else()
|
else()
|
||||||
# linux
|
# linux
|
||||||
|
@ -186,11 +190,9 @@ if(UNIX)
|
||||||
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "http://github.com/Cockatrice/Cockatrice")
|
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "http://github.com/Cockatrice/Cockatrice")
|
||||||
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5multimedia5-plugins, libqt5svg5")
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5multimedia5-plugins, libqt5svg5")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
|
|
||||||
endif()
|
endif()
|
||||||
elseif(WIN32)
|
elseif(WIN32)
|
||||||
set(CPACK_GENERATOR NSIS ${CPACK_GENERATOR})
|
set(CPACK_GENERATOR NSIS ${CPACK_GENERATOR})
|
||||||
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
|
|
||||||
|
|
||||||
# Configure file with custom definitions for NSIS.
|
# Configure file with custom definitions for NSIS.
|
||||||
configure_file(
|
configure_file(
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
!include "FileFunc.nsh"
|
!include "FileFunc.nsh"
|
||||||
|
|
||||||
Name "@CPACK_PACKAGE_NAME@"
|
Name "@CPACK_PACKAGE_NAME@"
|
||||||
BrandingText "@CPACK_PACKAGE_NAME@-@CPACK_PACKAGE_VERSION_MAJOR@"
|
BrandingText "@CPACK_PACKAGE_FILE_NAME@"
|
||||||
OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
|
OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
|
||||||
SetCompressor /SOLID lzma
|
SetCompressor /SOLID lzma
|
||||||
InstallDir "$PROGRAMFILES\Cockatrice"
|
InstallDir "$PROGRAMFILES\Cockatrice"
|
||||||
|
|
|
@ -1,40 +1,215 @@
|
||||||
find_package(Git)
|
# HELPER FUNCTIONS
|
||||||
if(GIT_FOUND)
|
|
||||||
|
function(get_commit_id)
|
||||||
|
# get last commit hash
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${GIT_EXECUTABLE} log -1 --abbrev=7 --date=short "--pretty=%h"
|
COMMAND ${GIT_EXECUTABLE} log -1 --abbrev=7 --date=short "--pretty=%h"
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||||
RESULT_VARIABLE res_var
|
RESULT_VARIABLE res_var
|
||||||
OUTPUT_VARIABLE GIT_COM_ID
|
OUTPUT_VARIABLE GIT_COM_ID
|
||||||
)
|
)
|
||||||
if( NOT ${res_var} EQUAL 0 )
|
if(NOT ${res_var} EQUAL 0)
|
||||||
set( GIT_COMMIT_ID "unknown")
|
message(WARNING "Git failed (not a repo, or no tags). Build will not contain git revision info.")
|
||||||
message( WARNING "Git failed (not a repo, or no tags). Build will not contain git revision info." )
|
return()
|
||||||
endif()
|
endif()
|
||||||
string( REPLACE "\n" "" GIT_COMMIT_ID "${GIT_COM_ID}" )
|
|
||||||
|
|
||||||
|
string(REPLACE "\n" "" GIT_COM_ID "${GIT_COM_ID}")
|
||||||
|
set(GIT_COMMIT_ID "${GIT_COM_ID}" PARENT_SCOPE)
|
||||||
|
set(PROJECT_VERSION_LABEL "custom_${GIT_COM_ID}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(get_commit_date)
|
||||||
|
# get last commit date
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${GIT_EXECUTABLE} log -1 --date=short "--pretty=%cd"
|
COMMAND ${GIT_EXECUTABLE} log -1 --date=short "--pretty=%cd"
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||||
RESULT_VARIABLE res_var
|
RESULT_VARIABLE res_var
|
||||||
OUTPUT_VARIABLE GIT_COM_DATE
|
OUTPUT_VARIABLE GIT_COM_DATE
|
||||||
)
|
)
|
||||||
if( NOT ${res_var} EQUAL 0 )
|
if(NOT ${res_var} EQUAL 0)
|
||||||
set( GIT_COMMIT_DATE "unknown")
|
message(WARNING "Git failed (not a repo, or no tags). Build will not contain git revision info.")
|
||||||
set( GIT_COMMIT_DATE_FRIENDLY "unknown")
|
return()
|
||||||
message( WARNING "Git failed (not a repo, or no tags). Build will not contain git revision info." )
|
|
||||||
endif()
|
endif()
|
||||||
string( REPLACE "\n" "" GIT_COMMIT_DATE_FRIENDLY "${GIT_COM_DATE}" )
|
|
||||||
string( REPLACE "-" "" GIT_COMMIT_DATE "${GIT_COMMIT_DATE_FRIENDLY}" )
|
string(REPLACE "\n" "" GIT_COM_DATE "${GIT_COM_DATE}")
|
||||||
|
set(GIT_COMMIT_DATE_FRIENDLY "${GIT_COM_DATE}" PARENT_SCOPE)
|
||||||
|
|
||||||
|
string(REPLACE "-" "" GIT_COM_DATE "${GIT_COM_DATE}")
|
||||||
|
set(GIT_COMMIT_DATE "${GIT_COM_DATE}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(clean_release_name name)
|
||||||
|
# "name": "Cockatrice: Thopter Pie Network, Revision 2"
|
||||||
|
|
||||||
|
# Remove all double quotes
|
||||||
|
STRING(REPLACE "\"" "" name "${name}")
|
||||||
|
# Remove json prefix "name: "
|
||||||
|
STRING(REPLACE " name: " "" name "${name}")
|
||||||
|
# Remove "cockatrice" name
|
||||||
|
STRING(REPLACE "Cockatrice" "" name "${name}")
|
||||||
|
# Remove all unwanted chars
|
||||||
|
STRING(REGEX REPLACE "[^A-Za-z0-9_ ]" "" name "${name}")
|
||||||
|
# Strip (trim) whitespaces
|
||||||
|
STRING(STRIP "${name}" name)
|
||||||
|
# Replace all spaces with underscores
|
||||||
|
STRING(REPLACE " " "_" name "${name}")
|
||||||
|
|
||||||
|
set(GIT_TAG_RELEASENAME "${name}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(get_tag_name commit)
|
||||||
|
if(${commit} STREQUAL "unknown")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} describe --exact-match --tags ${commit}
|
||||||
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||||
|
RESULT_VARIABLE res_var
|
||||||
|
OUTPUT_VARIABLE GIT_TAG
|
||||||
|
ERROR_VARIABLE GIT_TAG_ERR
|
||||||
|
)
|
||||||
|
|
||||||
|
if((NOT ${res_var} EQUAL 0) OR (${GIT_TAG_ERR} MATCHES "fatal: no tag exactly matches.*"))
|
||||||
|
message(STATUS "Commit is not a release or prerelease (no git tag found)")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REPLACE "\n" "" GIT_TAG "${GIT_TAG}")
|
||||||
|
message(STATUS "Commit is a release or prerelease, git tag: ${GIT_TAG}")
|
||||||
|
|
||||||
|
# Extract information from tag:
|
||||||
|
# YYYY-MM-DD-Release-MAJ.MIN.PATCH
|
||||||
|
# YYYY-MM-DD-Development-MAJ.MIN.PATCH-betaXYZ
|
||||||
|
string(REPLACE "-" ";" GIT_TAG_EXPLODED "${GIT_TAG}")
|
||||||
|
string(REPLACE "." ";" GIT_TAG_EXPLODED "${GIT_TAG_EXPLODED}")
|
||||||
|
|
||||||
|
# Sanity checks: length
|
||||||
|
list(LENGTH GIT_TAG_EXPLODED GIT_TAG_LISTCOUNT)
|
||||||
|
if(${GIT_TAG_LISTCOUNT} LESS 7 OR ${GIT_TAG_LISTCOUNT} GREATER 8)
|
||||||
|
message(WARNING "Invalid tag format, got ${GIT_TAG_LISTCOUNT} tokens")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Year
|
||||||
|
list(GET GIT_TAG_EXPLODED 0 GIT_TAG_YEAR)
|
||||||
|
if(${GIT_TAG_YEAR} LESS 2017 OR ${GIT_TAG_LISTCOUNT} GREATER 2100)
|
||||||
|
message(WARNING "Invalid tag year ${GIT_TAG_YEAR}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Month
|
||||||
|
list(GET GIT_TAG_EXPLODED 1 GIT_TAG_MONTH)
|
||||||
|
if(${GIT_TAG_MONTH} LESS 1 OR ${GIT_TAG_MONTH} GREATER 12)
|
||||||
|
message(WARNING "Invalid tag month ${GIT_TAG_MONTH}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Day
|
||||||
|
list(GET GIT_TAG_EXPLODED 2 GIT_TAG_DAY)
|
||||||
|
if(${GIT_TAG_DAY} LESS 1 OR ${GIT_TAG_DAY} GREATER 31)
|
||||||
|
message(WARNING "Invalid tag day ${GIT_TAG_DAY}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Type
|
||||||
|
list(GET GIT_TAG_EXPLODED 3 GIT_TAG_TYPE)
|
||||||
|
if(NOT(${GIT_TAG_TYPE} STREQUAL "Release" OR ${GIT_TAG_TYPE} STREQUAL "Development"))
|
||||||
|
message(WARNING "Invalid tag type ${GIT_TAG_TYPE}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Major
|
||||||
|
list(GET GIT_TAG_EXPLODED 4 GIT_TAG_MAJOR)
|
||||||
|
if(${GIT_TAG_MAJOR} LESS 0 OR ${GIT_TAG_MAJOR} GREATER 99)
|
||||||
|
message(WARNING "Invalid tag major version ${GIT_TAG_MAJOR}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Minor
|
||||||
|
list(GET GIT_TAG_EXPLODED 5 GIT_TAG_MINOR)
|
||||||
|
if(${GIT_TAG_MINOR} LESS 0 OR ${GIT_TAG_MINOR} GREATER 99)
|
||||||
|
message(WARNING "Invalid tag minor version ${GIT_TAG_MINOR}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Patch
|
||||||
|
list(GET GIT_TAG_EXPLODED 6 GIT_TAG_PATCH)
|
||||||
|
if(${GIT_TAG_PATCH} LESS 0 OR ${GIT_TAG_PATCH} GREATER 99)
|
||||||
|
message(WARNING "Invalid tag patch version ${GIT_TAG_PATCH}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Label
|
||||||
|
if(${GIT_TAG_LISTCOUNT} EQUAL 8)
|
||||||
|
list(GET GIT_TAG_EXPLODED 7 GIT_TAG_LABEL)
|
||||||
|
else()
|
||||||
|
SET(GIT_TAG_LABEL "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Override hardcoded version with the informations from the tag
|
||||||
|
set(PROJECT_VERSION_MAJOR ${GIT_TAG_MAJOR} PARENT_SCOPE)
|
||||||
|
set(PROJECT_VERSION_MINOR ${GIT_TAG_MINOR} PARENT_SCOPE)
|
||||||
|
set(PROJECT_VERSION_PATCH ${GIT_TAG_PATCH} PARENT_SCOPE)
|
||||||
|
set(PROJECT_VERSION_LABEL ${GIT_TAG_LABEL} PARENT_SCOPE)
|
||||||
|
|
||||||
|
if(${GIT_TAG_TYPE} STREQUAL "Development")
|
||||||
|
set(PROJECT_VERSION_LABEL ${GIT_TAG_LABEL} PARENT_SCOPE)
|
||||||
|
elseif(${GIT_TAG_TYPE} STREQUAL "Release")
|
||||||
|
set(PROJECT_VERSION_LABEL "" PARENT_SCOPE)
|
||||||
|
|
||||||
|
# get version name from github
|
||||||
|
set(GIT_TAG_TEMP_FILE "${PROJECT_BINARY_DIR}/tag_informations.txt")
|
||||||
|
set(GIT_TAG_TEMP_URL "https://api.github.com/repos/Cockatrice/Cockatrice/releases/tags/${GIT_TAG}")
|
||||||
|
message(STATUS "Fetching tag informations from ${GIT_TAG_TEMP_URL}")
|
||||||
|
file(REMOVE "${GIT_TAG_TEMP_FILE}")
|
||||||
|
file(DOWNLOAD "${GIT_TAG_TEMP_URL}" "${GIT_TAG_TEMP_FILE}" STATUS status LOG log INACTIVITY_TIMEOUT 30 TIMEOUT 300 SHOW_PROGRESS)
|
||||||
|
list(GET status 0 err)
|
||||||
|
list(GET status 1 msg)
|
||||||
|
if(err)
|
||||||
|
message(WARNING "Download failed with error ${msg}: ${log}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
file(STRINGS "${GIT_TAG_TEMP_FILE}" GIT_TAG_RAW_RELEASENAME REGEX "\"name\": \"" LIMIT_COUNT 1)
|
||||||
|
|
||||||
|
clean_release_name("${GIT_TAG_RAW_RELEASENAME}")
|
||||||
|
set(PROJECT_VERSION_RELEASENAME "${GIT_TAG_RELEASENAME}" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# START OF MAIN
|
||||||
|
|
||||||
|
# fallback defaults
|
||||||
|
set(GIT_COMMIT_ID "unknown")
|
||||||
|
set(GIT_COMMIT_DATE "unknown")
|
||||||
|
set(GIT_COMMIT_DATE_FRIENDLY "unknown")
|
||||||
|
set(PROJECT_VERSION_LABEL "custom_unknown")
|
||||||
|
set(PROJECT_VERSION_RELEASENAME "")
|
||||||
|
|
||||||
|
find_package(Git)
|
||||||
|
if(GIT_FOUND)
|
||||||
|
get_commit_id()
|
||||||
|
get_commit_date()
|
||||||
|
get_tag_name(${GIT_COMMIT_ID})
|
||||||
else()
|
else()
|
||||||
set( GIT_COMMIT_ID "unknown")
|
|
||||||
set( GIT_COMMIT_DATE "unknown")
|
|
||||||
set( GIT_COMMIT_DATE_FRIENDLY "unknown")
|
|
||||||
message( WARNING "Git not found. Build will not contain git revision info." )
|
message( WARNING "Git not found. Build will not contain git revision info." )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(PROJECT_VERSION_MAJOR "0")
|
|
||||||
set(PROJECT_VERSION_MINOR "0")
|
|
||||||
set(PROJECT_VERSION_PATCH "1~git${GIT_COMMIT_DATE}.${GIT_COMMIT_ID}")
|
|
||||||
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
||||||
set(PROJECT_VERSION_FRIENDLY "${GIT_COMMIT_ID} (${GIT_COMMIT_DATE_FRIENDLY})")
|
if(PROJECT_VERSION_LABEL)
|
||||||
|
set(PROJECT_VERSION "${PROJECT_VERSION}-${PROJECT_VERSION_LABEL}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(PROJECT_VERSION_FRIENDLY "${PROJECT_VERSION}<br>(${GIT_COMMIT_DATE_FRIENDLY})")
|
||||||
|
|
||||||
|
# Format: <program name>[-ReleaseName]-MAJ.MIN.PATCH[-prerelease_label]
|
||||||
|
set(PROJECT_VERSION_FILENAME "${PROJECT_NAME}")
|
||||||
|
if(PROJECT_VERSION_RELEASENAME)
|
||||||
|
set(PROJECT_VERSION_FILENAME "${PROJECT_VERSION_FILENAME}-${PROJECT_VERSION_RELEASENAME}")
|
||||||
|
endif()
|
||||||
|
set(PROJECT_VERSION_FILENAME "${PROJECT_VERSION_FILENAME}-${PROJECT_VERSION}")
|
||||||
|
|
||||||
|
message(STATUS "Project version: ${PROJECT_VERSION}")
|
||||||
|
message(STATUS "Friendly project version: ${PROJECT_VERSION_FRIENDLY}")
|
||||||
|
message(STATUS "Project version filename: ${PROJECT_VERSION_FILENAME}")
|
||||||
|
|
|
@ -285,7 +285,7 @@ void MainWindow::actAbout()
|
||||||
{
|
{
|
||||||
QMessageBox mb(QMessageBox::NoIcon, tr("About Cockatrice"), QString(
|
QMessageBox mb(QMessageBox::NoIcon, tr("About Cockatrice"), QString(
|
||||||
"<font size=\"8\"><b>Cockatrice</b></font><br>"
|
"<font size=\"8\"><b>Cockatrice</b></font><br>"
|
||||||
+ tr("Version %1").arg(VERSION_STRING)
|
+ tr("Version<br>%1").arg(VERSION_STRING)
|
||||||
+ "<br><br><b><a href='" + GITHUB_PAGES_URL + "'>" + tr("Cockatrice Webpage") + "</a></b><br>"
|
+ "<br><br><b><a href='" + GITHUB_PAGES_URL + "'>" + tr("Cockatrice Webpage") + "</a></b><br>"
|
||||||
+ "<br><br><b>" + tr("Project Manager:") + "</b><br>Gavin Bisesi<br><br>"
|
+ "<br><br><b>" + tr("Project Manager:") + "</b><br>Gavin Bisesi<br><br>"
|
||||||
+ "<b>" + tr("Past Project Managers:") + "</b><br>Max-Wilhelm Bruker<br>Marcus Schütz<br><br>"
|
+ "<b>" + tr("Past Project Managers:") + "</b><br>Max-Wilhelm Bruker<br>Marcus Schütz<br><br>"
|
||||||
|
|
Loading…
Reference in a new issue