Subversion Repositories Scribus

Rev

Rev 22845 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
1525 cbradney 7
/***************************************************************************
8
    begin                : Jan 2005
9
    copyright            : (C) 2005 by Craig Bradney
10
    email                : cbradney@zip.com.au
11
 ***************************************************************************/
12
 
13
/***************************************************************************
14
 *                                                                         *
15
 *   This program is free software; you can redistribute it and/or modify  *
16
 *   it under the terms of the GNU General Public License as published by  *
17
 *   the Free Software Foundation; either version 2 of the License, or     *
18
 *   (at your option) any later version.                                   *
19
 *                                                                         *
20
 ***************************************************************************/
21
 
663 cbradney 22
#include <iostream>
17542 craig 23
#include <QDebug>
10223 cbradney 24
#include <QDir>
25
#include <QFileInfo>
26
#include <QMap>
27
#include <QObject>
28
#include <QStringList> 
663 cbradney 29
 
2688 craig 30
#include "scconfig.h"
663 cbradney 31
#include "langmgr.h"
1693 craig 32
#include "scpaths.h"
663 cbradney 33
 
12787 pierre 34
LanguageManager * LanguageManager::m_instance = 0;
35
LanguageManager * LanguageManager::instance()
36
{
37
        if(!m_instance)
38
        {
39
                m_instance = new LanguageManager;
40
                Q_ASSERT(m_instance);
41
                m_instance->init();
42
        }
43
        return m_instance;
44
}
45
 
2010 cbradney 46
void LanguageManager::init(bool generateInstalledList)
663 cbradney 47
{
3776 cbradney 48
        //generateUntranslatedLangList();
663 cbradney 49
        generateLangList();
2010 cbradney 50
        if (generateInstalledList)
51
                generateInstalledLangList();
663 cbradney 52
}
53
 
