847ca3b5ea5b2baa64d8cf7c4b9bf2c8029fb494
[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-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 "MALLOC.h"
32 #include "InitializeLocalization.h"
33 #include "localization.h"
34 #include "sci_path.h"
35 #include "inisci-c.h"
36 #include "scilabDefaults.h"
37 #include "setgetlanguage.h"
38 #include "isdir.h"
39 #include "os_strdup.h"
40 #ifdef _MSC_VER
41 #include "LanguagePreferences_Windows.h"
42 #endif
43
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
61     if (bindtextdomain(NAMELOCALIZATIONDOMAIN,pathLocales)==NULL || !isdir(pathLocales))
62     {
63         /* source tree and classic build */
64         previousPathLocales = os_strdup(pathLocales);
65         if (pathLocales) {FREE(pathLocales); pathLocales = NULL;}
66
67         pathLocales=(char *)MALLOC(sizeof(char)*(strlen(SCIpath)+strlen("/..")+strlen(PATHLOCALIZATIONFILE)+1));
68         strcpy(pathLocales, SCIpath);
69         strcat(pathLocales, "/..");
70         strcat(pathLocales, PATHLOCALIZATIONFILE);
71         if (bindtextdomain(NAMELOCALIZATIONDOMAIN,pathLocales)==NULL || !isdir(pathLocales))
72         {
73             /* when it is installed on the system for example /usr/share/locale/ */
74             fprintf(stderr, "Warning: Localization issue: Error while binding the domain from %s or %s: Switch to the default language (English).\n", pathLocales, previousPathLocales);
75             if (previousPathLocales) {FREE(previousPathLocales); previousPathLocales = NULL;}
76             if (pathLocales) {FREE(pathLocales); pathLocales = NULL;}
77             if (SCIpath) {FREE(SCIpath); SCIpath = NULL;}
78             return FALSE;
79         }
80         if (previousPathLocales) {FREE(previousPathLocales); previousPathLocales = NULL;}
81         if (pathLocales) {FREE(pathLocales); pathLocales = NULL;}
82         if (SCIpath) {FREE(SCIpath); SCIpath = NULL;}
83
84     }
85
86     /* set domain for future gettext() calls */
87     ret=textdomain(NAMELOCALIZATIONDOMAIN);
88     if (ret==NULL)
89     {
90         fprintf(stderr, "Localization: Error while declaring the text domain %s\n", NAMELOCALIZATIONDOMAIN);
91         FREE(pathLocales);
92         return FALSE;
93     }
94     bind_textdomain_codeset (NAMELOCALIZATIONDOMAIN,"UTF-8"); /*such that gettext and dgettext return UTF8 string*/
95 #ifndef _MSC_VER
96     /* Here, the "" means that we will try to use the language of the system
97      * first. If it doesn't work, we switch back to default (English) */
98     setlanguage(L"");
99 #else
100     /* We look if registry value LANGUAGE exists */
101     /* If not exists the "" means that we will try to use the language of the system.*/
102     {
103         wchar_t *loadLanguage = getLanguagePreferences();
104         setlanguage(loadLanguage);
105         if (loadLanguage) {FREE(loadLanguage); loadLanguage = NULL;}
106     }
107 #endif
108
109     if (previousPathLocales) FREE(previousPathLocales);
110     if (pathLocales) FREE(pathLocales);
111     if (SCIpath) FREE(SCIpath);
112
113     return TRUE;
114 #else
115     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");
116     return FALSE;
117 #endif
118 }
119 /*--------------------------------------------------------------------------*/
120