common: Minor change of hex2str to allow for embedded nul.
[gnupg.git] / common / i18n.c
1 /* i18n.c - gettext initialization
2  *      Copyright (C) 2007, 2010 Free Software Foundation, Inc.
3  *
4  * This file is free software; you can redistribute it and/or modify
5  * it under the terms of either
6  *
7  *   - the GNU Lesser General Public License as published by the Free
8  *     Software Foundation; either version 3 of the License, or (at
9  *     your option) any later version.
10  *
11  * or
12  *
13  *   - the GNU General Public License as published by the Free
14  *     Software Foundation; either version 2 of the License, or (at
15  *     your option) any later version.
16  *
17  * or both in parallel, as here.
18  *
19  * This file is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, see <http://www.gnu.org/licenses/>.
26  */
27
28 #include <config.h>
29 #ifdef HAVE_LOCALE_H
30 #include <locale.h>
31 #endif
32 #ifdef HAVE_LANGINFO_CODESET
33 #include <langinfo.h>
34 #endif
35
36 #include "util.h"
37 #include "i18n.h"
38
39
40 void
41 i18n_init (void)
42 {
43 #ifdef USE_SIMPLE_GETTEXT
44   bindtextdomain (PACKAGE_GT, gnupg_localedir ());
45   textdomain (PACKAGE_GT);
46 #else
47 # ifdef ENABLE_NLS
48   setlocale (LC_ALL, "" );
49   bindtextdomain (PACKAGE_GT, LOCALEDIR);
50   textdomain (PACKAGE_GT);
51 # endif
52 #endif
53 }
54
55
56 /* The Assuan agent protocol requires us to transmit utf-8 strings
57    thus we need a way to temporary switch gettext from native to
58    utf8.  */
59 char *
60 i18n_switchto_utf8 (void)
61 {
62 #ifdef USE_SIMPLE_GETTEXT
63   /* Return an arbitrary pointer as true value.  */
64   return gettext_use_utf8 (1) ? (char*)(-1) : NULL;
65 #elif defined(ENABLE_NLS)
66   char *orig_codeset = bind_textdomain_codeset (PACKAGE_GT, NULL);
67 # ifdef HAVE_LANGINFO_CODESET
68   if (!orig_codeset)
69     orig_codeset = nl_langinfo (CODESET);
70 # endif
71   if (orig_codeset)
72     { /* We only switch when we are able to restore the codeset later.
73          Note that bind_textdomain_codeset does only return on memory
74          errors but not if a codeset is not available.  Thus we don't
75          bother printing a diagnostic here. */
76       orig_codeset = xstrdup (orig_codeset);
77       if (!bind_textdomain_codeset (PACKAGE_GT, "utf-8"))
78         {
79           xfree (orig_codeset);
80           orig_codeset = NULL;
81         }
82     }
83   return orig_codeset;
84 #else
85   return NULL;
86 #endif
87 }
88
89 /* Switch back to the saved codeset.  */
90 void
91 i18n_switchback (char *saved_codeset)
92 {
93 #ifdef USE_SIMPLE_GETTEXT
94   gettext_use_utf8 (!!saved_codeset);
95 #elif defined(ENABLE_NLS)
96   if (saved_codeset)
97     {
98       bind_textdomain_codeset (PACKAGE_GT, saved_codeset);
99       xfree (saved_codeset);
100     }
101 #else
102   (void)saved_codeset;
103 #endif
104 }
105
106
107 /* Gettext variant which temporary switches to utf-8 for string. */
108 const char *
109 i18n_utf8 (const char *string)
110 {
111   char *saved = i18n_switchto_utf8 ();
112   const char *result = _(string);
113   i18n_switchback (saved);
114   return result;
115 }