Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
gettext.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include "config.h" // for USE_GETTEXT
8#include "porting.h"
9#include "util/string.h"
10
11#if USE_GETTEXT
12 #include <libintl.h>
13#else
14 // In certain environments, some standard headers like <iomanip>
15 // and <locale> include libintl.h. If libintl.h is included after
16 // we define our gettext macro below, this causes a syntax error
17 // at the declaration of the gettext function in libintl.h.
18 // Fix this by including such a header before defining the macro.
19 // See issue #4446.
20 // Note that we can't include libintl.h directly since we're in
21 // the USE_GETTEXT=0 case and can't assume that gettext is installed.
22 #include <locale>
23
24 #define gettext(String) (String)
25 #define ngettext(String1, String2, n) ((n) == 1 ? (String1) : (String2))
26#endif
27
28#define _(String) gettext(String)
29#define gettext_noop(String) (String)
30#define N_(String) gettext_noop((String))
31
32void init_gettext(const char *path, const std::string &configured_language,
33 int argc, char *argv[]);
34
35inline std::string strgettext(const char *str)
36{
37 // We must check here that is not an empty string to avoid trying to translate it
38 return str[0] ? gettext(str) : "";
39}
40
41inline std::string strgettext(const std::string &str)
42{
43 return strgettext(str.c_str());
44}
45
46inline std::wstring wstrgettext(const char *str)
47{
48 return utf8_to_wide(strgettext(str));
49}
50
51inline std::wstring wstrgettext(const std::string &str)
52{
53 return wstrgettext(str.c_str());
54}
55
65template <typename ...Args>
66inline std::wstring fwgettext(const char *src, Args&&... args)
67{
68 wchar_t buf[255];
69 swprintf(buf, sizeof(buf) / sizeof(wchar_t), wstrgettext(src).c_str(),
70 std::forward<Args>(args)...);
71 return std::wstring(buf);
72}
73
82template <typename ...Args>
83inline std::string fmtgettext(const char *format, Args&&... args)
84{
85 format = gettext(format);
86
87 std::string buf;
88 {
89 size_t default_size = strlen(format);
90 if (default_size < 256)
91 default_size = 256;
92 buf.resize(default_size);
93 }
94
95 int len = porting::mt_snprintf(&buf[0], buf.size(), format, std::forward<Args>(args)...);
96 if (len <= 0)
97 throw std::runtime_error("gettext format error: " + std::string(format));
98 if ((size_t)len >= buf.size()) {
99 buf.resize(len+1); // extra null byte
100 porting::mt_snprintf(&buf[0], buf.size(), format, std::forward<Args>(args)...);
101 }
102 buf.resize(len); // remove null bytes
103
104 return buf;
105}
void init_gettext(const char *path, const std::string &configured_language, int argc, char *argv[])
Definition gettext.cpp:150
std::wstring wstrgettext(const char *str)
Definition gettext.h:46
std::string fmtgettext(const char *format, Args &&... args)
Returns translated string with format args applied.
Definition gettext.h:83
std::wstring fwgettext(const char *src, Args &&... args)
Returns translated string with format args applied.
Definition gettext.h:66
std::string strgettext(const char *str)
Definition gettext.h:35
int mt_snprintf(char *buf, const size_t buf_size, const char *fmt,...)
Definition porting.cpp:857
std::wstring utf8_to_wide(std::string_view input)
Definition string.cpp:87