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