Bring po update out of cmake again
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Sun, 24 Jul 2011 08:19:31 +0000 (10:19 +0200)
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Sun, 24 Jul 2011 14:52:59 +0000 (16:52 +0200)
This solves two issues at once:
* CMake would delete po files during ‘make clean’ because it thought
  they were autogenerated and not just managed
* the only gettext tools readily available in Windows are so old they
  don't support options like --package-name

The change also moves minetest.pot down one level, so we don't need to
special case ‘en’ anymore.

The downside is of course that you need some sane POSIX shell to update
the po files.

cmake/Modules/FindGettextLib.cmake
po/en/minetest.pot [deleted file]
po/minetest.pot [new file with mode: 0644]
src/CMakeLists.txt
util/updatepo.sh [new file with mode: 0755]

index 1c36f8c6e52ff42395d4ed37b9ffa4e6d7282017..a215f3f8d8d14276636e38bae058907f9d46fd8f 100644 (file)
@@ -16,21 +16,6 @@ FIND_PROGRAM(GETTEXT_MSGFMT
        PATHS "${CUSTOM_GETTEXT_PATH}/bin"
        DOC "path to msgfmt")
 
-FIND_PROGRAM(GETTEXT_MSGMERGE
-       NAMES msgmerge
-       PATHS "${CUSTOM_GETTEXT_PATH}/bin"
-       DOC "path to msgmerge")
-
-FIND_PROGRAM(GETTEXT_MSGEN
-       NAMES msgen
-       PATHS "${CUSTOM_GETTEXT_PATH}/bin"
-       DOC "path to msgen")
-
-FIND_PROGRAM(GETTEXT_EXTRACT
-       NAMES xgettext
-       PATHS "${CUSTOM_GETTEXT_PATH}/bin"
-       DOC "path to xgettext")
-
 # modern Linux, as well as Mac, seem to not need require special linking
 # they do not because gettext is part of glibc
 # TODO check the requirements on other BSDs and older Linux
@@ -73,6 +58,7 @@ IF(GETTEXT_FOUND)
        SET(GETTEXT_MO_BUILD_PATH ${CMAKE_BINARY_DIR}/locale/<locale>/LC_MESSAGES)
        SET(GETTEXT_MO_DEST_PATH locale/<locale>/LC_MESSAGES)
        FILE(GLOB GETTEXT_AVAILABLE_LOCALES RELATIVE ${GETTEXT_PO_PATH} "${GETTEXT_PO_PATH}/*")
+       LIST(REMOVE_ITEM GETTEXT_AVAILABLE_LOCALES minetest.pot)
        MACRO(SET_MO_PATHS _buildvar _destvar _locale)
                STRING(REPLACE "<locale>" ${_locale} ${_buildvar} ${GETTEXT_MO_BUILD_PATH})
                STRING(REPLACE "<locale>" ${_locale} ${_destvar} ${GETTEXT_MO_DEST_PATH})
