1 /***************************************************************************
4 begin : Wed Apr 25 2001
5 copyright : (C) 2001-2004 by Intra2net AG
6 email : info@intra2net.com
7 ***************************************************************************/
20 #define DEFAULT_LANG "en_EN"
24 void i18n_init (const string& domain, const string& path)
26 i18n_set_language (i18n_get_default_language());
28 bindtextdomain (domain.c_str(), path.c_str());
29 textdomain (domain.c_str());
32 void i18n_set_language (const string &lang)
47 setlocale(LC_ALL,"C");
49 setlocale(LC_ALL,target.c_str());
51 // Flush gcc based gettext caching. Code is from the -GNU-
52 // gettext manual in the "being a gettext grok" chapter.
54 extern int _nl_msg_cat_cntr;
61 // empty string returned: no language set
62 string i18n_get_current_language(void)
65 char* env=setlocale(LC_ALL,NULL);
69 if (strcmp(env,"C")==0)
80 // empty string returned: no language set
81 string i18n_get_default_language(void)
85 ifstream in("/usr/intranator/etc/locale");
98 void i18n_get_string(const char *source, string &target, const vector<string> &data) {
99 string src = string (source);
100 i18n_get_string (src, target, data);
103 string i18n_get_string(const char *source, const vector<string> &data) {
105 string src = string (source);
106 i18n_get_string (src, target, data);
110 string i18n_get_string(const string &source, const vector<string> &data) {
112 i18n_get_string (source, target, data);
116 void i18n_get_string(const string &source, string &target, const vector<string> &data)
118 string::size_type p=0, slen=0;
122 string text = source;
126 while ((p=target.find('$',p))!=string::npos)
130 if (target.size() < p)
133 os << "i18n syntax error: $ without number at pos ->" << p << "<- in string ->" << text << "<-";
138 // find string to insert (=ins)
139 if (target.at(p+1)=='$')
146 slen=target.find_first_not_of("0123456789",p+1);
148 if (slen==string::npos)
154 os << "i18n syntax error: $ without number at pos ->" << p << "<- in string ->" << text << "<-";
160 istringstream is(target.substr(p+1,slen-1));
168 os << "i18n syntax error: error reading number at pos ->" << p << "<- in string ->" << text << "<-";
173 if (dnr+1 > data.size())
176 os << "i18n parameter error: missing variable ->$" << dnr << "<- in string ->" << text << "<-";
184 target.replace(p,slen,*ins);
189 // convert locale to language (de_DE -> de)
190 string i18n_locale2language(string locale)
193 string::size_type pos = locale.find("_");
194 if (pos == string::npos)
197 return(locale.substr(0, pos));