2010-04-22 13 views
8

Ich migriere ein Projekt von Autotools zu cmake. Ich habe eine Frage zur Gettext-Unterstützung.Gibt es eine Cmake-Funktion, um .pot-Dateien zu aktualisieren?

Es gibt eine bestehende FindGettext.cmake Module, die eine nette Funktion bietet:

GETTEXT_CREATE_TRANSLATIONS(foo.pot ALL fr.po de.po) 

wo man einen Topf Datei und übersetzt po fil liefern; Die Funktion kümmert sich darum, die po-Dateien in gmo-Dateien umzuwandeln und fügt die richtigen Installationsziele hinzu, um sicherzustellen, dass die Dateien zur Laufzeit gefunden werden können. Alles gut und gut.

Jetzt kommt die Frage: Wie aktualisierst du deine Pot-Dateien und po-Dateien, wenn du neue Nachrichten hinzufügst?

Dafür würde autotools ein "update-po" Ziel generieren, das (von dem, was ich verstehe), liest eine POTFILES.in mit den Listen aller Dateien mit übersetzten Zeichenfolgen, mischt es mit anderen Informationen und endet Aufruf von xgetext, um den po zu generieren. Ich denke, die coresponding Makefile Aufgabe der ist, wie etwas enthält:

case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ 
    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ 
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ 
    --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ 
    --files-from=$(srcdir)/POTFILES.in \ 
    --copyright-holder='$(COPYRIGHT_HOLDER)' \ 
    --msgid-bugs-address="$$msgid_bugs_address" \ 
;; \ 
*) \ 
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ 
    --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ 
    --files-from=$(srcdir)/POTFILES.in \ 
    --copyright-holder='$(COPYRIGHT_HOLDER)' \ 
    --package-name="$${package_gnu}ube" \ 
    --package-version='0.4.0-dev' \ 
    --msgid-bugs-address="$$msgid_bugs_address" \ 
;; \ 
esac 

Also, bevor ich das Rad neu erfinden, gibt es eine bestehende Cmake Funktion die gleiche Sache zu tun? Oder muss ich die ausführbare Xgettext finden, listet die Dateien auf, und tun dies manuell? Die Makefile-Version scheint ziemlich kompliziert zu sein (obwohl sie viele Fälle zu behandeln scheint); Ich habe nichts dagegen nicht mit der Cmake äquivalent zu schreiben;)

Dank

PH

Antwort

6

Lassen Sie das Autotool aufblasen erschrecken Sie nicht. :-)

Sie können den folgenden Code verwenden:

SET(_potFile ${PROJECT_NAME}.pot) 
ADD_CUSTOM_COMMAND(OUTPUT ${_potFile} 
    COMMAND ${XGETTEXT_CMD} ${_xgettext_option_list} -o ${_potFile} ${_src_list} 
    DEPENDS ${_src_list} 
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 
    COMMENT "Extract translatable messages to ${_potFile}" 
) 

ADD_CUSTOM_TARGET(pot_file ${_all} 
DEPENDS ${_potFile} 
) 

Für C-Programme verwende ich folgenden als _xgettext_option_list

--language=C --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=NC_:1c,2 -s 
--package-name=${PROJECT_NAME} --package-version=${PRJ_VER} 

ich das Rad neu erfunden hat, wenn die FindGettext nicht hatte Option ALL (wenn es Cmake-2.4 war) :-)

2

Nach this kde Wiki-Seite, mit CMake zur Bearbeitung so Urces ist keine gute Idee. Besseres eigenständiges Skript zum Aktualisieren von Übersetzungen.

In der Tat, die Extraktion und das Verschmelzen von Nachrichten Karte nicht gut auf die CMake Konzept der out-of-Source baut und CMake kann nicht zu viel Hilfe zu diesem Schritt schaffen, auch nicht.

Daher werden wir in diesem Tutorial den ersten Schritt mit einem eigenständigen Shell-Skript behandeln, und nur der zweite Schritt wird von CMake behandelt werden.

+0

Während Ihre Antwort hilfreich sein kann, beantworten Sie eine 7-jährige Frage. Bitte überprüfen Sie die Buchungsdaten der Nachrichten, die Sie vor dem Buchen beantworten möchten. –

+3

Aber was ist das Problem, dass Frage 7 Jahre alt ist? Leute suchen diese Frage (einschließlich mich) ang gehen zu dieser Seite. Und hier gab es keine solche Information. Nachdem ich diese Frage untersucht hatte, stellte ich meine Ergebnisse hier für zukünftige Suchende zur Verfügung. – Ashark

Verwandte Themen