summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--app/CMakeLists.txt2
-rw-r--r--app/src/main.cpp6
-rw-r--r--app/src/windows/main.cpp3
-rw-r--r--app/tests/windows/main.cpp31
-rw-r--r--lang/CMakeLists.txt38
-rw-r--r--lang/po/de.po15
-rw-r--r--lang/po/en_US.po15
-rw-r--r--res/windows/main_window.ui2
-rw-r--r--res/windows/windows.cmb2
-rw-r--r--test_support/CMakeLists.txt10
-rw-r--r--test_support/src/gtk_main.cpp5
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();