54
void LanguageManager::generateLangList()
55
{
12787 pierre 56
        // TODO get rid of the redundant key, the english name.
57
        // So internally language would always be manipulated as a code and otherwise presented translated.
5516 cbradney 58
        langList.insert("af",       langPair("Afrikaans",           QObject::tr( "Afrikaans" )) );
17554 craig 59
        langList.insert("af_ZA",    langPair("Afrikaans",           QObject::tr( "Afrikaans" )) );
60
        langList.insert("an_ES",    langPair("Aragonese",           QObject::tr( "Aragonese" )) );
5516 cbradney 61
        langList.insert("ar",       langPair("Arabic",              QObject::tr( "Arabic" )) );
17554 craig 62
        langList.insert("be_BY",    langPair("Belarusian",          QObject::tr( "Belarusian" )) );
63
        langList.insert("bg",       langPair("Bulgarian",           QObject::tr( "Bulgarian" )) );
64
        langList.insert("bg_BG",    langPair("Bulgarian",           QObject::tr( "Bulgarian" )) );
18808 craig 65
        langList.insert("blo",      langPair("Anii",                QObject::tr( "Anii" )) );
12722 cbradney 66
        langList.insert("bn",       langPair("Bengali",             QObject::tr( "Bengali" )) );
67
        langList.insert("br",       langPair("Breton",              QObject::tr( "Breton" )) );
22868 jghali 68
        langList.insert("br_FR",    langPair("Breton",              QObject::tr( "Breton" )) );
5516 cbradney 69
        langList.insert("ca",       langPair("Catalan",             QObject::tr( "Catalan" )) );
70
        langList.insert("cs",       langPair("Czech",               QObject::tr( "Czech" )) );
71
        langList.insert("cs_CZ",    langPair("Czech",               QObject::tr( "Czech" )) );
17554 craig 72
        langList.insert("cy",       langPair("Welsh",               QObject::tr( "Welsh" )) );
20243 craig 73
        langList.insert("cy_GB",    langPair("Welsh",               QObject::tr( "Welsh" )) );
5516 cbradney 74
        langList.insert("da",       langPair("Danish",              QObject::tr( "Danish" )) );
75
        langList.insert("da_DK",    langPair("Danish",              QObject::tr( "Danish" )) );
17554 craig 76
        langList.insert("de",       langPair("German",              QObject::tr( "German" )) );
77
        langList.insert("de_1901",  langPair("German (Trad.)",      QObject::tr( "German (Trad.)" )) );
17892 craig 78
        langList.insert("de_AT",    langPair("German (Austria)",    QObject::tr( "German (Austria)" )) );
17554 craig 79
        langList.insert("de_CH",    langPair("German (Swiss)",      QObject::tr( "German (Swiss)" )) );
80
        langList.insert("de_DE",    langPair("German",              QObject::tr( "German" )) );
5516 cbradney 81
        langList.insert("dz",       langPair("Dzongkha",            QObject::tr( "Dzongkha" )) );
17554 craig 82
        langList.insert("el",       langPair("Greek",               QObject::tr( "Greek" )) );
5516 cbradney 83
        langList.insert("en",       langPair("English",             QObject::tr( "English" )) );
17554 craig 84
        langList.insert("en_AU",    langPair("English (Australia)", QObject::tr( "English (Australian)" )) );
85
        langList.insert("en_CA",    langPair("English (Canada)",    QObject::tr( "English (Canadian)" )) );
86
        langList.insert("en_GB",    langPair("English (UK)",        QObject::tr( "English (UK)" )) );
17522 craig 87
        langList.insert("en_NZ",    langPair("English (New Zealand)",QObject::tr( "English (New Zealand)" )) );
17554 craig 88
        langList.insert("en_US",    langPair("English (USA)",       QObject::tr( "English (USA)" )) );
17494 craig 89
        langList.insert("en_ZA",    langPair("English (South African)",  QObject::tr( "English (South African)" )) );
5516 cbradney 90
        langList.insert("eo",       langPair("Esperanto",           QObject::tr( "Esperanto" )) );
17554 craig 91
        langList.insert("es",       langPair("Spanish",             QObject::tr( "Spanish" )) );
92
        langList.insert("es_AR",    langPair("Spanish (Argentina)", QObject::tr( "Spanish (Argentina)" )) );
93
        langList.insert("es_ES",    langPair("Spanish",             QObject::tr( "Spanish" )) );
94
        langList.insert("es_LA",    langPair("Spanish (Latin)",     QObject::tr( "Spanish (Latin)" )) );
5516 cbradney 95
        langList.insert("et",       langPair("Estonian",            QObject::tr( "Estonian" )) );
17820 craig 96
        langList.insert("et_EE",    langPair("Estonian",            QObject::tr( "Estonian" )) );
17554 craig 97
        langList.insert("eu",       langPair("Basque",              QObject::tr( "Basque" )) );
5516 cbradney 98
        langList.insert("fi",       langPair("Finnish",             QObject::tr( "Finnish" )) );
99
        langList.insert("fr",       langPair("French",              QObject::tr( "French" )) );
17554 craig 100
        langList.insert("fr_FR",    langPair("French",              QObject::tr( "French" )) );
5516 cbradney 101
        langList.insert("gl",       langPair("Galician",            QObject::tr( "Galician" )) );
7617 cbradney 102
        langList.insert("he",       langPair("Hebrew",              QObject::tr( "Hebrew" )) );
17554 craig 103
        langList.insert("hr",       langPair("Croatian",            QObject::tr( "Croatian" )) );
5516 cbradney 104
        langList.insert("hu",       langPair("Hungarian",           QObject::tr( "Hungarian" )) );
17820 craig 105
        langList.insert("hu_HU",    langPair("Hungarian",           QObject::tr( "Hungarian" )) );
6254 mrdocs 106
        langList.insert("ia",       langPair("Latin",               QObject::tr( "Latin" )) );
17554 craig 107
        langList.insert("id",       langPair("Indonesian",          QObject::tr( "Indonesian" )) );
5516 cbradney 108
        langList.insert("is",       langPair("Icelandic",           QObject::tr( "Icelandic" )) );
109
        langList.insert("it",       langPair("Italian",             QObject::tr( "Italian" )) );
17554 craig 110
        langList.insert("it_IT",    langPair("Italian",             QObject::tr( "Italian" )) );
5516 cbradney 111
        langList.insert("ja",       langPair("Japanese",            QObject::tr( "Japanese" )) );
10106 cbradney 112
        langList.insert("km",       langPair("Khmer",               QObject::tr( "Khmer" )) );
5516 cbradney 113
        langList.insert("ko",       langPair("Korean",              QObject::tr( "Korean" )) );
14057 mrdocs 114
        langList.insert("ku",       langPair("Kurdish",             QObject::tr( "Kurdish" )) );
17554 craig 115
        langList.insert("la",       langPair("Latin",               QObject::tr( "Latin" )) );
116
        langList.insert("lb",       langPair("Luxembourgish",       QObject::tr( "Luxembourgish" )) );
10106 cbradney 117
        langList.insert("lo",       langPair("Lao",                 QObject::tr( "Lao" )) );
5516 cbradney 118
        langList.insert("lt",       langPair("Lithuanian",          QObject::tr( "Lithuanian" )) );
119
        langList.insert("lt_LT",    langPair("Lithuanian",          QObject::tr( "Lithuanian" )) );
17820 craig 120
        langList.insert("ne_NP",    langPair("Nepali",              QObject::tr( "Nepali" )) );
11711 herm 121
        langList.insert("nb",       langPair("Norwegian (Bokmål)",  QObject::trUtf8( "Norwegian (Bokm\303\245l)" )) );
122
        langList.insert("nb_NO",    langPair("Norwegian (Bokmål)",  QObject::trUtf8( "Norwegian (Bokm\303\245l)" )) );
17554 craig 123
        langList.insert("nl",       langPair("Dutch",               QObject::tr( "Dutch" )) );
17820 craig 124
        langList.insert("nl_NL",    langPair("Dutch",               QObject::tr( "Dutch" )) );
5516 cbradney 125
        langList.insert("nn",       langPair("Norwegian (Nnyorsk)", QObject::tr( "Norwegian (Nnyorsk)" )) );
126
        langList.insert("nn_NO",    langPair("Norwegian (Nnyorsk)", QObject::tr( "Norwegian (Nnyorsk)" )) );
127
        langList.insert("no",       langPair("Norwegian",           QObject::tr( "Norwegian" )) );
128
        langList.insert("no_NO",    langPair("Norwegian",           QObject::tr( "Norwegian" )) );
129
        langList.insert("pl",       langPair("Polish",              QObject::tr( "Polish" )) );
130
        langList.insert("pl_PL",    langPair("Polish",              QObject::tr( "Polish" )) );
131
        langList.insert("pt",       langPair("Portuguese",          QObject::tr( "Portuguese" )) );
132
        langList.insert("pt_BR",    langPair("Portuguese (BR)",     QObject::tr( "Portuguese (BR)" )) );
6254 mrdocs 133
        langList.insert("ro",       langPair("Romanian",            QObject::tr( "Romanian" )) );
5516 cbradney 134
        langList.insert("ru",       langPair("Russian",             QObject::tr( "Russian" )) );
17820 craig 135
        langList.insert("ru_RU",    langPair("Russian",             QObject::tr( "Russian" )) );
12811 jghali 136
        langList.insert("sa",       langPair("Sanskrit",            QObject::tr( "Sanskrit" )) );
5516 cbradney 137
        langList.insert("sk",       langPair("Slovak",              QObject::tr( "Slovak" )) );
16788 craig 138
        langList.insert("sk_SK",    langPair("Slovak",              QObject::tr( "Slovak" )) );
5516 cbradney 139
        langList.insert("sl",       langPair("Slovenian",           QObject::tr( "Slovenian" )) );
17820 craig 140
        langList.insert("sl_SL",    langPair("Slovenian",           QObject::tr( "Slovenian" )) );
17554 craig 141
        langList.insert("sq",       langPair("Albanian",            QObject::tr( "Albanian" )) );
5516 cbradney 142
        langList.insert("sr",       langPair("Serbian",             QObject::tr( "Serbian" )) );
143
        langList.insert("sv",       langPair("Swedish",             QObject::tr( "Swedish" )) );
22845 jghali 144
        langList.insert("sv_SE",    langPair("Swedish",             QObject::tr( "Swedish" )) );
5516 cbradney 145
        langList.insert("th",       langPair("Thai",                QObject::tr( "Thai" )) );
146
        langList.insert("th_TH",    langPair("Thai",                QObject::tr( "Thai" )) );
147
        langList.insert("tr",       langPair("Turkish",             QObject::tr( "Turkish" )) );
148
        langList.insert("tr_TR",    langPair("Turkish",             QObject::tr( "Turkish" )) );
149
        langList.insert("uk",       langPair("Ukranian",            QObject::tr( "Ukranian" )) );
17490 craig 150
        langList.insert("uk_UA",    langPair("Ukranian",            QObject::tr( "Ukranian" )) );
10106 cbradney 151
        langList.insert("vi",       langPair("Vietnamese",          QObject::tr( "Vietnamese" )) );
17554 craig 152
        langList.insert("zh",       langPair("Chinese",             QObject::tr( "Chinese" )) );
153
        langList.insert("zh_TW",    langPair("Chinese (Trad.)",     QObject::tr( "Chinese (Trad.)" )) );
154
 
663 cbradney 155
}
156
 
