Prenons un exemple, nous avons la société Kiwi basé aux Etats-Unis avec une succursale en France et une autre en Pologne. Vous devez générer un script qui renvoie des résultats en français pour la succursale française et en anglais pour la pologne ainsi que la maison mère aux Etat-Unis.

On va se servir de la Culture.

Pour connaitre la culture sur un pc

(Get-Culture).Name

Normalement, si les pc de kiwi sont bien réglés au niveau des “regionals settings”, les PC Kiwi des Etats-Unis renveront en-US et ceux de la France fr-FR. On n’a pas besoin de celle de la Pologne vu que le résultat doit être en Anglais pour eux.

Retennez bien ces codes, ils vont être très utiles.

Comment ça fonctionne ?

En fait on peut mettre une langue par défaut et des traductions alternatives. Dans notre cas on va utilisé l’anglais comme langue par défaut et une traduction française. Ca permettra d’appliquer la traduction française sur les sessions avec une culture fr-FR et l’anglais par défaut sur tous les autres (Dans notre cas donc, les Etats-Unis et la pologne).

Bien évidemment vous pouvez créer plusieurs traductions, ici c’est un exemple basique mais la logique est identique.

Ensuite dans notre script Powershell on chargera les données localisés et on les utilisera pour les sorties à destination des utilisateurs.

Important

Les fichiers de traduction portent l’extension .psd1

Les traductions doivent impérativement porter le m’ême nom que le script (Exemple: le fichier de tracduction de Kiwi.ps1 doit être Kiwi.psd1 quelque que soit la langue).

Par convention on créera un dossier “Localized” pour héberger les traductions.

La traduction par défaut doit se trouver à la racine du dossier Localized (Ce qui donne pour Kiwi.ps1 un fichier de traduction par défaut qui sera .\Localized\Kiwi.psd1)

Ensuite on créé des dossiers nommé du nom de la culture pour chaque culture sur laquelle on veut appliquer une traduction différente, ces dossiers sont a créer à la racine de Localized.

Pour rappel chaque fichier de traduction doit porter le nom exact du script avec une extension .psd1

Donc pour la traduction Française de Kiwi on aura .\Localized\fr-FR\Kiwi.psd1

Donc notre structure de fichiers donne ceci :

.\Kiwi.ps1 < Le script powershell
.\Localized\Kiwi.psd1 < La traduction par défaut (Anglais dans notre cas)
.\Localized\fr-FR\Kiwi.psd1 < La traduction française appliquée seulement si la culture correspond à fr-FR

Et les traductions ?

On va se baser sur un exemple stucturé comme ceux que j’utilise en production, c’est pas la plus simple mais c’est de mon point de vue la plus propre

Les mots clés que vous utiliserez dans votre traduction ne sont pas liés à des éléments de votre script mais :

  • C’est eux qui vous premettrons de cibler les phrases à récupérer dans le script.
  • Ils doivent être les mêmes dans toutes les traductions

.\Localized\Kiwi.psd1

@{
	Standard = @{
		Hello               = 'Hello {0} {1}.'
		ByeBye              = 'Goodbye.'
	}	
	Fonctions = @{
		MaPremiereFonction = @{
			Info = @{
				PathFound          = '{0} already exist.'
				LoadingFile        = 'Loading {0}.'
			}
			Error = @{
				LoadingError       = 'ERROR 99: Internal Error : Files loading failed (Message: {0}).'
			}
		}
		MaSecondeFonction = @{
			Info = @{
				Import 			= 'Starting import process.'
			}
			Warning = @{
				NoRequest      	= 'No request found for {0}.' 
			}
			Error = @{
				InvalidHeaders = 'ERROR 98: Internal Error : Headers of file ''{0}'' are not valid.'
			}
		}
	}
}

.\Localized\fr-FR\Kiwi.psd1

@{
     Standard = @{
         Hello               = 'Bonjour {0} {1}.'
         ByeBye              = 'Aurevoir.'
     }   
     Fonctions = @{
         MaPremiereFonction = @{
             Info = @{
                 PathFound          = '{0} existe.'
                 LoadingFile        = 'Chargement du fichier {0}.'
             }
             Error = @{
                 LoadingError       = 'ERREUR 99: Erreur Interne : Chargement des fichiers échoué (Message: {0}).'
             }
         }
         MaSecondeFonction = @{
             Info = @{
                 Import          = 'Début du processus d''import.'
             }
             Warning = @{
                 NoRequest       = 'Aucune requête connue pour {0} n''a été trouvée.' 
             }
             Error = @{
                 InvalidHeaders = 'ERREUR 98: Erreur interne : Les entêtes du fichier ''{0}'' sont invalides.'
             }
         }
     }
 }

Vous remarquerez ici :

  • La structure identique entre les deux fichiers
  • Pour échaper l’apostrophe, on la double
  • Les {0}, {1}, … qui nous permettent d’injecter du contenu dans la traduction depuis le script powershell

C’est tout pour nos exemples de traductions, passons au script.

Le script .\Kiwi.ps1

Chargement des données localisées

C’est la commande Import-LocalizedData qui permet de charger les traductions, je l’implémente de façon à pouvoir forcer la langue pour vérifier les traductions, voici comment :

if ($OverWriteCulture) {
    $Language = Import-LocalizedData -BaseDirectory (Join-Path -Path $PSScriptRoot -ChildPath Localized) -UICulture $OverWriteCulture
}
else {
    $Language = Import-LocalizedData -BaseDirectory (Join-Path -Path $PSScriptRoot -ChildPath Localized)
}

Vous l’aurez compris pour forcer la langue pour avez à remplir la variable $OverWriteCulture avec le code à forcer, par exemple avec fr-FR pour forcer la traduction française.

Si on ne précise pas le paramètre -UICulture, il va prendre la culture de la session et appliquer la traduction correspondante si elle existe, sinon la traduction par défaut.

Appel des traductions

$OverwriteCulture = "fr-FR"
if ($OverwriteCulture) {
    $Language = Import-LocalizedData -BaseDirectory (Join-Path -Path $PSScriptRoot -ChildPath Localized) -UICulture $OverwriteCulture
}
else {
    $Language = Import-LocalizedData -BaseDirectory (Join-Path -Path $PSScriptRoot -ChildPath Localized)
}

$Language.Standard.Hello -f "Jules", "Vernes"
$Language.Fonctions.MaSecondeFonction.Info.Import

Ce qui donne

Bonjour Jules Vernes.
Début du processus d'import.

Par contre si la culture passe sur en-US ou n’importe quelle autre pour laquelle vous n’avez pas créer de traduction

$OverwriteCulture = "en-US"

Le résultat est le suivant:

Hello Jules Vernes.
Starting import process.

Vous l’aurez compris, pour appeler une traduction bien précise, on descend dans la structure du psd1 jusqu’à l’élément souhaité pour l’apeller.

Conclusion

C’est une technique très souple de par le fait qu’on peut avoir plusieurs traductions sans alourdir le code du script.

C’est aussi une méthode à envisager dès la création du script si il est destiné à plusieurs pays. Suivant la complexité d’un script ça peut-être très laborieux d’appliquer une traduction sur un script existant


1 commentaire

Mon template de script multilingue – rhuberty.pro : PowerShell · 10 décembre 2019 à 17 h 51 min

[…] Script multilingue […]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *