2017-03-10 5 views
3

Ich arbeite an einem PowerShell-Skript, das in zwei Sprachen verfügbar sein muss. Um mir das Leben zu erleichtern, scheint es mir eine gute Idee zu sein, für jede eine Sprachdatei zu erstellen und die Zeichenfolgen darin einzubeziehen, anstatt den Text direkt im Code zu haben und 2 Kopien des Codes zu verwalten. Gibt es eine Best Practice zur Umsetzung?Wie kann die Übersetzung für ein PowerShell-Skript am besten implementiert werden?

Der Roadblock, in dem ich gerade bin, ist, dass einige der Strings Variablen enthalten müssen, also habe ich dort schon einige Probleme bekommen. Ich habe bemerkt, dass es den Wert der Variablen zum Zeitpunkt verwendet, an dem die Zeichenfolge gesetzt wird, was für mich Sinn macht.

So zum Beispiel, wenn ich eine Zeichenfolge habe, die einen Fehler Pegel ausgibt:

$Strings.ErrorMessage = "Error detected with $Level severity" 

Und dann später $Level auf, was auch immer Wert, wird es nicht diesen Wert hat, wenn das Skript aufgerufen wird. Unter der Annahme, dass $Level nicht gesetzt ist, bevor $Strings.ErrorMessage Einstellung die Ausgabe aussehen würde:

Error detected at severity 

Gibt es eine Möglichkeit Powershell zu sagen, um den aktuellen Wert der $ Ebene variabel zu greifen, bevor er ausgegeben wird?

+0

'$ Strings.ErrorMessage =‚Fehler mit $ Stufe severity'' erkannt und '$ ExecutionContext.InvokeCommand.ExpandString ($ Strings.ErrorMessage)' oder '$ Strings.ErrorMessage = 'Fehler erkannt mit {0} Schwere' 'und' $ Strings.ErrorMessage -f $ Level'. – PetSerAl

+0

Haben Sie das gelesen? https://msdn.microsoft.com/en-us/powershell/reference/4.0/microsoft.powershell.core/about/about_script_internationalization –

Antwort

1

Siehe diesen Link auf about_Script_Internationalization und this link, das ein Beispiel geht gibt:

PSUICulture Example.ps1vor localistion

[System.Windows.Forms.MessageBox]::Show(
    "This is a small example showing how to localize strings in a PowerShell script.", 
    "Hello, World!") | Out-Null 

-Code zwei lokalisierte Skripte zu erstellen.

Lokalisierte \ PSUICultureExample.psd1

ConvertFrom-StringData @" 
MessageTitle = Hello, World! 
MessageBody = This is a small example showing how to localize strings in a PowerShell script. 
OtherMessage = Hello {0}! 
"@ 

Lokalisierte \ es-ES \ PSUICulture.psd1

ConvertFrom-StringData @" 
MessageTitle = ¡Hola mundo! 
MessageBody = Este es un pequeño ejemplo que muestra cómo localizar cadenas en un script de PowerShell. 
OtherMessage = ¡Hola {0}! 
"@ 

PSUICultureExample.ps1NACH localistion

$s = Import-LocalizedData -BaseDirectory (Join-Path -Path $PSScriptRoot -ChildPath Localized) 
[System.Windows.Forms.MessageBox]::Show($s.MessageBody, $s.MessageTitle) | Out-Null 

Dann Werte innerhalb Ihrer Strings (Interpolation) enthalten, würden Sie so etwas tun:

$ValueToInsert = 'Bob' 
$s.OtherMessage -f $ValueToInsert 

bearbeiten Folders Localized & Localized\es-ES an das Skript relativ sind.

+0

Das funktioniert perfekt, vielen Dank! Der einzige Schluckauf, den ich hatte, war, als ich "= f" anstelle von "-f" eintippte. Ich fragte mich, warum es nicht funktionierte und warum mein Bindestrich so verschwommen war, aber ich dachte, ich würde gerade alt werden;) – RyanL

+0

Cool. Schön, dass es für dich funktioniert hat! – TechSpud

3

Wenn es um die besten Praktiken kommt, Powershell eigenes Hilfesystem hat eine Seite über das:

Get-Help about_Script_Internationalization 

Um zu vermeiden, Probleme laufen mit Variablen in lokalisierten Strings erweitern, können Sie den Format-String-Operator statt:

'Error detected with {0} severity' -f $Level 
Verwandte Themen