157
void LanguageManager::generateInstalledLangList()
158
{
10997 jghali 159
        QString path = ScPaths::instance().translationDir();
3776 cbradney 160
        QString langAbbrev;
161
        QMap<QString, langPair>::Iterator it;
162
        QDir dir(path , "*.*", QDir::Name, QDir::Files | QDir::NoSymLinks);
163
        if (dir.exists() && (dir.count() != 0))
10617 cbradney 164
        {
3776 cbradney 165
                for (uint i = 0; i < dir.count(); ++i)
1303 cbradney 166
                {
3776 cbradney 167
                        QFileInfo file(path + dir[i]);
10617 cbradney 168
                        if (file.suffix().toLower() == "qm")
1303 cbradney 169
                        {
10617 cbradney 170
                                langAbbrev = file.completeSuffix().remove(".qm");
3776 cbradney 171
                                if ((it=langList.find(langAbbrev))!=langList.end())
18373 jghali 172
                                        installedLangList.insert(it.key(), it.value().second);
3776 cbradney 173
                        }
174
                }
10617 cbradney 175
        }
663 cbradney 176
}
177
 
3776 cbradney 178
const QString LanguageManager::getLangFromAbbrev(QString langAbbrev, bool getTranslated)
663 cbradney 179
{
3776 cbradney 180
        QMap<QString, langPair>::Iterator it;
663 cbradney 181
        if ((it=langList.find(langAbbrev))!=langList.end())
3776 cbradney 182
        {
183
                if (getTranslated)
10427 cbradney 184
                        return it.value().second;
3776 cbradney 185
                else
10427 cbradney 186
                        return it.value().first;
3776 cbradney 187
        }
663 cbradney 188
        else
2010 cbradney 189
                return "";     
663 cbradney 190
}
191
 
17803 craig 192
const QString LanguageManager::getAbbrevFromLang(QString lang, bool getFromTranslated, bool useInstalled, int abbrevNo)
663 cbradney 193
{
3776 cbradney 194
        QMap<QString, langPair>::Iterator it;
11157 jghali 195
        if (lang == "English" || lang == QObject::tr( "English"))
196
                useInstalled = false;
17803 craig 197
        int count=1;
7617 cbradney 198
        if (useInstalled)
3776 cbradney 199
        {
7617 cbradney 200
                for (it=langList.begin();it!=langList.end();++it)
5072 cbradney 201
                {
7617 cbradney 202
                        if (installedLangList.find(it.key()) != installedLangList.end())
203
                        {
10427 cbradney 204
                                if (getFromTranslated && it.value().second==lang)
17803 craig 205
                                {
206
                                        if (abbrevNo==1)
207
                                                return it.key();
208
                                        if (abbrevNo!=1 && count==abbrevNo)
209
                                                return it.key();
210
                                        ++count;
211
                                        continue;                      
212
                                }
10427 cbradney 213
                                if (!getFromTranslated && it.value().first==lang)
17803 craig 214
                                {
215
                                        if (abbrevNo==1)
216
                                                return it.key();
217
                                        if (abbrevNo!=1 && count==abbrevNo)
218
                                                return it.key();
219
                                        ++count;
220
                                        continue;              
221
                                }
7617 cbradney 222
                        }
5072 cbradney 223
                }
3776 cbradney 224
        }
7617 cbradney 225
        else
226
        {
227
                for (it=langList.begin();it!=langList.end();++it)
228
                {
10427 cbradney 229
                        if (getFromTranslated && it.value().second==lang)
17803 craig 230
                        {
231
                                if (abbrevNo==1)
232
                                        return it.key();
233
                                if (abbrevNo!=1 && count==abbrevNo)
234
                                        return it.key();
235
                                ++count;
236
                                continue;
237
 
238
                        }
10427 cbradney 239
                        if (!getFromTranslated && it.value().first==lang)
17803 craig 240
                        {
241
                                if (abbrevNo==1)
242
                                        return it.key();
243
                                if (abbrevNo!=1 && count==abbrevNo)
244
                                        return it.key();
245
                                ++count;
246
                                continue;
247
                        }
7617 cbradney 248
                }
249
        }
5781 cbradney 250
        return "";
663 cbradney 251
}
252
 
