Esempio n. 1
0
        public List <NumberModel> GetTargetFromHindiNumbers(string source, string target, string sourceLanguage)
        {
            var result = new List <NumberModel>();

            try
            {
                var sb = new StringBuilder();
                var easternArabicNumbers = GetEasternArabicNumbers();
                var hindiNumberModel     = new HindiNumberModel
                {
                    SourceGroups     = source.Split(' ').ToArray(),
                    TargetGroups     = target.Split(' ').ToArray(),
                    SourceLanguage   = sourceLanguage,
                    TargetDictionary = new Dictionary <string, string>(),
                    HindiDictionary  = new Dictionary <string, string>(),
                    TextGroups       = new string[] { }
                };
                if (sourceLanguage.Equals(Constants.HindiLanguage))
                {
                    var sourceResult      = string.Empty;
                    var sourceGroupResult = new List <string>();
                    foreach (var sourceGroup in hindiNumberModel.SourceGroups)
                    {
                        foreach (var s in sourceGroup)
                        {
                            sourceResult = easternArabicNumbers.ContainsValue(s.ToString())
                                                                ? sb.Append(easternArabicNumbers.FirstOrDefault(h => h.Value == s.ToString()).Key).ToString()
                                                                : sb.Append(s.ToString()).ToString();
                        }

                        if (!string.IsNullOrEmpty(sourceResult) && !string.IsNullOrEmpty(sourceGroup))
                        {
                            hindiNumberModel.HindiDictionary.Add(sourceResult, sourceGroup);
                            sourceGroupResult.Add(sourceResult);
                        }
                        sourceResult = string.Empty;
                        hindiNumberModel.TextGroups = sourceGroupResult.ToArray();
                        sb.Clear();
                    }
                    result = GetFormatedNumbers(hindiNumberModel);
                }
                else
                {
                    var targetResult = string.Empty;
                    foreach (var targetGroup in hindiNumberModel.TargetGroups)
                    {
                        foreach (var t in targetGroup)
                        {
                            targetResult = easternArabicNumbers.ContainsValue(t.ToString())
                                                                ? sb.Append(easternArabicNumbers.FirstOrDefault(h => h.Value == t.ToString()).Key).ToString()
                                                                : sb.Append(t.ToString()).ToString();
                        }

                        if (!string.IsNullOrEmpty(source) && !string.IsNullOrEmpty(targetResult))
                        {
                            hindiNumberModel.HindiDictionary.Add(source, targetResult);
                        }

                        if (!string.IsNullOrEmpty(targetResult) && !string.IsNullOrEmpty(targetGroup))
                        {
                            hindiNumberModel.TargetDictionary.Add(targetResult, targetGroup);
                        }
                        targetResult = string.Empty;
                        hindiNumberModel.TextGroups = hindiNumberModel.SourceGroups;
                        sb.Clear();
                    }
                    result = GetFormatedNumbers(hindiNumberModel);
                }
            }
            catch (Exception ex)
            {
                _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}");
            }
            return(result);
        }
Esempio n. 2
0
        public List <NumberModel> GetFormatedNumbers(HindiNumberModel hindiNumberModel)
        {
            var result = new List <NumberModel>();

            try
            {
                var res = hindiNumberModel.TextGroups.Zip(hindiNumberModel.TargetGroups, (s, t) => new NumberModel {
                    SourceText = s, TargetText = t
                }).ToList();

                // add thousand separator or decimal separtor in the target text as it is in the source text where needed
                foreach (var numberRes in res)
                {
                    if (!string.IsNullOrEmpty(numberRes.TargetText))
                    {
                        // add . separator in the translated number as it is in the source number(this change will work only for valid verification)
                        // source: the converted hindi to arabic/just arabic(depending on source langauge) and target; (arabic/converted hindi to arabic)
                        // valid ex: source: 1234,56 => target: 1.234,56/1,234.56 or source: 1.234,56 => target: 1.234,56
                        // invalid ex: soruce: 1234,56  => target: 12.34,56
                        if (numberRes.SourceText.Contains("."))
                        {
                            var sourceTextIndex = numberRes.SourceText.IndexOf(".");
                            if (!numberRes.TargetText.Contains("."))
                            {
                                numberRes.TargetText = numberRes.TargetText.Insert(sourceTextIndex, ".");
                            }
                        }
                        if (numberRes.SourceText.Contains(","))
                        {
                            var sourceTextIndex = numberRes.SourceText.IndexOf(",");
                            if (!numberRes.TargetText.Contains(","))
                            {
                                numberRes.TargetText = numberRes.TargetText.Insert(sourceTextIndex, ",");
                            }
                            else
                            {
                                // Scenario of translation from Hindi to Arabic: ١٢٣٤,٨٩ => 1.234,56 or 1,234.56 should be valid.
                                // in scenario: ١٢٣٤,٨٩ => 1,234.56, the Hindi number is converted to 1234,56
                                // in the above code the . separator is added where it should be
                                // in the the bellow code, the , separator is moved at the right place
                                // so the target result it will be 1,234.56 for verification.
                                if (numberRes.TargetText.IndexOf(",.") != -1)
                                {
                                    numberRes.TargetText = Regex.Replace(numberRes.TargetText, ",+\\.+", ".");
                                    numberRes.TargetText = numberRes.TargetText.Insert(sourceTextIndex, ",");
                                }
                            }
                        }
                        if (numberRes.TargetText.IndexOf(".,") != -1)
                        {
                            numberRes.TargetText = Regex.Replace(numberRes.TargetText, "\\.+\\,+", ".");
                        }
                    }

                    if (hindiNumberModel.SourceLanguage.Equals(Constants.HindiLanguage))
                    {
                        var sourceText = hindiNumberModel.HindiDictionary.FirstOrDefault(s => s.Key.Equals(numberRes.SourceText));
                        result.Add(new NumberModel
                        {
                            SourceText       = !string.IsNullOrEmpty(sourceText.Value) ? sourceText.Value : numberRes.SourceText,
                            SourceArabicText = numberRes.SourceText,
                            TargetText       = numberRes.TargetText,
                            TargetArabicText = sourceText.Key
                        });
                    }
                    // map to the corresponding source text for the Hindi target numbers found with issues
                    if (hindiNumberModel.TargetDictionary.Count > 0)
                    {
                        var sourceText = hindiNumberModel.HindiDictionary.FirstOrDefault(s => s.Key.Contains(numberRes.SourceText));

                        var targetText = hindiNumberModel.TargetDictionary.FirstOrDefault(t => t.Key.Contains(sourceText.Value));
                        result.Add(new NumberModel
                        {
                            SourceText       = !string.IsNullOrEmpty(sourceText.Key) ? sourceText.Key : numberRes.SourceText,
                            SourceArabicText = numberRes.SourceText,
                            TargetText       = targetText.Value,
                            TargetArabicText = targetText.Key
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}");
            }
            return(result);
        }