Hi,

I started working on how to handle Qt based translations, and make it as
simple as possible to work with for framework maintainers as well as
framework users.

I picked KBookmarks as my guinea pig and got to the point where
kbookmarkdialogtest shows a translated dialog.

Here is how it currently works. All of this is liberally inspired from
the way Trojita works:

# String extraction

I created a src/Messages.sh which contains the following:

lupdate -silent -recursive . -ts $podir/tmp.ts
lconvert $podir/tmp.ts --sort-contexts --output-format pot -o
$podir/kbookmarks5.pot
rm $podir/tmp.ts

# String compilation

I modified the toplevel CMakeLists.txt, adding these lines:

if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/po)                               
    include(${CMAKE_CURRENT_SOURCE_DIR}/QmSupport.cmake)                 
    qm_setup(kbookmarks5 po)                                             
endif() 

I created a QmSupport.cmake file, which exposes a qm_setup() function.
This function does three things:
1. Create a "qm" target which turns all .po into .qm files.

2. Call install(FILES...) on the generated qm files, installing them in
share/${name}/locale, where ${name} is the firt argument of qm_setup().

3. Generate a "${name}_translation.h" which contain two inline functions
to make it easy to load the translations.
Using the translation is then just a matter of including
${name}_translation.h and calling ${name}_installTranslator(). If more
control is needed, ${name}_installTranslator() also accepts an optional
argument: the language. For even finer control, the .h also contains a
${name}_createTranslator() function, which returns a QTranslator loaded
with strings for the right language.

# Questions

Does this approach sounds sane to you?

I think QmSupport.cmake should go to extra-cmake-modules. Any
objections?

Right now qm_setup() is very inflexible: it installs files and creates
the _translation.h file based on the name argument, meaning in my
example it creates share/kbookmarks5/locale/kbookmarks5_*.qm and
include/kbookmarks5_translation.h, which contains the functions
kbookmarks5_createTranslator and kbookmarks5_installTranslator.

I think we want to be able to customize the install dir of the
_translation.h file because some frameworks install header files in a
subdir, others do not.

Should we also be able to customize the install data dir for qm files,
as well as the prefix of the function names from _translation.h? I am
tempted to default to ${PROJECT_NAME} for the prefix of the function
names, its lowercase version for the install data dir and add an
optional PROJECT_NAME argument to qm_setup(). Opinions?

I am attaching the diff of the current state. I do not intend to commit
it as is since po files are not supposed to be in the framework
repository, but it should make it easy for you to try it if you are
interested.

Aurélien
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ecb6d87..86bec2e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -40,6 +40,10 @@ endif()
 add_subdirectory(src)
 add_subdirectory(tests)
 add_subdirectory(autotests)
+if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/po)
+    include(${CMAKE_CURRENT_SOURCE_DIR}/QmSupport.cmake)
+    qm_setup(kbookmarks5 po)
+endif()
 
 # create a Config.cmake and a ConfigVersion.cmake file and install them
 set(CMAKECONFIG_INSTALL_DIR "${CMAKECONFIG_INSTALL_PREFIX}/KF5Bookmarks")
