daa0ef94443c2d21432e47171d512853c02d3219
[scilab.git] / scilab / modules / localization / src / c / InitializeLocalization.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Sylvestre LEDRU
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 #include <stdio.h>
13 #include <string.h>
14 #include <stdlib.h>
15 #include "machine.h"
16 #ifndef _MSC_VER
17 #ifdef HAVE_LIBINTL_H
18 #include <libintl.h>
19 #ifdef HAVE_LOCALE_H
20 #include <locale.h>
21 #else
22 #error "Cannot find locale.h despite that libintl.h is available"
23 #endif
24 #endif
25 #else
26 #include <libintl.h>
27 #include <locale.h>
28 #endif
29
30 #include "MALLOC.h"
31 #include "InitializeLocalization.h"
32 #include "localization.h"
33 #include "setgetSCIpath.h"
34 #include "inisci-c.h"
35 #include "scilabDefaults.h"
36 #include "setgetlanguage.h"
37 #include "isdir.h"
38 #ifdef _MSC_VER
39 #include "strdup_windows.h"
40 #include "LanguagePreferences_Windows.h"
41 #endif
42
43 /*--------------------------------------------------------------------------*/
44
45 BOOL InitializeLocalization(void)
46 {
47 #ifdef HAVE_LIBINTL_H
48
49     char *SCIpath = getSCIpath();
50     char *pathLocales = NULL, *previousPathLocales = NULL;
51     char *ret = NULL;
52
53     /* set directory containing message catalogs */
54     pathLocales = (char *)MALLOC(sizeof(char) * (strlen(SCIpath) + strlen(PATHLOCALIZATIONFILE) + 1));
55
56     strcpy(pathLocales, SCIpath);
57     strcat(pathLocales, PATHLOCALIZATIONFILE);
58
59     if (bindtextdomain(NAMELOCALIZATIONDOMAIN, pathLocales) == NULL || !isdir(pathLocales))
60     {
61         /* source tree and classic build */
62         previousPathLocales = strdup(pathLocales);
63         if (pathLocales)
64         {
65             FREE(pathLocales);
66             pathLocales = NULL;
67         }
68
69         pathLocales = (char *)MALLOC(sizeof(char) * (strlen(SCIpath) + strlen("/..") + strlen(PATHLOCALIZATIONFILE) + 1));
70         strcpy(pathLocales, SCIpath);
71         strcat(pathLocales, "/..");
72         strcat(pathLocales, PATHLOCALIZATIONFILE);
73         if (bindtextdomain(NAMELOCALIZATIONDOMAIN, pathLocales) == NULL || !isdir(pathLocales))
74         {
75             /* when it is installed on the system for example /usr/share/locale/ */
76             fprintf(stderr, "Warning: Localization issue: Error while binding the domain from %s or %s: Switch to the default language (English).\n", pathLocales, previousPathLocales);
77             if (previousPathLocales)
78             {
79                 FREE(previousPathLocales);
80                 previousPathLocales = NULL;
81             }
82             if (pathLocales)
83             {
84                 FREE(pathLocales);
85                 pathLocales = NULL;
86             }
87             if (SCIpath)
88             {
89                 FREE(SCIpath);
90                 SCIpath = NULL;
91             }
92             return FALSE;
93         }
94         if (previousPathLocales)
95         {
96             FREE(previousPathLocales);
97             previousPathLocales = NULL;
98         }
99         if (pathLocales)
100         {
101             FREE(pathLocales);
102             pathLocales = NULL;
103         }
104         if (SCIpath)
105         {
106             FREE(SCIpath);
107             SCIpath = NULL;
108         }
109
110     }
111
112     /* set domain for future gettext() calls */
113     ret = textdomain(NAMELOCALIZATIONDOMAIN);
114     if (ret == NULL)
115     {
116         fprintf(stderr, "Localization: Error while declaring the text domain %s\n", NAMELOCALIZATIONDOMAIN);
117         FREE(pathLocales);
118         return FALSE;
119     }
120     bind_textdomain_codeset (NAMELOCALIZATIONDOMAIN, "UTF-8"); /*such that gettext and dgettext return UTF8 string*/
121 #ifndef _MSC_VER
122     /* Here, the "" means that we will try to use the language of the system
123      * first. If it doesn't work, we switch back to default (English) */
124     setlanguage("");
125 #else
126     /* We look if registry value LANGUAGE exists */
127     /* If not exists the "" means that we will try to use the language of the system.*/
128     {
129         char *loadLanguage = getLanguagePreferences();
130         setlanguage(loadLanguage);
131         if (loadLanguage)
132         {
133             FREE(loadLanguage);
134             loadLanguage = NULL;
135         }
136     }
137 #endif
138
139     if (previousPathLocales)
140     {
141         FREE(previousPathLocales);
142     }
143     if (pathLocales)
144     {
145         FREE(pathLocales);
146     }
147     if (SCIpath)
148     {
149         FREE(SCIpath);
150     }
151
152     return TRUE;
153 #else
154     fprintf(stderr, "Localization: setlocale didn't exist on the computer used to compile Scilab ! This is abnormal ! No localization will be working for this distribution of Scilab.\n");
155     return FALSE;
156 #endif
157 }
158 /*--------------------------------------------------------------------------*/
159