diff --git a/C#/.vs/GoogleSpeak/v15/.suo b/C#/.vs/GoogleSpeak/v15/.suo
new file mode 100644
index 0000000..31f1498
Binary files /dev/null and b/C#/.vs/GoogleSpeak/v15/.suo differ
diff --git a/C#/.vs/config/applicationhost.config b/C#/.vs/config/applicationhost.config
new file mode 100644
index 0000000..f3e21da
--- /dev/null
+++ b/C#/.vs/config/applicationhost.config
@@ -0,0 +1,1021 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/C#/App.config b/C#/App.config
new file mode 100644
index 0000000..88fa402
--- /dev/null
+++ b/C#/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/C#/Form1.Designer.cs b/C#/Form1.Designer.cs
new file mode 100644
index 0000000..b11b30d
--- /dev/null
+++ b/C#/Form1.Designer.cs
@@ -0,0 +1,48 @@
+namespace GoogleSpeak
+{
+ partial class Form1
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.SuspendLayout();
+ //
+ // Form1
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(284, 261);
+ this.Name = "Form1";
+ this.Text = "Form1";
+ this.Load += new System.EventHandler(this.Form1_Load);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ }
+}
+
diff --git a/C#/Form1.cs b/C#/Form1.cs
new file mode 100644
index 0000000..3693b97
--- /dev/null
+++ b/C#/Form1.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Windows.Forms;
+using GoogleSpeak.GoogleSpeak;
+
+namespace GoogleSpeak
+{
+ public partial class Form1 : Form
+ {
+ public Form1()
+ {
+ InitializeComponent();
+ }
+
+ private void Form1_Load(object sender, EventArgs e)
+ {
+ var googleLina = GoogleSpeech.Instance;
+ googleLina.Say("Her er en hest");
+ googleLina.Say("og en hest mere");
+ googleLina.Say("and yet an other one", "en");
+ }
+ }
+}
diff --git a/C#/Form1.resx b/C#/Form1.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/C#/Form1.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/C#/GoogleSpeak.csproj b/C#/GoogleSpeak.csproj
new file mode 100644
index 0000000..0bebe1b
--- /dev/null
+++ b/C#/GoogleSpeak.csproj
@@ -0,0 +1,90 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {580F8F2A-2A28-4328-AD0B-4403F0266C19}
+ WinExe
+ GoogleSpeak
+ GoogleSpeak
+ v4.5.2
+ 512
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ packages\NAudio.1.8.4\lib\net35\NAudio.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ Form1.cs
+
+
+
+
+
+
+
+ Form1.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/C#/GoogleSpeak.sln b/C#/GoogleSpeak.sln
new file mode 100644
index 0000000..1109c09
--- /dev/null
+++ b/C#/GoogleSpeak.sln
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26403.7
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GoogleSpeak", "GoogleSpeak.csproj", "{580F8F2A-2A28-4328-AD0B-4403F0266C19}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {580F8F2A-2A28-4328-AD0B-4403F0266C19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {580F8F2A-2A28-4328-AD0B-4403F0266C19}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {580F8F2A-2A28-4328-AD0B-4403F0266C19}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {580F8F2A-2A28-4328-AD0B-4403F0266C19}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/C#/GoogleSpeak/CRC32.cs b/C#/GoogleSpeak/CRC32.cs
new file mode 100644
index 0000000..9a45b12
--- /dev/null
+++ b/C#/GoogleSpeak/CRC32.cs
@@ -0,0 +1,74 @@
+namespace GoogleSpeak.GoogleSpeak
+{
+ // ReSharper disable once InconsistentNaming
+ public static class CRC32
+ {
+
+ public static uint Hash(string input)
+ {
+ var table = new uint[]{
+ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
+ 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
+ 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
+ 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
+ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
+ 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
+ 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
+ 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
+ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
+ 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
+ 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
+ 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
+ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
+ 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
+ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
+ 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
+ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
+ 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
+ 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
+ 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
+ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
+ 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
+ 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
+ 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
+ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
+ 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
+ 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
+ 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
+ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
+ 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
+ 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
+ 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
+ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
+ 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
+ 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
+ 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
+ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
+ 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
+ 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
+ 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
+ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
+ 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
+ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
+ };
+
+ unchecked
+ {
+ uint crc = (uint)((uint)0 ^ -1);
+ var len = input.Length;
+
+ for (var i = 0; i < len; i++)
+ crc = (crc >> 8) ^ table[(crc ^ (byte)input[i]) & 0xFF];
+
+ crc = (uint)(crc ^ -1);
+
+ if (crc < 0)
+ crc += (uint)4294967296;
+
+ return crc;
+ }
+ }
+
+ }
+
+}
diff --git a/C#/GoogleSpeak/GoogleSpeech.cs b/C#/GoogleSpeak/GoogleSpeech.cs
new file mode 100644
index 0000000..bb3de84
--- /dev/null
+++ b/C#/GoogleSpeak/GoogleSpeech.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Threading.Tasks;
+using System.Web;
+using NAudio.Wave;
+
+namespace GoogleSpeak.GoogleSpeak
+{
+ public class GoogleSpeech
+ {
+ private readonly Queue playlist = new Queue();
+ private IWavePlayer player;
+ private Mp3FileReader mp3FileReader;
+ private string downloadFolder;
+ private static readonly Lazy Lazy = new Lazy(() => new GoogleSpeech());
+ private bool playing;
+
+ public event EventHandler PlaybackStopped;
+ public Language Language { get; set; } = Languages.FromCode("da");
+
+ private void Play()
+ {
+ if (playlist.Count < 1)
+ return;
+ playing = true;
+
+ player = new WaveOutEvent();
+ player.PlaybackStopped += (sender, e) =>
+ {
+ player?.Dispose();
+ mp3FileReader?.Dispose();
+ if (playlist.Any())
+ Play();
+ else
+ OnPlaybackStopped(e);
+ };
+
+ mp3FileReader = new Mp3FileReader(playlist.Dequeue());
+ player.Init(mp3FileReader);
+ player.Play();
+ }
+
+ protected virtual void OnPlaybackStopped(StoppedEventArgs e)
+ {
+ playing = false;
+ PlaybackStopped?.Invoke(this, e);
+ }
+
+
+ public void Say(string text, string languageCode)
+ {
+ var language = Languages.FromCode(languageCode);
+ Say(text, language);
+ }
+
+ public void Say(string text, Language language = null)
+ {
+ if (language == null)
+ language = Language;
+
+ var filename = DownloadFolder + CRC32.Hash(language.Code + " " + text) + ".mp3";
+ var url = $"https://translate.googleapis.com/translate_tts?ie=UTF-8&q={HttpUtility.UrlEncode(text)}&tl={language.Code}&total=1&idx=0&textlen={text.Length}&client=gtx";
+
+ if (!UseCache || !File.Exists(filename))
+ using (var webClient = new WebClient())
+ webClient.DownloadFile(url, filename);
+
+ playlist.Enqueue(filename);
+
+ if (!playing)
+ Play();
+ }
+
+ public GoogleSpeech(bool useCache = true)
+ {
+ UseCache = useCache;
+ DownloadFolder = AppDomain.CurrentDomain.BaseDirectory + @"Cache\";
+ }
+
+ ~GoogleSpeech()
+ {
+ if (!UseCache)
+ Directory.Delete(DownloadFolder);
+ }
+
+ public string DownloadFolder
+ {
+ get => downloadFolder;
+ set
+ {
+ downloadFolder = value;
+ Directory.CreateDirectory(downloadFolder);
+ }
+ }
+
+ public static GoogleSpeech Instance => Lazy.Value;
+ public bool UseCache { get; set; }
+ }
+}
diff --git a/C#/GoogleSpeak/Languages.cs b/C#/GoogleSpeak/Languages.cs
new file mode 100644
index 0000000..5d787ef
--- /dev/null
+++ b/C#/GoogleSpeak/Languages.cs
@@ -0,0 +1,130 @@
+using System.Collections.Generic;
+using System.Linq;
+
+namespace GoogleSpeak.GoogleSpeak
+{
+ public class Language
+ {
+ public string Code { get; set; }
+ public string Name { get; set; }
+ }
+
+ public static class Languages
+ {
+ public static List List { get; }
+
+ public static Language FromCode(string code) => List.FirstOrDefault(e => e.Code == code);
+ public static Language FromName(string name) => List.FirstOrDefault(e => e.Name == name);
+
+ static Languages()
+ {
+ List = new List
+ {
+ new Language {Name = "Afrikaans", Code = "af"},
+ new Language {Name = "Albanian", Code = "sq"},
+ new Language {Name = "Amharic", Code = "am"},
+ new Language {Name = "Arabic", Code = "ar"},
+ new Language {Name = "Armenian", Code = "hy"},
+ new Language {Name = "Azeerbaijani", Code = "az"},
+ new Language {Name = "Basque", Code = "eu"},
+ new Language {Name = "Belarusian", Code = "be"},
+ new Language {Name = "Bengali", Code = "bn"},
+ new Language {Name = "Bosnian", Code = "bs"},
+ new Language {Name = "Bulgarian", Code = "bg"},
+ new Language {Name = "Catalan", Code = "ca"},
+ new Language {Name = "Cebuano", Code = "ceb (ISO-639-2)"},
+ new Language {Name = "Chinese (Simplified)", Code = "zh-CN"},
+ new Language {Name = "Chinese (Traditional)", Code = "zh-TW"},
+ new Language {Name = "Corsican", Code = "co"},
+ new Language {Name = "Croatian", Code = "hr"},
+ new Language {Name = "Czech", Code = "cs"},
+ new Language {Name = "Danish", Code = "da"},
+ new Language {Name = "Dutch", Code = "nl"},
+ new Language {Name = "English", Code = "en"},
+ new Language {Name = "Esperanto", Code = "eo"},
+ new Language {Name = "Estonian", Code = "et"},
+ new Language {Name = "Finnish", Code = "fi"},
+ new Language {Name = "French", Code = "fr"},
+ new Language {Name = "Frisian", Code = "fy"},
+ new Language {Name = "Galician", Code = "gl"},
+ new Language {Name = "Georgian", Code = "ka"},
+ new Language {Name = "German", Code = "de"},
+ new Language {Name = "Greek", Code = "el"},
+ new Language {Name = "Gujarati", Code = "gu"},
+ new Language {Name = "Haitian Creole", Code = "ht"},
+ new Language {Name = "Hausa", Code = "ha"},
+ new Language {Name = "Hawaiian", Code = "haw"},
+ new Language {Name = "Hebrew", Code = "iw"},
+ new Language {Name = "Hindi", Code = "hi"},
+ new Language {Name = "Hmong", Code = "hmn"},
+ new Language {Name = "Hungarian", Code = "hu"},
+ new Language {Name = "Icelandic", Code = "is"},
+ new Language {Name = "Igbo", Code = "ig"},
+ new Language {Name = "Indonesian", Code = "id"},
+ new Language {Name = "Irish", Code = "ga"},
+ new Language {Name = "Italian", Code = "it"},
+ new Language {Name = "Japanese", Code = "ja"},
+ new Language {Name = "Javanese", Code = "jw"},
+ new Language {Name = "Kannada", Code = "kn"},
+ new Language {Name = "Kazakh", Code = "kk"},
+ new Language {Name = "Khmer", Code = "km"},
+ new Language {Name = "Korean", Code = "ko"},
+ new Language {Name = "Kurdish", Code = "ku"},
+ new Language {Name = "Kyrgyz", Code = "ky"},
+ new Language {Name = "Lao", Code = "lo"},
+ new Language {Name = "Latin", Code = "la"},
+ new Language {Name = "Latvian", Code = "lv"},
+ new Language {Name = "Lithuanian", Code = "lt"},
+ new Language {Name = "Luxembourgish", Code = "lb"},
+ new Language {Name = "Macedonian", Code = "mk"},
+ new Language {Name = "Malagasy", Code = "mg"},
+ new Language {Name = "Malay", Code = "ms"},
+ new Language {Name = "Malayalam", Code = "ml"},
+ new Language {Name = "Maltese", Code = "mt"},
+ new Language {Name = "Maori", Code = "mi"},
+ new Language {Name = "Marathi", Code = "mr"},
+ new Language {Name = "Mongolian", Code = "mn"},
+ new Language {Name = "Myanmar (Burmese)", Code = "my"},
+ new Language {Name = "Nepali", Code = "ne"},
+ new Language {Name = "Norwegian", Code = "no"},
+ new Language {Name = "Nyanja (Chichewa)", Code = "ny"},
+ new Language {Name = "Pashto", Code = "ps"},
+ new Language {Name = "Persian", Code = "fa"},
+ new Language {Name = "Polish", Code = "pl"},
+ new Language {Name = "Portuguese (Portugal, Brazil)", Code = "pt"},
+ new Language {Name = "Punjabi", Code = "pa"},
+ new Language {Name = "Romanian", Code = "ro"},
+ new Language {Name = "Russian", Code = "ru"},
+ new Language {Name = "Samoan", Code = "sm"},
+ new Language {Name = "Scots Gaelic", Code = "gd"},
+ new Language {Name = "Serbian", Code = "sr"},
+ new Language {Name = "Sesotho", Code = "st"},
+ new Language {Name = "Shona", Code = "sn"},
+ new Language {Name = "Sindhi", Code = "sd"},
+ new Language {Name = "Sinhala (Sinhalese)", Code = "si"},
+ new Language {Name = "Slovak", Code = "sk"},
+ new Language {Name = "Slovenian", Code = "sl"},
+ new Language {Name = "Somali", Code = "so"},
+ new Language {Name = "Spanish", Code = "es"},
+ new Language {Name = "Sundanese", Code = "su"},
+ new Language {Name = "Swahili", Code = "sw"},
+ new Language {Name = "Swedish", Code = "sv"},
+ new Language {Name = "Tagalog (Filipino)", Code = "tl"},
+ new Language {Name = "Tajik", Code = "tg"},
+ new Language {Name = "Tamil", Code = "ta"},
+ new Language {Name = "Telugu", Code = "te"},
+ new Language {Name = "Thai", Code = "th"},
+ new Language {Name = "Turkish", Code = "tr"},
+ new Language {Name = "Ukrainian", Code = "uk"},
+ new Language {Name = "Urdu", Code = "ur"},
+ new Language {Name = "Uzbek", Code = "uz"},
+ new Language {Name = "Vietnamese", Code = "vi"},
+ new Language {Name = "Welsh", Code = "cy"},
+ new Language {Name = "Xhosa", Code = "xh"},
+ new Language {Name = "Yiddish", Code = "yi"},
+ new Language {Name = "Yoruba", Code = "yo"},
+ new Language {Name = "Zulu", Code = "zu"}
+ };
+ }
+ }
+}
diff --git a/C#/Program.cs b/C#/Program.cs
new file mode 100644
index 0000000..330672a
--- /dev/null
+++ b/C#/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace GoogleSpeak
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Form1());
+ }
+ }
+}
diff --git a/C#/Properties/AssemblyInfo.cs b/C#/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..1381ed8
--- /dev/null
+++ b/C#/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("GoogleSpeak")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("GoogleSpeak")]
+[assembly: AssemblyCopyright("Copyright © 2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("580f8f2a-2a28-4328-ad0b-4403f0266c19")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/C#/Properties/Resources.Designer.cs b/C#/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..d94dad2
--- /dev/null
+++ b/C#/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace GoogleSpeak.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GoogleSpeak.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/C#/Properties/Resources.resx b/C#/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/C#/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/C#/Properties/Settings.Designer.cs b/C#/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..380a96e
--- /dev/null
+++ b/C#/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace GoogleSpeak.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/C#/Properties/Settings.settings b/C#/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/C#/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/C#/packages.config b/C#/packages.config
new file mode 100644
index 0000000..1d482cc
--- /dev/null
+++ b/C#/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Delphi/CRC32U.pas b/Delphi/CRC32U.pas
new file mode 100644
index 0000000..101d581
--- /dev/null
+++ b/Delphi/CRC32U.pas
@@ -0,0 +1,69 @@
+unit CRC32U;
+
+interface
+
+uses
+ Winapi.Windows, System.SysUtils;
+
+type
+ TCrc32 = record
+ public
+ class procedure Hash(p: Pointer; ByteCount: DWORD; var CRCValue: DWORD); overload; static;
+ class function Hash(input: string): DWORD; overload; static;
+ end;
+
+implementation
+
+const
+ Table: array [0 .. 255] of DWORD = ($00000000, $77073096, $EE0E612C, $990951BA, $076DC419, $706AF48F, $E963A535, $9E6495A3, $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, $09B64C2B, $7EB17CBD,
+ $E7B82D07, $90BF1D91, $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, $14015C4F, $63066CD9, $FA0F3D63,
+ $8D080DF5, $3B6E20C8, $4C69105E, $D56041E4, $A2677172, $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59,
+ $26D930AC, $51DE003A, $C8D75180, $BFD06116, $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, $2802B89E, $5F058808, $C60CD9B2, $B10BE924, $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D,
+
+ $76DC4190, $01DB7106, $98D220BC, $EFD5102A, $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, $7807C9A2, $0F00F934, $9609A88E, $E10E9818, $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, $6B6B51F4,
+ $1C6C6162, $856530D8, $F262004E, $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, $4DB26158, $3AB551CE,
+ $A3BC0074, $D4BB30E2, $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, $5005713C, $270241AA, $BE0B1010,
+ $C90C2086, $5768B525, $206F85B3, $B966D409, $CE61E49F, $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD,
+
+ $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, $EAD54739, $9DD277AF, $04DB2615, $73DC1683, $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, $F00F9344,
+ $8708A3D2, $1E01F268, $6906C2FE, $F762575D, $806567CB, $196C3671, $6E6B06E7, $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, $D6D6A3E8, $A1D1937E,
+ $38D8C2C4, $4FDFF252, $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, $CB61B38C, $BC66831A, $256FD2A0,
+ $5268E236, $CC0C7795, $BB0B4703, $220216B9, $5505262F, $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D,
+
+ $9B64C2B0, $EC63F226, $756AA39C, $026D930A, $9C0906A9, $EB0E363F, $72076785, $05005713, $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, $86D3D2D4,
+ $F1D4E242, $68DDB3F8, $1FDA836E, $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, $A00AE278, $D70DD2EE,
+ $4E048354, $3903B3C2, $A7672661, $D06016F7, $4969474D, $3E6E77DB, $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, $BDBDF21C, $CABAC28A, $53B39330,
+ $24B4A3A6, $BAD03605, $CDD70693, $54DE5729, $23D967BF, $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D);
+ { TCrc32 }
+
+class function TCrc32.Hash(input: string): DWORD;
+var
+ CRC32Table: DWORD;
+begin
+ CRC32Table := $FFFFFFFF;
+ Hash(Addr(Table[0]), SizeOf(Table), CRC32Table);
+ CRC32Table := not CRC32Table;
+
+ if CRC32Table <> $6FCF9E13 then
+ raise Exception.Create('CRC32 Table CRC32 is ' + IntToHex(CRC32Table, 8) + ', expecting $6FCF9E13');
+
+ Result := $FFFFFFFF;
+ if Length(input) > 0 then
+ Hash(Addr(input[1]), Length(input), Result);
+ Result := not Result;
+end;
+
+class procedure TCrc32.Hash(p: Pointer; ByteCount: DWORD; var CRCValue: DWORD);
+var
+ i: DWORD;
+ q: ^BYTE;
+begin
+ q := p;
+ for i := 0 to ByteCount - 1 do
+ begin
+ CRCValue := (CRCValue shr 8) xor Table[q^ xor (CRCValue and $000000FF)];
+ Inc(q)
+ end;
+end;
+
+end.
diff --git a/Delphi/GoogleSpeak.dpr b/Delphi/GoogleSpeak.dpr
new file mode 100644
index 0000000..809057c
--- /dev/null
+++ b/Delphi/GoogleSpeak.dpr
@@ -0,0 +1,17 @@
+program GoogleSpeak;
+
+uses
+ Vcl.Forms,
+ MainU in 'MainU.pas' {FormMain},
+ GoogleSpeakU in 'GoogleSpeakU.pas',
+ CRC32U in 'CRC32U.pas',
+ LanguagesU in 'LanguagesU.pas';
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.MainFormOnTaskbar := True;
+ Application.CreateForm(TFormMain, FormMain);
+ Application.Run;
+end.
diff --git a/Delphi/GoogleSpeak.dproj b/Delphi/GoogleSpeak.dproj
new file mode 100644
index 0000000..cdded11
--- /dev/null
+++ b/Delphi/GoogleSpeak.dproj
@@ -0,0 +1,533 @@
+
+
+ {CCAD942C-3B6D-4EF1-A6EA-AF6EC40EC689}
+ 18.0
+ VCL
+ GoogleSpeak.dpr
+ True
+ Debug
+ Win32
+ 1
+ Application
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Cfg_1
+ true
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Cfg_2
+ true
+ true
+
+
+ System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)
+ $(BDS)\bin\delphi_PROJECTICON.ico
+ GoogleSpeak
+ .\$(Platform)\$(Config)
+ .\$(Platform)\$(Config)
+ false
+ false
+ false
+ false
+ false
+
+
+ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
+ $(BDS)\bin\default_app.manifest
+ true
+ DBXSqliteDriver;DBXDb2Driver;dxCoreRS23;vclactnband;frxe23;vclFireDAC;dxPSLnksRS23;dxPSdxLCLnkRS23;tethering;cxDataRS23;dxPSdxOCLnkRS23;dxTabbedMDIRS23;FireDACADSDriver;dxSkinBlackRS23;dxSkinLondonLiquidSkyRS23;dxDBXServerModeRS23;dxHttpIndyRequestRS23;dxPScxGridLnkRS23;cxSchedulerRS23;FireDACMSSQLDriver;vcltouch;vcldb;Intraweb;svn;dxWizardControlRS23;dxSkinMcSkinRS23;dxPScxCommonRS23;Spring.Data;dxSkinOffice2007BlueRS23;dxBarRS23;cxSchedulerRibbonStyleEventEditorRS23;dxSkinOffice2013WhiteRS23;dxPSTeeChartRS23;cxLibraryRS23;dxSkinVisualStudio2013LightRS23;cxPivotGridChartRS23;dxSkinSummer2008RS23;dxPSdxDBOCLnkRS23;dxGDIPlusRS23;dxSkinDarkSideRS23;FireDACDBXDriver;dxSkinFoggyRS23;dxSkinSevenRS23;vclx;dxSkinOffice2010SilverRS23;DataBindingsVCL;dxdborRS23;RESTBackendComponents;dxLayoutControlRS23;dxPSPrVwRibbonRS23;VCLRESTComponents;dxSkinDevExpressStyleRS23;dxSkinWhiteprintRS23;vclie;bindengine;CloudService;FireDACMySQLDriver;dxSkinOffice2013DarkGrayRS23;DataSnapClient;dxPScxPCProdRS23;bindcompdbx;DBXSybaseASEDriver;IndyIPServer;dxSkinPumpkinRS23;IndySystem;dsnapcon;cxTreeListdxBarPopupMenuRS23;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSkinLilianRS23;dxRichEditDocumentModelRS23;dxRichEditCoreRS23;dxSpreadSheetConditionalFormattingDialogsRS23;dxBarDBNavRS23;dxFlowChartRS23;dxSkinOffice2016ColorfulRS23;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;dxSpreadSheetRS23;dxSkinOffice2007PinkRS23;dxPSdxSpreadSheetLnkRS23;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;dxSkinHighContrastRS23;dxSkinSevenClassicRS23;rtl;dxSkinTheAsphaltWorldRS23;DbxClientDriver;dxSkinDevExpressDarkStyleRS23;DBXSybaseASADriver;dxNavBarRS23;dxSkinMetropolisDarkRS23;dxRichEditControlCoreRS23;dxRichEditControlRS23;dxOfficeCoreRS23;appanalytics;cxPivotGridRS23;dxSkinsdxDLPainterRS23;IndyIPClient;dxRibbonRS23;dxPScxVGridLnkRS23;bindcompvcl;frxDB23;dxSkinOffice2007SilverRS23;dxSpreadSheetInplaceRichEditRS23;dxPScxTLLnkRS23;dxMapControlRS23;TeeUI;VclSmp;dxPScxSchedulerLnkRS23;cxTreeListRS23;FireDACODBCDriver;DataSnapIndy10ServerTransport;dxRibbonCustomizationFormRS23;dxPSRichEditControlLnkRS23;dxBarExtDBItemsRS23;DataSnapProviderClient;FireDACMongoDBDriver;dxSpreadSheetReportDesignerRS23;dxSkiniMaginaryRS23;frx23;dxSpellCheckerRS23;dxSkinsdxBarPainterRS23;dxSkinCoffeeRS23;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxADOServerModeRS23;emsclientfiredac;DataSnapFireDAC;svnui;dxmdsRS23;dxSkinLiquidSkyRS23;dxPSDBTeeChartRS23;dxSkinSpringTimeRS23;dxdbtrRS23;dxPSCoreRS23;dxSkinscxPCPainterRS23;DBXMSSQLDriver;dxSkinXmas2008BlueRS23;DatasnapConnectorsFreePascal;bindcompfmx;DBXOracleDriver;dxSkinSilverRS23;dxSkinValentineRS23;inetdb;DataBindings;dxPSdxMapControlLnkRS23;FmxTeeUI;dxBarExtItemsRS23;FireDACIBDriver;fmx;fmxdae;dxServerModeRS23;dxPsPrVwAdvRS23;dxSkinOffice2010BlackRS23;cxPageControlRS23;dxSkinStardustRS23;cxSchedulerGridRS23;dbexpress;IndyCore;dxSkinSharpPlusRS23;dsnap;DataSnapCommon;emsclient;FireDACCommon;dxSkinOffice2010BlueRS23;dxSkinVS2010RS23;dxSkinMetropolisRS23;DataSnapConnectors;cxVerticalGridRS23;soapserver;dxSkinCaramelRS23;frxTee23;dxTileControlRS23;cxGridRS23;FireDACOracleDriver;DBXMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;inet;IndyIPCommon;dxSkinDarkRoomRS23;dxDockingRS23;vcl;dxSkinOffice2007GreenRS23;dxPScxExtCommonRS23;dxSkinsCoreRS23;FireDACDb2Driver;dxThemeRS23;dxSkinsdxRibbonPainterRS23;dxSkinVisualStudio2013BlueRS23;dxSkinMoneyTwinsRS23;dxPSdxFCLnkRS23;dxtrmdRS23;TeeDB;FireDAC;cxSchedulerTreeBrowserRS23;dxFireDACServerModeRS23;dxSkinBlueRS23;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;cxEditorsRS23;dxSkinGlassOceansRS23;dxSkinsdxNavBarPainterRS23;dxGaugeControlRS23;Tee;dxSkinSharpRS23;DataSnapServer;cxPivotGridOLAPRS23;dxPSdxPDFViewerLnkRS23;vclwinx;FireDACDSDriver;dxSkinBlueprintRS23;dxSkinOffice2007BlackRS23;CustomIPTransport;vcldsnap;dxSkinOffice2013LightGrayRS23;bindcomp;DBXInformixDriver;dxPSdxGaugeControlLnkRS23;dxRichEditInplaceRS23;dxPScxPivotGridLnkRS23;dxorgcRS23;dxPSdxDBTVLnkRS23;vclribbon;dbxcds;dxPDFViewerRS23;adortl;dxComnRS23;dsnapxml;dbrtl;inetdbxpress;IndyProtocols;cxExportRS23;dxSkinOffice2016DarkRS23;dxSkinVisualStudio2013DarkRS23;dxSkinscxSchedulerPainterRS23;fmxase;$(DCC_UsePackage)
+ CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=
+ 1033
+
+
+ DBXSqliteDriver;DBXDb2Driver;dxCoreRS23;vclactnband;vclFireDAC;dxPSLnksRS23;dxPSdxLCLnkRS23;tethering;cxDataRS23;dxPSdxOCLnkRS23;dxTabbedMDIRS23;FireDACADSDriver;dxSkinBlackRS23;dxSkinLondonLiquidSkyRS23;dxDBXServerModeRS23;dxHttpIndyRequestRS23;dxPScxGridLnkRS23;cxSchedulerRS23;FireDACMSSQLDriver;vcltouch;vcldb;Intraweb;dxWizardControlRS23;dxSkinMcSkinRS23;dxPScxCommonRS23;Spring.Data;dxSkinOffice2007BlueRS23;dxBarRS23;cxSchedulerRibbonStyleEventEditorRS23;dxSkinOffice2013WhiteRS23;dxPSTeeChartRS23;cxLibraryRS23;dxSkinVisualStudio2013LightRS23;cxPivotGridChartRS23;dxSkinSummer2008RS23;dxPSdxDBOCLnkRS23;dxGDIPlusRS23;dxSkinDarkSideRS23;FireDACDBXDriver;dxSkinFoggyRS23;dxSkinSevenRS23;vclx;dxSkinOffice2010SilverRS23;DataBindingsVCL;dxdborRS23;RESTBackendComponents;dxLayoutControlRS23;dxPSPrVwRibbonRS23;VCLRESTComponents;dxSkinDevExpressStyleRS23;dxSkinWhiteprintRS23;vclie;bindengine;CloudService;FireDACMySQLDriver;dxSkinOffice2013DarkGrayRS23;DataSnapClient;dxPScxPCProdRS23;bindcompdbx;DBXSybaseASEDriver;IndyIPServer;dxSkinPumpkinRS23;IndySystem;dsnapcon;cxTreeListdxBarPopupMenuRS23;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSkinLilianRS23;dxRichEditDocumentModelRS23;dxRichEditCoreRS23;dxSpreadSheetConditionalFormattingDialogsRS23;dxBarDBNavRS23;dxFlowChartRS23;dxSkinOffice2016ColorfulRS23;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;dxSpreadSheetRS23;dxSkinOffice2007PinkRS23;dxPSdxSpreadSheetLnkRS23;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;dxSkinHighContrastRS23;dxSkinSevenClassicRS23;rtl;dxSkinTheAsphaltWorldRS23;DbxClientDriver;dxSkinDevExpressDarkStyleRS23;DBXSybaseASADriver;dxNavBarRS23;dxSkinMetropolisDarkRS23;dxRichEditControlCoreRS23;dxRichEditControlRS23;dxOfficeCoreRS23;appanalytics;cxPivotGridRS23;dxSkinsdxDLPainterRS23;IndyIPClient;dxRibbonRS23;dxPScxVGridLnkRS23;bindcompvcl;dxSkinOffice2007SilverRS23;dxSpreadSheetInplaceRichEditRS23;dxPScxTLLnkRS23;dxMapControlRS23;TeeUI;VclSmp;dxPScxSchedulerLnkRS23;cxTreeListRS23;FireDACODBCDriver;DataSnapIndy10ServerTransport;dxRibbonCustomizationFormRS23;dxPSRichEditControlLnkRS23;dxBarExtDBItemsRS23;DataSnapProviderClient;FireDACMongoDBDriver;dxSpreadSheetReportDesignerRS23;dxSkiniMaginaryRS23;dxSpellCheckerRS23;dxSkinsdxBarPainterRS23;dxSkinCoffeeRS23;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxADOServerModeRS23;emsclientfiredac;DataSnapFireDAC;dxmdsRS23;dxSkinLiquidSkyRS23;dxPSDBTeeChartRS23;dxSkinSpringTimeRS23;dxdbtrRS23;dxPSCoreRS23;dxSkinscxPCPainterRS23;DBXMSSQLDriver;dxSkinXmas2008BlueRS23;DatasnapConnectorsFreePascal;bindcompfmx;DBXOracleDriver;dxSkinSilverRS23;dxSkinValentineRS23;inetdb;DataBindings;dxPSdxMapControlLnkRS23;FmxTeeUI;dxBarExtItemsRS23;FireDACIBDriver;fmx;fmxdae;dxServerModeRS23;dxPsPrVwAdvRS23;dxSkinOffice2010BlackRS23;cxPageControlRS23;dxSkinStardustRS23;cxSchedulerGridRS23;dbexpress;IndyCore;dxSkinSharpPlusRS23;dsnap;DataSnapCommon;emsclient;FireDACCommon;dxSkinOffice2010BlueRS23;dxSkinVS2010RS23;dxSkinMetropolisRS23;DataSnapConnectors;cxVerticalGridRS23;soapserver;dxSkinCaramelRS23;dxTileControlRS23;cxGridRS23;FireDACOracleDriver;DBXMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;inet;IndyIPCommon;dxSkinDarkRoomRS23;dxDockingRS23;vcl;dxSkinOffice2007GreenRS23;dxPScxExtCommonRS23;dxSkinsCoreRS23;FireDACDb2Driver;dxThemeRS23;dxSkinsdxRibbonPainterRS23;dxSkinVisualStudio2013BlueRS23;dxSkinMoneyTwinsRS23;dxPSdxFCLnkRS23;dxtrmdRS23;TeeDB;FireDAC;cxSchedulerTreeBrowserRS23;dxFireDACServerModeRS23;dxSkinBlueRS23;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;cxEditorsRS23;dxSkinGlassOceansRS23;dxSkinsdxNavBarPainterRS23;dxGaugeControlRS23;Tee;dxSkinSharpRS23;DataSnapServer;cxPivotGridOLAPRS23;dxPSdxPDFViewerLnkRS23;vclwinx;FireDACDSDriver;dxSkinBlueprintRS23;dxSkinOffice2007BlackRS23;CustomIPTransport;vcldsnap;dxSkinOffice2013LightGrayRS23;bindcomp;DBXInformixDriver;dxPSdxGaugeControlLnkRS23;dxRichEditInplaceRS23;dxPScxPivotGridLnkRS23;dxorgcRS23;dxPSdxDBTVLnkRS23;vclribbon;dbxcds;dxPDFViewerRS23;adortl;dxComnRS23;dsnapxml;dbrtl;inetdbxpress;IndyProtocols;cxExportRS23;dxSkinOffice2016DarkRS23;dxSkinVisualStudio2013DarkRS23;dxSkinscxSchedulerPainterRS23;fmxase;$(DCC_UsePackage)
+
+
+ DEBUG;$(DCC_Define)
+ true
+ false
+ true
+ true
+ true
+
+
+ true
+ true
+ false
+
+
+ false
+ RELEASE;$(DCC_Define)
+ 0
+ 0
+
+
+ true
+ true
+
+
+
+ MainSource
+
+
+
+ dfm
+
+
+
+
+
+ Cfg_2
+ Base
+
+
+ Base
+
+
+ Cfg_1
+ Base
+
+
+
+ Delphi.Personality.12
+ Application
+
+
+
+ GoogleSpeak.dpr
+
+
+
+
+
+ GoogleSpeak.exe
+ true
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ Contents\Resources
+ 1
+
+
+
+
+ classes
+ 1
+
+
+
+
+ Contents\MacOS
+ 0
+
+
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+
+
+ library\lib\mips
+ 1
+
+
+
+
+ 0
+
+
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ 1
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ 1
+
+
+
+
+ 0
+
+
+ Contents\MacOS
+ 1
+ .framework
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+
+
+ library\lib\x86
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ library\lib\armeabi
+ 1
+
+
+
+
+ 0
+
+
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ res\drawable-normal
+ 1
+
+
+
+
+ res\drawable-xhdpi
+ 1
+
+
+
+
+ res\drawable-large
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ../
+ 1
+
+
+ ../
+ 1
+
+
+
+
+ res\drawable-hdpi
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ Contents
+ 1
+
+
+
+
+ ../
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+
+
+ res\drawable-small
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+
+
+ 0
+
+
+ 0
+
+
+ Contents\Resources\StartUp\
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ 0
+ .bpl
+
+
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+
+
+ res\drawable-mdpi
+ 1
+
+
+
+
+ res\drawable-xlarge
+ 1
+
+
+
+
+ res\drawable-ldpi
+ 1
+
+
+
+
+ 0
+ .dll;.bpl
+
+
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+
+
+
+
+
+
+
+
+
+ True
+ False
+
+
+ 12
+
+
+
+
+
diff --git a/Delphi/GoogleSpeak.dproj.local b/Delphi/GoogleSpeak.dproj.local
new file mode 100644
index 0000000..40666e3
--- /dev/null
+++ b/Delphi/GoogleSpeak.dproj.local
@@ -0,0 +1,15 @@
+
+
+
+ 1899-12-30 00:00:00.000.592,C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\CRC32U.pas=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Unit1.pas
+ 1899-12-30 00:00:00.000.375,C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\GoogleSpeak.dproj=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Project24.dproj
+ 1899-12-30 00:00:00.000.320,C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\MainU.pas=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Unit28.pas
+ 1899-12-30 00:00:00.000.320,C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\MainU.dfm=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Unit28.dfm
+ 1899-12-30 00:00:00.000.851,=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Unit1.pas
+ 1899-12-30 00:00:00.000.192,=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Unit28.pas
+ 1899-12-30 00:00:00.000.318,C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\GoogleSpeakU.pas=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Unit1.pas
+ 1899-12-30 00:00:00.000.239,=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Unit1.pas
+ 2018-02-25 07:44:41.655,=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\Unit1.pas
+ 2018-02-25 07:44:58.969,C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\LanguagesU.pas=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\Unit1.pas
+
+
diff --git a/Delphi/GoogleSpeak.dsk b/Delphi/GoogleSpeak.dsk
new file mode 100644
index 0000000..ed619b9
--- /dev/null
+++ b/Delphi/GoogleSpeak.dsk
@@ -0,0 +1,802 @@
+[Closed Files]
+File_0=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\SOURCE\RTL\SYS\System.SysUtils.pas',0,1,288,3,313,0,0,,
+File_1=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\SOURCE\VCL\Vcl.MPlayer.pas',0,1,11,27,36,0,0,,{1
+File_2=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\SOURCE\VCL\Vcl.Controls.pas',0,1,1,6,9,0,0,,
+File_3=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\source\rtl\common\System.IOUtils.pas',0,1,853,120,878,0,0,,
+File_4=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\SOURCE\VCL\Vcl.Forms.pas',0,1,3740,1,3763,0,0,{{1729,4}
+File_5=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\source\rtl\win\Winapi.Windows.pas',0,1,8255,107,8281,0,0,,
+File_6=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Unit26.pas',0,1,1,90,39,0,0,,{1
+File_7=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\ClipBoardMonitorU.pas',0,1,1,75,24,0,0,,{1
+File_8=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\source\rtl\win\Winapi.Messages.pas',0,1,1130,5,1155,0,0,,
+File_9=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\HukoFtpU.pas',0,1,1,1,13,0,0,,
+File_10=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Unit23.pas',0,1,1,1,1,0,0,,
+File_11=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Unit22.pas',0,1,97,36,119,0,0,,{1
+File_12=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\QuestionPosterU.pas',0,1,60,63,60,0,0,,{1
+File_13=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\GoogleSpeakU.pas',0,1,1,30,66,0,0,,
+File_14=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\source\data\ado\Data.Win.ADODB.pas',0,1,2563,1,2591,0,0,,
+
+[Modules]
+Module0=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\MainU.pas
+Module1=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\LanguagesU.pas
+Module2=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\GoogleSpeakU.pas
+Count=3
+EditWindowCount=1
+
+[C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\MainU.pas]
+ModuleType=TSourceModule
+FormState=1
+FormOnTop=0
+
+[C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\LanguagesU.pas]
+ModuleType=TSourceModule
+FormState=0
+FormOnTop=0
+
+[C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\GoogleSpeakU.pas]
+ModuleType=TSourceModule
+FormState=0
+FormOnTop=0
+
+[EditWindow0]
+ViewCount=3
+CurrentEditView=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\MainU.pas
+View0=0
+View1=1
+View2=2
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=10000
+Height=9342
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=10000
+ClientHeight=9342
+DockedToMainForm=1
+BorlandEditorCodeExplorer=BorlandEditorCodeExplorer@EditWindow0
+TopPanelSize=0
+LeftPanelSize=0
+RightPanelSize=0
+BottomPanelSize=1550
+BottomPanelClients=DockSite1,MessageView
+BottomPanelData=0000080001020100000009000000446F636B5369746531803E000000000000020E060000000000000100000000803E00000F0000004D65737361676556696577466F726DFFFFFFFF
+BottomMiddlePanelSize=0
+BottomMiddlePanelClients=DockSite0,GraphDrawingModel
+BottomMiddelPanelData=0000080001020200000009000000446F636B536974653010000000477261706844726177696E67566965779F1D00000000000002F706000000000000FFFFFFFF
+
+[View0]
+CustomEditViewType=TEditView
+Module=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\MainU.pas
+CursorX=153
+CursorY=15
+TopLine=1
+LeftCol=1
+Elisions=
+Bookmarks=
+EditViewName=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\MainU.pas
+
+[View1]
+CustomEditViewType=TEditView
+Module=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\GoogleSpeakU.pas
+CursorX=111
+CursorY=38
+TopLine=19
+LeftCol=1
+Elisions=
+Bookmarks={1,102,3}{2,76,11}
+EditViewName=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\GoogleSpeakU.pas
+
+[View2]
+CustomEditViewType=TEditView
+Module=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\LanguagesU.pas
+CursorX=133
+CursorY=41
+TopLine=1
+LeftCol=1
+Elisions=
+Bookmarks={1,163,1}
+EditViewName=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\LanguagesU.pas
+
+[Watches]
+Count=0
+
+[WatchWindow]
+WatchColumnWidth=120
+WatchShowColumnHeaders=1
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1133
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1133
+TBDockHeight=217
+LRDockWidth=13604
+Dockable=1
+StayOnTop=0
+
+[Breakpoints]
+Count=0
+
+[EmbarcaderoWin32Debugger_AddressBreakpoints]
+Count=0
+
+[EmbarcaderoWin64Debugger_AddressBreakpoints]
+Count=0
+
+[EmbarcaderoAndroidDebugger_AddressBreakpoints]
+Count=0
+
+[Main Window]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=0
+State=2
+Left=146
+Top=275
+Width=8932
+Height=8525
+MaxLeft=-5
+MaxTop=-8
+MaxWidth=8932
+MaxHeight=8525
+ClientWidth=10000
+ClientHeight=9808
+BottomPanelSize=9342
+BottomPanelClients=EditWindow0
+BottomPanelData=0000080000000000000000000000000000000000000000000000000100000000000000000C0000004564697457696E646F775F30FFFFFFFF
+
+[ProjectManager]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=4050
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=4050
+TBDockHeight=5900
+LRDockWidth=2349
+Dockable=1
+StayOnTop=0
+
+[MessageView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=23
+Width=10000
+Height=1358
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=10000
+ClientHeight=1358
+TBDockHeight=1358
+LRDockWidth=2771
+Dockable=1
+StayOnTop=0
+
+[ToolForm]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=3825
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=3825
+TBDockHeight=7150
+LRDockWidth=2000
+Dockable=1
+StayOnTop=0
+
+[ClipboardHistory]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=0
+Top=0
+Width=1271
+Height=3717
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1188
+ClientHeight=3392
+TBDockHeight=3717
+LRDockWidth=1271
+Dockable=1
+StayOnTop=0
+
+[ProjectStatistics]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=0
+Top=0
+Width=1375
+Height=4275
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1292
+ClientHeight=3950
+TBDockHeight=4275
+LRDockWidth=1375
+Dockable=1
+StayOnTop=0
+
+[ClassBrowserTool]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=-3484
+Top=-217
+Width=1849
+Height=3142
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1849
+ClientHeight=3142
+TBDockHeight=3142
+LRDockWidth=1849
+Dockable=1
+StayOnTop=0
+
+[MetricsView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1250
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1250
+TBDockHeight=4833
+LRDockWidth=3562
+Dockable=1
+StayOnTop=0
+
+[QAView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1250
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1250
+TBDockHeight=4833
+LRDockWidth=3562
+Dockable=1
+StayOnTop=0
+
+[PropertyInspector]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=0
+State=0
+Left=10458
+Top=2017
+Width=1896
+Height=3875
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1812
+ClientHeight=3550
+TBDockHeight=7508
+LRDockWidth=1896
+Dockable=1
+StayOnTop=0
+SplitPos=106
+
+[PropInspDesignerSelection]
+ArrangeBy=Name
+SelectedItem=Action,
+ExpandedItems=Anchors=0,BorderIcons=0,Constraints=0,Font=0,GlassFrame=0,HorzScrollBar=0,LiveBindings=0,"LiveBindings Designer=0",Margins=0,Padding=0,StyleElements=0
+
+[frmDesignPreview]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=4050
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=4050
+TBDockHeight=5958
+LRDockWidth=2510
+Dockable=1
+StayOnTop=0
+
+[TFileExplorerForm]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=-2282
+Top=16
+Width=2844
+Height=6200
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2844
+ClientHeight=6200
+TBDockHeight=6200
+LRDockWidth=2844
+Dockable=1
+StayOnTop=0
+
+[TemplateView]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=-3464
+Top=282
+Width=276
+Height=358
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=276
+ClientHeight=358
+TBDockHeight=358
+LRDockWidth=276
+Dockable=1
+StayOnTop=0
+Name=120
+Description=334
+filter=1
+
+[DebugLogView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1133
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1133
+TBDockHeight=408
+LRDockWidth=4953
+Dockable=1
+StayOnTop=0
+
+[ThreadStatusWindow]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1133
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1133
+TBDockHeight=217
+LRDockWidth=7406
+Dockable=1
+StayOnTop=0
+Column0Width=145
+Column1Width=100
+Column2Width=115
+Column3Width=250
+
+[LocalVarsWindow]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1133
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1133
+TBDockHeight=1533
+LRDockWidth=3484
+Dockable=1
+StayOnTop=0
+
+[CallStackWindow]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1133
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1133
+TBDockHeight=2067
+LRDockWidth=3484
+Dockable=1
+StayOnTop=0
+
+[FindReferencsForm]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1017
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1017
+TBDockHeight=2317
+LRDockWidth=2823
+Dockable=1
+StayOnTop=0
+
+[RefactoringForm]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1250
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1250
+TBDockHeight=3208
+LRDockWidth=2823
+Dockable=1
+StayOnTop=0
+
+[ToDo List]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1250
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1250
+TBDockHeight=1158
+LRDockWidth=3677
+Dockable=1
+StayOnTop=0
+Column0Width=314
+Column1Width=30
+Column2Width=150
+Column3Width=172
+Column4Width=129
+SortOrder=4
+ShowHints=1
+ShowChecked=1
+
+[DataExplorerContainer]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=4050
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=4050
+TBDockHeight=4883
+LRDockWidth=7151
+Dockable=1
+StayOnTop=0
+
+[GraphDrawingModel]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=370
+Top=963
+Width=2854
+Height=3208
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2854
+ClientHeight=3208
+TBDockHeight=3208
+LRDockWidth=2854
+Dockable=1
+StayOnTop=0
+
+[BreakpointWindow]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1133
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1133
+TBDockHeight=1550
+LRDockWidth=8740
+Dockable=1
+StayOnTop=0
+Column0Width=200
+Column1Width=75
+Column2Width=200
+Column3Width=200
+Column4Width=200
+Column5Width=75
+Column6Width=75
+
+[StructureView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1812
+Height=3125
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1812
+ClientHeight=3125
+TBDockHeight=3675
+LRDockWidth=1896
+Dockable=1
+StayOnTop=0
+
+[TestInsightForm]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=0
+Top=0
+Width=2969
+Height=2733
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=2885
+ClientHeight=2408
+TBDockHeight=2733
+LRDockWidth=2969
+Dockable=1
+StayOnTop=0
+TabIndex=0
+
+[ModelViewTool]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=4050
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=4050
+TBDockHeight=4883
+LRDockWidth=5307
+Dockable=1
+StayOnTop=0
+
+[BorlandEditorCodeExplorer@EditWindow0]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=0
+Top=0
+Width=1823
+Height=6175
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1740
+ClientHeight=5850
+TBDockHeight=6175
+LRDockWidth=1823
+Dockable=1
+StayOnTop=0
+
+[DockHosts]
+DockHostCount=5
+
+[DockSite0]
+HostDockSite=DockBottomCenterPanel
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1475
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1475
+TBDockHeight=1475
+LRDockWidth=2339
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=RefactoringForm
+TabDockClients=RefactoringForm,FindReferencsForm,ToDo List,MetricsView,QAView
+
+[DockSite1]
+HostDockSite=DockBottomPanel
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=0
+Top=23
+Width=3823
+Height=1358
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1358
+TBDockHeight=1358
+LRDockWidth=3823
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=DebugLogView
+TabDockClients=DebugLogView,BreakpointWindow,ThreadStatusWindow,CallStackWindow,WatchWindow,LocalVarsWindow
+
+[DockSite2]
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=0
+State=0
+Left=12453
+Top=450
+Width=2000
+Height=4600
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1917
+ClientHeight=4275
+TBDockHeight=7508
+LRDockWidth=2000
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=ProjectManager
+TabDockClients=ProjectManager,ModelViewTool,DataExplorerContainer,frmDesignPreview,TFileExplorerForm
+
+[DockSite3]
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=0
+State=0
+Left=17302
+Top=1550
+Width=1896
+Height=3450
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1812
+ClientHeight=3125
+TBDockHeight=7508
+LRDockWidth=1896
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=StructureView
+TabDockClients=StructureView,ClassBrowserTool
+
+[DockSite4]
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=0
+State=0
+Left=15042
+Top=942
+Width=2000
+Height=4150
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1917
+ClientHeight=3825
+TBDockHeight=7508
+LRDockWidth=2000
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=ToolForm
+TabDockClients=ToolForm,TemplateView
+
diff --git a/Delphi/GoogleSpeak.identcache b/Delphi/GoogleSpeak.identcache
new file mode 100644
index 0000000..23b26b9
Binary files /dev/null and b/Delphi/GoogleSpeak.identcache differ
diff --git a/Delphi/GoogleSpeak.res b/Delphi/GoogleSpeak.res
new file mode 100644
index 0000000..20ba553
Binary files /dev/null and b/Delphi/GoogleSpeak.res differ
diff --git a/Delphi/GoogleSpeak.skincfg b/Delphi/GoogleSpeak.skincfg
new file mode 100644
index 0000000..c03ee5a
--- /dev/null
+++ b/Delphi/GoogleSpeak.skincfg
@@ -0,0 +1,55 @@
+[ExpressSkins]
+Default=1
+ShowNotifications=1
+Enabled=0
+dxSkinBlack=1
+dxSkinBlue=1
+dxSkinBlueprint=1
+dxSkinCaramel=1
+dxSkinCoffee=1
+dxSkinDarkRoom=1
+dxSkinDarkSide=1
+dxSkinDevExpressDarkStyle=1
+dxSkinDevExpressStyle=1
+dxSkinFoggy=1
+dxSkinGlassOceans=1
+dxSkinHighContrast=1
+dxSkiniMaginary=1
+dxSkinLilian=1
+dxSkinLiquidSky=1
+dxSkinLondonLiquidSky=1
+dxSkinMcSkin=1
+dxSkinMetropolis=1
+dxSkinMetropolisDark=1
+dxSkinMoneyTwins=1
+dxSkinOffice2007Black=1
+dxSkinOffice2007Blue=1
+dxSkinOffice2007Green=1
+dxSkinOffice2007Pink=1
+dxSkinOffice2007Silver=1
+dxSkinOffice2010Black=1
+dxSkinOffice2010Blue=1
+dxSkinOffice2010Silver=1
+dxSkinOffice2013DarkGray=1
+dxSkinOffice2013LightGray=1
+dxSkinOffice2013White=1
+dxSkinOffice2016Colorful=1
+dxSkinOffice2016Dark=1
+dxSkinPumpkin=1
+dxSkinSeven=1
+dxSkinSevenClassic=1
+dxSkinSharp=1
+dxSkinSharpPlus=1
+dxSkinSilver=1
+dxSkinSpringTime=1
+dxSkinStardust=1
+dxSkinSummer2008=1
+dxSkinTheAsphaltWorld=1
+dxSkinsDefaultPainters=1
+dxSkinValentine=1
+dxSkinVisualStudio2013Blue=1
+dxSkinVisualStudio2013Dark=1
+dxSkinVisualStudio2013Light=1
+dxSkinVS2010=1
+dxSkinWhiteprint=1
+dxSkinXmas2008Blue=1
diff --git a/Delphi/GoogleSpeak.stat b/Delphi/GoogleSpeak.stat
new file mode 100644
index 0000000..7505bf8
--- /dev/null
+++ b/Delphi/GoogleSpeak.stat
@@ -0,0 +1,10 @@
+[Stats]
+EditorSecs=1975
+DesignerSecs=8
+InspectorSecs=30
+CompileSecs=39015
+OtherSecs=56
+StartTime=24-02-2018 16:06:23
+RealKeys=0
+EffectiveKeys=0
+DebugSecs=163
diff --git a/Delphi/GoogleSpeak.~dsk b/Delphi/GoogleSpeak.~dsk
new file mode 100644
index 0000000..e748358
--- /dev/null
+++ b/Delphi/GoogleSpeak.~dsk
@@ -0,0 +1,779 @@
+[Closed Files]
+File_0=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\SOURCE\VCL\Vcl.MPlayer.pas',0,1,11,27,36,0,0,,{1
+File_1=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\SOURCE\VCL\Vcl.Controls.pas',0,1,1,6,9,0,0,,
+File_2=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\source\rtl\common\System.IOUtils.pas',0,1,853,120,878,0,0,,
+File_3=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\SOURCE\VCL\Vcl.Forms.pas',0,1,3740,1,3763,0,0,{{1729,4}
+File_4=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\SOURCE\RTL\SYS\System.SysUtils.pas',0,1,10763,25,10788,0,0,,
+File_5=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\source\rtl\win\Winapi.Windows.pas',0,1,8255,107,8281,0,0,,
+File_6=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Unit26.pas',0,1,1,90,39,0,0,,{1
+File_7=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\ClipBoardMonitorU.pas',0,1,1,75,24,0,0,,{1
+File_8=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\source\rtl\win\Winapi.Messages.pas',0,1,1130,5,1155,0,0,,
+File_9=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\HukoFtpU.pas',0,1,1,1,13,0,0,,
+File_10=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Unit23.pas',0,1,1,1,1,0,0,,
+File_11=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Unit22.pas',0,1,97,36,119,0,0,,{1
+File_12=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\QuestionPosterU.pas',0,1,60,63,60,0,0,,{1
+File_13=TSourceModule,'C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\GoogleSpeakU.pas',0,1,1,30,66,0,0,,
+File_14=TSourceModule,'c:\program files (x86)\embarcadero\studio\17.0\source\data\ado\Data.Win.ADODB.pas',0,1,2563,1,2591,0,0,,
+
+[Modules]
+Module0=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\GoogleSpeakU.pas
+Module1=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\MainU.pas
+Count=2
+EditWindowCount=1
+
+[C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\GoogleSpeakU.pas]
+ModuleType=TSourceModule
+FormState=0
+FormOnTop=0
+
+[C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\MainU.pas]
+ModuleType=TSourceModule
+FormState=1
+FormOnTop=0
+
+[EditWindow0]
+ViewCount=2
+CurrentEditView=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\GoogleSpeakU.pas
+View0=0
+View1=1
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=10000
+Height=9342
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=10000
+ClientHeight=9342
+DockedToMainForm=1
+BorlandEditorCodeExplorer=BorlandEditorCodeExplorer@EditWindow0
+TopPanelSize=0
+LeftPanelSize=0
+RightPanelSize=0
+BottomPanelSize=1550
+BottomPanelClients=DockSite1,MessageView
+BottomPanelData=0000080001020100000009000000446F636B5369746531803E000000000000020E060000000000000100000000803E00000F0000004D65737361676556696577466F726DFFFFFFFF
+BottomMiddlePanelSize=0
+BottomMiddlePanelClients=DockSite0,GraphDrawingModel
+BottomMiddelPanelData=0000080001020200000009000000446F636B536974653010000000477261706844726177696E67566965779F1D00000000000002F706000000000000FFFFFFFF
+
+[View0]
+CustomEditViewType=TEditView
+Module=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\MainU.pas
+CursorX=1
+CursorY=30
+TopLine=1
+LeftCol=1
+Elisions=
+Bookmarks=
+EditViewName=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\MainU.pas
+
+[View1]
+CustomEditViewType=TEditView
+Module=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\GoogleSpeakU.pas
+CursorX=44
+CursorY=58
+TopLine=19
+LeftCol=1
+Elisions=
+Bookmarks={1,72,1}{2,69,11}
+EditViewName=C:\Users\Jens Borrisholt\Documents\Embarcadero\Studio\Projects\Google Speak\Delphi\GoogleSpeakU.pas
+
+[Watches]
+Count=0
+
+[WatchWindow]
+WatchColumnWidth=120
+WatchShowColumnHeaders=1
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1192
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1192
+TBDockHeight=217
+LRDockWidth=13604
+Dockable=1
+StayOnTop=0
+
+[Breakpoints]
+Count=0
+
+[EmbarcaderoWin32Debugger_AddressBreakpoints]
+Count=0
+
+[EmbarcaderoWin64Debugger_AddressBreakpoints]
+Count=0
+
+[EmbarcaderoAndroidDebugger_AddressBreakpoints]
+Count=0
+
+[Main Window]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=0
+State=2
+Left=8797
+Top=3875
+Width=8932
+Height=8525
+MaxLeft=-5
+MaxTop=-8
+MaxWidth=8932
+MaxHeight=8525
+ClientWidth=10000
+ClientHeight=9808
+BottomPanelSize=9342
+BottomPanelClients=EditWindow0
+BottomPanelData=0000080000000000000000000000000000000000000000000000000100000000000000000C0000004564697457696E646F775F30FFFFFFFF
+
+[ProjectManager]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=4050
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=4050
+TBDockHeight=5900
+LRDockWidth=2349
+Dockable=1
+StayOnTop=0
+
+[MessageView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=23
+Width=10000
+Height=1358
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=10000
+ClientHeight=1358
+TBDockHeight=1358
+LRDockWidth=2771
+Dockable=1
+StayOnTop=0
+
+[ToolForm]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=3825
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=3825
+TBDockHeight=7150
+LRDockWidth=2000
+Dockable=1
+StayOnTop=0
+
+[ClipboardHistory]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=0
+Top=0
+Width=1271
+Height=3717
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1188
+ClientHeight=3392
+TBDockHeight=3717
+LRDockWidth=1271
+Dockable=1
+StayOnTop=0
+
+[ProjectStatistics]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=0
+Top=0
+Width=1375
+Height=4275
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1292
+ClientHeight=3950
+TBDockHeight=4275
+LRDockWidth=1375
+Dockable=1
+StayOnTop=0
+
+[ClassBrowserTool]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=-8
+Top=-31
+Width=1849
+Height=3142
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1849
+ClientHeight=3142
+TBDockHeight=3142
+LRDockWidth=1849
+Dockable=1
+StayOnTop=0
+
+[MetricsView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1250
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1250
+TBDockHeight=4833
+LRDockWidth=3562
+Dockable=1
+StayOnTop=0
+
+[QAView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1250
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1250
+TBDockHeight=4833
+LRDockWidth=3562
+Dockable=1
+StayOnTop=0
+
+[PropertyInspector]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=10458
+Top=2017
+Width=1896
+Height=3875
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1812
+ClientHeight=3550
+TBDockHeight=7508
+LRDockWidth=1896
+Dockable=1
+StayOnTop=0
+SplitPos=106
+
+[frmDesignPreview]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=4050
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=4050
+TBDockHeight=5958
+LRDockWidth=2510
+Dockable=1
+StayOnTop=0
+
+[TFileExplorerForm]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=-8
+Top=-31
+Width=2844
+Height=6200
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2844
+ClientHeight=6200
+TBDockHeight=6200
+LRDockWidth=2844
+Dockable=1
+StayOnTop=0
+
+[TemplateView]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=-8
+Top=-31
+Width=276
+Height=358
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=276
+ClientHeight=358
+TBDockHeight=358
+LRDockWidth=276
+Dockable=1
+StayOnTop=0
+Name=120
+Description=334
+filter=1
+
+[DebugLogView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1192
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1192
+TBDockHeight=408
+LRDockWidth=4953
+Dockable=1
+StayOnTop=0
+
+[ThreadStatusWindow]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1192
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1192
+TBDockHeight=217
+LRDockWidth=7406
+Dockable=1
+StayOnTop=0
+Column0Width=145
+Column1Width=100
+Column2Width=115
+Column3Width=250
+
+[LocalVarsWindow]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1192
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1192
+TBDockHeight=1533
+LRDockWidth=3484
+Dockable=1
+StayOnTop=0
+
+[CallStackWindow]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1192
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1192
+TBDockHeight=2067
+LRDockWidth=3484
+Dockable=1
+StayOnTop=0
+
+[FindReferencsForm]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1250
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1250
+TBDockHeight=2317
+LRDockWidth=2823
+Dockable=1
+StayOnTop=0
+
+[RefactoringForm]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1250
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1250
+TBDockHeight=3208
+LRDockWidth=2823
+Dockable=1
+StayOnTop=0
+
+[ToDo List]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1250
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1250
+TBDockHeight=1158
+LRDockWidth=3677
+Dockable=1
+StayOnTop=0
+Column0Width=314
+Column1Width=30
+Column2Width=150
+Column3Width=172
+Column4Width=129
+SortOrder=4
+ShowHints=1
+ShowChecked=1
+
+[DataExplorerContainer]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=4050
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=4050
+TBDockHeight=4883
+LRDockWidth=7151
+Dockable=1
+StayOnTop=0
+
+[GraphDrawingModel]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2854
+Height=3208
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2854
+ClientHeight=3208
+TBDockHeight=3208
+LRDockWidth=2854
+Dockable=1
+StayOnTop=0
+
+[BreakpointWindow]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1192
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1192
+TBDockHeight=1550
+LRDockWidth=8740
+Dockable=1
+StayOnTop=0
+Column0Width=200
+Column1Width=75
+Column2Width=200
+Column3Width=200
+Column4Width=200
+Column5Width=75
+Column6Width=75
+
+[StructureView]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1812
+Height=3125
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1812
+ClientHeight=3125
+TBDockHeight=3675
+LRDockWidth=1896
+Dockable=1
+StayOnTop=0
+
+[TestInsightForm]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=0
+Top=0
+Width=2969
+Height=2733
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=2885
+ClientHeight=2408
+TBDockHeight=2733
+LRDockWidth=2969
+Dockable=1
+StayOnTop=0
+TabIndex=0
+
+[ModelViewTool]
+PercentageSizes=1
+Create=1
+Visible=1
+Docked=1
+State=0
+Left=0
+Top=0
+Width=1917
+Height=4050
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=1917
+ClientHeight=4050
+TBDockHeight=4883
+LRDockWidth=5307
+Dockable=1
+StayOnTop=0
+
+[BorlandEditorCodeExplorer@EditWindow0]
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=0
+Top=0
+Width=1823
+Height=6175
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1740
+ClientHeight=5850
+TBDockHeight=6175
+LRDockWidth=1823
+Dockable=1
+StayOnTop=0
+
+[DockHosts]
+DockHostCount=5
+
+[DockSite0]
+HostDockSite=DockBottomCenterPanel
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=0
+Top=0
+Width=2339
+Height=1475
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=2339
+ClientHeight=1475
+TBDockHeight=1475
+LRDockWidth=2339
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=RefactoringForm
+TabDockClients=RefactoringForm,FindReferencsForm,ToDo List,MetricsView,QAView
+
+[DockSite1]
+HostDockSite=DockBottomPanel
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=1
+State=0
+Left=0
+Top=0
+Width=3823
+Height=1417
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=3823
+ClientHeight=1417
+TBDockHeight=1417
+LRDockWidth=3823
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=DebugLogView
+TabDockClients=DebugLogView,BreakpointWindow,ThreadStatusWindow,CallStackWindow,WatchWindow,LocalVarsWindow
+
+[DockSite2]
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=12453
+Top=450
+Width=2000
+Height=4600
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1917
+ClientHeight=4275
+TBDockHeight=7508
+LRDockWidth=2000
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=ProjectManager
+TabDockClients=ProjectManager,ModelViewTool,DataExplorerContainer,frmDesignPreview,TFileExplorerForm
+
+[DockSite3]
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=17302
+Top=1550
+Width=1896
+Height=3450
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1812
+ClientHeight=3125
+TBDockHeight=7508
+LRDockWidth=1896
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=StructureView
+TabDockClients=StructureView,ClassBrowserTool
+
+[DockSite4]
+DockSiteType=1
+PercentageSizes=1
+Create=1
+Visible=0
+Docked=0
+State=0
+Left=15042
+Top=942
+Width=2000
+Height=4150
+MaxLeft=-5
+MaxTop=-8
+ClientWidth=1917
+ClientHeight=3825
+TBDockHeight=7508
+LRDockWidth=2000
+Dockable=1
+StayOnTop=0
+TabPosition=1
+ActiveTabID=ToolForm
+TabDockClients=ToolForm,TemplateView
+
diff --git a/Delphi/GoogleSpeakU.pas b/Delphi/GoogleSpeakU.pas
new file mode 100644
index 0000000..ac82e7a
--- /dev/null
+++ b/Delphi/GoogleSpeakU.pas
@@ -0,0 +1,108 @@
+unit GoogleSpeakU;
+
+interface
+
+uses
+ System.Classes, System.SysUtils, VCL.Forms, VCL.MPlayer, VCL.Controls, LanguagesU;
+{$M+}
+
+type
+ TGoogleSpeak = class(TComponent)
+ private
+ FMediaPlayer: TMediaPlayer;
+ FUseCache: Boolean;
+ FDownloadFolder: string;
+ FBuffer: TStringlist;
+ FLanguage: TLanguage;
+ procedure SayNext;
+ procedure MediaPlayerNotify(Sender: TObject);
+ function DownloadFile(aText: String; aLanguage: TLanguage): string;
+ published
+ property Language: TLanguage read FLanguage write FLanguage;
+ public
+ constructor Create(AOwner: TWinControl; AUseCache: Boolean = True; aLanguageCode: string = 'da'); reintroduce;
+ destructor Destroy; override;
+ procedure Say(aText: String; aLanguage: TLanguage = nil); overload;
+ procedure Say(aText: String; aLanguageCode: string); overload;
+ end;
+
+implementation
+
+uses
+ System.Types, System.IOUtils,
+ IdURI, UrlMon, CRC32U;
+
+{ TGoogleSpeak }
+
+constructor TGoogleSpeak.Create(AOwner: TWinControl; AUseCache: Boolean; aLanguageCode: string);
+begin
+ inherited Create(AOwner);
+ FUseCache := AUseCache;
+ FDownloadFolder := ExtractFilePath(ParamStr(0)) + 'Cache\';
+ ForceDirectories(FDownloadFolder);
+
+ FBuffer := TStringlist.Create;
+ FMediaPlayer := TMediaPlayer.Create(self);
+ FMediaPlayer.OnNotify := MediaPlayerNotify;
+
+ FMediaPlayer.Parent := AOwner;
+ FMediaPlayer.Visible := False;
+ FLanguage := TLanguages.FromCode(aLanguageCode);
+end;
+
+destructor TGoogleSpeak.Destroy;
+begin
+ FBuffer.Free;
+ if not FUseCache then
+ TDirectory.Delete(FDownloadFolder);
+ inherited;
+end;
+
+function TGoogleSpeak.DownloadFile(aText: String; aLanguage: TLanguage): string;
+var
+ Url: String;
+begin
+ Url := 'https://translate.googleapis.com/translate_tts?ie=UTF-8&q=' + TIdURI.PathEncode(aText) + '&tl=' + aLanguage.Code + '&total=1&idx=0&textlen=' + aText.Length.ToString + '&client=gtx';
+ Result := FDownloadFolder + TCrc32.Hash(aText).ToString + '.mp3';
+
+ if (FUseCache and TFile.Exists(Result)) then
+ exit;
+
+ URLDownloadToFile(nil, pchar(Url), pchar(Result), 0, nil);
+end;
+
+procedure TGoogleSpeak.MediaPlayerNotify(Sender: TObject);
+begin
+ SayNext;
+end;
+
+procedure TGoogleSpeak.Say(aText: String; aLanguage: TLanguage = nil);
+begin
+ if aLanguage = nil then
+ aLanguage := FLanguage;
+
+ FBuffer.AddObject(aText, aLanguage);
+ if not(FMediaPlayer.Mode in [TMPModes.mpPlaying, TMPModes.mpSeeking, TMPModes.mpPaused]) then
+ SayNext;
+end;
+
+procedure TGoogleSpeak.Say(aText, aLanguageCode: string);
+var
+ Language : TLanguage;
+begin
+ Language := TLanguages.FromCode(aLanguageCode);
+ Say(aText, Language);
+end;
+
+procedure TGoogleSpeak.SayNext;
+begin
+ if FBuffer.Count = 0 then
+ exit;
+
+ FMediaPlayer.FileName := DownloadFile(FBuffer[0], TLanguage(FBuffer.Objects[0]));
+ FBuffer.Delete(0);
+ FMediaPlayer.Open;
+ FMediaPlayer.Play;
+end;
+
+end.
diff --git a/Delphi/LanguagesU.pas b/Delphi/LanguagesU.pas
new file mode 100644
index 0000000..410d529
--- /dev/null
+++ b/Delphi/LanguagesU.pas
@@ -0,0 +1,175 @@
+unit LanguagesU;
+
+interface
+
+uses
+ System.Generics.Collections;
+
+type
+ TLanguage = class
+ Code: string;
+ Name: string;
+ private
+ constructor Create(aName, aCode: string);
+ end;
+
+ TLanguages = class
+ private
+ class var FList: TObjectList;
+ public
+ class constructor Create;
+ class destructor Destroy;
+ class property List: TObjectList read FList;
+ class function FromCode(aCode: String): TLanguage;
+ class function FromName(aName: String): TLanguage;
+ end;
+
+implementation
+
+{ TLanguages }
+
+class constructor TLanguages.Create;
+begin
+ FList := TObjectList.Create;
+ FList.Add(TLanguage.Create('Afrikaans', 'af'));
+ FList.Add(TLanguage.Create('Albanian', 'sq'));
+ FList.Add(TLanguage.Create('Amharic', 'am'));
+ FList.Add(TLanguage.Create('Arabic', 'ar'));
+ FList.Add(TLanguage.Create('Armenian', 'hy'));
+ FList.Add(TLanguage.Create('Azeerbaijani', 'az'));
+ FList.Add(TLanguage.Create('Basque', 'eu'));
+ FList.Add(TLanguage.Create('Belarusian', 'be'));
+ FList.Add(TLanguage.Create('Bengali', 'bn'));
+ FList.Add(TLanguage.Create('Bosnian', 'bs'));
+ FList.Add(TLanguage.Create('Bulgarian', 'bg'));
+ FList.Add(TLanguage.Create('Catalan', 'ca'));
+ FList.Add(TLanguage.Create('Cebuano', 'ceb (ISO-639-2)'));
+ FList.Add(TLanguage.Create('Chinese (Simplified)', 'zh-CN'));
+ FList.Add(TLanguage.Create('Chinese (Traditional)', 'zh-TW'));
+ FList.Add(TLanguage.Create('Corsican', 'co'));
+ FList.Add(TLanguage.Create('Croatian', 'hr'));
+ FList.Add(TLanguage.Create('Czech', 'cs'));
+ FList.Add(TLanguage.Create('Danish', 'da'));
+ FList.Add(TLanguage.Create('Dutch', 'nl'));
+ FList.Add(TLanguage.Create('English', 'en'));
+ FList.Add(TLanguage.Create('Esperanto', 'eo'));
+ FList.Add(TLanguage.Create('Estonian', 'et'));
+ FList.Add(TLanguage.Create('Finnish', 'fi'));
+ FList.Add(TLanguage.Create('French', 'fr'));
+ FList.Add(TLanguage.Create('Frisian', 'fy'));
+ FList.Add(TLanguage.Create('Galician', 'gl'));
+ FList.Add(TLanguage.Create('Georgian', 'ka'));
+ FList.Add(TLanguage.Create('German', 'de'));
+ FList.Add(TLanguage.Create('Greek', 'el'));
+ FList.Add(TLanguage.Create('Gujarati', 'gu'));
+ FList.Add(TLanguage.Create('Haitian Creole', 'ht'));
+ FList.Add(TLanguage.Create('Hausa', 'ha'));
+ FList.Add(TLanguage.Create('Hawaiian', 'haw'));
+ FList.Add(TLanguage.Create('Hebrew', 'iw'));
+ FList.Add(TLanguage.Create('Hindi', 'hi'));
+ FList.Add(TLanguage.Create('Hmong', 'hmn'));
+ FList.Add(TLanguage.Create('Hungarian', 'hu'));
+ FList.Add(TLanguage.Create('Icelandic', 'is'));
+ FList.Add(TLanguage.Create('Igbo', 'ig'));
+ FList.Add(TLanguage.Create('Indonesian', 'id'));
+ FList.Add(TLanguage.Create('Irish', 'ga'));
+ FList.Add(TLanguage.Create('Italian', 'it'));
+ FList.Add(TLanguage.Create('Japanese', 'ja'));
+ FList.Add(TLanguage.Create('Javanese', 'jw'));
+ FList.Add(TLanguage.Create('Kannada', 'kn'));
+ FList.Add(TLanguage.Create('Kazakh', 'kk'));
+ FList.Add(TLanguage.Create('Khmer', 'km'));
+ FList.Add(TLanguage.Create('Korean', 'ko'));
+ FList.Add(TLanguage.Create('Kurdish', 'ku'));
+ FList.Add(TLanguage.Create('Kyrgyz', 'ky'));
+ FList.Add(TLanguage.Create('Lao', 'lo'));
+ FList.Add(TLanguage.Create('Latin', 'la'));
+ FList.Add(TLanguage.Create('Latvian', 'lv'));
+ FList.Add(TLanguage.Create('Lithuanian', 'lt'));
+ FList.Add(TLanguage.Create('Luxembourgish', 'lb'));
+ FList.Add(TLanguage.Create('Macedonian', 'mk'));
+ FList.Add(TLanguage.Create('Malagasy', 'mg'));
+ FList.Add(TLanguage.Create('Malay', 'ms'));
+ FList.Add(TLanguage.Create('Malayalam', 'ml'));
+ FList.Add(TLanguage.Create('Maltese', 'mt'));
+ FList.Add(TLanguage.Create('Maori', 'mi'));
+ FList.Add(TLanguage.Create('Marathi', 'mr'));
+ FList.Add(TLanguage.Create('Mongolian', 'mn'));
+ FList.Add(TLanguage.Create('Myanmar (Burmese)', 'my'));
+ FList.Add(TLanguage.Create('Nepali', 'ne'));
+ FList.Add(TLanguage.Create('Norwegian', 'no'));
+ FList.Add(TLanguage.Create('Nyanja (Chichewa)', 'ny'));
+ FList.Add(TLanguage.Create('Pashto', 'ps'));
+ FList.Add(TLanguage.Create('Persian', 'fa'));
+ FList.Add(TLanguage.Create('Polish', 'pl'));
+ FList.Add(TLanguage.Create('Portuguese (Portugal, Brazil)', 'pt'));
+ FList.Add(TLanguage.Create('Punjabi', 'pa'));
+ FList.Add(TLanguage.Create('Romanian', 'ro'));
+ FList.Add(TLanguage.Create('Russian', 'ru'));
+ FList.Add(TLanguage.Create('Samoan', 'sm'));
+ FList.Add(TLanguage.Create('Scots Gaelic', 'gd'));
+ FList.Add(TLanguage.Create('Serbian', 'sr'));
+ FList.Add(TLanguage.Create('Sesotho', 'st'));
+ FList.Add(TLanguage.Create('Shona', 'sn'));
+ FList.Add(TLanguage.Create('Sindhi', 'sd'));
+ FList.Add(TLanguage.Create('Sinhala (Sinhalese)', 'si'));
+ FList.Add(TLanguage.Create('Slovak', 'sk'));
+ FList.Add(TLanguage.Create('Slovenian', 'sl'));
+ FList.Add(TLanguage.Create('Somali', 'so'));
+ FList.Add(TLanguage.Create('Spanish', 'es'));
+ FList.Add(TLanguage.Create('Sundanese', 'su'));
+ FList.Add(TLanguage.Create('Swahili', 'sw'));
+ FList.Add(TLanguage.Create('Swedish', 'sv'));
+ FList.Add(TLanguage.Create('Tagalog (Filipino)', 'tl'));
+ FList.Add(TLanguage.Create('Tajik', 'tg'));
+ FList.Add(TLanguage.Create('Tamil', 'ta'));
+ FList.Add(TLanguage.Create('Telugu', 'te'));
+ FList.Add(TLanguage.Create('Thai', 'th'));
+ FList.Add(TLanguage.Create('Turkish', 'tr'));
+ FList.Add(TLanguage.Create('Ukrainian', 'uk'));
+ FList.Add(TLanguage.Create('Urdu', 'ur'));
+ FList.Add(TLanguage.Create('Uzbek', 'uz'));
+ FList.Add(TLanguage.Create('Vietnamese', 'vi'));
+ FList.Add(TLanguage.Create('Welsh', 'cy'));
+ FList.Add(TLanguage.Create('Xhosa', 'xh'));
+ FList.Add(TLanguage.Create('Yiddish', 'yi'));
+ FList.Add(TLanguage.Create('Yoruba', 'yo'));
+ FList.Add(TLanguage.Create('Zulu', 'zu'));
+end;
+
+class destructor TLanguages.Destroy;
+begin
+ FList.Free;
+end;
+
+class function TLanguages.FromCode(aCode: String): TLanguage;
+var
+ Language: TLanguage;
+begin
+ for Language in FList do
+ if Language.Code = aCode then
+ exit(Language);
+
+ exit(nil);
+end;
+
+class function TLanguages.FromName(aName: String): TLanguage;
+var
+ Language: TLanguage;
+begin
+ for Language in FList do
+ if Language.Name = aName then
+ exit(Language);
+
+ exit(nil);
+end;
+
+{ TLanguage }
+
+constructor TLanguage.Create(aName, aCode: string);
+begin
+ Code := aCode;
+ Name := aName;
+end;
+
+end.
diff --git a/Delphi/MainU.dfm b/Delphi/MainU.dfm
new file mode 100644
index 0000000..971791e
--- /dev/null
+++ b/Delphi/MainU.dfm
@@ -0,0 +1,17 @@
+object FormMain: TFormMain
+ Left = 0
+ Top = 0
+ Caption = 'Demo'
+ ClientHeight = 336
+ ClientWidth = 635
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+end
diff --git a/Delphi/MainU.pas b/Delphi/MainU.pas
new file mode 100644
index 0000000..2ac38d3
--- /dev/null
+++ b/Delphi/MainU.pas
@@ -0,0 +1,35 @@
+unit MainU;
+
+interface
+
+uses
+ Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
+ Vcl.Controls, Vcl.Forms, Vcl.Dialogs, GoogleSpeakU;
+
+type
+ TFormMain = class(TForm)
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ FormMain: TFormMain;
+
+implementation
+
+{$R *.dfm}
+
+procedure TFormMain.FormCreate(Sender: TObject);
+begin
+ with TGoogleSpeak.Create(Self) do
+ begin
+ Say('Her er en hest');
+ Say('og en hest mere');
+ Say('and yet another one', 'en');
+ end;
+end;
+
+end.