WSH Shell : Calendar
Écrit par Gilles LAURENT   
13-04-2008

WSH Shell : Un calendrier (Gadget) perpétuel multilingue

Une épreuve des Scripting Games 2008 consistait à écrire un script affichant un calendrier formaté à l'écran. Vous pouvez retrouver le descriptif détaillé de cette épreuve ici. Suite à cette épreuve, j'ai souhaité faire évoluer le code pour d'une part le porter en classe VBScript compatible avec la console WSH Shell (module externe) et d'autre part afficher le calendrier en fonction d'une locale (langue) spécifiée par une propriété de classe. Comme d'habitude vous trouverez les commentaires dans la console au fil de l'eau ! Le module se nomme _wshCalendar.inc et doit être instancié sous wshCalendar. So, Let's go !

Microsoft (R) Windows Script Host Version 5.6                                   
Copyright (C) Microsoft Corporation 1996-2001. Tous droits réservés.            
                                                                                
 _ _ _  ___  _ _   ___  _         _  _                                          
| | | |/ __>| | | / __>| |_  ___ | || |                                         
| | | |\__ \|   | \__ \| . |/ ._>| || |                                         
|__/_/ <___/|_|_| <___/|_|_|\___.|_||_|                                         
                                                                                
Windows Script Host (WSH) Shell v1.0.0.8 starting ...                           
                                                                                
Registering components ...                                                      
  Registering dyncall.dll ...                                                   
                                                                                
Loading external modules ...                                                    
  Loading _wshAdsi.inc ...                                                      
  Loading _wshCalendar.inc ...                                                  
  Loading _wshCodeSyntaxing.inc ...                                             
  Loading _wshCultures.inc ...                                                  
  Loading _wshIni.inc ...                                                       
  Loading _wshWmi.inc ...                                                       
                                                                                
Loading profiles ...                                                            
  Loading D:\Users\Dev\Copyright\WSH\Release\WSHShell_Profile.inc ...           
  Loading D:\Documents and Settings\Gilles\Mes documents\WSH Shell\WSHShell_P...
                                                                                
Welcome ...                                                                     
It's 13/04/2008 18:16:10 and WSH Shell is up !                                  
                                                                                
Ready.                                                                          
                                                                                
WSH D:\Test> ' notre nouveau module est bien présent dans la liste des modules  
WSH D:\Test> ' automatiquement chargés. Il ne reste plus qu'à créer une         
WSH D:\Test> ' instance pour en bénéficier                                      
WSH D:\Test> Set oCal=New wshCalendar                                           
WSH D:\Test> ' détermination des membres (méthodes et propriétés)               
WSH D:\Test> gm(oCal)                                                           
                                                                                
Category  Name                                                                  
--------  ----                                                                  
Sub       DisplayCalendar ()                                                    
Property  Culture                                                               
Property  nMonth                                                                
Property  nYear                                                                 
Property  sMark                                                                 
Property  Version                                                               
                                                                                
WSH D:\Test> ' affichage du calendrier pour le mois en cours                    
WSH D:\Test> oCal.DisplayCalendar()                                             
                                                                                
________________________________                                                
                      Avril 2008                                                
                                                                                
--   Dim Lun Mar Mer Jeu Ven Sam                                                
14 |           1   2   3   4   5                                                
15 |   6   7   8   9  10  11  12                                                
16 | »13  14  15  16  17  18  19                                                
17 |  20  21  22  23  24  25  26                                                
18 |  27  28  29  30                                                            
________________________________                                                
                                                                                
WSH D:\Test> ' la propriété nMonth permet de définir le mois [1..12]            
WSH D:\Test> ' la propriété nYear permet de définir l'année                     
WSH D:\Test> ' affichage du calendrier du mois de Janvier 2010                  
WSH D:\Test> oCal.nYear=2010: oCal.nMonth=1                                     
WSH D:\Test> oCal.DisplayCalendar                                               
                                                                                
________________________________                                                
                    Janvier 2010                                                
                                                                                
--   Dim Lun Mar Mer Jeu Ven Sam                                                
 1 |                       1   2                                                
 2 |   3   4   5   6   7   8   9                                                
 3 |  10  11  12  13  14  15  16                                                
 4 |  17  18  19  20  21  22  23                                                
 5 |  24  25  26  27  28  29  30                                                
 6 |  31                                                                        
________________________________                                                
                                                                                
