xref: /haiku/src/kits/locale/Language.cpp (revision 526e86ac79f9899c43e2def55f82754a5c449f8a)
1 /*
2  * Copyright 2003-2009, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <Language.h>
8 
9 #include <iostream>
10 
11 #include <Catalog.h>
12 #include <Locale.h>
13 #include <LocaleRoster.h>
14 #include <Path.h>
15 #include <String.h>
16 #include <FindDirectory.h>
17 
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <string.h>
21 #include <ctype.h>
22 
23 #include <ICUWrapper.h>
24 
25 #include <unicode/locid.h>
26 
27 
28 static const char *gBuiltInStrings[] = {
29 	"Yesterday",
30 	"Today",
31 	"Tomorrow",
32 	"Future",
33 
34 	"Sunday",
35 	"Monday",
36 	"Tuesday",
37 	"Wednesday",
38 	"Thursday",
39 	"Friday",
40 	"Saturday",
41 
42 	"Sun",
43 	"Mon",
44 	"Tue",
45 	"Wed",
46 	"Thu",
47 	"Fri",
48 	"Sat",
49 
50 	"January",
51 	"February",
52 	"March",
53 	"April",
54 	"May",
55 	"June",
56 	"July",
57 	"August",
58 	"September",
59 	"October",
60 	"November",
61 	"December",
62 
63 	"Jan",
64 	"Feb",
65 	"Mar",
66 	"Apr",
67 	"May",
68 	"Jun",
69 	"Jul",
70 	"Aug",
71 	"Sep",
72 	"Oct",
73 	"Nov",
74 	"Dec",
75 
76 	"^[yY]",
77 	"^[nN]",
78 	"yes",
79 	"no"
80 };
81 
82 
83 BLanguage::BLanguage(const char* language)
84 	:
85 	fDirection(B_LEFT_TO_RIGHT)
86 {
87 	fICULocale = new icu_4_2::Locale(language);
88 
89 	for (int32 i = B_NUM_LANGUAGE_STRINGS;i-- > 0;)
90 		fStrings[i] = NULL;
91 }
92 
93 
94 BLanguage::~BLanguage()
95 {
96 	delete fICULocale;
97 
98 	for (int32 i = B_NUM_LANGUAGE_STRINGS;i-- > 0;)
99 		free(fStrings[i]);
100 }
101 
102 
103 void
104 BLanguage::Default()
105 {
106 	fICULocale = new icu_4_2::Locale("en");
107 	fDirection = B_LEFT_TO_RIGHT;
108 
109 	for (int32 i = B_NUM_LANGUAGE_STRINGS;i-- > 0;) {
110 		free(fStrings[i]);
111 		fStrings[i] = strdup(gBuiltInStrings[i]);
112 	}
113 }
114 
115 
116 uint8
117 BLanguage::Direction() const
118 {
119 	return fDirection;
120 }
121 
122 
123 const char*
124 BLanguage::GetString(uint32 id) const
125 {
126 	if (id < B_LANGUAGE_STRINGS_BASE
127 		|| id > B_LANGUAGE_STRINGS_BASE + B_NUM_LANGUAGE_STRINGS)
128 		return NULL;
129 
130 	return fStrings[id - B_LANGUAGE_STRINGS_BASE];
131 }
132 
133 
134 status_t
135 BLanguage::GetName(BString& name) const
136 {
137 	UnicodeString string;
138 	fICULocale->getDisplayName(*fICULocale, string);
139 
140 	name.Truncate(0);
141 	BStringByteSink converter(&name);
142 	string.toUTF8(converter);
143 
144 	return B_OK;
145 }
146 
147 
148 status_t
149 BLanguage::GetTranslatedName(BString& name) const
150 {
151 	BMessage preferredLanguage;
152 	be_locale_roster->GetPreferredLanguages(&preferredLanguage);
153 
154 	BString appLanguage;
155 	preferredLanguage.FindString("language", 0, &appLanguage);
156 
157 	UnicodeString string;
158 	fICULocale->getDisplayName(Locale(appLanguage), string);
159 
160 	name.Truncate(0);
161 	BStringByteSink converter(&name);
162 	string.toUTF8(converter);
163 
164 	return B_OK;
165 }
166 
167 
168 const char*
169 BLanguage::Code() const
170 {
171 	return fICULocale->getLanguage();
172 }
173 
174 
175 const char*
176 BLanguage::Country() const
177 {
178 	const char* country = fICULocale->getCountry();
179 	if (country == NULL || country[0] == '\0')
180 		return NULL;
181 
182 	return country;
183 }
184 
185 
186 const char*
187 BLanguage::Variant() const
188 {
189 	const char* variant = fICULocale->getVariant();
190 	if (variant == NULL || variant[0] == '\0')
191 		return NULL;
192 
193 	return variant;
194 }
195 
196 
197 const char*
198 BLanguage::ID() const
199 {
200 	return fICULocale->getName();
201 }
202 
203 
204 bool
205 BLanguage::IsCountrySpecific() const
206 {
207 	return Country() != NULL;
208 }
209 
210 
211 bool
212 BLanguage::IsVariant() const
213 {
214 	return Variant() != NULL;
215 }
216