1// SuperTux
2// Copyright (C) 2006 Ingo Ruhnke <grumbel@gmail.com>
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17#ifndef HEADER_SUPERTUX_UTIL_GETTEXT_HPP
18#define HEADER_SUPERTUX_UTIL_GETTEXT_HPP
19
20#include <tinygettext/tinygettext.hpp>
21#include <memory>
22
23extern std::unique_ptr<tinygettext::DictionaryManager> g_dictionary_manager;
24
25/*
26 * If you need to do a nontrivial substitution of values into a pattern, use
27 * boost::format rather than an ad-hoc concatenation. That way, translators can
28 * translate the format string as a whole (and even rearrange the values if
29 * necessary with "%1$s"-style codes) instead of multiple pieces. Patterns like
30 * "Label: %s" with only one string piece are a borderline case where
31 * boost::format is not really necessary.
32 *
33 * http://www.mihai-nita.net/article.php?artID=20060430a
34 *
35 * Bad:
36 * std::string greeting = _("Hello ") + name + _("!");
37 * std::cout << _("Hello ") << name << _("!");
38 * Good:
39 * #include <boost/format.hpp>
40 * std::string greeting = str(boost::format(_("Hello %s!")) % name);
41 * std::cout << boost::format(_("Hello %s!")) % name;
42 *
43 * If you need singular and plural forms use __ instead of _ and boost::format
44 * if necessary.
45 *
46 * https://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
47 *
48 * Bad:
49 * std::cout << _("You collected ") << num << _(" coins");
50 * Good:
51 * #include <boost/format.hpp>
52 * std::cout << boost::format(__("You collected %d coin",
53 * "You collected %d coins", num)) % num;
54 */
55
56static inline std::string _(const std::string& message)
57{
58 if (g_dictionary_manager)
59 {
60 return g_dictionary_manager->get_dictionary().translate(message);
61 }
62 else
63 {
64 return message;
65 }
66}
67
68static inline std::string __(const std::string& message,
69 const std::string& message_plural, int num)
70{
71 if (g_dictionary_manager)
72 {
73 return g_dictionary_manager->get_dictionary().translate_plural(message,
74 message_plural, num);
75 }
76 else if (num == 1)
77 {
78 return message;
79 }
80 else
81 {
82 return message_plural;
83 }
84}
85
86#endif
87
88/* EOF */
89