diff --git a/QmSupport.cmake b/QmSupport.cmake
new file mode 100644
index 0000000..7c63064
--- /dev/null
+++ b/QmSupport.cmake
@@ -0,0 +1,53 @@
+# This gives us Qt5::lrelease and Qt5::lupdate but unfortunately no Qt5::lconvert
+find_package(Qt5LinguistTools CONFIG REQUIRED)
+
+# Find lconvert
+get_target_property(lrelease_location Qt5::lrelease LOCATION)
+get_filename_component(lrelease_path ${lrelease_location} PATH)
+find_program(lconvert_executable
+    NAMES lconvert-qt5 lconvert
+    PATHS ${lrelease_path}
+    )
+
+function(_qm_create_target name)
+    foreach (it ${ARGN})
+        get_filename_component(it ${it} ABSOLUTE)
+        # PO files are foo-en_GB.po not foo_en_GB.po like Qt expects
+        get_filename_component(fileWithDash ${it} NAME_WE)
+        string(REPLACE "-" "_" filenameBase "${fileWithDash}")
+        file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+        set(tsfile ${CMAKE_CURRENT_BINARY_DIR}/${filenameBase}.ts)
+        set(qmfile ${CMAKE_CURRENT_BINARY_DIR}/${filenameBase}.qm)
+
+        # lconvert from PO to TS and then run lupdate to generate the correct strings
+        # finally run lrelease as used above
+        add_custom_command(OUTPUT ${qmfile}
+            COMMAND ${lconvert_executable}
+                ARGS -i ${it} -o ${tsfile}
+            COMMAND Qt5::lupdate
+                ARGS ${CMAKE_SOURCE_DIR}/src -silent -noobsolete -ts ${tsfile}
+            COMMAND Qt5::lrelease
+                ARGS -compress -removeidentical -silent ${tsfile} -qm ${qmfile}
+            DEPENDS ${it}
+            )
+        set(qmfiles ${qmfiles} ${qmfile})
+    endforeach(it)
+
+    add_custom_target(qm ALL DEPENDS ${qmfiles})
+
+    install(FILES ${qmfiles} DESTINATION share/${name}/locale)
+endfunction()
+
+function(_qm_create_translation_h name)
+    set(_PROJECT_NAME ${name})
+    configure_file(translation.h.in ${name}_translation.h @ONLY)
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}_translation.h
+        DESTINATION ${INCLUDE_INSTALL_DIR}
+        COMPONENT DEVEL)
+endfunction()
+
+function(qm_setup name po_dir)
+    file(GLOB po_files "${po_dir}/*.po")
+    _qm_create_target(${name} ${po_files})
+    _qm_create_translation_h(${name})
+endfunction()
diff --git a/po/kbookmarks5-fr.po b/po/kbookmarks5-fr.po
new file mode 100644
index 0000000..c4ac70d
--- /dev/null
+++ b/po/kbookmarks5-fr.po
@@ -0,0 +1,266 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Qt-Contexts: true\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: ../src/kbookmark.cpp:307
+msgctxt "Bookmark separator|"
+msgid "--- separator ---"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:62
+msgctxt "KBookmarkContextMenu|"
+msgid "Add Bookmark Here"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:68
+msgctxt "KBookmarkContextMenu|"
+msgid "Open Folder in Bookmark Editor"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:71
+msgctxt "KBookmarkContextMenu|"
+msgid "Delete Folder"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:76
+msgctxt "KBookmarkContextMenu|"
+msgid "Properties"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:81
+msgctxt "KBookmarkContextMenu|"
+msgid "Copy Link Address"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:84
+msgctxt "KBookmarkContextMenu|"
+msgid "Delete Bookmark"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:90
+msgctxt "KBookmarkContextMenu|"
+msgid "Open Folder in Tabs"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:116
+msgctxt "KBookmarkContextMenu|"
+msgid "Cannot add bookmark with empty URL."
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:146
+msgctxt "KBookmarkContextMenu|"
+msgid "Bookmark Folder Deletion"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:147
+msgctxt "KBookmarkContextMenu|"
+msgid "Bookmark Deletion"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:148
+#, qt-format
+msgctxt "KBookmarkContextMenu|"
+msgid ""
+"Are you sure you wish to remove the bookmark folder\n"
+"\"%1\"?"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:149
+#, qt-format
+msgctxt "KBookmarkContextMenu|"
+msgid ""
+"Are you sure you wish to remove the bookmark\n"
+"\"%1\"?"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:70
+msgctxt "QObject|@label:textbox"
+msgid "Name:"
+msgstr "Nom :"
+
+#: ../src/kbookmarkdialog.cpp:75
+msgctxt "QObject|@label:textbox"
+msgid "Location:"
+msgstr "Emplacement :"
+
+#: ../src/kbookmarkdialog.cpp:80
+msgctxt "QObject|@label:textbox"
+msgid "Comment:"
+msgstr "Commentaire :"
+
+#: ../src/kbookmarkdialog.cpp:191
+msgctxt "KBookmarkDialog|@action:button"
+msgid "Update"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:192
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Bookmark Properties"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:223 ../src/kbookmarkdialog.cpp:261
+#: ../src/kbookmarkdialog.cpp:295
+msgctxt "KBookmarkDialog|@action:button"
+msgid "&New Folder..."
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:227 ../src/kbookmarkdialog.cpp:265
+msgctxt "KBookmarkDialog|@action:button"
+msgid "Add"
+msgstr "Ajouter"
+
+#: ../src/kbookmarkdialog.cpp:228
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Add Bookmark"
+msgstr "Ajouter un signet"
+
+#: ../src/kbookmarkdialog.cpp:266
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Add Bookmarks"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:299
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Select Folder"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:327
+msgctxt "KBookmarkDialog|@title:window"
+msgid "New Folder"
+msgstr "Nouveau dossier"
+
+#: ../src/kbookmarkdialog.cpp:362
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Create New Bookmark Folder"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:363
+#, qt-format
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Create New Bookmark Folder in %1"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:365
+msgctxt "KBookmarkDialog|@label:textbox"
+msgid "New folder:"
+msgstr "Nouveau dossier :"
+
+#: ../src/kbookmarkdialog.cpp:386
+msgctxt "KBookmarkDialog|name of the container of all browser bookmarks"
+msgid "Bookmarks"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:115
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "HTML Files (*.html)"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:119
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "*.html|HTML Files (*.html)"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:135
+#, qt-format
+msgctxt "KNSBookmarkImporterImpl|"
+msgid ""
+"Could not find %1. Netscape is probably not installed. Aborting the export."
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:137
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "Netscape not found"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:158
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "<!-- This file was generated by Konqueror -->"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:161 ../src/kbookmarkimporter_ns.cpp:162
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "Bookmarks"
+msgstr ""
+
+#: ../src/kbookmarkimporter_opera.cpp:119
+msgctxt "KOperaBookmarkImporterImpl|"
+msgid "Opera Bookmark Files (*.adr)"
+msgstr ""
+
+#: ../src/kbookmarkimporter_opera.cpp:122
+msgctxt "KOperaBookmarkImporterImpl|"
+msgid "*.adr|Opera Bookmark Files (*.adr)"
+msgstr ""
+
+#: ../src/kbookmarkmanager.cpp:442
+#, qt-format
+msgctxt "KBookmarkManager|"
+msgid ""
+"Unable to save bookmarks in %1. Reported error was: %2. This error message "
+"will only be shown once. The cause of the error needs to be fixed as quickly "
+"as possible, which is most likely a full hard drive."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:260
+msgctxt "KBookmarkMenu|"
+msgid "Open Folder in Tabs"
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:264
+msgctxt "KBookmarkMenu|"
+msgid "Open all bookmarks in this folder as a new tab."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:279
+msgctxt "KBookmarkMenu|"
+msgid "Bookmark Tabs as Folder..."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:283
+msgctxt "KBookmarkMenu|"
+msgid "Add a folder of bookmarks for all open tabs."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:320
+msgctxt "KBookmarkMenu|"
+msgid "Edit your bookmark collection in a separate window"
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:331
+msgctxt "KBookmarkMenu|"
+msgid "New Bookmark Folder..."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:333
+msgctxt "KBookmarkMenu|"
+msgid "Create a new bookmark folder in this menu"
+msgstr ""
+
+#: ../src/konqbookmarkmenu.cpp:59 ../src/konqbookmarkmenu.cpp:72
+msgctxt "KonqBookmarkContextMenu|"
+msgid "Hide in toolbar"
+msgstr ""
+
+#: ../src/konqbookmarkmenu.cpp:59 ../src/konqbookmarkmenu.cpp:72
+msgctxt "KonqBookmarkContextMenu|"
+msgid "Show in toolbar"
+msgstr ""
+
+#: ../src/konqbookmarkmenu.cpp:66
+msgctxt "KonqBookmarkContextMenu|"
+msgid "Open in New Window"
+msgstr ""
+
+#: ../src/konqbookmarkmenu.cpp:67
+msgctxt "KonqBookmarkContextMenu|"
+msgid "Open in New Tab"
+msgstr ""
diff --git a/po/kbookmarks5.pot b/po/kbookmarks5.pot
new file mode 100644
index 0000000..989b292
--- /dev/null
+++ b/po/kbookmarks5.pot
@@ -0,0 +1,260 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Qt-Contexts: true\n"
+
+#: ../src/kbookmark.cpp:307
+msgctxt "Bookmark separator|"
+msgid "--- separator ---"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:62
+msgctxt "KBookmarkContextMenu|"
+msgid "Add Bookmark Here"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:68
+msgctxt "KBookmarkContextMenu|"
+msgid "Open Folder in Bookmark Editor"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:71
+msgctxt "KBookmarkContextMenu|"
+msgid "Delete Folder"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:76
+msgctxt "KBookmarkContextMenu|"
+msgid "Properties"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:81
+msgctxt "KBookmarkContextMenu|"
+msgid "Copy Link Address"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:84
+msgctxt "KBookmarkContextMenu|"
+msgid "Delete Bookmark"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:90
+msgctxt "KBookmarkContextMenu|"
+msgid "Open Folder in Tabs"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:116
+msgctxt "KBookmarkContextMenu|"
+msgid "Cannot add bookmark with empty URL."
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:146
+msgctxt "KBookmarkContextMenu|"
+msgid "Bookmark Folder Deletion"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:147
+msgctxt "KBookmarkContextMenu|"
+msgid "Bookmark Deletion"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:148
+#, qt-format
+msgctxt "KBookmarkContextMenu|"
+msgid ""
+"Are you sure you wish to remove the bookmark folder\n"
+"\"%1\"?"
+msgstr ""
+
+#: ../src/kbookmarkcontextmenu.cpp:149
+#, qt-format
+msgctxt "KBookmarkContextMenu|"
+msgid ""
+"Are you sure you wish to remove the bookmark\n"
+"\"%1\"?"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:70
+msgctxt "QObject|@label:textbox"
+msgid "Name:"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:75
+msgctxt "QObject|@label:textbox"
+msgid "Location:"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:80
+msgctxt "QObject|@label:textbox"
+msgid "Comment:"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:191
+msgctxt "KBookmarkDialog|@action:button"
+msgid "Update"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:192
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Bookmark Properties"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:223 ../src/kbookmarkdialog.cpp:261
+#: ../src/kbookmarkdialog.cpp:295
+msgctxt "KBookmarkDialog|@action:button"
+msgid "&New Folder..."
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:227 ../src/kbookmarkdialog.cpp:265
+msgctxt "KBookmarkDialog|@action:button"
+msgid "Add"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:228
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Add Bookmark"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:266
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Add Bookmarks"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:299
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Select Folder"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:327
+msgctxt "KBookmarkDialog|@title:window"
+msgid "New Folder"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:362
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Create New Bookmark Folder"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:363
+#, qt-format
+msgctxt "KBookmarkDialog|@title:window"
+msgid "Create New Bookmark Folder in %1"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:365
+msgctxt "KBookmarkDialog|@label:textbox"
+msgid "New folder:"
+msgstr ""
+
+#: ../src/kbookmarkdialog.cpp:386
+msgctxt "KBookmarkDialog|name of the container of all browser bookmarks"
+msgid "Bookmarks"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:115
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "HTML Files (*.html)"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:119
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "*.html|HTML Files (*.html)"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:135
+#, qt-format
+msgctxt "KNSBookmarkImporterImpl|"
+msgid ""
+"Could not find %1. Netscape is probably not installed. Aborting the export."
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:137
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "Netscape not found"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:158
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "<!-- This file was generated by Konqueror -->"
+msgstr ""
+
+#: ../src/kbookmarkimporter_ns.cpp:161 ../src/kbookmarkimporter_ns.cpp:162
+msgctxt "KNSBookmarkImporterImpl|"
+msgid "Bookmarks"
+msgstr ""
+
+#: ../src/kbookmarkimporter_opera.cpp:119
+msgctxt "KOperaBookmarkImporterImpl|"
+msgid "Opera Bookmark Files (*.adr)"
+msgstr ""
+
+#: ../src/kbookmarkimporter_opera.cpp:122
+msgctxt "KOperaBookmarkImporterImpl|"
+msgid "*.adr|Opera Bookmark Files (*.adr)"
+msgstr ""
+
+#: ../src/kbookmarkmanager.cpp:442
+#, qt-format
+msgctxt "KBookmarkManager|"
+msgid ""
+"Unable to save bookmarks in %1. Reported error was: %2. This error message "
+"will only be shown once. The cause of the error needs to be fixed as quickly "
+"as possible, which is most likely a full hard drive."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:260
+msgctxt "KBookmarkMenu|"
+msgid "Open Folder in Tabs"
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:264
+msgctxt "KBookmarkMenu|"
+msgid "Open all bookmarks in this folder as a new tab."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:279
+msgctxt "KBookmarkMenu|"
+msgid "Bookmark Tabs as Folder..."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:283
+msgctxt "KBookmarkMenu|"
+msgid "Add a folder of bookmarks for all open tabs."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:320
+msgctxt "KBookmarkMenu|"
+msgid "Edit your bookmark collection in a separate window"
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:331
+msgctxt "KBookmarkMenu|"
+msgid "New Bookmark Folder..."
+msgstr ""
+
+#: ../src/kbookmarkmenu.cpp:333
+msgctxt "KBookmarkMenu|"
+msgid "Create a new bookmark folder in this menu"
+msgstr ""
+
+#: ../src/konqbookmarkmenu.cpp:59 ../src/konqbookmarkmenu.cpp:72
+msgctxt "KonqBookmarkContextMenu|"
+msgid "Hide in toolbar"
+msgstr ""
+
+#: ../src/konqbookmarkmenu.cpp:59 ../src/konqbookmarkmenu.cpp:72
+msgctxt "KonqBookmarkContextMenu|"
+msgid "Show in toolbar"
+msgstr ""
+
+#: ../src/konqbookmarkmenu.cpp:66
+msgctxt "KonqBookmarkContextMenu|"
+msgid "Open in New Window"
+msgstr ""
+
+#: ../src/konqbookmarkmenu.cpp:67
+msgctxt "KonqBookmarkContextMenu|"
+msgid "Open in New Tab"
+msgstr ""
diff --git a/src/Messages.sh b/src/Messages.sh
new file mode 100755
index 0000000..4f60d56
--- /dev/null
+++ b/src/Messages.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# Invoke the extractrc script on all .ui, .rc, and .kcfg files in the sources.
+# The results are stored in a pseudo .cpp file to be picked up by xgettext.
+lst=`find . -name \*.rc -o -name \*.ui -o -name \*.kcfg`
+if [ -n "$lst" ] ; then
+    $EXTRACTRC $lst >> rc.cpp
+fi
+
+# If your framework contains tips-of-the-day, call preparetips as well.
+if [ -f "data/tips" ] ; then
+    ( cd data && $PREPARETIPS > ../tips.cpp )
+fi
+
+rm -f $podir/tmp.ts
+lupdate -silent -recursive . -ts $podir/tmp.ts
+lconvert $podir/tmp.ts --sort-contexts --output-format pot -o $podir/kbookmarks5.pot
+rm $podir/tmp.ts
diff --git a/src/kbookmarkdialog.cpp b/src/kbookmarkdialog.cpp
index 1a20512..a32d725 100644
--- a/src/kbookmarkdialog.cpp
+++ b/src/kbookmarkdialog.cpp
@@ -67,17 +67,17 @@ void KBookmarkDialogPrivate::initLayoutPrivate()
 {
     title = new QLineEdit(q);
     title->setMinimumWidth(300);
-    titleLabel = new QLabel(q->tr("Name:", "@label:textbox"), q);
+    titleLabel = new QLabel(QObject::tr("Name:", "@label:textbox"), q);
     titleLabel->setBuddy(title);
 
     url = new QLineEdit(q);
     url->setMinimumWidth(300);
-    urlLabel = new QLabel(q->tr("Location:", "@label:textbox"), q);
+    urlLabel = new QLabel(QObject::tr("Location:", "@label:textbox"), q);
     urlLabel->setBuddy(url);
 
     comment = new QLineEdit(q);
     comment->setMinimumWidth(300);
-    commentLabel = new QLabel(q->tr("Comment:", "@label:textbox"), q);
+    commentLabel = new QLabel(QObject::tr("Comment:", "@label:textbox"), q);
     commentLabel->setBuddy(comment);
 
     folderTree = new QTreeWidget(q);
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 59b1cbd..abecd39 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -3,6 +3,7 @@ remove_definitions(-DQT_NO_CAST_FROM_ASCII)
 
 include(ECMMarkAsTest)
 
+include_directories(${CMAKE_BINARY_DIR})
 add_executable(kbookmarkdialogtest kbookmarkdialogtest.cpp)
 ecm_mark_as_test(kbookmarkdialogtest)
 target_link_libraries(kbookmarkdialogtest KF5::Bookmarks)
diff --git a/tests/kbookmarkdialogtest.cpp b/tests/kbookmarkdialogtest.cpp
index 38e5942..2899cf2 100644
--- a/tests/kbookmarkdialogtest.cpp
+++ b/tests/kbookmarkdialogtest.cpp
@@ -26,9 +26,13 @@
 #include <kbookmarkdialog.h>
 #include <kbookmarkmanager.h>
 
+#include <kbookmarks5_translation.h>
+
 int main(int argc, char **argv)
 {
     QApplication app(argc, argv);
+    kbookmarks5_installTranslator();
+
     KBookmarkDialog dlg(KBookmarkManager::userBookmarksManager());
     dlg.addBookmark("KDE", QUrl("http://www.kde.org";), "www"); // calls exec()
     return 0;
diff --git a/translation.h.in b/translation.h.in
new file mode 100644
index 0000000..dd0d668
--- /dev/null
+++ b/translation.h.in
@@ -0,0 +1,29 @@
+#ifndef @_PROJECT_NAME@_TRANSLATION_H
+#define @_PROJECT_NAME@_TRANSLATION_H
+
+#include <QStandardPaths>
+#include <QTranslator>
+
+inline QTranslator *@_PROJECT_NAME@_createTranslator(const QString &lang_ = QString())
+{
+    QString projectName = QStringLiteral("@_PROJECT_NAME@");
+    QString lang = lang_.isEmpty() ? QLocale::system().name() : lang_;
+    QString dir = QStandardPaths::locate(QStandardPaths::GenericDataLocation, projectName, QStandardPaths::LocateDirectory);
+    QTranslator *translator = new QTranslator(QCoreApplication::instance());
+    translator->load(projectName + QStringLiteral("_") + lang, dir + QStringLiteral("/locale"));
+    return translator;
+}
+
+inline bool @_PROJECT_NAME@_installTranslator(const QString &lang = QString())
+{
+    QTranslator *translator = @_PROJECT_NAME@_createTranslator(lang);
+    if (translator->isEmpty()) {
+        delete translator;
+        return false;
+    }
+    translator->setParent(QCoreApplication::instance());
+    QCoreApplication::instance()->installTranslator(translator);
+    return true;
+}
+
+#endif /* @_PROJECT_NAME@_TRANSLATION_H */
_______________________________________________
Kde-frameworks-devel mailing list
Kde-frameworks-devel@kde.org
https://mail.kde.org/mailman/listinfo/kde-frameworks-devel

Reply via email to