File size: 2,543 Bytes
3dd5c9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System.Text;

namespace TaskTrackingSystem.Shared.Localization;

public enum DetectedContentLanguage
{
    Empty,
    Burmese,
    English,
    Mixed,
    Unknown
}

public sealed record LanguageDetectionResult(
    DetectedContentLanguage Language,
    int BurmeseCharacters,
    int LatinCharacters,
    int OtherCharacters,
    double BurmeseRatio,
    double EnglishRatio);

/// <summary>
/// Local, advisory detection used only to help users move content between fields.
/// It deliberately does not reject mixed-language business text.
/// </summary>
public sealed class LanguageDetectionService
{
    public LanguageDetectionResult Detect(string? text)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            return new(DetectedContentLanguage.Empty, 0, 0, 0, 0, 0);
        }

        var burmese = 0;
        var latin = 0;
        var other = 0;

        foreach (var rune in text.EnumerateRunes())
        {
            if (IsBurmese(rune.Value))
            {
                burmese++;
            }
            else if ((rune.Value >= 'A' && rune.Value <= 'Z') || (rune.Value >= 'a' && rune.Value <= 'z'))
            {
                latin++;
            }
            else if (!Rune.IsWhiteSpace(rune) && !Rune.IsPunctuation(rune) && !Rune.IsNumber(rune) && !Rune.IsSymbol(rune))
            {
                other++;
            }
        }

        var letters = burmese + latin + other;
        if (letters == 0)
        {
            return new(DetectedContentLanguage.Unknown, burmese, latin, other, 0, 0);
        }

        var burmeseRatio = burmese / (double)letters;
        var englishRatio = latin / (double)letters;
        var language = burmeseRatio >= 0.70 && burmese > 0
            ? DetectedContentLanguage.Burmese
            : englishRatio >= 0.70 && latin > 0
                ? DetectedContentLanguage.English
                : burmese > 0 && latin > 0
                    ? DetectedContentLanguage.Mixed
                    : DetectedContentLanguage.Unknown;

        return new(language, burmese, latin, other, burmeseRatio, englishRatio);
    }

    public bool AppearsPredominantlyBurmese(string? text) => Detect(text).Language == DetectedContentLanguage.Burmese;
    public bool AppearsPredominantlyEnglish(string? text) => Detect(text).Language == DetectedContentLanguage.English;

    private static bool IsBurmese(int value) =>
        (value >= 0x1000 && value <= 0x109F) ||
        (value >= 0xAA60 && value <= 0xAA7F) ||
        (value >= 0xA9E0 && value <= 0xA9FF);
}