summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2016-08-06 21:11:06 +0200
committerJulian Andres Klode <jak@debian.org>2016-08-06 22:36:02 +0200
commit7def24826c298df77e34fd17bb72c570a22b04bd (patch)
tree7b97d2acd914e4543c3388f061eb3ed0ee294b42
parentf3de2dbaf657f9040a4da448c57267de0fef7d33 (diff)
CMake: Add support for building and installing .mo files
Introduce support for building translation domain-specific templates, merging them with the translations, and building a language-specific .mo file. The invocation of xgettext is done in the project source directory, not in the current source directory, and all paths are made relative to the project root, in order to have clean templates. This only supports the C++ source code for now, it unfortunately does not handle the shell scripts of deselect yet.
-rw-r--r--CMake/Translations.cmake53
-rw-r--r--CMakeLists.txt2
-rw-r--r--README.cmake4
-rw-r--r--po/CMakeLists.txt20
4 files changed, 78 insertions, 1 deletions
diff --git a/CMake/Translations.cmake b/CMake/Translations.cmake
new file mode 100644
index 000000000..2a1e03d4c
--- /dev/null
+++ b/CMake/Translations.cmake
@@ -0,0 +1,53 @@
+# 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})
+ # Build the list of source files of the target
+ set(files "")
+ foreach(target ${targets})
+ get_target_property(source_dir ${target} SOURCE_DIR)
+ get_target_property(sources ${target} SOURCES)
+ foreach(source ${sources})
+ string(SUBSTRING ${source} 0 1 init_char)
+ string(COMPARE EQUAL ${init_char} "/" is_absolute)
+ if (${is_absolute})
+ set(file "${source}")
+ else()
+ set(file "${source_dir}/${source}")
+ endif()
+ file(RELATIVE_PATH relfile ${PROJECT_SOURCE_DIR} ${file})
+ set(files ${files} ${relfile})
+ endforeach()
+
+ 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
+ COMMAND xgettext --add-comments --foreign -k_ -kN_
+ -o ${PROJECT_BINARY_DIR}/${domain}.pot ${files}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ )
+
+ # Build .mo files
+ file(GLOB translations "${PROJECT_SOURCE_DIR}/po/*.po")
+ list(SORT translations)
+ foreach(file ${translations})
+ get_filename_component(langcode ${file} NAME_WE)
+ set(outdir ${PROJECT_BINARY_DIR}/locale/${langcode}/LC_MESSAGES)
+ file(MAKE_DIRECTORY ${outdir})
+ # Command to merge and compile the messages
+ add_custom_command(OUTPUT ${outdir}/${domain}.mo
+ COMMAND msgmerge -qo - ${file} ${PROJECT_BINARY_DIR}/${domain}.pot |
+ msgfmt -o ${outdir}/${domain}.mo -
+ DEPENDS ${file} ${PROJECT_BINARY_DIR}/${domain}.pot
+ )
+
+ set(mofiles ${mofiles} ${outdir}/${domain}.mo)
+ install(FILES ${outdir}/${domain}.mo
+ DESTINATION "${CMAKE_INSTALL_LOCALEDIR}/${langcode}/LC_MESSAGES")
+ endforeach(file ${translations})
+
+ add_custom_target(nls-${domain} ALL DEPENDS ${mofiles})
+endfunction()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 90e5272c9..cba893227 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,6 +17,7 @@ endif()
# Include stuff
include(Misc)
+include(Translations)
include(CheckIncludeFiles)
include(CheckFunctionExists)
include(CheckStructHasMember)
@@ -130,3 +131,4 @@ add_subdirectory(cmdline)
add_subdirectory(dselect)
add_subdirectory(ftparchive)
add_subdirectory(methods)
+add_subdirectory(po)
diff --git a/README.cmake b/README.cmake
index c9347a057..d94a46f12 100644
--- a/README.cmake
+++ b/README.cmake
@@ -32,5 +32,7 @@ TODO
The following features have not been implemented yet:
- documentation
- - translation
+ - Translated docbook guides
+ - dselect translations
- unit tests
+ - update-po
diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt
new file mode 100644
index 000000000..0dd14839c
--- /dev/null
+++ b/po/CMakeLists.txt
@@ -0,0 +1,20 @@
+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)
+
+
+apt_add_translation_domain(apt-utils # Domain
+ 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)