/// <summary>
        /// Translate to the specified single language
        /// </summary>
        /// <param name="request">Translation Request</param>
        /// <returns>Translation Entry</returns>
        public TranslationEntry Translate(TranslationRequest request)
        {
            string procName = "usp_TranslateUsingCache";

            SqlParameter[] cmdParms = new SqlParameter[]{
                new SqlParameter("@EntryText", SqlDbType.NVarChar),
                new SqlParameter("@LangFromID", SqlDbType.Int),
                new SqlParameter("@LangToID", SqlDbType.Int)
            };

            cmdParms[0].Value = request.TransText;
            cmdParms[1].Value = request.LangFromID;
            cmdParms[2].Value = request.LangToID;

            try
            {
                SqlDataReader sdr = SQLHelper.ExecuteDataReader(connnectionString, CommandType.StoredProcedure, procName, cmdParms);
                TranslationEntry entry = null;
                if (sdr.Read() && !String.IsNullOrEmpty(sdr["TranslationText"].ToString().Trim()))
                {
                    entry = new TranslationEntry();
                    entry.EntryID = Convert.ToInt32(sdr["EntryID"]);
                    entry.LangFromID = Convert.ToInt32(sdr["LangFromID"]);
                    entry.LangToID = Convert.ToInt32(sdr["LangToID"]);
                    entry.TranslationText = sdr["TranslationText"].ToString();
                    if (entry.EntryID > 0)
                    {
                        entry.SourceID = Convert.ToInt32(sdr["SourceID"]);
                        entry.DateCreated = Convert.ToDateTime(sdr["DateCreated"]);
                    }
                }
                return entry;
            }
            catch (SqlException ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// The Main Translate Function, First translate from DataBase, if result is null then translate from Bing
        /// </summary>
        /// <param name="translationRequest">Translation Request</param>
        /// <returns>Translation Result</returns>
        public TranslationResult Translate(TranslationRequest translationRequest)
        {
            if (String.IsNullOrEmpty(translationRequest.TransText))
                throw new ArgumentNullException();

            try
            {
                TranslationResult transResult = null;
                if (IsAccessDB && !ConfigSetting.OnlyTranslateFromBing)
                {
                    //TranslationSource.ProcessSourceList //do later.
                    transResult = TranslateUsingDataBase(translationRequest);
                    if (transResult == null)
                    {
                        if (translationRequest.LangFrom == "psps")
                        {
                            translationRequest.DetectLanguage = Detect(translationRequest.TransText);
                            translationRequest.LangFrom = translationRequest.DetectLanguage;
                        }
                        transResult = TranslateUsingBing(translationRequest);

                    }
                }
                else
                {
                    transResult = TranslateUsingBing(translationRequest);
                }
                return transResult;
            }
            catch (SqlException sqlex)
            {
                throw sqlex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Translate to Multi languages
        /// </summary>
        /// <param name="request">Translation Request</param>
        /// <returns>The DateSet with multi languages</returns>
        public DataSet TranslateMulti(TranslationRequest request)
        {
            string procName = "usp_TranslateMultipleLanguages";
            SqlParameter[] cmdParms = new SqlParameter[]{
                new SqlParameter("@InputString", SqlDbType.NVarChar),
                new SqlParameter("@FromLangID", SqlDbType.Int)
            };

            cmdParms[0].Value = request.TransText;
            cmdParms[1].Value = request.LangFromID;

            try
            {
                return SQLHelper.ExecuteDataSet(connnectionString, CommandType.StoredProcedure, procName, cmdParms);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
        }
        private TranslationResult TranslateFromBing(TranslationRequest translationRequest)
        {
            string fromLang = translationRequest.LangFrom;
            string toLang = translationRequest.LangTo;

            //As to match with SCCM (SCCM contains "PTB" and "PTG", but Bing only contains "PTG") , so "ptb" is manual added in DataBae Languages table.
            //Only translate with "pt" by Bing, no matter what user choose "ptb" or "pt". If translate Using DataBase, the language will be base on user choosed.
            fromLang = fromLang == "ptb" ? "pt" : fromLang;
            toLang = toLang == "ptb" ? "pt" : toLang;

            string translation = _transClient.Translate(appId, translationRequest.TransText, fromLang, toLang, contentType, category);

            TranslationResult transResult = new TranslationResult()
            {
                SourceTransText = translationRequest.SourceTransText,
                TranslationText = translation,
                DetectLanguage = translationRequest.DetectLanguage,
                LangFromID = translationRequest.LangFromID,
                LangToID = translationRequest.LangToID,
                AccountID = TranslatorServiceClient.Account.AccountID,
                WhereFrom = TranslationSourceEnum.BingWeb.ToString()
            };

            if (IsAccessDB == true && !ConfigSetting.OnlyTranslateFromBing && fromLang != toLang && transResult.SourceTransText != transResult.TranslationText && translationRequest.TransText.Length <= 256) // 256 match with 'TranslationEntries' table's 'EntryText' column's size
            {
                int entryId = trans.AddResult(transResult);//Add Result to DataBase
                AddLog(entryId, false);
            }

            return transResult;
        }
 /// <summary>
 /// The Main Multi Languages Translate Function
 /// </summary>
 /// <param name="translationRequest">Translation Request</param>
 /// <returns>The DataTable with multi languages</returns>
 public DataTable TranslateMulti(TranslationRequest translationRequest)
 {
     try
     {
         return trans.TranslateMulti(translationRequest).Tables[0];
     }
     catch (Exception ex) { throw ex; }
 }
 private TranslationResult TranslateText(TranslationRequest translationRequest)
 {
     try
     {
         return TranslateFromBing(translationRequest);
     }
     catch (SqlException sqlex)
     {
         throw sqlex;
     }
     catch (Exception ex)
     {
         string msg = FilterExceptionMessage(ex.Message);
         if (msg != "")
         {
             throw new ArgumentException(msg);
         }
         else
         {
             CheckTranslatorServiceClient();
             return TranslateFromBing(translationRequest);
         }
     }
 }
        private TranslationResult TranslateUsingBing(TranslationRequest translationRequest)
        {
            string transText = FilterHotKeyChar(translationRequest.TransText);
            translationRequest.TransText = transText;

            if (String.IsNullOrEmpty(transText))
                throw new ArgumentNullException();
            if (transText.Length > maxStringLength)
                throw new ArgumentException("'Translate From' must be less than '" + maxStringLength + "' characters.");
            try
            {
                CheckTranslatorServiceClient();
                return TranslateText(translationRequest);
            }
            catch (InvalidOperationException ioex)
            {
                throw ioex;
            }
            catch (SqlException sqlex)
            {
                throw sqlex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private TranslationResult TranslateUsingDataBase(TranslationRequest translationRequest)
        {
            TranslationResult transResult = null;
            try
            {
                TranslationEntry entry = trans.Translate(translationRequest);
                if (entry != null && !String.IsNullOrEmpty(entry.TranslationText.Trim()))
                {
                    AddLog(entry.EntryID, true);

                    transResult = new TranslationResult()
                    {
                        SourceTransText = translationRequest.SourceTransText.Replace("]A;", "\n"),
                        TranslationText = entry.TranslationText,
                        DetectLanguage = translationRequest.DetectLanguage,
                        LangFromID = translationRequest.LangFromID,
                        LangToID = translationRequest.LangToID,
                        AccountID = TranslatorServiceClient.Account.AccountID,
                        WhereFrom = entry.EntryID > 0 ? Enum.Parse(typeof(TranslationSourceEnum), entry.SourceID.ToString()).ToString() : TranslationSourceEnum.BingWeb.ToString()
                    };
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return transResult;
        }
        /// <summary>
        /// Translate for Multi Languages
        /// </summary>
        private void tabLanguages_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.OriginalSource is TabControl)
            {
                if (tabLanguages.SelectedIndex == 1 && transManage.IsAccessDB == true)
                {
                    string transText = txtTransTextFrom.Text;
                    if (transText.Trim().Length > 0)
                    {

                        string fromLanguage = GetFromLanguage();
                        string toLanguage = GetToLanguage();
                        string detectLanguage = "";
                        BackgroundWorker worker = new BackgroundWorker();
                        worker.DoWork += (o, ea) =>
                        {
                            try
                            {
                                if (String.IsNullOrEmpty(fromLanguage))
                                {
                                    detectLanguage = transManage.Detect(transText);
                                    fromLanguage = detectLanguage;
                                }

                                TranslationRequest request = new TranslationRequest(
                                                             fromLanguage,
                                                             toLanguage,
                                                             TranslationManage.languages[fromLanguage].LanguageID,
                                                             TranslationManage.languages[toLanguage].LanguageID,
                                                             transText,
                                                             transText,
                                                             detectLanguage);

                                Dispatcher.Invoke(new Action(() => gvList.ItemsSource = transManage.TranslateMulti(request).DefaultView));
                                SetAutoDetectedLanguageName(cboFrom, fromLanguage);
                            }
                            catch (KeyNotFoundException)
                            {
                                ea.Result = "Language name is not supported, please check if 'Language From' is right.";
                            }
                            catch (Exception ex)
                            {
                                ea.Result = ex;
                            }
                        };

                        worker.RunWorkerCompleted += (o, ea) =>
                        {
                            pBar.Visibility = Visibility.Hidden;
                            if (ea.Result != null)
                            {
                                SetStatusLabelValue(tsslblException, "Warning : " + ea.Result);
                            }
                        };

                        SetStatusLabelValue(tsslblException, "");
                        pBar.Visibility = Visibility.Visible;
                        worker.RunWorkerAsync();
                    }
                    else
                    {
                        gvList.ItemsSource = null;
                    }
                }
                else if (tabLanguages.SelectedIndex == 0 || tabLanguages.SelectedIndex == 2)
                {
                    SetStatusLabelValue(tsslblException, "");
                }
            }
        }
        private void DoTranslation(string transText)
        {
            string fromLanguage = GetFromLanguage();
            string toLanguage = GetToLanguage();
            string detectLanguage = "";

            try
            {
                if (String.IsNullOrEmpty(fromLanguage))
                {
                    detectLanguage = transManage.Detect(transText);
                    fromLanguage = detectLanguage;
                }

                TranslationRequest request;
                if (transManage.IsAccessDB)
                {
                    request = new TranslationRequest(
                                            fromLanguage,
                                            toLanguage,
                                            TranslationManage.languages[fromLanguage].LanguageID,
                                            TranslationManage.languages[toLanguage].LanguageID,
                                            transText,
                                            transText,
                                            detectLanguage);
                }
                else
                {
                    request = new TranslationRequest(
                                            fromLanguage,
                                            toLanguage,
                                            transText,
                                            transText,
                                            detectLanguage);
                }

                TranslationResult result = transManage.Translate(request);
                TranslationComplete(result);
            }
            catch (ArgumentNullException)
            {
                SetValueFrom("");
                SetValueTo("");
                SetStatusLabelValue(tsslblWhere, "");
                SetStatusLabelValue(tsslblException, "");
            }
            catch (ArgumentException agex)
            {
                SetValueFrom("");
                SetValueTo("");
                string msg = agex.Message;
                if (agex.Message.Contains("There was no endpoint listening"))
                {
                    msg = "Please check your proxy.";
                }
                SetStatusLabelValue(tsslblException, "Warning : " + msg);
                if (ConfigSetting.Mini)
                {
                    floatBox.FontColor = Brushes.Red;
                    floatBox.Translation = "Warning : " + msg;
                    floatBox.Visible = true;
                }
            }
            catch (InvalidOperationException)
            {
                SetStatusLabelValue(tsslblException, "Warning : Please check your proxy.");
            }
            catch (KeyNotFoundException)
            {
                SetValueTo("");
                SetStatusLabelValue(tsslblWhere, "");
                SetStatusLabelValue(tsslblException, "Language name is not supported, please check if 'Language From' is right.");
            }
            catch (Exception ex)
            {
                SetValueFrom("");
                SetValueTo("");
                string msg = ex.Message;
                if (ex.Message.Contains("There was no endpoint listening"))
                {
                    msg = "Please check your proxy.";
                }
                SetStatusLabelValue(tsslblException, "Warning : " + msg);
                if (ConfigSetting.Mini)
                {
                    floatBox.FontColor = Brushes.Red;
                    floatBox.Translation = "Warning : " + msg;
                    floatBox.Visible = true;
                }
            }
        }