I. Quel service Windows 7 permet de faire de la reconnaissance de langages ?

Bien que le support des langages dans Windows (NLS) n'a fait que s'accroitre de version en version, les développeurs qui produisent des composants et des applications et qui visent différents marchés internationaux ont toujours été à la recherche de plus en plus de fonctionnalités. Fonctionnalités qui leur permettraient de développer des applications qui réagissent mieux, en fonction du langage ou des langages de l'utilisateur. Avec les services linguistiques étendus (ELS pour faire court), Microsoft met à disposition des développeurs, une plate-forme et des API qui permettent :

  • De détecter le langage de l'utilisateur, par exemple lorsqu'il saisit du texte
  • De détecter plusieurs types de caractères dans une chaîne (ex Latin, Cyrillique, ou autre)
  • Des conversions (Une translittération) de type de caractère vers un autre. Par exemple du cyrillique vers du latin ou vice-versa, du bengali vers du latin, etc.

Cette fonctionnalité n'est disponible qu'à partir de Windows 7.

Enumération des services disponibles C#
Sélectionnez
public static void EnumerationServices()
{
		MappingEnumOptions enumOptions = new MappingEnumOptions();
		MappingService[] transliterationServices = MappingService.GetServices(enumOptions);
		foreach (MappingService service in transliterationServices)
		{
		Console.WriteLine("Service : {0} ", service.Description);
		}
}
Enumération des services disponibles VB.NET
Sélectionnez
Public Shared Sub EnumerationServices()
    Dim enumOptions As New MappingEnumOptions
    Dim transliterationServices As MappingService() = MappingService.GetServices(enumOptions)
    Dim service As MappingService
    For Each service In transliterationServices
        Console.WriteLine("Service : {0} ", service.Description)
    Next
End Sub
Enumération des services disponibles C++
Sélectionnez
void static EnumerationServices()
{
    PMAPPING_SERVICE_INFO   prgServices = NULL;
    DWORD                   dwServicesCount = 0;
    HRESULT                 hr;    	
    hr = MappingGetServices(NULL, &prgServices, &dwServicesCount);
	if (SUCCEEDED(hr))
    {
        for (DWORD i = 0; i < dwServicesCount; ++i)
        {
			
            wprintf(L"Service : %ws\n", prgServices[i].pszDescription);
        }
        MappingFreeServices(prgServices);
    }
}
Détection d'un langage C#
Sélectionnez
public static void DetecterLangage()
{
	MappingService languageDetection = new MappingService(MappingAvailableServices.LanguageDetection);
	using (MappingPropertyBag bag =
		languageDetection.RecognizeText("??? ?? ??????????", null))
	{
		string[] languages = bag.GetResultRanges()[0].FormatData(
							new StringArrayFormatter());
		foreach (string language in languages)
			{
				Console.WriteLine("Langage reconnu : {0}", language);
			}
	}
}
Détection d'un langage VB.NET
Sélectionnez
Public Shared Sub DetecterLangage()
Dim languageDetection As New MappingService(MappingAvailableServices.LanguageDetection)
    Using bag As MappingPropertyBag = languageDetection.RecognizeText("??? ?? ??????????"), Nothing)
Dim languages As String() = bag.GetResultRanges(0).FormatData(Of String())(New StringArrayFormatter)
        Dim language As String
        For Each language In languages
            Console.WriteLine("Langage reconnu : {0}", language)
        Next
    End Using
End Sub
Détection d'un langage C++
Sélectionnez
void DetecterLangage()
{
    LPCWSTR texte=L"??? ?? ??????????";
    MAPPING_ENUM_OPTIONS    EnumOptions;
    PMAPPING_SERVICE_INFO   prgServices = NULL;
    DWORD                   dwServicesCount = 0;
    HRESULT hr;

    ZeroMemory(&EnumOptions, sizeof (MAPPING_ENUM_OPTIONS));
    EnumOptions.Size = sizeof (MAPPING_ENUM_OPTIONS);
    EnumOptions.pGuid = (GUID *)&ELS_GUID_LANGUAGE_DETECTION;
    hr = MappingGetServices(&EnumOptions, &prgServices, &dwServicesCount);
	if (SUCCEEDED(hr))
	{
		MAPPING_PROPERTY_BAG bag;
		ZeroMemory(&bag, sizeof (MAPPING_PROPERTY_BAG));
		bag.Size = sizeof (MAPPING_PROPERTY_BAG);
		hr=MappingRecognizeText (&prgServices[0],texte,wcslen (texte),0,NULL,&bag);
	    WCHAR * p;
		for (p = (WCHAR *)bag.prgResultRanges[0].pData; *p; p += wcslen(p) + 1)
		{
	 	printf("%ws\n", p);
		}
		hr = MappingFreePropertyBag(&bag);
	}
}
Pour plus d'infos :