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