13210 jghali 253
const QString LanguageManager::getLangFromTransLang(QString lang)
254
{
255
        QMap<QString, langPair>::Iterator it;
256
        for (it=langList.begin();it!=langList.end();++it)
257
        {
258
                if (it.value().second==lang)
259
                        return it.value().first;
260
        }
261
        return "";
262
}
263
 
12283 cbradney 264
const QString LanguageManager::getTransLangFromLang(QString lang)
265
{
266
        QMap<QString, langPair>::Iterator it;
12787 pierre 267
        // Seems something is missing here!
268
        QString enLang(QObject::tr( "English"));
269
        if ((lang == "English") || (lang == enLang))
270
                return enLang;
271
 
12283 cbradney 272
        for (it=langList.begin();it!=langList.end();++it)
273
        {
274
                if (it.value().first==lang)
275
                        return it.value().second;
276
        }
277
        return "";
278
}
279
 
17886 jghali 280
const QString LanguageManager::getShortAbbrevFromAbbrev(QString langAbbrev)
281
{
282
        if (langList.contains(langAbbrev))
283
                return langAbbrev;
284
 
285
        QString joiner("_");
286
        QStringList langParts = langAbbrev.split(QChar('_'));
287
        if (langParts.count() > 2)
288
                langParts.removeLast();
289
 
290
        while (langParts.count() > 2)
291
        {
292
                QString abbrev = langParts.join(joiner);
293
                if (langList.contains(abbrev))
294
                        return abbrev;
295
                langParts.removeLast();
296
        }
297
 
298
        if (langParts.count() == 2)
299
        {
300
                QString abbrev = langParts.join(joiner);
301
                if (langList.contains(abbrev))
302
                        return abbrev;
303
                if (langParts.at(0) == langParts.at(1).toLower())
304
                {
305
                        if (langList.contains(langParts.at(0)))
306
                                return langParts.at(0);
307
                }
308
                langParts.removeLast();
309
        }
310
 
311
        return "";
312
}
313
 
663 cbradney 314
void LanguageManager::fillInstalledStringList(QStringList *stringListToFill, bool addDefaults)
315
{
316
        if (stringListToFill)
317
        {
318
                QMap<QString, QString>::Iterator it;
319
 
320
                if (addDefaults)
321
                {
322
                        stringListToFill->append("");
323
                        stringListToFill->append( QObject::tr( "English" ));
324
                }
325
 
326
                for (it=installedLangList.begin();it!=installedLangList.end();++it)
10427 cbradney 327
                        stringListToFill->append(it.value());
663 cbradney 328
        }
329
}
330
 
331
void LanguageManager::printInstalledList()
332
{
333
        QMap<QString, QString>::Iterator it;
334
 
335
        for (it=installedLangList.begin();it!=installedLangList.end();++it)
10455 cbradney 336
                std::cout << it.key().leftJustified(6).toStdString() << ": " << it.value().toStdString() << std::endl;
663 cbradney 337
}
6769 cbradney 338
 
