19 #include "Codetable.hpp"
20 #include <QCoreApplication>
23 #include <QXmlStreamReader>
27 #define ISO_639_DOMAIN "iso_639"
28 #define ISO_3166_DOMAIN "iso_3166"
38 void Codetable::lookup(
const QString &language_code, QString &language_name, QString &country_name, QString& extra)
const
40 QStringList parts = language_code.split(
"_");
41 language_name = language_code;
46 if(parts.size() >= 1) {
47 language_name = m_languageTable.contains(parts[0]) ? m_languageTable.value(parts[0]) : parts[0];
49 if(parts.size() >= 2) {
50 country_name = m_countryTable.contains(parts[1]) ? m_countryTable.value(parts[1]) : parts[1];
52 if(parts.size() > 2) {
53 extra = QStringList(parts.mid(2)).join(
"_");
57 Codetable::Codetable()
60 QDir dataDir = QDir(QString(
"%1/../share").arg(QCoreApplication::applicationDirPath()));
62 QDir dataDir = QDir(ISO_CODES_PREFIX
"/share").absolutePath();
65 bindtextdomain(ISO_639_DOMAIN, dataDir.absoluteFilePath(
"locale").toLocal8Bit().data());
66 bind_textdomain_codeset(ISO_639_DOMAIN,
"UTF-8");
68 bindtextdomain(ISO_3166_DOMAIN, dataDir.absoluteFilePath(
"locale").toLocal8Bit().data());
69 bind_textdomain_codeset(ISO_3166_DOMAIN,
"UTF-8");
71 parse(dataDir,
"iso_639.xml", parseIso639Elements, m_languageTable);
72 parse(dataDir,
"iso_3166.xml", parseIso3166Elements, m_countryTable);
75 void Codetable::parseIso639Elements(
const QXmlStreamReader &xml, QMap<QString, QString> &table)
77 if(xml.name() ==
"iso_639_entry" ){
78 QString name = xml.attributes().value(
"name").toString();
79 QString code = xml.attributes().value(
"iso_639_1_code").toString();
80 if(!name.isEmpty() && !code.isEmpty()){
81 name = QString::fromUtf8(dgettext(ISO_639_DOMAIN, name.toUtf8().constData()));
82 table.insert(code, name);
87 void Codetable::parseIso3166Elements(
const QXmlStreamReader &xml, QMap<QString, QString> &table)
89 if(xml.name() ==
"iso_3166_entry" ){
90 QString name = xml.attributes().value(
"name").toString();
91 QString code = xml.attributes().value(
"alpha_2_code").toString();
92 if(!name.isEmpty() && !code.isEmpty()){
93 name = QString::fromUtf8(dgettext(ISO_3166_DOMAIN, name.toUtf8().constData()));
94 table.insert(code, name);
99 void Codetable::parse(
const QDir& dataDir,
const QString& basename,
const parser_t& parser, QMap<QString, QString>& table)
101 QString filename = QDir(QDir(dataDir.filePath(
"xml")).filePath(
"iso-codes")).absoluteFilePath(basename);
102 QFile file(filename);
103 if(!file.open(QIODevice::ReadOnly)){
104 qWarning() <<
"Failed to open " << file.fileName() <<
" for reading";
108 QXmlStreamReader xml(&file);
109 while(!xml.atEnd() && !xml.hasError()){
110 if(xml.readNext() == QXmlStreamReader::StartElement){
Class for translating locale identifiers into human readable strings.
static Codetable * instance()
Get codetable instance.
void lookup(const QString &language_code, QString &language_name, QString &country_name, QString &extra) const
Looks up the language and country name for the specified language code. If no matching entries are fo...