diff --git a/po/en/minetest.pot b/po/en/minetest.pot
deleted file mode 100644 (file)
index e242c49..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: minetest\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-07-22 11:02+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/guiMainMenu.cpp:180
-msgid "Name/Password"
-msgstr ""
-
-#: src/guiMainMenu.cpp:203
-msgid "Address/Port"
-msgstr ""
-
-#: src/guiMainMenu.cpp:223
-msgid "Leave address blank to start a local server."
-msgstr ""
-
-#: src/guiMainMenu.cpp:230
-msgid "Fancy trees"
-msgstr ""
-
-#: src/guiMainMenu.cpp:236
-msgid "Smooth Lighting"
-msgstr ""
-
-#: src/guiMainMenu.cpp:244
-msgid "Start Game / Connect"
-msgstr ""
-
-#: src/guiMainMenu.cpp:253
-msgid "Change keys"
-msgstr ""
-
-#: src/guiMainMenu.cpp:276
-msgid "Creative Mode"
-msgstr ""
-
-#: src/guiMainMenu.cpp:282
-msgid "Enable Damage"
-msgstr ""
-
-#: src/guiMainMenu.cpp:290
-msgid "Delete map"
-msgstr ""
-
-#: src/guiMessageMenu.cpp:93 src/guiTextInputMenu.cpp:111
-msgid "Proceed"
-msgstr ""
-
-#: src/guiPasswordChange.cpp:102
-msgid "Old Password"
-msgstr ""
-
-#: src/guiPasswordChange.cpp:117
-msgid "New Password"
-msgstr ""
-
-#: src/guiPasswordChange.cpp:131
-msgid "Confirm Password"
-msgstr ""
-
-#: src/guiPasswordChange.cpp:146
-msgid "Change"
-msgstr ""
-
-#: src/guiPasswordChange.cpp:155
-msgid "Passwords do not match!"
-msgstr ""
-
-#: src/guiPauseMenu.cpp:110
-msgid "Continue"
-msgstr ""
-
-#: src/guiPauseMenu.cpp:117
-msgid "Change Password"
-msgstr ""
-
-#: src/guiPauseMenu.cpp:124
-msgid "Disconnect"
-msgstr ""
-
-#: src/guiPauseMenu.cpp:131
-msgid "Exit to OS"
-msgstr ""
-
-#: src/guiPauseMenu.cpp:138
-msgid ""
-"Keys:\n"
-"- WASD: Walk\n"
-"- Mouse left: dig blocks\n"
-"- Mouse right: place blocks\n"
-"- Mouse wheel: select item\n"
-"- 0...9: select item\n"
-"- Shift: sneak\n"
-"- R: Toggle viewing all loaded chunks\n"
-"- I: Inventory menu\n"
-"- ESC: This menu\n"
-"- T: Chat\n"
-msgstr ""
diff --git a/po/minetest.pot b/po/minetest.pot
new file mode 100644 (file)
index 0000000..7b95d21
--- /dev/null
@@ -0,0 +1,113 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: minetest\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-07-24 10:16+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/guiMainMenu.cpp:180
+msgid "Name/Password"
+msgstr ""
+
+#: src/guiMainMenu.cpp:203
+msgid "Address/Port"
+msgstr ""
+
+#: src/guiMainMenu.cpp:223
+msgid "Leave address blank to start a local server."
+msgstr ""
+
+#: src/guiMainMenu.cpp:230
+msgid "Fancy trees"
+msgstr ""
+
+#: src/guiMainMenu.cpp:236
+msgid "Smooth Lighting"
+msgstr ""
+
+#: src/guiMainMenu.cpp:244
+msgid "Start Game / Connect"
+msgstr ""
+
+#: src/guiMainMenu.cpp:253
+msgid "Change keys"
+msgstr ""
+
+#: src/guiMainMenu.cpp:276
+msgid "Creative Mode"
+msgstr ""
+
+#: src/guiMainMenu.cpp:282
+msgid "Enable Damage"
+msgstr ""
+
+#: src/guiMainMenu.cpp:290
+msgid "Delete map"
+msgstr ""
+
+#: src/guiMessageMenu.cpp:93 src/guiTextInputMenu.cpp:111
+msgid "Proceed"
+msgstr ""
+
+#: src/guiPasswordChange.cpp:102
+msgid "Old Password"
+msgstr ""
+
+#: src/guiPasswordChange.cpp:117
+msgid "New Password"
+msgstr ""
+
+#: src/guiPasswordChange.cpp:131
+msgid "Confirm Password"
+msgstr ""
+
+#: src/guiPasswordChange.cpp:146
+msgid "Change"
+msgstr ""
+
+#: src/guiPasswordChange.cpp:155
+msgid "Passwords do not match!"
+msgstr ""
+
+#: src/guiPauseMenu.cpp:110
+msgid "Continue"
+msgstr ""
+
+#: src/guiPauseMenu.cpp:117
+msgid "Change Password"
+msgstr ""
+
+#: src/guiPauseMenu.cpp:124
+msgid "Disconnect"
+msgstr ""
+
+#: src/guiPauseMenu.cpp:131
+msgid "Exit to OS"
+msgstr ""
+
+#: src/guiPauseMenu.cpp:138
+msgid ""
+"Keys:\n"
+"- WASD: Walk\n"
+"- Mouse left: dig blocks\n"
+"- Mouse right: place blocks\n"
+"- Mouse wheel: select item\n"
+"- 0...9: select item\n"
+"- Shift: sneak\n"
+"- R: Toggle viewing all loaded chunks\n"
+"- I: Inventory menu\n"
+"- ESC: This menu\n"
+"- T: Chat\n"
+msgstr ""
index c50b74dc517d6570ab388f3462ba86099d895714..c897f4bf3514bd26fe3b7ea0378e9b49e0fbe526 100644 (file)
@@ -267,11 +267,9 @@ if(BUILD_CLIENT)
 
        if(GETTEXT_FOUND AND USE_GETTEXT)
                foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
-                       if (NOT LOCALE STREQUAL "en")
-                               set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
-                               set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
-                               install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
-                       endif(NOT LOCALE STREQUAL "en")
+                       set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
+                       set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
+                       install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
                endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
        endif()
 
@@ -298,54 +296,29 @@ if(BUILD_SERVER)
 endif(BUILD_SERVER)
 
 if (GETTEXT_FOUND AND USE_GETTEXT)
