00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <kglobal.h>
00021 #include <klocale.h>
00022
00023
00024 #include "talkercode.h"
00025
00029 TalkerCode::TalkerCode(const QString &code, bool normal )
00030 {
00031 if (!code.isEmpty())
00032 parseTalkerCode(code);
00033 if (normal) normalize();
00034 }
00035
00039 TalkerCode::TalkerCode(TalkerCode* talker, bool normal )
00040 {
00041 m_languageCode = talker->languageCode();
00042 m_countryCode = talker->countryCode();
00043 m_voice = talker->voice();
00044 m_gender = talker->gender();
00045 m_volume = talker->volume();
00046 m_rate = talker->rate();
00047 m_plugInName = talker->plugInName();
00048 if (normal) normalize();
00049 }
00050
00054 TalkerCode::~TalkerCode() { }
00055
00059 QString TalkerCode::languageCode() { return m_languageCode; }
00060 QString TalkerCode::countryCode() { return m_countryCode; }
00061 QString TalkerCode::voice() { return m_voice; }
00062 QString TalkerCode::gender() { return m_gender; }
00063 QString TalkerCode::volume() { return m_volume; }
00064 QString TalkerCode::rate() { return m_rate; }
00065 QString TalkerCode::plugInName() { return m_plugInName; }
00066
00067 void TalkerCode::setLanguageCode(const QString &languageCode) { m_languageCode = languageCode; }
00068 void TalkerCode::setCountryCode(const QString &countryCode) { m_countryCode = countryCode; }
00069 void TalkerCode::setVoice(const QString &voice) { m_voice = voice; }
00070 void TalkerCode::setGender(const QString &gender) { m_gender = gender; }
00071 void TalkerCode::setVolume(const QString &volume) { m_volume = volume; }
00072 void TalkerCode::setRate(const QString &rate) { m_rate = rate; }
00073 void TalkerCode::setPlugInName(const QString plugInName) { m_plugInName = plugInName; }
00074
00078 void TalkerCode::setFullLanguageCode(const QString &fullLanguageCode)
00079 {
00080 splitFullLanguageCode(fullLanguageCode, m_languageCode, m_countryCode);
00081 }
00082
00086 QString TalkerCode::fullLanguageCode()
00087 {
00088 if (!m_countryCode.isEmpty())
00089 return m_languageCode + "_" + m_countryCode;
00090 else
00091 return m_languageCode;
00092 }
00093
00097 QString TalkerCode::getTalkerCode()
00098 {
00099 QString languageCode = m_languageCode;
00100 if (!m_countryCode.isEmpty()) languageCode += "_" + m_countryCode;
00101 QString code = "<voice lang=\"" + languageCode + "\" ";
00102 if (!m_voice.isEmpty()) code += "name=\"" + m_voice + "\" ";
00103 if (!m_gender.isEmpty()) code += "gender=\"" + m_gender + "\" ";
00104 code += "/>";
00105 QString prosody;
00106 if (!m_volume.isEmpty()) prosody = "volume=\"" + m_volume + "\" ";
00107 if (!m_rate.isEmpty()) prosody += "rate=\"" + m_rate + "\" ";
00108 if (!prosody.isEmpty()) code += "<prosody " + prosody + "/>";
00109 if (!m_plugInName.isEmpty()) code += "<kttsd synthesizer=\"" + m_plugInName + "\" />";
00110 return code;
00111 }
00112
00116 void TalkerCode::normalize()
00117 {
00118 if (m_voice.isEmpty()) m_voice = "fixed";
00119 if (m_gender.isEmpty()) m_gender = "neutral";
00120 if (m_volume.isEmpty()) m_volume = "medium";
00121 if (m_rate.isEmpty()) m_rate = "medium";
00122 }
00123
00131 QString TalkerCode::normalizeTalkerCode(const QString &talkerCode, QString &fullLanguageCode)
00132 {
00133 TalkerCode tmpTalkerCode(talkerCode);
00134 tmpTalkerCode.normalize();
00135 fullLanguageCode = tmpTalkerCode.fullLanguageCode();
00136 return tmpTalkerCode.getTalkerCode();
00137 }
00138
00149 void TalkerCode::splitFullLanguageCode(const QString &lang, QString &languageCode, QString &countryCode)
00150 {
00151 QString language = lang;
00152 if (language.left(1) == "*") language = language.mid(1);
00153 QString charSet;
00154 KGlobal::locale()->splitLocale(language, languageCode, countryCode, charSet);
00155 }
00156
00168 QString TalkerCode::defaultTalkerCode(const QString &fullLanguageCode, const QString &plugInName)
00169 {
00170 TalkerCode tmpTalkerCode;
00171 tmpTalkerCode.setFullLanguageCode(fullLanguageCode);
00172 tmpTalkerCode.setPlugInName(plugInName);
00173 tmpTalkerCode.normalize();
00174 return tmpTalkerCode.getTalkerCode();
00175 }
00176
00180 QString TalkerCode::languageCodeToLanguage(const QString &languageCode)
00181 {
00182 QString twoAlpha;
00183 QString countryCode;
00184 QString language;
00185 if (languageCode == "other")
00186 language = i18n("Other");
00187 else
00188 {
00189 splitFullLanguageCode(languageCode, twoAlpha, countryCode);
00190 language = KGlobal::locale()->twoAlphaToLanguageName(twoAlpha);
00191 }
00192 if (!countryCode.isEmpty())
00193 language += " (" + KGlobal::locale()->twoAlphaToCountryName(countryCode) + ")";
00194 return language;
00195 }
00196
00200 QString TalkerCode::translatedGender(const QString &gender)
00201 {
00202 if (gender == "male")
00203 return i18n("male");
00204 else if (gender == "female")
00205 return i18n("female");
00206 else if (gender == "neutral")
00207 return i18n("neutral gender", "neutral");
00208 else return gender;
00209 }
00210 QString TalkerCode::translatedVolume(const QString &volume)
00211 {
00212 if (volume == "medium")
00213 return i18n("medium sound", "medium");
00214 else if (volume == "loud")
00215 return i18n("loud sound", "loud");
00216 else if (volume == "soft")
00217 return i18n("soft sound", "soft");
00218 else return volume;
00219 }
00220 QString TalkerCode::translatedRate(const QString &rate)
00221 {
00222 if (rate == "medium")
00223 return i18n("medium speed", "medium");
00224 else if (rate == "fast")
00225 return i18n("fast speed", "fast");
00226 else if (rate == "slow")
00227 return i18n("slow speed", "slow");
00228 else return rate;
00229 }
00230
00235 void TalkerCode::parseTalkerCode(const QString &talkerCode)
00236 {
00237 QString fullLanguageCode = talkerCode.section("lang=", 1, 1);
00238 if (fullLanguageCode.isEmpty())
00239 fullLanguageCode = talkerCode;
00240 else
00241 fullLanguageCode = fullLanguageCode.section('"', 1, 1);
00242 QString languageCode;
00243 QString countryCode;
00244 splitFullLanguageCode(fullLanguageCode, languageCode, countryCode);
00245 m_languageCode = languageCode;
00246 if (fullLanguageCode.left(1) == "*") countryCode = "*" + countryCode;
00247 m_countryCode = countryCode;
00248 m_voice = talkerCode.section("name=", 1, 1);
00249 m_voice = m_voice.section('"', 1, 1);
00250 m_gender = talkerCode.section("gender=", 1, 1);
00251 m_gender = m_gender.section('"', 1, 1);
00252 m_volume = talkerCode.section("volume=", 1, 1);
00253 m_volume = m_volume.section('"', 1, 1);
00254 m_rate = talkerCode.section("rate=", 1, 1);
00255 m_rate = m_rate.section('"', 1, 1);
00256 m_plugInName = talkerCode.section("synthesizer=", 1, 1);
00257 m_plugInName = m_plugInName.section('"', 1, 1);
00258 }
00259