diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | app/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | app/src/main.cpp | 6 | ||||
| -rw-r--r-- | app/src/windows/main.cpp | 3 | ||||
| -rw-r--r-- | app/tests/windows/main.cpp | 31 | ||||
| -rw-r--r-- | lang/CMakeLists.txt | 38 | ||||
| -rw-r--r-- | lang/po/de.po | 15 | ||||
| -rw-r--r-- | lang/po/en_US.po | 15 | ||||
| -rw-r--r-- | res/windows/main_window.ui | 2 | ||||
| -rw-r--r-- | res/windows/windows.cmb | 2 | ||||
| -rw-r--r-- | test_support/CMakeLists.txt | 10 | ||||
| -rw-r--r-- | test_support/src/gtk_main.cpp | 5 |
12 files changed, 124 insertions, 7 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a15236..1ee538f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,7 @@ include("CheckIPOSupported") include("GlibCompileResources") include("GNUInstallDirs") +find_package("Gettext" REQUIRED) find_package("PkgConfig" REQUIRED) check_ipo_supported(RESULT CAN_DO_IPO LANGUAGES CXX) @@ -53,6 +54,7 @@ include("Catch") add_subdirectory("app") add_subdirectory("domain") +add_subdirectory("lang") add_subdirectory("res") add_subdirectory("test_support") diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 824e107..c25efe8 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -27,6 +27,8 @@ target_link_libraries("app" PUBLIC "PkgConfig::adwaita" "PkgConfig::gtkmm" + "turns::lang" + "$<$<CXX_COMPILER_ID:GNU,Clang>:-Wl,--whole-archive>" "turns::res" "$<$<CXX_COMPILER_ID:GNU,Clang>:-Wl,--no-whole-archive>" diff --git a/app/src/main.cpp b/app/src/main.cpp index dd23c82..d7fadc7 100644 --- a/app/src/main.cpp +++ b/app/src/main.cpp @@ -1,9 +1,15 @@ #include "turns/app/application.hpp" #include <adwaita.h> +#include <glibmm/i18n.h> auto main(int argc, char * argv[]) -> int { + setlocale(LC_ALL, ""); + bindtextdomain("turns", LOCALEDIR); + bind_textdomain_codeset("turns", "UTF-8"); + textdomain("turns"); + adw_init(); auto app = turns::app::application::create(); diff --git a/app/src/windows/main.cpp b/app/src/windows/main.cpp index f8437a6..0000f60 100644 --- a/app/src/windows/main.cpp +++ b/app/src/windows/main.cpp @@ -1,6 +1,7 @@ #include "turns/app/windows/main.hpp" #include <adwaita.h> +#include <glibmm/i18n.h> namespace turns::app::windows { @@ -10,7 +11,7 @@ namespace turns::app::windows , 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"); + adw_window_title_set_subtitle(m_title, _("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 d2ad60e..53c9386 100644 --- a/app/tests/windows/main.cpp +++ b/app/tests/windows/main.cpp @@ -1,20 +1,24 @@ #include "turns/app/windows/main.hpp" #include <catch2/catch_test_macros.hpp> +#include <catch2/generators/catch_generators.hpp> #include <string> #include <adwaita.h> +#include <glibmm/i18n.h> +#include <glibmm/ustring.h> #include <gtkmm/builder.h> #include <gtkmm/widget.h> -using namespace std::string_literals; - namespace turns::app::windows::tests { TEST_CASE("Newly constructed main window", "[windows]") { + auto locale = GENERATE("en_US.UTF-8", "de_CH.UTF-8"); + setlocale(LC_ALL, locale); + auto builder = Gtk::Builder::create_from_resource("/turns/windows/main_window.ui"); auto instance = Gtk::Builder::get_widget_derived<main>(builder, "main_window"); @@ -23,11 +27,32 @@ namespace turns::app::windows::tests REQUIRE(instance); } + SECTION("the window sub-title is not empty") + { + auto widget = builder->get_widget<Gtk::Widget>("title"); + auto adw = ADW_WINDOW_TITLE(widget->gobj()); + REQUIRE(adw_window_title_get_subtitle(adw)); + } + + SECTION("the window sub-title is set according to the active language") + { + 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")}); + } + SECTION("the window title is not empty") { auto widget = builder->get_widget<Gtk::Widget>("title"); auto adw = ADW_WINDOW_TITLE(widget->gobj()); - REQUIRE(adw_window_title_get_subtitle(adw) != ""s); + REQUIRE(adw_window_title_get_title(adw)); + } + + SECTION("the window title is set according to the active language") + { + 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")}); } } diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt new file mode 100644 index 0000000..4bc985c --- /dev/null +++ b/lang/CMakeLists.txt @@ -0,0 +1,38 @@ +set(TRANSLATIONS + "de" + "en_US" +) + +foreach(LANG IN LISTS TRANSLATIONS) + set(SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/po/${LANG}.po") + set(BINARY_FILE "${CMAKE_CURRENT_BINARY_DIR}/${LANG}/LC_MESSAGES/turns.mo") + + list(APPEND TRANSLATION_BINARIES "${BINARY_FILE}") + + add_custom_command(OUTPUT "${BINARY_FILE}" + COMMAND "${GETTEXT_MSGFMT_EXECUTABLE}" + ARGS + "-o" + "${BINARY_FILE}" + "${SOURCE_FILE}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + DEPENDS "${SOURCE_FILE}" + COMMENT "Processing translation ${LANG}" + ) + + install(FILES "${BINARY_FILE}" + DESTINATION "${CMAKE_INSTALL_FULL_LOCALEDIR}/${LANG}/LC_MESSAGES" + ) +endforeach() + +add_custom_target("mofiles" DEPENDS ${TRANSLATION_BINARIES}) + +add_library("lang" INTERFACE) + +add_library("turns::lang" ALIAS "lang") + +target_compile_definitions("lang" INTERFACE + "LOCALEDIR=\"${CMAKE_INSTALL_FULL_LOCALEDIR}\"" +) + +add_dependencies("lang" "mofiles")
\ No newline at end of file diff --git a/lang/po/de.po b/lang/po/de.po new file mode 100644 index 0000000..8b06799 --- /dev/null +++ b/lang/po/de.po @@ -0,0 +1,15 @@ +msgid "" +msgstr "" +"Project-Id-Version: turns 1.0.0\n" +"Last-Translator: Felix Morgner\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Turns" +msgstr "Züge" + +msgid "No active turn-order" +msgstr "Keine aktive Zugreihenfolge"
\ No newline at end of file diff --git a/lang/po/en_US.po b/lang/po/en_US.po new file mode 100644 index 0000000..77f577d --- /dev/null +++ b/lang/po/en_US.po @@ -0,0 +1,15 @@ +msgid "" +msgstr "" +"Project-Id-Version: turns 1.0.0\n" +"Last-Translator: Felix Morgner\n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Turns" +msgstr "Turns" + +msgid "No active turn-order" +msgstr "No active turn-order"
\ No newline at end of file diff --git a/res/windows/main_window.ui b/res/windows/main_window.ui index c9dbf26..b506e5a 100644 --- a/res/windows/main_window.ui +++ b/res/windows/main_window.ui @@ -19,7 +19,7 @@ <object class="AdwHeaderBar" id="header"> <property name="title-widget"> <object class="AdwWindowTitle" id="title"> - <property name="title">Turns</property> + <property name="title" translatable="yes">Turns</property> </object> </property> <child type="start"> diff --git a/res/windows/windows.cmb b/res/windows/windows.cmb index 8236b71..73ecbae 100644 --- a/res/windows/windows.cmb +++ b/res/windows/windows.cmb @@ -26,7 +26,7 @@ (1,1,"GtkWidget","width-request","360",None,None,None,None,None,None,None,None,None), (1,2,"AdwToolbarView","content",None,None,None,None,None,4,None,None,None,None), (1,3,"AdwHeaderBar","title-widget",None,None,None,None,None,6,None,None,None,None), - (1,6,"AdwWindowTitle","title","Turns",None,None,None,None,None,None,None,None,None), + (1,6,"AdwWindowTitle","title","Turns",1,None,None,None,None,None,None,None,None), (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), diff --git a/test_support/CMakeLists.txt b/test_support/CMakeLists.txt index 04bb256..fe30782 100644 --- a/test_support/CMakeLists.txt +++ b/test_support/CMakeLists.txt @@ -1,3 +1,5 @@ +get_target_property(TRANSLATIONS_BINARY_DIR "lang" BINARY_DIR) + add_library("test_support-gtk" OBJECT "src/gtk_main.cpp" ) @@ -8,7 +10,13 @@ target_compile_features("test_support-gtk" PRIVATE "cxx_std_23" ) +target_compile_definitions("test_support-gtk" PUBLIC + "TESTLOCALEDIR=\"${TRANSLATIONS_BINARY_DIR}\"" +) + target_link_libraries("test_support-gtk" PUBLIC + "turns::lang" + "PkgConfig::adwaita" "PkgConfig::gtkmm" -)
\ No newline at end of file +) diff --git a/test_support/src/gtk_main.cpp b/test_support/src/gtk_main.cpp index 02173f9..cb2ae5c 100644 --- a/test_support/src/gtk_main.cpp +++ b/test_support/src/gtk_main.cpp @@ -5,6 +5,11 @@ auto main(int argc, char * argv[]) -> int { + setlocale(LC_ALL, ""); + bindtextdomain("turns", TESTLOCALEDIR); + bind_textdomain_codeset("turns", "UTF-8"); + textdomain("turns"); + Gtk::init_gtkmm_internals(); adw_init(); |
