-inline void init_gettext(const char *path) {
-#if USE_GETTEXT
- setlocale(LC_MESSAGES, "");
- bindtextdomain(PROJECT_NAME, path);
- textdomain(PROJECT_NAME);
-#endif
+void init_gettext(const char *path, const std::string &configured_language,
+ int argc, char *argv[]);
+
+extern wchar_t *utf8_to_wide_c(const char *str);
+
+// The returned string must be freed using delete[]
+inline const wchar_t *wgettext(const char *str)
+{
+ // We must check here that is not an empty string to avoid trying to translate it
+ return str[0] ? utf8_to_wide_c(gettext(str)) : utf8_to_wide_c("");
+}
+
+inline std::string strgettext(const std::string &text)
+{
+ return text.empty() ? "" : gettext(text.c_str());
+}
+
+/**
+ * Returns translated string with format args applied
+ *
+ * @tparam Args Template parameter for format args
+ * @param src Translation source string
+ * @param args Variable format args
+ * @return translated string
+ */
+template <typename ...Args>
+inline std::wstring fwgettext(const char *src, Args&&... args)
+{
+ wchar_t buf[255];
+ const wchar_t* str = wgettext(src);
+ swprintf(buf, sizeof(buf) / sizeof(wchar_t), str, std::forward<Args>(args)...);
+ delete[] str;
+ return std::wstring(buf);