diff options
Diffstat (limited to 'src/i18n.cc')
-rw-r--r-- | src/i18n.cc | 136 |
1 files changed, 73 insertions, 63 deletions
diff --git a/src/i18n.cc b/src/i18n.cc index 5f102dd..c282d63 100644 --- a/src/i18n.cc +++ b/src/i18n.cc | |||
@@ -1,3 +1,6 @@ | |||
1 | // i18n.hh for Fluxbox Window Manager | ||
2 | // Copyright (c) 2001 - 2002 Henrik Kinnunen (fluxgen@linuxmail.org) | ||
3 | // | ||
1 | // i18n.cc for Blackbox - an X11 Window manager | 4 | // i18n.cc for Blackbox - an X11 Window manager |
2 | // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) | 5 | // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) |
3 | // | 6 | // |
@@ -19,67 +22,76 @@ | |||
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
21 | 24 | ||
22 | // stupid macros needed to access some functions in version 2 of the GNU C | 25 | // $Id: i18n.cc,v 1.5 2002/04/04 11:32:16 fluxgen Exp $ |
23 | // library | 26 | |
24 | #ifndef _GNU_SOURCE | 27 | //usr GNU extensions |
25 | #define _GNU_SOURCE | 28 | #ifndef _GNU_SOURCE |
29 | #define _GNU_SOURCE | ||
26 | #endif // _GNU_SOURCE | 30 | #endif // _GNU_SOURCE |
27 | 31 | ||
28 | #ifdef HAVE_CONFIG_H | 32 | #ifdef HAVE_CONFIG_H |
29 | # include "../config.h" | 33 | #include "../config.h" |
30 | #endif // HAVE_CONFIG_H | 34 | #endif // HAVE_CONFIG_H |
31 | 35 | ||
32 | #include "i18n.hh" | 36 | #include "i18n.hh" |
33 | 37 | ||
34 | #include <X11/Xlocale.h> | 38 | #include <X11/Xlocale.h> |
35 | 39 | ||
36 | #ifdef STDC_HEADERS | 40 | #ifdef STDC_HEADERS |
37 | # include <stdlib.h> | 41 | # include <stdlib.h> |
38 | # include <string.h> | 42 | # include <string.h> |
39 | # include <stdio.h> | 43 | # include <stdio.h> |
40 | #endif // STDC_HEADERS | 44 | #endif // STDC_HEADERS |
41 | 45 | ||
42 | #ifdef HAVE_LOCALE_H | 46 | #ifdef HAVE_LOCALE_H |
43 | # include <locale.h> | 47 | # include <locale.h> |
44 | #endif // HAVE_LOCALE_H | 48 | #endif // HAVE_LOCALE_H |
45 | 49 | ||
50 | #include <iostream> | ||
51 | using std::cerr; | ||
52 | using std::endl; | ||
53 | using std::string; | ||
46 | 54 | ||
47 | void NLSInit(const char *catalog) { | 55 | void NLSInit(const char *catalog) { |
48 | I18n *i18n = I18n::instance(); | 56 | I18n *i18n = I18n::instance(); |
49 | i18n->openCatalog(catalog); | 57 | i18n->openCatalog(catalog); |
50 | } | 58 | } |
51 | 59 | ||
52 | 60 | ||
53 | I18n::I18n(void) { | 61 | I18n::I18n():m_multibyte(false), m_catalog_fd((nl_catd)(-1)) { |
54 | #ifdef HAVE_SETLOCALE | 62 | #ifdef HAVE_SETLOCALE |
55 | locale = setlocale(LC_ALL, ""); | 63 | //make sure we don't get 0 to m_locale string |
56 | if (! locale) { | 64 | char *temp = setlocale(LC_ALL, ""); |
57 | fprintf(stderr, "failed to set locale, reverting to \"C\"\n"); | 65 | m_locale = ( temp ? temp : ""); |
66 | if (m_locale.size() == 0) { | ||
67 | cerr<<"Warning: Failed to set locale, reverting to \"C\""<<endl; | ||
58 | #endif // HAVE_SETLOCALE | 68 | #endif // HAVE_SETLOCALE |
59 | locale = "C"; | 69 | m_locale = "C"; |
60 | mb = 0; | 70 | #ifdef HAVE_SETLOCALE |
61 | #ifdef HAVE_SETLOCALE | 71 | } else { |
62 | } else if (! strcmp(locale, "C") || ! strcmp(locale, "POSIX")) { | 72 | // MB_CUR_MAX returns the size of a char in the current locale |
63 | mb = 0; | 73 | if (MB_CUR_MAX > 1) |
64 | } else { | 74 | m_multibyte = true; |
65 | mb = 1; | 75 | |
66 | // truncate any encoding off the end of the locale | 76 | // truncate any encoding off the end of the locale |
67 | char *l = strchr(locale, '.'); | 77 | |
68 | if (l) *l = '\0'; | 78 | string::size_type index = m_locale.find('@'); |
69 | } | 79 | if (index != string::npos) |
80 | m_locale.erase(index); //erase all characters starting at index | ||
81 | |||
82 | index = m_locale.find('.'); | ||
83 | if (index != string::npos) | ||
84 | m_locale.erase(index); //erase all characters starting at index | ||
85 | } | ||
70 | #endif // HAVE_SETLOCALE | 86 | #endif // HAVE_SETLOCALE |
71 | |||
72 | catalog_filename = (char *) 0; | ||
73 | catalog_fd = (nl_catd) -1; | ||
74 | } | 87 | } |
75 | 88 | ||
76 | 89 | ||
77 | I18n::~I18n(void) { | 90 | I18n::~I18n() { |
78 | delete catalog_filename; | ||
79 | 91 | ||
80 | #if defined(NLS) && defined(HAVE_CATCLOSE) | 92 | #if defined(NLS) && defined(HAVE_CATCLOSE) |
81 | if (catalog_fd != (nl_catd) -1) | 93 | if (m_catalog_fd != (nl_catd)-1) |
82 | catclose(catalog_fd); | 94 | catclose(m_catalog_fd); |
83 | #endif // HAVE_CATCLOSE | 95 | #endif // HAVE_CATCLOSE |
84 | } | 96 | } |
85 | 97 | ||
@@ -90,37 +102,35 @@ I18n *I18n::instance() { | |||
90 | 102 | ||
91 | void I18n::openCatalog(const char *catalog) { | 103 | void I18n::openCatalog(const char *catalog) { |
92 | #if defined(NLS) && defined(HAVE_CATOPEN) | 104 | #if defined(NLS) && defined(HAVE_CATOPEN) |
93 | int lp = strlen(LOCALEPATH), lc = strlen(locale), | 105 | |
94 | ct = strlen(catalog), len = lp + lc + ct + 3; | 106 | string catalog_filename = LOCALEPATH; |
95 | catalog_filename = new char[len]; | 107 | catalog_filename += '/'; |
96 | 108 | catalog_filename += m_locale; | |
97 | strncpy(catalog_filename, LOCALEPATH, lp); | 109 | catalog_filename += '/'; |
98 | *(catalog_filename + lp) = '/'; | 110 | catalog_filename += catalog; |
99 | strncpy(catalog_filename + lp + 1, locale, lc); | 111 | |
100 | *(catalog_filename + lp + lc + 1) = '/'; | 112 | #ifdef MCLoadBySet |
101 | strncpy(catalog_filename + lp + lc + 2, catalog, ct + 1); | 113 | m_catalog_fd = catopen(catalog_filename.c_str(), MCLoadBySet); |
102 | 114 | #else // !MCLoadBySet | |
103 | # ifdef MCLoadBySet | 115 | m_catalog_fd = catopen(catalog_filename.c_str(), NL_CAT_LOCALE); |
104 | catalog_fd = catopen(catalog_filename, MCLoadBySet); | 116 | #endif // MCLoadBySet |
105 | # else // !MCLoadBySet | 117 | |
106 | catalog_fd = catopen(catalog_filename, NL_CAT_LOCALE); | 118 | if (m_catalog_fd == (nl_catd)-1) |
107 | # endif // MCLoadBySet | 119 | cerr<<"Warning: Failed to open catalog, using default messages."<<endl; |
108 | |||
109 | if (catalog_fd == (nl_catd) -1) | ||
110 | fprintf(stderr, "failed to open catalog, using default messages\n"); | ||
111 | 120 | ||
112 | #else // !HAVE_CATOPEN | 121 | #else // !HAVE_CATOPEN |
113 | catalog_fd = (nl_catd) -1; | 122 | |
114 | catalog_filename = (char *) 0; | 123 | m_catalog_fd = (nl_catd)-1; |
115 | #endif // HAVE_CATOPEN | 124 | #endif // HAVE_CATOPEN |
116 | } | 125 | } |
117 | 126 | ||
118 | 127 | ||
119 | const char *I18n::getMessage(int set, int msg, const char *s) { | 128 | const char *I18n::getMessage(int set_number, int message_number, const char *default_message) { |
120 | #if defined(NLS) && defined(HAVE_CATGETS) | 129 | |
121 | if (catalog_fd != (nl_catd) -1) | 130 | #if defined(NLS) && defined(HAVE_CATGETS) |
122 | return (const char *) catgets(catalog_fd, set, msg, s); | 131 | if (m_catalog_fd != (nl_catd)-1) |
123 | else | 132 | return (const char *) catgets(m_catalog_fd, set_number, message_number, default_message); |
133 | else | ||
124 | #endif | 134 | #endif |
125 | return s; | 135 | return default_message; |
126 | } | 136 | } |