summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2016-08-07 15:52:59 +0200
committerJulian Andres Klode <jak@debian.org>2016-08-10 16:11:05 +0200
commit6ff8727a0641b299ac32bc897d3ac1246b02061e (patch)
tree2acddb42e56ed5a70f4eb0b0bce0ff6ba30b3736
parenta331fb701683779d4113c39243f39ffad28cb912 (diff)
CMake: Translations: Add support for shell scripts
Rework the arguments to apt_add_translation_domain so a user can specify TARGETS and SCRIPTS, the latter being Shell scripts. For each language (TARGETS being C++, SCRIPTS being Shell), a separate template is generated via xgettext. Those templates are then merged together by using msgcomm. In case there are no Shell scripts in the translation domain, msgcomm will receive /dev/null instead of a shell translation template. This also reintroduces line numbers, as msgcomm would otherwise re-order the merged files not only by filename, but also by message string. It's unclear why it does that, it could just leave strings within a file alone. In contrast to the old build system, we use xgettext for shell scripts instead of bash --dump-strings, as it's just easier to use the same tool for everything. We also create valid headers.
-rw-r--r--CMake/Translations.cmake54
-rw-r--r--README.cmake1
-rw-r--r--po/CMakeLists.txt42
3 files changed, 72 insertions, 25 deletions
diff --git a/CMake/Translations.cmake b/CMake/Translations.cmake
index a26bf1c17..1b9781d69 100644
--- a/CMake/Translations.cmake
+++ b/CMake/Translations.cmake
@@ -1,11 +1,30 @@
# translations.cmake - Translations using APT's translation system.
# Copyright (C) 2009, 2016 Julian Andres Klode <jak@debian.org>
-function(apt_add_translation_domain domain)
- set(targets ${ARGN})
+function(apt_add_translation_domain)
+ set(options)
+ set(oneValueArgs DOMAIN)
+ set(multiValueArgs TARGETS SCRIPTS)
+ cmake_parse_arguments(NLS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
# Build the list of source files of the target
set(files "")
set(abs_files "")
+ set(scripts "")
+ set(abs_scripts "")
+ set(targets ${NLS_TARGETS})
+ set(domain ${NLS_DOMAIN})
+ foreach(source ${NLS_SCRIPTS})
+ string(SUBSTRING ${source} 0 1 init_char)
+ string(COMPARE EQUAL ${init_char} "/" is_absolute)
+ if (${is_absolute})
+ set(file "${source}")
+ else()
+ set(file "${CMAKE_CURRENT_SOURCE_DIR}/${source}")
+ endif()
+ file(RELATIVE_PATH relfile ${PROJECT_SOURCE_DIR} ${file})
+ list(APPEND scripts ${relfile})
+ list(APPEND abs_scripts ${file})
+ endforeach()
foreach(target ${targets})
get_target_property(source_dir ${target} SOURCE_DIR)
get_target_property(sources ${target} SOURCES)
@@ -25,15 +44,38 @@ function(apt_add_translation_domain domain)
target_compile_definitions(${target} PRIVATE -DAPT_DOMAIN="${domain}")
endforeach()
- # Create the template for this specific sub-domain
- add_custom_command (OUTPUT ${PROJECT_BINARY_DIR}/${domain}.pot
+ if("${scripts}" STREQUAL "")
+ set(sh_pot "/dev/null")
+ else()
+ set(sh_pot ${PROJECT_BINARY_DIR}/${domain}.sh.pot)
+ # Create the template for this specific sub-domain
+ add_custom_command (OUTPUT ${sh_pot}
+ COMMAND xgettext --add-comments --foreign -L Shell
+ -o ${sh_pot} ${scripts}
+ DEPENDS ${abs_scripts}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ )
+ endif()
+
+
+ add_custom_command (OUTPUT ${PROJECT_BINARY_DIR}/${domain}.c.pot
COMMAND xgettext --add-comments --foreign -k_ -kN_
- --add-location=file --keyword=P_:1,2
- -o ${PROJECT_BINARY_DIR}/${domain}.pot ${files}
+ --keyword=P_:1,2
+ -o ${PROJECT_BINARY_DIR}/${domain}.c.pot ${files}
DEPENDS ${abs_files}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
)
+ add_custom_command (OUTPUT ${PROJECT_BINARY_DIR}/${domain}.pot
+ COMMAND msgcomm --more-than=0 --sort-by-file
+ ${sh_pot}
+ ${PROJECT_BINARY_DIR}/${domain}.c.pot
+ --output=${PROJECT_BINARY_DIR}/${domain}.pot
+ DEPENDS ${sh_pot}
+ ${PROJECT_BINARY_DIR}/${domain}.c.pot
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ )
+
# Build .mo files
file(GLOB translations "${PROJECT_SOURCE_DIR}/po/*.po")
list(SORT translations)
diff --git a/README.cmake b/README.cmake
index a993b2589..1a4d2a448 100644
--- a/README.cmake
+++ b/README.cmake
@@ -32,6 +32,5 @@ TODO
The following features have not been implemented yet:
- Translated docbook guides
- - dselect translations
- unit tests
- update-po
diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt
index dc3622156..c7dfcb0fb 100644
--- a/po/CMakeLists.txt
+++ b/po/CMakeLists.txt
@@ -1,22 +1,28 @@
-apt_add_translation_domain(libapt-pkg${APT_PKG_MAJOR} apt-pkg)
-
-apt_add_translation_domain(apt # Domain
- apt apt-cache apt-get apt-config apt-cdrom
- apt-helper apt-mark
- apt-private
- # Methods
- file copy store gpgv cdrom http https ftp rred rsh
- mirror
+apt_add_translation_domain(
+ DOMAIN libapt-pkg${APT_PKG_MAJOR}
+ TARGETS apt-pkg
)
+apt_add_translation_domain(
+ DOMAIN apt
+ TARGETS apt apt-cache apt-get apt-config apt-cdrom apt-helper apt-mark
+ apt-private
+ # Methods
+ file copy store gpgv cdrom http https ftp rred rsh mirror
+ SCRIPTS ../dselect/install ../dselect/update
+)
-apt_add_translation_domain(apt-utils # Domain
- apt-sortpkgs
- apt-extracttemplates
- apt-internal-solver
- apt-dump-solver
- apt-internal-planner
- apt-ftparchive)
+apt_add_translation_domain(
+ DOMAIN apt-utils
+ TARGETS apt-sortpkgs
+ apt-extracttemplates
+ apt-internal-solver
+ apt-dump-solver
+ apt-internal-planner
+ apt-ftparchive
+)
-# Add the translations for libapt-inst, and set the translation domain.
-apt_add_translation_domain(libapt-inst${APT_INST_MAJOR} apt-inst)
+apt_add_translation_domain(
+ DOMAIN libapt-inst${APT_INST_MAJOR}
+ TARGETS apt-inst
+)