From f286aa1611c625e16fae7af83bd10f5607272c9d Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Sat, 14 Sep 2013 11:51:40 -0400 Subject: [PATCH 1/5] autotools: rearrange qt sources to make them more flexible Add BITCOIN_MM QR_CPP and BITCOIN_CPP in order to better accomodate complicated targets. This is a no-op change. --- src/qt/Makefile.am | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/qt/Makefile.am b/src/qt/Makefile.am index c6c4cb37a..af8ebee6c 100644 --- a/src/qt/Makefile.am +++ b/src/qt/Makefile.am @@ -53,6 +53,9 @@ QT_MOC_CPP = moc_aboutdialog.cpp moc_addressbookpage.cpp \ moc_transactiontablemodel.cpp moc_transactionview.cpp moc_walletframe.cpp \ moc_walletmodel.cpp moc_walletstack.cpp moc_walletview.cpp +BITCOIN_MM = macdockiconhandler.mm macnotificationhandler.mm +QR_CPP = qrcodedialog.cpp + QT_MOC = intro.moc overviewpage.moc rpcconsole.moc QT_QRC_CPP = qrc_bitcoin.cpp @@ -91,6 +94,19 @@ RES_ICONS = res/icons/bitcoin.png res/icons/address-book.png \ res/icons/qrcode.png res/icons/debugwindow.png res/icons/bitcoin.ico \ res/icons/bitcoin_testnet.ico +BITCOIN_QT_CPP = aboutdialog.cpp addressbookpage.cpp \ + addresstablemodel.cpp askpassphrasedialog.cpp bitcoinaddressvalidator.cpp \ + bitcoinamountfield.cpp bitcoin.cpp bitcoingui.cpp \ + bitcoinunits.cpp clientmodel.cpp csvmodelwriter.cpp editaddressdialog.cpp \ + guiutil.cpp intro.cpp monitoreddatamapper.cpp notificator.cpp \ + optionsdialog.cpp optionsmodel.cpp overviewpage.cpp paymentrequestplus.cpp \ + paymentserver.cpp qvalidatedlineedit.cpp qvaluecombobox.cpp \ + rpcconsole.cpp sendcoinsdialog.cpp sendcoinsentry.cpp \ + signverifymessagedialog.cpp splashscreen.cpp transactiondesc.cpp \ + transactiondescdialog.cpp transactionfilterproxy.cpp transactionrecord.cpp \ + transactiontablemodel.cpp transactionview.cpp walletframe.cpp \ + walletmodel.cpp walletmodeltransaction.cpp walletstack.cpp walletview.cpp + RES_IMAGES = res/images/about.png res/images/splash.png \ res/images/splash_testnet.png @@ -100,20 +116,8 @@ BITCOIN_RC = res/bitcoin-qt-res.rc libbitcoinqt_a_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) \ -I$(top_srcdir)/src/qt/forms $(QT_DBUS_INCLUDES) -libbitcoinqt_a_SOURCES = aboutdialog.cpp addressbookpage.cpp \ - addresstablemodel.cpp askpassphrasedialog.cpp bitcoinaddressvalidator.cpp \ - bitcoinamountfield.cpp bitcoin.cpp bitcoingui.cpp bitcoinstrings.cpp \ - bitcoinunits.cpp clientmodel.cpp csvmodelwriter.cpp editaddressdialog.cpp \ - guiutil.cpp intro.cpp monitoreddatamapper.cpp notificator.cpp \ - optionsdialog.cpp optionsmodel.cpp overviewpage.cpp paymentrequestplus.cpp \ - paymentserver.cpp qvalidatedlineedit.cpp qvaluecombobox.cpp \ - rpcconsole.cpp sendcoinsdialog.cpp sendcoinsentry.cpp \ - signverifymessagedialog.cpp splashscreen.cpp transactiondesc.cpp \ - transactiondescdialog.cpp transactionfilterproxy.cpp transactionrecord.cpp \ - transactiontablemodel.cpp transactionview.cpp walletframe.cpp \ - walletmodel.cpp walletmodeltransaction.cpp walletstack.cpp walletview.cpp \ - $(BITCOIN_QT_H) $(QT_FORMS_UI) $(QT_QRC) $(QT_TS) $(PROTOBUF_PROTO) \ - $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) +libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ + $(QT_QRC) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) nodist_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(PROTOBUF_CC) \ $(PROTOBUF_H) $(QT_QRC_CPP) @@ -126,13 +130,13 @@ $(QT_MOC): $(PROTOBUF_H) $(QT_MOC_CPP): $(PROTOBUF_H) if TARGET_DARWIN - libbitcoinqt_a_SOURCES += macdockiconhandler.mm macnotificationhandler.mm + libbitcoinqt_a_SOURCES += $(BITCOIN_MM) endif if TARGET_WINDOWS libbitcoinqt_a_SOURCES += $(BITCOIN_RC) endif if USE_QRCODE - libbitcoinqt_a_SOURCES += qrcodedialog.cpp + libbitcoinqt_a_SOURCES += $(QR_CPP) endif # From f3f09462cd5c9f9964a3c0631f5bdceab8768b0c Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Sat, 14 Sep 2013 11:48:27 -0400 Subject: [PATCH 2/5] autotools: teach extract_strings_qt.py to respect the XGETTEXT env variable --- share/qt/extract_strings_qt.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/share/qt/extract_strings_qt.py b/share/qt/extract_strings_qt.py index 1267b1856..a7bfc1f9f 100755 --- a/share/qt/extract_strings_qt.py +++ b/share/qt/extract_strings_qt.py @@ -6,6 +6,7 @@ they can be picked up by Qt linguist. from subprocess import Popen, PIPE import glob import operator +import os OUT_CPP="src/qt/bitcoinstrings.cpp" EMPTY=['""'] @@ -49,7 +50,8 @@ def parse_po(text): files = glob.glob('src/*.cpp') + glob.glob('src/*.h') # xgettext -n --keyword=_ $FILES -child = Popen(['xgettext','--output=-','-n','--keyword=_'] + files, stdout=PIPE) +XGETTEXT=os.getenv('XGETTEXT', 'gettext') +child = Popen([XGETTEXT,'--output=-','-n','--keyword=_'] + files, stdout=PIPE) (out, err) = child.communicate() messages = parse_po(out) From 21ffa3ce3ad6f8909d88edca1a1208a091078bb5 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Sat, 14 Sep 2013 11:52:42 -0400 Subject: [PATCH 3/5] autotools: add translate target for qt translations --- src/Makefile.am | 4 ++++ src/qt/Makefile.am | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index 349978423..65e675e52 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -58,6 +58,10 @@ leveldb/libmemenv.a: @echo "Building LevelDB ..." && cd leveldb && CXX="$(CXX)" CC="$(CC)" \ PLATFORM=$(TARGET_OS) AR="$(AR)" $(MAKE) $(LEVELDB_TARGET_FLAGS) OPT="$(CXXFLAGS) $(CPPFLAGS)" libmemenv.a +qt/bitcoinstrings.cpp: $(libbitcoin_a_SOURCES) + @test -n $(XGETTEXT) || echo "xgettext is required for updating translations" + @cd $(top_srcdir); XGETTEXT=$(XGETTEXT) share/qt/extract_strings_qt.py + CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a *.gcda *.gcno DISTCLEANFILES = obj/build.h diff --git a/src/qt/Makefile.am b/src/qt/Makefile.am index af8ebee6c..33c5825eb 100644 --- a/src/qt/Makefile.am +++ b/src/qt/Makefile.am @@ -153,8 +153,16 @@ QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI: #locale/foo.ts -> locale/foo.qm QT_QM=$(QT_TS:.ts=.qm) +.PHONY: FORCE .SECONDARY: $(QT_QM) +bitcoinstrings.cpp: FORCE + $(MAKE) -C $(top_srcdir)/src qt/bitcoinstrings.cpp + +translate: bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM) $(QR_CPP) + @test -n $(LUPDATE) || echo "lupdate is required for updating translations" + @$(LUPDATE) $^ -locations relative -no-obsolete -ts locale/bitcoin_en.ts + $(QT_QRC_CPP): $(QT_QRC) $(QT_QM) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H) @cd $(abs_srcdir); test -f $(RCC) && $(RCC) -name bitcoin -o $(abs_builddir)/$@ $< || \ echo error: could not build $@ From 035ddf6f6ba565f04d0b38652794378129baf4ed Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Sat, 14 Sep 2013 11:49:33 -0400 Subject: [PATCH 4/5] autotools: check for lupdate/xgettext --- configure.ac | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/configure.ac b/configure.ac index 066134a6f..a41379819 100644 --- a/configure.ac +++ b/configure.ac @@ -147,8 +147,10 @@ AC_PATH_PROGS([MOC], [moc-qt4 moc4 moc],, $qt_bin_path:$PATH) AC_PATH_PROGS([UIC], [uic-qt4 uic4 uic],, $qt_bin_path:$PATH) AC_PATH_PROGS([RCC], [rcc-qt4 rcc4 rcc],, $qt_bin_path:$PATH) AC_PATH_PROGS([LRELEASE], [lrelease-qt4 lrelease4 lrelease],, $qt_bin_path:$PATH) +AC_PATH_PROGS([LUPDATE], [lupdate-qt4 lupdate4 lupdate],, $qt_bin_path:$PATH) AC_PATH_PROG([PROTOC], [protoc],, $protoc_bin_path:$PATH) AC_PATH_PROG(CCACHE,ccache) +AC_PATH_PROG(XGETTEXT,xgettext) PKG_PROG_PKG_CONFIG ## TODO: Remove these hard-coded paths and flags. They are here for the sake of @@ -625,6 +627,13 @@ if test x$use_qt = xyes; then AC_MSG_ERROR("libQtDBus not found. Use --without-qtdbus.") fi fi + if test x$XGETTEXT == x; then + AC_MSG_WARN("xgettext is required to update qt translations") + fi + if test x$LUPDATE == x; then + AC_MSG_WARN("lupdate is required to update qt translations") + fi + BUILD_QT=qt else use_qt=no From a0c3ab7ed1011c66b5137a77f701b00be376dda1 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Sat, 14 Sep 2013 12:07:18 -0400 Subject: [PATCH 5/5] autotools: update translation docs --- doc/translation_process.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/doc/translation_process.md b/doc/translation_process.md index 1724e9537..006726b95 100644 --- a/doc/translation_process.md +++ b/doc/translation_process.md @@ -32,14 +32,13 @@ This directory contains all translations. Filenames must adhere to this format: `src/qt/locale/bitcoin_en.ts` is treated in a special way. It is used as the source for all other translations. Whenever a string in the code is changed -this file must be updated to reflect those changes. This can be accomplished -by running `lupdate` (included in the Qt SDK). Also, a custom script is used +this file must be updated to reflect those changes. A custom script is used to extract strings from the non-Qt parts. This script makes use of `gettext`, so make sure that utility is installed (ie, `apt-get install gettext` on -Ubuntu/Debian): - - python share/qt/extract_strings_qt.py - lupdate bitcoin-qt.pro -no-obsolete -locations relative -ts src/qt/locale/bitcoin_en.ts +Ubuntu/Debian). Once this has been updated, lupdate (included in the Qt SDK) +is used to update bitcoin_en.ts. This process has been automated, from src/qt, +simply run: + make translate ##### Handling of plurals in the source file