2 // Copyright (C) 2009 Ingo Ruhnke <grumbel@gmx.de>
4 // This program is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU General Public License
6 // as published by the Free Software Foundation; either version 2
7 // of the License, or (at your option) any later version.
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.
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 #include "tinygettext/po_parser.hpp"
25 #include "tinygettext/tinygettext.hpp"
27 using namespace tinygettext;
29 void print_msg(const std::string& msgid, const std::vector<std::string>& msgstrs)
31 std::cout << "Msgid: " << msgid << std::endl;
32 for(std::vector<std::string>::const_iterator i = msgstrs.begin(); i != msgstrs.end(); ++i)
34 std::cout << *i << std::endl;
38 void print_msg_ctxt(const std::string& ctxt, const std::string& msgid, const std::vector<std::string>& msgstrs)
40 std::cout << "Msgctxt: " << ctxt << std::endl;
41 std::cout << "Msgid: " << msgid << std::endl;
42 for(std::vector<std::string>::const_iterator i = msgstrs.begin(); i != msgstrs.end(); ++i)
44 std::cout << *i << std::endl;
48 void print_usage(int /*argc*/, char** argv)
50 std::cout << "Usage: " << argv[0] << " translate FILE MESSAGE" << std::endl;
51 std::cout << " " << argv[0] << " translate FILE MESSAGE_S MESSAGE_P NUM" << std::endl;
52 std::cout << " " << argv[0] << " directory DIRECTORY MESSAGE [LANG]" << std::endl;
53 std::cout << " " << argv[0] << " language LANGUAGE" << std::endl;
54 std::cout << " " << argv[0] << " language-dir DIR" << std::endl;
55 std::cout << " " << argv[0] << " list-msgstrs FILE" << std::endl;
58 void read_dictionary(const std::string& filename, Dictionary& dict)
60 std::ifstream in(filename.c_str());
64 throw std::runtime_error("Couldn't open " + filename);
68 POParser::parse(filename, in, dict);
73 int main(int argc, char** argv)
77 if (argc == 3 && strcmp(argv[1], "language-dir") == 0)
79 DictionaryManager dictionary_manager;
80 dictionary_manager.add_directory(argv[2]);
81 const std::set<Language>& languages = dictionary_manager.get_languages();
82 std::cout << "Number of languages: " << languages.size() << std::endl;
83 for (std::set<Language>::const_iterator i = languages.begin(); i != languages.end(); ++i)
85 const Language& language = *i;
86 std::cout << "Env: " << language.str() << std::endl
87 << "Name: " << language.get_name() << std::endl
88 << "Language: " << language.get_language() << std::endl
89 << "Country: " << language.get_country() << std::endl
90 << "Modifier: " << language.get_modifier() << std::endl
94 else if (argc == 3 && strcmp(argv[1], "language") == 0)
96 Language language = Language::from_name(argv[2]);
99 std::cout << "Env: " << language.str() << std::endl
100 << "Name: " << language.get_name() << std::endl
101 << "Language: " << language.get_language() << std::endl
102 << "Country: " << language.get_country() << std::endl
103 << "Modifier: " << language.get_modifier() << std::endl;
105 std::cout << "not found" << std::endl;
107 else if (argc == 4 && strcmp(argv[1], "translate") == 0)
109 const char* filename = argv[2];
110 const char* message = argv[3];
113 read_dictionary(filename, dict);
114 std::cout << "TRANSLATION: \"\"\"" << dict.translate(message) << "\"\"\""<< std::endl;
116 else if (argc == 5 && strcmp(argv[1], "translate") == 0)
118 const char* filename = argv[2];
119 const char* context = argv[3];
120 const char* message = argv[4];
123 read_dictionary(filename, dict);
124 std::cout << dict.translate_ctxt(context, message) << std::endl;
126 else if (argc == 6 && strcmp(argv[1], "translate") == 0)
128 const char* filename = argv[2];
129 const char* message_singular = argv[3];
130 const char* message_plural = argv[4];
131 int num = atoi(argv[5]);
134 read_dictionary(filename, dict);
135 std::cout << dict.translate_plural(message_singular, message_plural, num) << std::endl;
137 else if (argc == 7 && strcmp(argv[1], "translate") == 0)
139 const char* filename = argv[2];
140 const char* context = argv[3];
141 const char* message_singular = argv[4];
142 const char* message_plural = argv[5];
143 int num = atoi(argv[6]);
146 read_dictionary(filename, dict);
147 std::cout << dict.translate_ctxt_plural(context, message_singular, message_plural, num) << std::endl;
149 else if ((argc == 4 || argc == 5) && strcmp(argv[1], "directory") == 0)
151 const char* directory = argv[2];
152 const char* message = argv[3];
153 const char* language = (argc == 5) ? argv[4] : NULL;
155 DictionaryManager manager;
156 manager.add_directory(directory);
160 Language lang = Language::from_name(language);
163 manager.set_language(lang);
167 std::cout << "Unknown language: " << language << std::endl;
172 std::cout << "Directory: '" << directory << "'" << std::endl;
173 std::cout << "Message: '" << message << "'" << std::endl;
174 std::cout << "Language: '" << manager.get_language().str() << "' (name: '"
175 << manager.get_language().get_name() << "', language: '"
176 << manager.get_language().get_language() << "', country: '"
177 << manager.get_language().get_country() << "', modifier: '"
178 << manager.get_language().get_modifier() << "')"
180 std::cout << "Translation: '" << manager.get_dictionary().translate(message) << "'" << std::endl;
182 else if ((argc == 3) && strcmp(argv[1], "list-msgstrs") == 0)
184 const char* filename = argv[2];
187 read_dictionary(filename, dict);
188 dict.foreach(print_msg);
189 dict.foreach_ctxt(print_msg_ctxt);
193 print_usage(argc, argv);
196 catch(std::exception& err)
198 std::cout << "Exception: " << err.what() << std::endl;