tizen 2.3 release
[framework/appfw/app-core.git] / src / appcore-i18n.c
1 /*
2  *  app-core
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22
23 #include <locale.h>
24 #include <libintl.h>
25 #include <stdlib.h>
26 #include <errno.h>
27
28 #include <vconf.h>
29
30 #include "appcore-internal.h"
31
32 static int _set;
33
34 void update_lang(void)
35 {
36         char *lang = vconf_get_str(VCONFKEY_LANGSET);
37         if (lang) {
38                 setenv("LANG", lang, 1);
39                 setenv("LC_MESSAGES", lang, 1);
40                 char *r = setlocale(LC_ALL, "");
41                 if (r == NULL) {
42                         r = setlocale(LC_ALL, lang);
43                         if (r) {
44                                 _DBG("*****appcore setlocale=%s\n", r);
45                         }
46                 }
47                 free(lang);
48         }
49 }
50
51 void update_region(void)
52 {
53         char *region;
54         char *r;
55
56         region = vconf_get_str(VCONFKEY_REGIONFORMAT);
57         if (region) {
58                 setenv("LC_CTYPE", region, 1);
59                 setenv("LC_NUMERIC", region, 1);
60                 setenv("LC_TIME", region, 1);
61                 setenv("LC_COLLATE", region, 1);
62                 setenv("LC_MONETARY", region, 1);
63                 setenv("LC_PAPER", region, 1);
64                 setenv("LC_NAME", region, 1);
65                 setenv("LC_ADDRESS", region, 1);
66                 setenv("LC_TELEPHONE", region, 1);
67                 setenv("LC_MEASUREMENT", region, 1);
68                 setenv("LC_IDENTIFICATION", region, 1);
69                 r = setlocale(LC_ALL, "");
70                 if (r != NULL) {
71                         _DBG("*****appcore setlocale=%s\n", r);
72                 }
73                 free(region);
74         }
75 }
76
77 static int __set_i18n(const char *domain, const char *dir)
78 {
79         char *r;
80
81         if (domain == NULL) {
82                 errno = EINVAL;
83                 return -1;
84         }
85
86         r = setlocale(LC_ALL, "");
87         /* if locale is not set properly, try again to set as language base */
88         if (r == NULL) {
89                 char *lang = vconf_get_str(VCONFKEY_LANGSET);
90                 r = setlocale(LC_ALL, lang);
91                 if (r) {
92                         _DBG("*****appcore setlocale=%s\n", r);
93                 }
94                 if (lang) {
95                         free(lang);
96                 }
97         }
98         if (r == NULL) {
99                 _ERR("appcore: setlocale() error");
100         }
101         //_retvm_if(r == NULL, -1, "appcore: setlocale() error");
102
103         r = bindtextdomain(domain, dir);
104         if (r == NULL) {
105                 _ERR("appcore: bindtextdomain() error");
106         }
107         //_retvm_if(r == NULL, -1, "appcore: bindtextdomain() error");
108
109         r = textdomain(domain);
110         if (r == NULL) {
111                 _ERR("appcore: textdomain() error");
112         }
113         //_retvm_if(r == NULL, -1, "appcore: textdomain() error");
114
115         return 0;
116 }
117
118
119 EXPORT_API int appcore_set_i18n(const char *domainname, const char *dirname)
120 {
121         int r;
122
123         update_lang();
124         update_region();
125
126         r = __set_i18n(domainname, dirname);
127         if (r == 0)
128                 _set = 1;
129
130         return r;
131 }
132
133 int set_i18n(const char *domainname, const char *dirname)
134 {
135         _retv_if(_set, 0);
136
137         update_lang();
138         update_region();
139
140         return __set_i18n(domainname, dirname);
141 }
142
143 EXPORT_API int appcore_get_timeformat(enum appcore_time_format *timeformat)
144 {
145         int r;
146
147         if (timeformat == NULL) {
148                 errno = EINVAL;
149                 return -1;
150         }
151
152         r = vconf_get_int(VCONFKEY_REGIONFORMAT_TIME1224, (int *)timeformat);
153
154         if (r < 0) {
155                 *timeformat = APPCORE_TIME_FORMAT_UNKNOWN;
156                 return -1;
157         } else
158                 return 0;
159 }