WSH D:\Test> ' configuration de la date courante (valeurs initiales)            
WSH D:\Test> oCal.nYear=Year(Date()): oCal.nMonth=Month(Date())                 
WSH D:\Test>                                                                    
WSH D:\Test> ' la propriété sMark permet de définir le marqueur du jour         
WSH D:\Test> echo oCal.sMark                                                    
»                                                                               
WSH D:\Test> ' la propriété Culture permet d'afficher le calendrier dans la     
WSH D:\Test> ' locale (langue) spécifiée. La langue peut être spécifiée par     
WSH D:\Test> ' son LCID (ex: &H40c) ou alors par son code ISO (ex: fr-FR)       
WSH D:\Test> ' pour afficher le calendrier en Polonais (&h415 ou pl-PL)         
WSH D:\Test> oCal.Culture="pl-PL"                                               
WSH D:\Test> oCal.DisplayCalendar()                                             
                                                                                
________________________________                                                
                   Kwiecien 2008                                                
                                                                                
--   Nie Pon Wto Sro Czw Pia Sob                                                
14 |           1   2   3   4   5                                                
15 |   6   7   8   9  10  11  12                                                
16 | »13  14  15  16  17  18  19                                                
17 |  20  21  22  23  24  25  26                                                
18 |  27  28  29  30                                                            
________________________________                                                
                                                                                
WSH D:\Test> ' attention toutefois !                                            
WSH D:\Test> ' certaines locales (langues) installées sur le système ne sont    
WSH D:\Test> ' pas supportées par VBScript. C'est le cas par exemple sur ma     
WSH D:\Test> ' plateforme XP SP2 (WSH 5.6) du Maori (&H481 ou mi-NZ)            
WSH D:\Test> oCal.Culture="mi-NZ"                                               
WSH D:\Test> oCal.DisplayCalendar()                                             
:: An error occured (447)                                                       
:: Cet objet ne gère pas les paramètres régionaux en cours.                     
                                                                                
WSH D:\Test> ' en fait c'est uniquement certains codes ISO (ex: mi-NZ) qui ne   
WSH D:\Test> ' sont pas définis par VBScript. Dans ce cas, spécifier le LCID    
WSH D:\Test> ' permet de résoudre le problème !                                 
WSH D:\Test> oCal.Culture=&H481                                                 
WSH D:\Test> oCal.DisplayCalendar()                                             
                                                                                
________________________________                                                
              Paenga-whawha 2008                                                
                                                                                
--   Rat Man Tur Wen Tai Par Hat                                                
14 |           1   2   3   4   5                                                
15 |   6   7   8   9  10  11  12                                                
16 | »13  14  15  16  17  18  19                                                
17 |  20  21  22  23  24  25  26                                                
18 |  27  28  29  30                                                            
________________________________                                                
                                                                                
WSH D:\Test> ' dans le cadre de ce projet, j'ai également développé le module   
WSH D:\Test> ' externe _wshCultures.inc permettant l'énumération dynamique      
WSH D:\Test> ' (via les API Win32 et le composant COM dyncall) des locales      
WSH D:\Test> ' (langues) installées sur la machine. Ce module sera documenté    
WSH D:\Test> ' dans un article dédié. Ci-dessous la liste des locales (langues) 
WSH D:\Test> ' installées sur mon système :                                     
WSH D:\Test> set oCul=New wshCultures                                           
WSH D:\Test> ft oCul.EnumSystemLocales(),"Language","","*"                      
                                                                                
