diff options
| -rw-r--r-- | app/include/turns/app/windows/main.hpp | 4 | ||||
| -rw-r--r-- | app/src/windows/main.cpp | 8 | ||||
| -rw-r--r-- | app/tests/windows/main.cpp | 15 | ||||
| -rw-r--r-- | lang/CMakeLists.txt | 18 | ||||
| -rw-r--r-- | lang/include/turns/lang/messages.hpp | 23 | ||||
| -rw-r--r-- | lang/po/de.po | 12 | ||||
| -rw-r--r-- | lang/po/en_US.po | 12 | ||||
| -rw-r--r-- | lang/po/labels/de.po | 5 | ||||
| -rw-r--r-- | lang/po/labels/en_US.po | 5 | ||||
| -rw-r--r-- | lang/po/menu_items/de.po | 2 | ||||
| -rw-r--r-- | lang/po/menu_items/en_US.po | 2 | ||||
| -rw-r--r-- | lang/po/tooltips/de.po | 2 | ||||
| -rw-r--r-- | lang/po/tooltips/en_US.po | 2 | ||||
| -rw-r--r-- | lang/tests/labels.cpp | 30 | ||||
| -rw-r--r-- | lang/tests/menu_items.cpp | 29 | ||||
| -rw-r--r-- | lang/tests/tooltips.cpp (renamed from lang/tests/translations.cpp) | 14 | ||||
| -rw-r--r-- | res/windows/main_window.ui | 1 | ||||
| -rw-r--r-- | res/windows/windows.cmb | 1 |
18 files changed, 147 insertions, 38 deletions
diff --git a/app/include/turns/app/windows/main.hpp b/app/include/turns/app/windows/main.hpp index 9d2e1c3..a39d156 100644 --- a/app/include/turns/app/windows/main.hpp +++ b/app/include/turns/app/windows/main.hpp @@ -5,6 +5,7 @@ #include <glibmm/refptr.h> #include <gtkmm/applicationwindow.h> #include <gtkmm/builder.h> +#include <gtkmm/button.h> namespace turns::app::windows { @@ -14,10 +15,11 @@ namespace turns::app::windows main(BaseObjectType * base, Glib::RefPtr<Gtk::Builder> const builder); private: + Gtk::Button * m_add_participant; AdwApplicationWindow * m_adw; AdwWindowTitle * m_title; }; -} // namespace turns::app +} // namespace turns::app::windows #endif
\ No newline at end of file diff --git a/app/src/windows/main.cpp b/app/src/windows/main.cpp index 0000f60..d8118c6 100644 --- a/app/src/windows/main.cpp +++ b/app/src/windows/main.cpp @@ -1,17 +1,23 @@ #include "turns/app/windows/main.hpp" +#include "turns/lang/messages.hpp" + #include <adwaita.h> #include <glibmm/i18n.h> namespace turns::app::windows { + using namespace turns::lang; + main::main(BaseObjectType * base, Glib::RefPtr<Gtk::Builder> const builder) : Gtk::ApplicationWindow{base} + , m_add_participant{builder->get_widget<Gtk::Button>("add_participant")} , m_adw{ADW_APPLICATION_WINDOW(gobj())} , m_title(ADW_WINDOW_TITLE(builder->get_widget<Gtk::Widget>("title")->gobj())) { - adw_window_title_set_subtitle(m_title, _("No active turn-order")); + m_add_participant->set_tooltip_text(_(tooltips::add_a_participant)); + adw_window_title_set_subtitle(m_title, _(labels::no_active_turn_order)); } } // namespace turns::app::windows
\ No newline at end of file diff --git a/app/tests/windows/main.cpp b/app/tests/windows/main.cpp index 53c9386..fca04fd 100644 --- a/app/tests/windows/main.cpp +++ b/app/tests/windows/main.cpp @@ -1,5 +1,7 @@ #include "turns/app/windows/main.hpp" +#include "turns/lang/messages.hpp" + #include <catch2/catch_test_macros.hpp> #include <catch2/generators/catch_generators.hpp> @@ -9,11 +11,14 @@ #include <glibmm/i18n.h> #include <glibmm/ustring.h> #include <gtkmm/builder.h> +#include <gtkmm/button.h> #include <gtkmm/widget.h> namespace turns::app::windows::tests { + using namespace turns::lang; + TEST_CASE("Newly constructed main window", "[windows]") { auto locale = GENERATE("en_US.UTF-8", "de_CH.UTF-8"); @@ -38,7 +43,7 @@ namespace turns::app::windows::tests { auto widget = builder->get_widget<Gtk::Widget>("title"); auto adw = ADW_WINDOW_TITLE(widget->gobj()); - REQUIRE(adw_window_title_get_subtitle(adw) == Glib::ustring{_("No active turn-order")}); + REQUIRE(adw_window_title_get_subtitle(adw) == Glib::ustring{_(labels::no_active_turn_order)}); } SECTION("the window title is not empty") @@ -52,7 +57,13 @@ namespace turns::app::windows::tests { auto widget = builder->get_widget<Gtk::Widget>("title"); auto adw = ADW_WINDOW_TITLE(widget->gobj()); - REQUIRE(adw_window_title_get_title(adw) == Glib::ustring{_("Turns")}); + REQUIRE(adw_window_title_get_title(adw) == Glib::ustring{_(labels::turns)}); + } + + SECTION("the add_participant button has the correct tooltip") + { + auto widget = builder->get_widget<Gtk::Button>("add_participant"); + REQUIRE(widget->get_tooltip_text() == Glib::ustring{_(tooltips::add_a_participant)}); } } diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index 9ba960b..61e0488 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -4,7 +4,10 @@ set(TRANSLATIONS ) foreach(LANG IN LISTS TRANSLATIONS) - set(SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/po/${LANG}.po") + set(BASE_SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/po/${LANG}.po") + set(LABELS_SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/po/labels/${LANG}.po") + set(MENU_ITEMS_SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/po/menu_items/${LANG}.po") + set(TOOLTIPS_SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/po/tooltips/${LANG}.po") set(BINARY_FILE "${CMAKE_CURRENT_BINARY_DIR}/${LANG}/LC_MESSAGES/turns.mo") list(APPEND TRANSLATION_BINARIES "${BINARY_FILE}") @@ -14,7 +17,10 @@ foreach(LANG IN LISTS TRANSLATIONS) ARGS "-o" "${BINARY_FILE}" - "${SOURCE_FILE}" + "${BASE_SOURCE_FILE}" + "${LABELS_SOURCE_FILE}" + "${MENU_ITEMS_SOURCE_FILE}" + "${TOOLTIPS_SOURCE_FILE}" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" DEPENDS "${SOURCE_FILE}" COMMENT "Processing translation ${LANG}" @@ -35,12 +41,18 @@ target_compile_definitions("lang" INTERFACE "LOCALEDIR=\"${CMAKE_INSTALL_FULL_LOCALEDIR}\"" ) +target_include_directories("lang" INTERFACE + "include" +) + add_dependencies("lang" "mofiles") # Tests add_executable("lang-tests" - "tests/translations.cpp" + "tests/labels.cpp" + "tests/menu_items.cpp" + "tests/tooltips.cpp" ) target_link_libraries("lang-tests" PRIVATE diff --git a/lang/include/turns/lang/messages.hpp b/lang/include/turns/lang/messages.hpp new file mode 100644 index 0000000..a6ff5ee --- /dev/null +++ b/lang/include/turns/lang/messages.hpp @@ -0,0 +1,23 @@ +#ifndef TURNS_LANG_MESSAGES_HPP +#define TURNS_LANG_MESSAGES_HPP + +namespace turns::lang +{ + namespace menu_items + { + auto constexpr static quit = "_Quit"; + } // namespace menu_items + + namespace labels + { + auto constexpr static no_active_turn_order = "No active turn-order"; + auto constexpr static turns = "Turns"; + } // namespace labels + + namespace tooltips + { + auto constexpr static add_a_participant = "Add a participant"; + } // namespace tooltips +} // namespace turns::lang + +#endif
\ No newline at end of file diff --git a/lang/po/de.po b/lang/po/de.po index aca650c..c775800 100644 --- a/lang/po/de.po +++ b/lang/po/de.po @@ -7,15 +7,3 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Add a participant" -msgstr "Teilnehmer hinzufügen" - -msgid "No active turn-order" -msgstr "Keine aktive Zugreihenfolge" - -msgid "_Quit" -msgstr "_Beenden" - -msgid "Turns" -msgstr "Züge" diff --git a/lang/po/en_US.po b/lang/po/en_US.po index 31fa912..5ffcd74 100644 --- a/lang/po/en_US.po +++ b/lang/po/en_US.po @@ -7,15 +7,3 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Add a participant" -msgstr "Add a participant" - -msgid "No active turn-order" -msgstr "No active turn-order" - -msgid "_Quit" -msgstr "_Quit" - -msgid "Turns" -msgstr "Turns" diff --git a/lang/po/labels/de.po b/lang/po/labels/de.po new file mode 100644 index 0000000..d1cf410 --- /dev/null +++ b/lang/po/labels/de.po @@ -0,0 +1,5 @@ +msgid "No active turn-order" +msgstr "Keine aktive Zugreihenfolge" + +msgid "Turns" +msgstr "Züge" diff --git a/lang/po/labels/en_US.po b/lang/po/labels/en_US.po new file mode 100644 index 0000000..1761c41 --- /dev/null +++ b/lang/po/labels/en_US.po @@ -0,0 +1,5 @@ +msgid "No active turn-order" +msgstr "No active turn-order" + +msgid "Turns" +msgstr "Turns" diff --git a/lang/po/menu_items/de.po b/lang/po/menu_items/de.po new file mode 100644 index 0000000..4351945 --- /dev/null +++ b/lang/po/menu_items/de.po @@ -0,0 +1,2 @@ +msgid "_Quit" +msgstr "_Beenden" diff --git a/lang/po/menu_items/en_US.po b/lang/po/menu_items/en_US.po new file mode 100644 index 0000000..7b59e50 --- /dev/null +++ b/lang/po/menu_items/en_US.po @@ -0,0 +1,2 @@ +msgid "_Quit" +msgstr "_Quit" diff --git a/lang/po/tooltips/de.po b/lang/po/tooltips/de.po new file mode 100644 index 0000000..da788ae --- /dev/null +++ b/lang/po/tooltips/de.po @@ -0,0 +1,2 @@ +msgid "Add a participant" +msgstr "Teilnehmer hinzufügen" diff --git a/lang/po/tooltips/en_US.po b/lang/po/tooltips/en_US.po new file mode 100644 index 0000000..cd80911 --- /dev/null +++ b/lang/po/tooltips/en_US.po @@ -0,0 +1,2 @@ +msgid "Add a participant" +msgstr "Add a participant" diff --git a/lang/tests/labels.cpp b/lang/tests/labels.cpp new file mode 100644 index 0000000..3ebdf42 --- /dev/null +++ b/lang/tests/labels.cpp @@ -0,0 +1,30 @@ +#include "turns/lang/messages.hpp" + +#include <catch2/catch_test_macros.hpp> +#include <catch2/generators/catch_generators.hpp> + +#include <format> +#include <string> + +#include <libintl.h> + +namespace turns::lang::tests +{ + + TEST_CASE("Label translations") + { + auto message = GENERATE( + labels::no_active_turn_order, + labels::turns + ); + + auto locale = GENERATE("de_CH.UTF-8", "de_DE.UTF-8", "de_AT.UTF-8"); + + SECTION(std::format("'{}' has a translation in '{}'", message, locale)) + { + setlocale(LC_ALL, locale); + REQUIRE(std::string{gettext(message)} != message); + } + } + +} // namespace turns::lang::tests
\ No newline at end of file diff --git a/lang/tests/menu_items.cpp b/lang/tests/menu_items.cpp new file mode 100644 index 0000000..71fdef5 --- /dev/null +++ b/lang/tests/menu_items.cpp @@ -0,0 +1,29 @@ +#include "turns/lang/messages.hpp" + +#include <catch2/catch_test_macros.hpp> +#include <catch2/generators/catch_generators.hpp> + +#include <format> +#include <string> + +#include <libintl.h> + +namespace turns::lang::tests +{ + + TEST_CASE("Menu item translations") + { + auto message = GENERATE( + menu_items::quit + ); + + auto locale = GENERATE("de_CH.UTF-8", "de_DE.UTF-8", "de_AT.UTF-8"); + + SECTION(std::format("'{}' has a translation in '{}'", message, locale)) + { + setlocale(LC_ALL, locale); + REQUIRE(std::string{gettext(message)} != message); + } + } + +} // namespace turns::lang::tests
\ No newline at end of file diff --git a/lang/tests/translations.cpp b/lang/tests/tooltips.cpp index 1bb78a5..66b6d72 100644 --- a/lang/tests/translations.cpp +++ b/lang/tests/tooltips.cpp @@ -1,3 +1,5 @@ +#include "turns/lang/messages.hpp" + #include <catch2/catch_test_macros.hpp> #include <catch2/generators/catch_generators.hpp> @@ -6,13 +8,13 @@ #include <format> #include <string> -TEST_CASE("All supported languages have translations") +namespace turns::lang::tests +{ + +TEST_CASE("Tooltip translations") { auto message = GENERATE( - "Turns", - "Add a participant", - "No active turn-order", - "_Quit" + tooltips::add_a_participant ); auto locale = GENERATE( @@ -27,3 +29,5 @@ TEST_CASE("All supported languages have translations") REQUIRE(std::string{gettext(message)} != message); } } + +}
\ No newline at end of file diff --git a/res/windows/main_window.ui b/res/windows/main_window.ui index 631e6a7..4106421 100644 --- a/res/windows/main_window.ui +++ b/res/windows/main_window.ui @@ -31,7 +31,6 @@ <child type="start"> <object class="GtkButton" id="add_participant"> <property name="icon-name">contact-new</property> - <property name="tooltip-text" translatable="yes">Add a participant</property> </object> </child> </object> diff --git a/res/windows/windows.cmb b/res/windows/windows.cmb index 09117bd..91a0184 100644 --- a/res/windows/windows.cmb +++ b/res/windows/windows.cmb @@ -30,7 +30,6 @@ (1,7,"GtkMenuButton","icon-name","open-menu",None,None,None,None,None,None,None,None,None), (1,7,"GtkMenuButton","menu-model","9",None,None,None,None,None,None,None,None,None), (1,8,"GtkButton","icon-name","contact-new",None,None,None,None,None,None,None,None,None), - (1,8,"GtkWidget","tooltip-text","Add a participant",1,None,None,None,None,None,None,None,None), (1,10,"(item)","action","app.quit",None,None,None,None,None,None,None,None,None), (1,10,"(item)","label","_Quit",1,None,None,None,None,None,None,None,None) </object_property> |
