1 /* 2 SPDX-FileCopyrightText: 2013 Andreas Cord-Landwehr <cordlandwehr@kde.org> 3 4 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 5 */ 6 7 #include "language.h" 8 #include "artikulate_debug.h" 9 #include "models/languagemodel.h" 10 #include "phoneme.h" 11 #include "phonemegroup.h" 12 #include <KLocalizedString> 13 #include <QFile> 14 #include <QIODevice> 15 #include <QQmlEngine> 16 #include <QXmlStreamReader> 17 create(QUrl file)18std::shared_ptr<Language> Language::create(QUrl file) 19 { 20 auto language = std::shared_ptr<Language>(new Language()); 21 // load basic information from language file, but does not parse everything 22 QXmlStreamReader xml; 23 QFile handle(file.toLocalFile()); 24 if (handle.open(QIODevice::ReadOnly)) { 25 xml.setDevice(&handle); 26 xml.readNextStartElement(); 27 while (xml.readNext() && !xml.atEnd()) { 28 if (xml.name() == "id") { 29 language->setId(xml.readElementText()); 30 } 31 if (xml.name() == "title") { 32 language->setTitle(xml.readElementText()); 33 } 34 if (xml.name() == "i18nTitle") { 35 language->seti18nTitle(xml.readElementText()); 36 } 37 if (xml.name() == "phonemeGroup") { 38 std::shared_ptr<PhonemeGroup> group = std::shared_ptr<PhonemeGroup>(new PhonemeGroup); 39 while (xml.readNext() && !xml.atEnd() && xml.name() != "phonemeGroup") { 40 if (xml.name() == "id") { 41 group->setId(xml.readElementText()); 42 } 43 if (xml.name() == "title") { 44 group->setTitle(xml.readElementText()); 45 } 46 if (xml.name() == "description") { 47 group->setDescription(xml.readElementText()); 48 } 49 if (xml.name() == "phoneme") { 50 std::unique_ptr<Phoneme> phoneme = std::unique_ptr<Phoneme>(new Phoneme); 51 while (xml.readNext() && !xml.atEnd() && xml.name() != "phoneme") { 52 if (xml.name() == "id") { 53 phoneme->setId(xml.readElementText()); 54 } 55 if (xml.name() == "title") { 56 phoneme->setTitle(xml.readElementText()); 57 } 58 } 59 group->addPhoneme(std::move(phoneme)); 60 } 61 } 62 language->m_phonemeGroups.append(group); 63 } 64 } 65 if (xml.hasError()) { 66 qCritical() << "Error occurred when reading Language XML file:" << file.toLocalFile(); 67 } 68 } 69 xml.clear(); 70 handle.close(); 71 72 return language; 73 } 74 Language()75Language::Language() 76 : ILanguage() 77 { 78 QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); 79 } 80 81 Language::~Language() = default; 82 id() const83QString Language::id() const 84 { 85 return m_id; 86 } 87 setId(const QString & id)88void Language::setId(const QString &id) 89 { 90 if (id != m_id) { 91 m_id = id; 92 emit idChanged(); 93 } 94 } 95 title() const96QString Language::title() const 97 { 98 return m_title; 99 } 100 setTitle(const QString & title)101void Language::setTitle(const QString &title) 102 { 103 if (QString::compare(title, m_title) != 0) { 104 m_title = title; 105 emit titleChanged(); 106 } 107 } 108 i18nTitle() const109QString Language::i18nTitle() const 110 { 111 return i18n(m_i18nTitle.toUtf8()); 112 } 113 seti18nTitle(const QString & title)114void Language::seti18nTitle(const QString &title) 115 { 116 if (m_i18nTitle == title) { 117 return; 118 } 119 m_i18nTitle = title; 120 emit i18nTitleChanged(); 121 } 122 file() const123QUrl Language::file() const 124 { 125 return m_file; 126 } 127 setFile(const QUrl & file)128void Language::setFile(const QUrl &file) 129 { 130 m_file = file; 131 } 132 phonemes() const133QVector<std::shared_ptr<Phoneme>> Language::phonemes() const 134 { 135 QVector<std::shared_ptr<Phoneme>> list; 136 for (auto group : m_phonemeGroups) { 137 list << group->phonemes(); 138 } 139 return list; 140 } 141 phonemeGroups() const142QVector<std::shared_ptr<PhonemeGroup>> Language::phonemeGroups() const 143 { 144 return m_phonemeGroups; 145 } 146