LCID   ISO    Language                                                          
----   ---    --------                                                          
1078   af-ZA  Afrikaans                                                         
1052   sq-AL  Albanais                                                          
1031   de-DE  Allemand (Allemagne)                                              
3079   de-AT  Allemand (Autriche)                                               
5127   de-LI  Allemand (Liechtenstein)                                          
4103   de-LU  Allemand (Luxembourg)                                             
2055   de-CH  Allemand (Suisse)                                                 
7177   en-ZA  Anglais (Afrique du Sud)                                          
3081   en-AU  Anglais (Australie)                                               
10249  en-BZ  Anglais (Belize)                                                  
4105   en-CA  Anglais (Canada)                                                  
9225   en-CB  Anglais (Caraïbes)                                                
1033   en-US  Anglais (États-Unis)                                              
11273  en-TT  Anglais (Île de la Trinité)                                       
6153   en-IE  Anglais (Irlande)                                                 
8201   en-JM  Anglais (Jamaïque)                                                
5129   en-NZ  Anglais (Nouvelle-Zélande)                                        
13321  en-PH  Anglais (Philippines)                                             
2057   en-GB  Anglais (Royaume-Uni)                                             
12297  en-ZW  Anglais (Zimbabwe)                                                
2092   az-AZ  Azéri (cyrillique)                                                
1068   az-AZ  Azéri (latin)                                                     
1069   eu-ES  Basque                                                            
1059   be-BY  Biélorusse                                                        
5146   bs-BA  Bosniaque                                                         
1026   bg-BG  Bulgare                                                           
1027   ca-ES  Catalan                                                           
1050   hr-HR  Croate                                                            
4122   hr-BA  Croate (Bosnie-Herzégovine)                                       
1030   da-DK  Danois                                                            
3082   es-ES  Espagnol (alphabet international)                                 
11274  es-AR  Espagnol (Argentine)                                              
16394  es-BO  Espagnol (Bolivie)                                                
13322  es-CL  Espagnol (Chili)                                                  
9226   es-CO  Espagnol (Colombie)                                               
5130   es-CR  Espagnol (Costa Rica)                                             
12298  es-EC  Espagnol (Équateur)                                               
4106   es-GT  Espagnol (Guatemala)                                              
18442  es-HN  Espagnol (Honduras)                                               
17418  es-SV  Espagnol (Le Salvador)                                            
2058   es-MX  Espagnol (Mexique)                                                
19466  es-NI  Espagnol (Nicaragua)                                              
6154   es-PA  Espagnol (Panama)                                                 
15370  es-PY  Espagnol (Paraguay)                                               
10250  es-PE  Espagnol (Pérou)                                                  
20490  es-PR  Espagnol (Porto Rico)                                             
7178   es-DO  Espagnol (République dominicaine)                                 
1034   es-ES  Espagnol (traditionnel)                                           
14346  es-UY  Espagnol (Uruguay)                                                
8202   es-VE  Espagnol (Venezuela)                                              
1061   et-EE  Estonien                                                          
1080   fo-FO  Féroïen                                                           
1035   fi-FI  Finnois                                                           
2060   fr-BE  Français (Belgique)                                               
3084   fr-CA  Français (Canada)                                                 
1036   fr-FR  Français (France)                                                 
5132   fr-LU  Français (Luxembourg)                                             
6156   fr-MC  Français (Monaco)                                                 
4108   fr-CH  Français (Suisse)                                                 
1110   gl-ES  Galicien                                                          
1106   cy-GB  Gallois                                                           
1032   el-GR  Grec                                                              
1038   hu-HU  Hongrois                                                          
1057   id-ID  Indonésien                                                        
1039   is-IS  Islandais                                                         
1040   it-IT  Italien (Italie)                                                  
2064   it-CH  Italien (Suisse)                                                  
1087   kk-KZ  Kazakh                                                            
1088   ky-KG  Kyrgyz (cyrillique)                                               
1062   lv-LV  Letton                                                            
1063   lt-LT  Lituanien                                                         
1071   mk-MK  Macédonien Ex Rép. yougoslave de Macédoine                        
2110   ms-BN  Malais (Brunei Darussalam)                                        
1086   ms-MY  Malais (Malaisie)                                                 
1082   mt-MT  Maltais                                                           
1153   mi-NZ  Maori                                                             
1104   mn-MN  Mongol (cyrillique)                                               
2067   nl-BE  Néerlandais (Belgique)                                            
1043   nl-NL  Néerlandais (Pays-Bas)                                            
1044   nb-NO  Norvégien (Bokmål)                                                
2068   nn-NO  Norvégien (Nynorsk)                                               
2115   uz-UZ  Ouzbek (cyrillique)                                               
1091   uz-UZ  Ouzbek (latin)                                                    
1045   pl-PL  Polonais                                                          
1046   pt-BR  Portugais (Brésil)                                                
2070   pt-PT  Portugais (Portugal)                                              
1131   qu-BO  Quechua (Bolivie)                                                 
2155   qu-EC  Quechua (Équateur)                                                
3179   qu-PE  Quechua (Pérou)                                                   
1048   ro-RO  Roumain                                                           
1049   ru-RU  Russe                                                             
4155   se-NO  Same de Lule (Norvège)                                            
5179   se-SE  Same de Lule (Suède)                                              
8251   se-FI  Same de Skolt (Finlande)                                          
9275   se-FI  Same d'Inari (Finlande)                                           
3131   se-FI  Same du nord (Finlande)                                           
1083   se-NO  Same du nord (Norvège)                                            
2107   se-SE  Same du nord (Suède)                                              
6203   se-NO  Same du sud (Norvège)                                             
7227   se-SE  Same du sud (Suède)                                               
3098   sr-SP  Serbe (cyrillique)                                                
7194   sr-BA  Serbe (cyrillique, Bosnie-Herzégovine)                            
2074   sr-SP  Serbe (latin)                                                     
6170   sr-BA  Serbe (latin, Bosnie-Herzégovine)                                 
1051   sk-SK  Slovaque                                                          
1060   sl-SI  Slovène                                                           
1132   ns-ZA  Sotho du nord                                                     
1053   sv-SE  Suédois                                                           
2077   sv-FI  Suédois (Finlande)                                                
1089   sw-KE  Swahili                                                           
1092   tt-RU  Tatar                                                             
1029   cs-CZ  Tchèque                                                           
1074   tn-ZA  Tswana                                                            
1055   tr-TR  Turc                                                              
1058   uk-UA  Ukrainien                                                         
1076   xh-ZA  Xhosa                                                             
1077   zu-ZA  Zoulou                                                            
                                                                                
