/// <summary> /// Translates a local language to another language /// </summary> /// <param name="sourceLanguage">The language to be translated</param> /// <param name="toLanguage">The language to translate to</param> /// <param name="translator">The translator to use</param> public string[] AddOnlineLanguage(Language sourceLanguage, CultureInfo toLanguage, IOnlineTranslator translator) { // If the decoder selected is embbeded, throw exception if (Decoder is EmbbededLanguageDecoder) { throw new Exception("This feature is not available using the EmbbededLanguage decoder."); } // If the source language is not installed, throw exception if (!GetInstalledLanguages().Contains(sourceLanguage)) { throw new LanguageNotFoundException($"Language {sourceLanguage.Code} not found."); } // Get the language file if (!File.Exists(sourceLanguage.Location)) { throw new FileNotFoundException("Language file not found."); } // Get entries var entries = LanguageManager.LoadLanguageEntries(sourceLanguage.Code, Decoder); var translatedEntries = new Dictionary <string, string>(); // Create a dictionary to store translated entries var translationFailed = new List <string>(); // List to store the keys that could not be translated // Foreach entry... foreach (var entry in entries) { // Translate the text string translated = translator.TranslateText(entry.Value, sourceLanguage.GetCulture(), toLanguage); // Add if failed if (string.IsNullOrWhiteSpace(translated)) { translationFailed.Add(entry.Key); } // Add to translated entries translatedEntries.Add(entry.Key, translated.Replace('"', '\'')); } // Write to a file string path = Path.Combine((Decoder as PhysicalFileDecoder).Path, $"{toLanguage.Name}{LANG_FILE_EXTENSION}"); using (var fs = new FileStream(path, FileMode.Create)) using (var writer = new StreamWriter(fs)) { // Write each entry into the file foreach (var entry in translatedEntries) { writer.WriteLine($"{entry.Key}={entry.Value}"); } } // Create a new language Language lang = new Language(toLanguage.Name, path); // Add it LanguageManager.AddLanguage(lang); // Return failed translations as array return(translationFailed.ToArray()); }