9d4f590cdaef6a7dbf4fde9dd52f84c9b9f615ba
[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         return FALSE;
92     }
93     bind_textdomain_codeset (NAMELOCALIZATIONDOMAIN,"UTF-8"); /*such that gettext and dgettext return UTF8 string*/
94 #ifndef _MSC_VER
95     /* Here, the "" means that we will try to use the language of the system
96      * first. If it doesn't work, we switch back to default (English) */
97     setlanguage(L"");
98 #else
99     /* We look if registry value LANGUAGE exists */
100     /* If not exists the "" means that we will try to use the language of the system.*/
101     {
102         wchar_t *loadLanguage = getLanguagePreferences();
103         setlanguage(loadLanguage);
104         if (loadLanguage) {FREE(loadLanguage); loadLanguage = NULL;}
105     }
106 #endif
107
108     if (previousPathLocales) FREE(previousPathLocales);
109     if (pathLocales) FREE(pathLocales);
110     if (SCIpath) FREE(SCIpath);
111
112     return TRUE;
113 #else
114     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");
115     return FALSE;
116 #endif
117 }
118 /*--------------------------------------------------------------------------*/
119