39 #include <config-superkaramba.h>
41 #ifdef HAVE_SYS_TYPES_H
42 #include <sys/types.h>
46 # define W(flag, data) ((flag) ? SWAP (data) : (data))
56 struct string_desc *orig_tab;
57 struct string_desc *trans_tab;
64 return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
70 #define _MAGIC 0x950412de
71 #define _MAGIC_SWAPPED 0xde120495
74 #define MO_REVISION_NUMBER 0
80 static inline unsigned long hash_string(
const char *__str_param);
128 void ThemeLocale::unload()
141 QString result = QString::fromUtf8(
tl_nl_find_msg(&m_domain, text.toAscii().constData()));
142 if (result.isEmpty())
153 for (QStringList::ConstIterator it = languages.begin();
154 it != languages.end();
157 QString(
"locale/%1/LC_MESSAGES/%2.mo").arg(*it).arg(m_theme->
mo());
161 QBuffer buffer(&array);
177 languageList += QFile::decodeName(::getenv(
"KDE_LANG")).split(
':');
180 languageList += KGlobal::locale()->languageList();
184 QList<QString> langs;
186 langs.append(QFile::decodeName(::getenv(
"LC_ALL")));
187 langs.append(QFile::decodeName(::getenv(
"LC_MESSAGES")));
188 langs.append(QFile::decodeName(::getenv(
"LANG")));
190 foreach(
const QString &lang, langs) {
191 QString ln, ct, modf, chrset;
192 KLocale::splitLocale(lang, ln, ct, modf, chrset);
204 languageList += langs;
207 for (QStringList::Iterator it = languageList.begin(); it != languageList.end();) {
208 if ((*it).isEmpty()) {
209 it = languageList.erase(it);
221 size_t top, act, bottom;
222 struct loaded_domain *domain;
227 if (domain_file->
data == NULL)
230 domain = (
struct loaded_domain *) domain_file->
data;
233 if (domain->hash_size > 2 && domain->hash_tab != NULL)
238 nls_uint32 idx = hash_val % domain->hash_size;
239 nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
240 nls_uint32 nstr =
W(domain->must_swap, domain->hash_tab[idx]);
246 if (
W(domain->must_swap, domain->orig_tab[nstr - 1].length) == len
248 domain->data +
W(domain->must_swap,
249 domain->orig_tab[nstr - 1].offset)) == 0)
250 return (
char *) domain->data +
W(domain->must_swap,
251 domain->trans_tab[nstr - 1].offset);
254 if (idx >= domain->hash_size - incr)
255 idx -= domain->hash_size - incr;
259 nstr =
W(domain->must_swap, domain->hash_tab[idx]);
264 if (
W(domain->must_swap, domain->orig_tab[nstr - 1].length) == len
266 domain->data +
W(domain->must_swap,
267 domain->orig_tab[nstr - 1].offset))
269 return (
char *) domain->data
270 +
W(domain->must_swap, domain->trans_tab[nstr - 1].offset);
278 top = domain->nstrings;
284 act = (bottom + top) / 2;
285 cmp_val = strcmp(msgid, domain->data
286 +
W(domain->must_swap,
287 domain->orig_tab[act].offset));
290 else if (cmp_val > 0)
297 return bottom >= top ? NULL : (
char *) domain->data
298 +
W(domain->must_swap,
299 domain->trans_tab[act].offset);
304 #define HASHWORDBITS 32
306 static inline unsigned long
309 unsigned long int hval, g;
310 const char *str = str_param;
314 while (*str !=
'\0') {
316 hval += (
unsigned long) * str++;
331 struct mo_file_header *data = (
struct mo_file_header *) - 1;
332 struct loaded_domain *domain;
335 domain_file->
data = NULL;
345 if (device->open(QIODevice::ReadOnly) ==
false)
349 if (size < (off_t)
sizeof(
struct mo_file_header))
358 if (data == (
struct mo_file_header *) - 1)
363 data = (
struct mo_file_header *) malloc(size);
368 read_ptr = (
char *) data;
371 long int nb = (
long int) device->read(read_ptr, to_read);
380 }
while (to_read > 0);
395 = (
struct loaded_domain *) malloc(
sizeof(
struct loaded_domain));
396 if (domain_file->
data == NULL)
399 domain = (
struct loaded_domain *) domain_file->
data;
400 domain->data = (
char *) data;
401 domain->must_swap = data->magic !=
_MAGIC;
404 switch (
W(domain->must_swap, data->revision))
407 domain->nstrings =
W(domain->must_swap, data->nstrings);
408 domain->orig_tab = (
struct string_desc *)
409 ((
char *) data +
W(domain->must_swap,
410 data->orig_tab_offset));
411 domain->trans_tab = (
struct string_desc *)
412 ((
char *) data +
W(domain->must_swap,
413 data->trans_tab_offset));
414 domain->hash_size =
W(domain->must_swap, data->hash_tab_size);
416 ((
char *) data +
W(domain->must_swap,
417 data->hash_tab_offset));
423 domain_file->
data = NULL;
430 free((
void *) domain->data);
static unsigned long hash_string(const char *__str_param)
char * tl_nl_find_msg(const struct sk_kde_loaded_l10nfile *domain_file, const char *msgid)
SUPERKARAMBA_EXPORT QString translate(const QString &text) const
static QStringList languageList()
void tl_nl_unload_domain(struct loaded_domain *domain)
void tl_nl_load_domain(QIODevice *device, int size, struct sk_kde_loaded_l10nfile *domain_file)
static nls_uint32 SWAP(nls_uint32 i)
ThemeLocale(ThemeFile *theme)
const QString & mo() const
void setLanguage(const QStringList &languages)
QByteArray readThemeFile(const QString &filename) const
bool fileExists(const QString &filename) const