339
QString LanguageManager::numericSequence(QString seq)
340
{
341
        QString retSeq;
342
        const int nsBengali=0,nsDevanagari=1,nsGujarati=2,nsGurumukhi=3,nsKannada=4,nsMalayalam=5,nsOriya=6,nsTamil=7,nsTelugu=8,nsTibetan=9,nsLepcha=10;
343
        switch (1)
344
        {
345
                case nsBengali:
346
                        retSeq+="";
347
                        break;
348
                case nsDevanagari:
349
                        retSeq+="०१२३४५६७८९";
350
                        break;
351
                case nsGujarati:
352
                        retSeq+="૦૧૨૩૪૫૬૭૮૯";
353
                        break;
354
                case nsGurumukhi:
355
                        retSeq+="੦੧੨੩੪੫੬੭੮੯";
356
                        break;
357
                case nsKannada:
358
                        retSeq+="";
359
                        break;
360
                case nsMalayalam:
361
                        retSeq+="";
362
                        break;
363
                case nsOriya:
364
                        retSeq+="";
365
                        break;
366
                case nsTamil:
367
                        retSeq+="";
368
                        break;
369
                case nsTelugu:
370
                        retSeq+="";
371
                        break;
372
                case nsTibetan:
373
                        retSeq+="";
374
                        break;
375
                case nsLepcha:
376
                        retSeq+="";
377
                        break;
378
                default:
379
                        retSeq="0123456789";
380
                        break;
381
        }
382
        return retSeq;
383
}
384
 
17542 craig 385
bool LanguageManager::findDictionaries(QStringList &sl)
386
{
387
        sl=ScPaths::instance().spellDirs();
388
        if (sl.count()==0)
389
                return false;
390
        return true;
391
}
392
 
393
void LanguageManager::findDictionarySets(QStringList &dictionaryPaths, QMap<QString, QString> &dictionaryMap)
394
{
395
        for (int i=0; i<dictionaryPaths.count(); ++i)
396
        {
397
                // Find the dic and aff files in the location
398
                QDir dictLocation(dictionaryPaths.at(i));
399
                QStringList dictFilters("*.dic");
400
                QStringList dictList(dictLocation.entryList(dictFilters, QDir::Files, QDir::Name));
401
                dictList.replaceInStrings(".dic","");
402
 
403
                //Ensure we have aff+dic file pairs, remove any hyphenation dictionaries from the list
404
                QString dictName;
405
                foreach(dictName, dictList)
406
                {
407
                        if (!QFile::exists(dictionaryPaths.at(i)+dictName+".aff"))
17886 jghali 408
                        {
17542 craig 409
                                dictList.removeAll(dictName);
17886 jghali 410
                        }
17542 craig 411
                        else
412
                        {
413
                                if (!dictionaryMap.contains(dictName))
17886 jghali 414
                                {
415
                                        if (dictName.length() <= 5 && langList.contains(dictName))
416
                                        {
417
                                                dictionaryMap.insert(dictName, dictionaryPaths.at(i)+dictName);
418
                                                continue;
419
                                        }
420
                                        QString shortAbbrev(LanguageManager::getShortAbbrevFromAbbrev(dictName));
421
                                        if (shortAbbrev.isEmpty())
422
                                                shortAbbrev = dictName;
423
                                        dictionaryMap.insert(shortAbbrev, dictionaryPaths.at(i)+dictName);
424
                                }
17542 craig 425
                        }
426
                }
427
//              qDebug()<<"Number of dictionaries/AFFs found in"<<dictionaryPaths.at(i)<<":"<<dictList.count();
428
        }
429
}
430
 
7669 cbradney 431
LanguageManager::~LanguageManager()
432
{
433
        langList.clear();
434
        installedLangList.clear();
12787 pierre 435
        hyphLangList.clear();
7669 cbradney 436
}
437
 
12787 pierre 438
void LanguageManager::addHyphLang(const QString & lang, const QString & filename)
439
{
440
        hyphLangList[lang] = filename;
441
}
442
 
443
const QString LanguageManager::getHyphFilename(const QString & lang, bool langIsAbbreviated)
444
{
445
        if(langIsAbbreviated)
446
                return hyphLangList.value(lang);
15774 jghali 447
        return hyphLangList.value(getAbbrevFromLang(lang, false, false));
12787 pierre 448
}
449
 
450
const QStringList LanguageManager::hyphLangs()
451
{
452
        return hyphLangList.keys();
453
}
454
 
455
 
456
 
457
 
458