-       add_custom_command(OUTPUT "${GETTEXT_PO_PATH}/en"
-               COMMAND ${CMAKE_COMMAND} -E make_directory "${GETTEXT_PO_PATH}/en"
-               COMMENT "po-update [en]: creating translation template base directory")
-       set(POT_FILE "${GETTEXT_PO_PATH}/en/minetest.pot")
-       file(GLOB GETTEXT_POT_DEPS *.cpp *.h)
-       file(GLOB GETTEXT_POT_DEPS_REL RELATIVE ${CMAKE_SOURCE_DIR} *.cpp *.h)
-       add_custom_command(OUTPUT ${POT_FILE}
-               COMMAND ${GETTEXT_EXTRACT} -F -n -o ${POT_FILE} ${GETTEXT_POT_DEPS_REL}
-               DEPENDS "${GETTEXT_PO_PATH}/en" ${GETTEXT_POT_DEPS}
-               WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-               COMMENT "po-update [en]: updating translation template")
-
-       set(PO_FILES)
        set(MO_FILES)
 
        foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
-               # skip the 'en' locale which is treated separately
-               if (NOT LOCALE STREQUAL "en")
-                       set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
-                       add_custom_command(OUTPUT ${PO_FILE_PATH}
-                               COMMAND ${GETTEXT_MSGMERGE} -F -U ${PO_FILE_PATH} ${POT_FILE}
-                               DEPENDS ${POT_FILE}
-                               WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
-                               COMMENT "po-update [${LOCALE}]: updating strings")
-
+               set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
+               set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
+               set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
+
+               add_custom_command(OUTPUT ${MO_BUILD_PATH}
+                       COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
+                       COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
+
+               add_custom_command(
+                       OUTPUT ${MO_FILE_PATH}
+                       COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
+                       DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
+                       WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
+                       COMMENT "mo-update [${LOCALE}]: Creating mo file."
+                       )
 
-                       set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
-                       add_custom_command(OUTPUT ${MO_BUILD_PATH}
-                               COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
-                               COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
-
-                       set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
-
-                       add_custom_command(
-                               OUTPUT ${MO_FILE_PATH}
-                               COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
-                               DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
-                               WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
-                               COMMENT "mo-update [${LOCALE}]: Creating mo file."
-                               )
-
-                       set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
-                       set(PO_FILES ${PO_FILES} ${PO_FILE_PATH})
-               endif(NOT LOCALE STREQUAL "en")
+               set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
        endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
 
        add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
-       add_custom_target(updatepo COMMENT "po update" DEPENDS ${PO_FILES})
 endif(GETTEXT_FOUND AND USE_GETTEXT)
 
 # Subdirectories
diff --git a/util/updatepo.sh b/util/updatepo.sh
new file mode 100755 (executable)
index 0000000..bcfa4c4
--- /dev/null
@@ -0,0 +1,65 @@
+#!/bin/sh
+
+# Update/create minetest po files
+
+# an auxiliary function to abort processing with an optional error
+# message
+abort() {
+       test -n "$1" && echo >&2 "$1"
+       exit 1
+}
+
+# The po/ directory is assumed to be parallel to the directory where
+# this script is. Relative paths are fine for us so we can just
+# use the following trick (works both for manual invocations and for
+# script found from PATH)
+scriptisin="$(dirname "$(which "$0")")"
+
+# The script is executed from the parent of po/, which is also the
+# parent of the script directory and of the src/ directory.
+# We go through $scriptisin so that it can be executed from whatever
+# directory and still work correctly
+cd "$scriptisin/.."
+
+test -e po || abort "po/ directory not found"
+test -d po || abort "po/ is not a directory!"
+
+# Get a list of the languages we have to update/create
+
+cd po || abort "couldn't change directory to po!"
+
+# This assumes that we won't have dirnames with space, which is
+# the case for language codes, which are the only subdirs we expect to
+# find in po/ anyway. If you put anything else there, you need to suffer
+# the consequences of your actions, so we don't do sanity checks
+langs=""
+
+for lang in * ; do
+       if test ! -d $lang; then
+               continue
+       fi
+       langs="$langs $lang"
+done
+
+# go back
+cd ..
+
+# First thing first, update the .pot template. We place it in the po/
+# directory at the top level. You a recent enough xgettext that supports
+# --package-name
+potfile=po/minetest.pot
+xgettext --package-name=minetest -F -n -o $potfile src/*.cpp src/*.h
+
+# Now iterate on all languages and create the po file if missing, or update it
+# if it exists already
+for lang in $langs ; do # note the missing quotes around $langs
+       pofile=po/$lang/minetest.po
+       if test -e $pofile; then
+               echo "[$lang]: updating strings"
+               msgmerge -F -U $pofile $potfile
+       else
+               # This will ask for the translator identity
+               echo "[$lang]: NEW strings"
+               msginit -l $lang -o $pofile -i $potfile
+       fi
+done