Déterminer la langue système sous Macintosh et Windows
Date de publication : Février 2005
Par
Aziz ELGHOMARI (Directeur Support Technique 4D SA)
Il existe des commandes 4ème Dimension qui permettent de retourner différentes informations liées à l'environnement système, mais nous n'avons pas de commandes qui permettent de connaître la langue Système de façon précise en respectant le code ISO 639-1. Nous vous proposons un plug-in permettant cela (Windows, MachO, Carbon).
1.
Introduction
2.
Informations liées à l’environnement système que nous pouvons récupérer
3.
Détermination de la langue système sous Macintosh et Windows
3.1. Le Plug-in InfoSysteme sous Windows
a. Explication du Code 4ème Dimension utilisé
b. Explication des principales fonctions utilisées dans le Plug-in
3.2. Le Plug-in InfoSysteme sur Macintosh
a. Explication du Code 4ème Dimension utilisé
b. Explication des principales fonctions utilisées dans le Plug-in
4.
Conclusion
4.1. Les codes sources en C
a. Code en C Windows
b. Code en C Macintosh
5. Bases exemples
1.
Introduction
Certaines bases de données orientées vers l'international, nécessitent d'être déployées
avec des langues étrangères (Anglais, Italien, Allemand etc..) et sur des systèmes
d'exploitation différents.
Il existe des commandes 4ème Dimension qui permettent de retourner différentes
informations liées à l'environnement système, mais nous n'avons pas de commandes
qui permettent de connaître la langue Système de façon précise en respectant le code ISO 639-1.
2.
Informations liées à l’environnement système que nous pouvons récupérer
Les commandes 4ème Dimension liées à l'environnement système sont :
-
Hauteur ecran {(*) -> Numérique
-
Largeur ecran {(*)}->Numérique
-
Nombre ecrans -> Entier long
-
COORDONNEES ECRAN (gauche;
haut;
droite;
bas{;
écran})
-
PROFONDEUR ECRAN (profondeur;
couleurs{;
écran})
-
FIXER PROFONDEUR ECRAN (profondeur{;
couleurs{;
écran}})
-
Ecran principal -> Entier long
-
Hauteur barre de menus -> Entier long
-
LISTE DES POLICES (polices)
-
Nom de police (numéro) -> Alpha
-
Numero de police (nomPolice) -> Entier long
-
PROPRIETES PLATE FORME (plateForme{;
système{;
machine}})
-
Dossier systeme {(type)} Alpha
-
Dossier temporaire -> Alpha
-
Nom de la machine -> Alpha
-
Nom du possesseur -> Alpha
-
Gestalt (sélecteur;
valeur) -> Numérique
-
ENREGISTRER EVENEMENT (message{; importance})
-
FIXER VARIABLE ENVIRONNEMENT (nomVar;
valeurVar)
-
LANCER PROCESS EXTERNE (nomFichier{;
fluxEntrée{;
fluxSortie{;
fluxErreur}}})
Nous avons aussi la commande Gestalt qui retourne dans
valeur
un numérique représentant les caractéristiques de la configuration matérielle et logicielle de votre système, en fonction du
sélecteur
que vous avez passé dans le paramètre
sélecteur
. Si l'information demandée est obtenue, la fonction
Gestalt retourne 0, sinon elle retourne l'erreur -5550. Si le sélecteur est inconnu,
Gestalt retourne l'erreur -5551.
 |
Important : Le Gestalt Manager est spécifique à MacOS. Certains des sélecteurs sont également implémentés sous Windows mais l'utilité de cette fonction reste limitée sur cette plate-forme.
|
Mais nous n'avons pas de commandes qui nous renseignent sur la langue système utilisée par la machine.
3.
Détermination de la langue système sous Macintosh et Windows
On peut faire par exemple la différence entre le système français et le système Américain
grâce à la date système qui se règle dans les «paramètres régionaux» car l'emplacement
du mois et du jour est inversé si l'on passe d'un système à l'autre .
Exemple : le
Mercredi 17 Novembre 2004-11-17
Pour le système français, nous aurons
17/11/2004
Pour le système Américain, nous aurons
11/17/2004
Il y a donc possibilité d'envisager une solution par programmation autour de la commande
Date du langage 4ème Dimension.
Par contre, pour tous les autres systèmes étrangers, il n'existe pas de commandes
pour déterminer la langue système sous Macintosh et Windows.
Pour résoudre ce problème, nous allons utiliser un nouveau Plug-In compilé sous
Windows, Carbon et
Macho. Le Plug-In est appelé «InfoSysteme» et il contient 2 commandes
pour Windows et une commande pour Macintosh
3.1. Le Plug-in InfoSysteme sous Windows
a. Explication du Code 4ème Dimension utilisé
Les commandes utilisées sous Windows sont GetLanguage et GetidLanguage.
GetLanguage ne prend pas de paramètres et retourne une chaîne alphanumérique.
La chaîne retournée correspond à la langue système, pour le système français nous aurons :
Français (France)
GetidLanguage ne prend pas de paramètres et retourne une chaîne alphanumérique.
La chaîne retournée correspond au code ISO 639-x, elle donnera "fr" pour "Français" par exemple.
Le code utilisé dans la base est le suivant :
Si (Evenement formulaire=Sur chargement)
Idlanguage:=0
Nom_Langue:=""
Fin de si
Le code utilisé dans le bouton «GetLanguage» est :
Nom_Langue:=
GetLanguage
idlanguage:=
GetidLanguage
Comment utiliser la base exemple sous Windows ?
A partir du menu « Fichier», sélectionnez la ligne « Démonstration», cliquez ensuite « GetLanguage» :
b. Explication des principales fonctions utilisées dans le Plug-in
Les principales fonctions utilisées dans le source en C sont :
· GetSystemDirectory
· GetFileVersionInfoSize
· VerLanguageName
GetSystemDirectory
La fonction GetSystemDirectory renvoie le chemin du répertoire système. Ce répertoire contient des fichiers tels que dll, drivers, polices etc...
Cette fonction sert en premier lieu à assurer la compatibilité. Les applications doivent sauvegarder le code dans le dossier ProgramFiles et les données dans le dossier Data du profile de l'utilisateur.
| Syntaxe : | UINT GetSystemDirectory(
LPTSTR lpBuffer,
UINT uSize
); |
GetFileVersionInfoSize
La fonction
GetFileVersionInfoSize détermine si le système est en mesure de renvoyer l'information de version pour un dossier donné. Lorsque la chose est possible, cette fonction renvoie la taille (en bytes ou octets) de cette info.
| Syntaxe : | DWORD GetFileVersionInfoSize(
LPTSTR lptstrFilename,
LPDWORD lpdwHandle
); |
VerLanguageName
La fonction VerLanguageName renvoie une chaîne descriptive afférente à la langue liée à un MLI binaire spécifique.
| Syntaxe : | DWORD VerLanguageName(
DWORD wLang,
LPTSTR szLang,
DWORD nSize
); |
3.2. Le Plug-in InfoSysteme sur Macintosh
a. Explication du Code 4ème Dimension utilisé
La commande utilisée sous Macintosh est GetidLanguage.
GetidLanguage ne prend pas de paramètres et retourne une chaîne alphanumérique.
La chaîne retournée correspond au code ISO 639-1 ; elle donnera "fr" pour "Français" par exemple.
La commande GetLanguage n'existe pas mais peut être implémentée facilement dans 4ème Dimension à partir de la commande
GetidLanguage.
Exemple
Au cas ou
: (idLanguage="fr")
Nom_Langue:="french"
Fin de cas
Le paramètre idLanguage a été implémenté dans les ressources du Plug-in pour éviter tout problème de compilation cross-plateforme.
Le code utilisé dans la base est le suivant :
Si (Evenement formulaire=Sur chargement)
Idlanguage:=""
Fin de si
Comment utiliser la base exemple sous Macintosh ?
A partir du menu «Fichier», sélectionnez la ligne «Démonstration», cliquez ensuite «GetLanguage».
b. Explication des principales fonctions utilisées dans le Plug-in
Les principales fonctions utilisées dans le source en C sont :
· CFPreferencesCopyValue
· CFStringGetCString
· LocaleRefFromLocaleString
· LocaleRefGetPartString
CFPreferencesCopyValue
Cette fonction permet de rechercher des clefs de préférence et d'obtenir une valeur préférence pour un domaine spécifié.
CFPropertyListRef CFPreferencesCopyValue (
CFStringRef key,
CFStringRef applicationID,
CFStringRef userName,
CFStringRef hostName); |
Les clés de préférences pour notre Plug-in sont :
- CFSTR("AppleLanguages")
- kCFPreferencesAnyApplication
- kCFPreferencesCurrentUser
- kCFPreferencesAnyHost
| Syntaxe : | lgArray = (CFArrayRef) CFPreferencesCopyValue(CFSTR("AppleLanguages"),
kCFPreferencesAnyApplication, kCFPreferencesCurrentUser,
kCFPreferencesAnyHost |
CFStringGetCString
Permet de copier les caractères contenus dans un objet
CFString vers un buffer chaîne C local après conversion des caractères de l'encodage donné.
Boolean CFStringGetCString (
CFStringRef theString,
char *buffer,
CFIndex bufferSize,
CFStringEncoding encoding
); |
LocaleRefFromLocaleString
Permet de convertir une chaîne contenant des données locales en une référence locale
OSStatus LocaleRefFromLocaleString (
const char localeString[],
LocaleRef * locale
); |
LocaleRefGetPartString
Permet de convertir une référence de locale en une chaîne contenant des données locales.
OSStatus LocaleRefGetPartString (
LocaleRef locale,
LocalePartMask partMask,
ByteCount maxStringLen,
char partString[]
);
Pour certaines langues (German, Spanish et Dutch), nous avons été obligé de faire un cas spécial :
Si le code retourné est «Germain» on recopie «de» dans le code
Si le code retourné est «Spanish» on recopie «spa» dans le code
Si le code retourné est «Dutch» on recopie «dut» dans le code
Pour les langues (French et English), si l'on prend les deux caractères et qu'on passe en minuscule, on obtient directement les codes ISO 639-1 "fr" et "en".
4.
Conclusion
Le Plug-in infoSysteme est compilé pour :
· Windows
· Macho
· Carbon
Après compilation le Plug-in se situe dans le dossier "Debug" ou dans le dossier "Release".
Un base de démonstration est fournie pour Macintosh et Windows.
Grâce à ce plug-in, nous pouvons connaître la langue Système de façon précise en respectant le code ISO 639-1. Cette information est très utile pour les bases de données déployées avec des langues étrangères différentes.
Elle peut servir par exemple à ouvrir un fichier de ressources lié à une langue ou lancer un traitement en relation avec une autre langue.
Ce Plug-in fourni en note technique est libre de droit et vous pouvez donc l'intéger à vos applicatifs. La société 4D ne s'engage à aucune obligation d'évolution de ce plug-in.
4.1. Les codes sources en C
a. Code en C Windows
#include "4DPluginAPI.h"
#include "4DPlugin.h"
#include <stdio.h>
#include <string.h>
#include <assert.h>
#if VERSIONWIN
#include <Windows.h>
#endif
//#include "AsiPort.h"
#define NUM_TCHARS_NEEDED_FOR_BACKSLASH (1)
#define NUM_TCHARS_NEEDED_FOR_NULL_TERM (1)
#define BACKSLASH (TEXT("\\"))
//long AnsiToMac( unsigned char *AnsiStr, unsigned char *MacStr, short AnsiLen );
char *conversion(char *ptr);
void PluginMain( long selector, PA_PluginParameters params )
{
switch( selector )
{
case kInitPlugin :
InitPlugin();
break;
case kDeinitPlugin :
DeinitPlugin();
break;
// --- InfoSysteme
case eCMD_GetLanguage :
GetLanguage( params );
break;
case eCMD_GetidLanguage :
GetidLanguage( params );
break;
}
}
void InitPlugin()
{
// write initialisation code here...
}
void DeinitPlugin()
{
// write deinitialisation code here...
}
// ---------------------------------- InfoSysteme ---------------------------------
void GetLanguage( PA_PluginParameters params )
{
char *maval;
char returnValue[256];
long IDLanguage;
UINT nLenOfSysDirPath = 0;
LPTSTR lpszSysDir = NULL;
//char lpdwTrans[256],cbTrans[256];
LPVOID *lpdwTrans; // address of buffer for version value pointer
PUINT cbTrans; // address of length buffer
LPTSTR lpszSysFile = NULL;
UINT nLen = 0;
DWORD dwUseless = 0;
LPVOID lpVersionData = NULL;
DWORD dwSize = 0;
LCID lcidUSER;
TCHAR szUserLangName [64];
long lenr, taille;
char t1[255] = "çéèà";
char t2[255] = "";
unsigned char *src = (unsigned char*)t1;
unsigned char *dest = (unsigned char*)t2;
nLen = GetSystemDirectory( NULL, 0 );
nLenOfSysDirPath = nLen + NUM_TCHARS_NEEDED_FOR_BACKSLASH;
lpszSysDir = (LPTSTR) LocalAlloc( LPTR, nLenOfSysDirPath *sizeof( TCHAR ) );
lpszSysFile = (LPTSTR) LocalAlloc( LPTR, (nLenOfSysDirPath+8) *sizeof( TCHAR ) );
GetSystemDirectory( lpszSysDir, nLen );
if ( lstrcmp( (LPCTSTR) lpszSysDir[ lstrlen( lpszSysDir ) ], (LPCTSTR) BACKSLASH ) )
lstrcat( lpszSysDir, (LPCTSTR) BACKSLASH );
//lstrcpy( lpszSysFile, (LPCTSTR) lpszSysDir );
lstrcpy( lpszSysFile,(LPCTSTR)lpszSysDir );
lstrcat( lpszSysFile, (LPCTSTR) TEXT("USER.EXE"));
dwSize = GetFileVersionInfoSize(lpszSysFile,&dwUseless);
if (dwSize)
{
lpVersionData = LocalAlloc(LPTR,(UINT)dwSize);
if (GetFileVersionInfo(lpszSysFile,dwUseless,dwSize,lpVersionData))
{
if(VerQueryValue(lpVersionData,TEXT("\\VarFileInfo\\Translation"),(VOID**)&lpdwTrans,&cbTrans))
{
lcidUSER = LOWORD(lpdwTrans[0]);
}
} // end we got version data
LocalFree((HLOCAL)lpVersionData);
}
// --- write the code of GetLanguage here...
VerLanguageName (lcidUSER,szUserLangName,sizeof(szUserLangName));
PA_ReturnString( params, szUserLangName );
LocalFree(lpszSysDir);
LocalFree(lpszSysFile);
}
void GetidLanguage( PA_PluginParameters params )
{
char *maval;
char returnValue[256];
long IDLanguage;
UINT nLenOfSysDirPath = 0;
LPTSTR lpszSysDir = NULL;
//char lpdwTrans[256],cbTrans[256];
LPVOID *lpdwTrans; // address of buffer for version value pointer
PUINT cbTrans; // address of length buffer
LPTSTR lpszSysFile = NULL;
UINT nLen = 0;
DWORD dwUseless = 0;
LPVOID lpVersionData = NULL;
DWORD dwSize = 0;
LCID lcidUSER;
TCHAR szUserLangName [64];
long lenr, taille;
char t1[255] = "çéèà";
char t2[255] = "";
unsigned char *src = (unsigned char*)t1;
unsigned char *dest = (unsigned char*)t2;
unsigned char *dest2 = (unsigned char*)t2;
nLen = GetSystemDirectory( NULL, 0 );
nLenOfSysDirPath = nLen + NUM_TCHARS_NEEDED_FOR_BACKSLASH;
lpszSysDir = (LPTSTR) LocalAlloc( LPTR, nLenOfSysDirPath *sizeof( TCHAR ) );
lpszSysFile = (LPTSTR) LocalAlloc( LPTR, (nLenOfSysDirPath+8) *sizeof( TCHAR ) );
GetSystemDirectory( lpszSysDir, nLen );
if ( lstrcmp( (LPCTSTR) lpszSysDir[ lstrlen( lpszSysDir ) ], (LPCTSTR) BACKSLASH ) )
lstrcat( lpszSysDir, (LPCTSTR) BACKSLASH );
//lstrcpy( lpszSysFile, (LPCTSTR) lpszSysDir );
lstrcpy( lpszSysFile,(LPCTSTR)lpszSysDir );
lstrcat( lpszSysFile, (LPCTSTR) TEXT("USER.EXE"));
dwSize = GetFileVersionInfoSize(lpszSysFile,&dwUseless);
if (dwSize)
{
lpVersionData = LocalAlloc(LPTR,(UINT)dwSize);
if (GetFileVersionInfo(lpszSysFile,dwUseless,dwSize,lpVersionData))
{
if(VerQueryValue(lpVersionData,TEXT("\\VarFileInfo\\Translation"),(VOID**)&lpdwTrans, &cbTrans))
{
lcidUSER = LOWORD(lpdwTrans[0]);
}
} // end we got version data
LocalFree((HLOCAL)lpVersionData);
}
// --- write the code of GetLanguage here...
VerLanguageName (lcidUSER,szUserLangName,sizeof(szUserLangName));
strncpy(dest,szUserLangName,2);
PA_ReturnString( params, dest );
LocalFree(lpszSysDir);
LocalFree(lpszSysFile);
} |
b. Code en C Macintosh
#include "4DPluginAPI.h"
#include "4DPlugin.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <extras_string.h>
#if VERSIONWIN
#include <Windows.h>
#endif
void PluginMain( long selector, PA_PluginParameters params )
{
switch( selector )
{
case kInitPlugin :
InitPlugin();
break;
case kDeinitPlugin :
DeinitPlugin();
break;
// --- InfoSysteme
case 1 :
GetLanguage( params );
break;
}
}
void InitPlugin()
{
// write initialisation code here...
}
void DeinitPlugin()
{
// write deinitialisation code here...
}
// ---------------------------------- InfoSysteme ---------------------------------
void GetLanguage( PA_PluginParameters params )
{
CFArrayRef lgArray;
char lgCode[4];
char code[256];
CFStringRef strRef;
Boolean result;
OSStatus status;
LocaleRef locale;
lgCode[0] = 0;
lgArray = (CFArrayRef) CFPreferencesCopyValue(CFSTR("AppleLanguages"),
kCFPreferencesAnyApplication, kCFPreferencesCurrentUser,
kCFPreferencesAnyHost);
if (lgArray != NULL) {
strRef = (CFStringRef) CFArrayGetValueAtIndex(lgArray, 0);
if (strRef != NULL) {
result = CFStringGetCString(strRef, code, 256, kCFStringEncodingASCII);
if (result == true) {
status = LocaleRefFromLocaleString(code, &locale);
if (status == noErr) {
char lcode[256];
status = LocaleRefGetPartString(locale, kLocaleLanguageMask, 256, lcode);
if (status == noErr) {
strcpy(code, lcode);
}
}
if (strlen(code) > 2) {
if (strcmp(code, "german") == 0) strcpy(code, "de");
//allemand
else if (strcmp(code, "spanish") == 0) strcpy(code, "es");
//espagnol
else if (strcmp(code, "dutch") == 0) strcpy(code, "nl");
//neerlandais
else code[2] = 0;
}
tolower(code[0]);
tolower(code[1]);
strcpy(lgCode, code);
}
}
}
PA_ReturnString( params, lgCode );
} |
5. Bases exemples
__________________________________________________
Copyright © 1985-2008 4D SA - Tous droits réservés
Tous les efforts ont été faits pour que le contenu de cette note technique présente le maximum de fiabilité possible.
Néanmoins, les différents éléments composant cette note technique, et le cas échéant, le code, sont fournis sans garantie d'aucune sorte.
L'auteur et 4D S.A. déclinent donc toute responsabilité quant à l'utilisation qui pourrait être faite de ces éléments, tant à l'égard de leurs
utilisateurs que des tiers.
Les informations contenues dans ce document peuvent faire l'objet de modifications sans préavis et ne sauraient en aucune manière engager
4D SA. La fourniture du logiciel décrit dans ce document est régie par un octroi de licence dont les termes sont précisés par ailleurs dans la
licence électronique figurant sur le support du Logiciel et de la Documentation afférente. Le logiciel et sa documentation ne peuvent être
utilisés, copiés ou reproduits sur quelque support que ce soit et de quelque manière que ce soit, que conformément aux termes de cette
licence.
Aucune partie de ce document ne peut être reproduite ou recopiée de quelque manière que ce soit, électronique ou mécanique, y compris par
photocopie, enregistrement, archivage ou tout autre procédé de stockage, de traitement et de récupération d'informations, pour d'autres buts
que l'usage personnel de l'acheteur, et ce exclusivement aux conditions contractuelles, sans la permission explicite de 4D SA.
4D, 4D Calc, 4D Draw, 4D Write, 4D Insider, 4ème Dimension ®, 4D Server, 4D Compiler ainsi que les logos 4e Dimension, sont des marques
enregistrées de 4D SA.
Windows,Windows NT,Win 32s et Microsoft sont des marques enregistrées de Microsoft Corporation.
Apple, Macintosh, Power Macintosh, LaserWriter, ImageWriter, QuickTime sont des marques enregistrées ou des noms commerciaux de Apple Computer,Inc.
Mac2Win Software Copyright © 1990-2002 est un produit de Altura Software,Inc.
4D Write contient des éléments de "MacLink Plus file translation", un produit de DataViz, Inc,55 Corporate drive,Trumbull,CT,USA.
XTND Copyright 1992-2002 © 4D SA. Tous droits réservés.
XTND Technology Copyright 1989-2002 © Claris Corporation.. Tous droits réservés ACROBAT © Copyright 1987-2002, Secret
Commercial Adobe Systems Inc.Tous droits réservés. ACROBAT est une marque enregistrée d'Adobe Systems Inc.
Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires
respectifs.
__________________________________________________
 
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
|