WSH D:\Test> ' Enjoy !                                                          
WSH D:\Test>                                                                    

Listing 1 : _wshCalendar.inc

  1. '
  2. '    Windows Script Host (WSH) Shell
  3. '    (c) 2007 Gilles LAURENT
  4. '    wshCalendar Class v1.0.0.1
  5. '
  6. Class WSHCalendar
  7. ' =========================
  8. ' == PRIVATE PROPERTIES
  9. ' =========================
  10.     Private oFs, oRe
  11.     Private nCurrentCulture
  12. ' =========================
  13. ' == PUBLIC PROPERTIES
  14. ' =========================
  15.     Public Culture
  16.     Public nMonth
  17.     Public nYear
  18.     Public sMark
  19.     Public Property Get Version ()
  20.         oRe.Pattern="v(\d\.\d.*)"    
  21.         Version = oRe.Execute (oFs.OpenTextFile (shell.Path & "\Include\_wshCalendar.inc", 1, False).ReadAll ())(0).SubMatches (0)
  22.     End Property
  23. ' =========================
  24. ' == PRIVATE MEMBERS
  25. ' =========================
  26.     Private Sub Class_Initialize ()
  27.         ' initialisation des objets
  28.         Set oFs = CreateObject ("Scripting.FileSystemObject")
  29.         Set oRe = New RegExp
  30.         ' initialisation des propriétés
  31.         Me.Culture = GetLocale()
  32.         Me.nYear = Year (Now)
  33.         Me.nMonth = Month (Now)
  34.         Me.sMark = Chr (187)
  35.         ' définition des propriétés de l'expression régulière
  36.         oRe.IgnoreCase = True
  37.         oRe.Multiline = False
  38.         oRe.Global = False
  39.     End Sub
  40.     Private Sub Class_Terminate ()
  41.         ' libération des objets
  42.         Set oFs = Nothing
  43.         Set oRe = Nothing
  44.     End Sub
  45.     Private Function UCFirst (strText)
  46.         UCFirst = UCase (Left(strText,1)) & LCase (Right(strText,Len(strText)-1))
  47.     End Function
  48.         
  49. ' =========================
  50. ' == PUBLIC MEMBERS
  51. ' =========================
  52.     Public Sub DisplayCalendar ()
  53.         ' déclaration des variables
  54.         Dim sDate, sLine, sWeek, sMark
  55.         Dim arrDays(6)
  56.         Dim i
  57.         ' prise en compte des options linguistiques
  58.         nCurrentCulture = SetLocale (Me.Culture)
  59.         ' initialisation de la date
  60.         sDate = Me.nMonth & "/" & Me.nYear
  61.         ' détermination des noms des jours dans le respect des options linguistiques
  62.         For i=0 To 6: arrDays(i) = UCFirst(Left(WeekDayName(i+1),3)): Next
  63.         ' création du calendrier
  64.         WScript.Echo VBCrLf & "________________________________"
  65.         WScript.Echo Space(27-Len(MonthName(Me.nMonth))) & UCFirst(MonthName(Me.nMonth)) & " " & Me.nYear
  66.         WScript.Echo
  67.         WScript.Echo "--   " & Join(arrDays," ") & Chr (2)
  68.         For i=1 To 31
  69.             sWeek = DatePart("ww",sDate)
  70.             If Day(Now)=i And Month(Now)=Me.nMonth And Year(Now)=Me.nYear Then sMark=Me.sMark Else sMark=" "
  71.             sLine=sLine & sMark & Left(Space(2),2-Len(i)) & i & " "
  72.             If WeekDay(sDate)=7 Then
  73.                 WScript.Echo Left(" ", 2-Len(sWeek)) & sWeek & " | " & Left(Space(28),28-Len(sLine)) & sLine
  74.                 sLine=""
  75.             End If
  76.             sDate=DateAdd("D",1,sDate)
  77.             If Me.nMonth <> Month(sDate) Then
  78.                 If sLine <> "" Then WScript.Echo Left(" ", 2-Len(sWeek)) & sWeek & " | " & sLine
  79.                 Exit For
  80.             End If
  81.         Next
  82.         WScript.Echo "________________________________" & VBCrLf
  83.         ' restauration des options linguistiques par défaut
  84.         SetLocale (nCurrentCulture)
  85.     End Sub
  86.         
  87. End Class

Dernière mise à jour : ( 15-04-2008 )