Spaces:
Runtime error
Runtime error
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);
}
|