簡単な説明
スクリプトを使ってメッセージや指示をユーザー インターフェイス (UI) 言語で簡単に表示できるようにするスクリプトの国際化機能について説明します。
長い説明
PowerShell スクリプトの国際化機能を使用すると、ヘルプとユーザー メッセージをユーザーの言語で表示して、世界中のユーザーにより適切なサービスを提供できます。
スクリプトの国際化機能は、実行時にオペレーティン グシステムの UI カルチャのクエリを実行し、適切な翻訳されたテキスト文字列をインポートして、ユーザーに表示します。 Data セクションを使用すると、テキスト文字列はコードと切り離して格納されるため、簡単に識別および抽出できます。 新しいコマンドレットの ConvertFrom-StringData は、テキスト文字列を辞書のようなハッシュ テーブルに変換して翻訳を支援します。
さまざまな言語のヘルプ テキストをサポートするために、PowerShell には次の機能が含まれています。
テキスト文字列をコード命令から切り離す Data セクション。 Data セクションの詳細については、about_Data_Sections を参照してください。
新しい自動変数である
$PSCultureと$PSUICulture。$PSCultureは、日付、時刻、通貨などの要素に対してシステムで使用される UI 言語の名前を格納します。$PSUICulture変数には、メニューやテキスト文字列などのユーザー インターフェイス要素に対してシステムで使用される UI 言語の名前が格納されます。テキスト文字列を辞書のようなハッシュ テーブルに変換して翻訳を支援する、新しいコマンドレットの
ConvertFrom-StringData。 詳細については、「ConvertFrom-StringData」を参照してください。翻訳されたテキスト文字列を格納する、新しいファイルの種類である
.psd1。.psd1ファイルは、スクリプト ディレクトリの言語固有のサブディレクトリに格納されます。指定した言語の翻訳されたテキスト文字列を実行時にスクリプトにインポートする、コマンドレットの
Import-LocalizedData。 このコマンドレットは、Windows でサポートされている任意の言語の文字列を認識してインポートします。 詳細については、「Import-LocalizedData」を参照してください。
Data セクション: 既定の文字列の格納
スクリプトの Data セクションを使用して、テキスト文字列を既定の言語で格納します。 キーと値のペアの文字列をヒア文字列に配置します。 キーと値の各ペアは、個別の行に配置する必要があります。 コメントを含める場合、コメントは別の行に配置する必要があります。
ConvertFrom-StringData コマンドレットは、ヒア文字列内のキーと値のペアを、Data セクション変数の値に格納されている辞書のようなハッシュ テーブルに変換します。
次の例では、World.ps1 スクリプトの Data セクションに、スクリプトに対する英語 (米国) (en-US) のプロンプト メッセージ セットが含まれています。
ConvertFrom-StringData コマンドレットは、文字列をハッシュ テーブルに変換して $msgtable 変数に格納します。
$msgTable = data {
#culture="en-US"
ConvertFrom-StringData @'
helloWorld = Hello, World.
errorMsg1 = You cannot leave the user name field blank.
promptMsg = Please enter your user name.
'@
}
ヒア文字列の詳細については、about_Quoting_Rules を参照してください。
PSD1 ファイル: 翻訳された文字列の格納
各 UI 言語のスクリプト メッセージを、名前がスクリプトと同じで .psd1 ファイル名拡張子を持つ別のテキスト ファイルに保存します。 次の形式のカルチャの名前を持つスクリプト ディレクトリのサブディレクトリにファイルを格納します。
<language>-<region>
例: de-DE、ar-SA、および zh-Hans
たとえば、World.ps1 スクリプトが C:\Scripts ディレクトリに格納されている場合は、次のようなファイル ディレクトリ構造を作成します。
C:\Scripts
C:\Scripts\World.ps1
C:\Scripts\de-DE\World.psd1
C:\Scripts\ar-SA\World.psd1
C:\Scripts\zh-CN\World.psd1
...
スクリプト ディレクトリの de-DE サブディレクトリ内にある World.psd1 ファイルには、次のステートメントが含まれる場合があります。
ConvertFrom-StringData -StringData @'
helloWorld = Hallo, Welt.
errorMsg1 = Das Feld Benutzername darf nicht leer sein.
promptMsg = Geben Sie Ihren Benutzernamen ein.
'@
同様に、スクリプト ディレクトリの ar-SA サブディレクトリにある World.psd1 ファイルには、次のステートメントが含まれる場合があります。
ConvertFrom-StringData -StringData @'
helloWorld = مرحبًا أيها العالَم
errorMsg1 = لا يمكنك ترك حقل اسم المستخدم فارغًا
promptMsg = يرجى إدخال اسم المستخدم الخاص بك
'@
Import-LocalizedData: 翻訳された文字列の動的な取得
現在のユーザーの UI 言語で文字列を取得するには、Import-LocalizedData コマンドレットを使用します。
Import-LocalizedData は、$PSUICulture 自動変数の値を検索し、<script-name>.psd1 値と一致するサブディレクトリ内の $PSUICulture ファイルの内容をインポートします。 次に、インポートされた内容を、BindingVariable パラメーターの値で指定された変数に保存します。
Import-LocalizedData -BindingVariable msgTable
たとえば、Import-LocalizedData コマンドが C:\Scripts\World.ps1 スクリプトに表示され、$PSUICulture の値が "ar-SA" の場合、Import-LocalizedData は次のファイルを検索します。
C:\Scripts\ar-SA\World.psd1
次に、ファイルから $msgTable 変数にアラビア語のテキスト文字列をインポートし、World.ps1 スクリプトの Data セクションで定義されている既定の文字列を置き換えます。
その結果、スクリプトが $msgTable 変数を使用してユーザー メッセージを表示すると、メッセージはアラビア語で表示されます。
たとえば、次のスクリプトでは、アラビア語で "ユーザー名を入力してください" というメッセージが表示されます。
if (!($username)) { $msgTable.promptMsg }
Import-LocalizedData が .psd1 の値と一致する $PSUICulture ファイルを見つけられない場合、$msgTable の値は置き換えられず、$msgTable.promptMsg の呼び出しではフォールバックの en-US 文字列が表示されます。
例示
この例は、コンピューターに設定されている言語でユーザーに曜日を表示するために、スクリプトの国際化機能がどのように使用されているかを示しています。
Sample1.ps1 スクリプト ファイルの完全な一覧を次に示します。
スクリプトは、ConvertFrom-StringData コマンドを含む Day ($Day) という名前の Data セクションで始まります。
ConvertFrom-StringDataに送信される式は、キーと値のペアで、既定の UI カルチャの曜日の名前を含む here-string です。
ConvertFrom-StringData コマンドレットは、ヒア文字列のキーと値のペアをハッシュ テーブルに変換し、$Day 変数の値に保存します。
Import-LocalizedData コマンドは、.psd1 ファイルの内容を、$PSUICulture 自動変数の値と一致するディレクトリにインポートし、$Day 変数に保存して、Data セクションで定義されている $Day の値を置き換えます。
残りのコマンドは、文字列を配列に読み込んで表示します。
$Day = data {
#culture="en-US"
ConvertFrom-StringData -StringData @'
messageDate = Today is
d0 = Sunday
d1 = Monday
d2 = Tuesday
d3 = Wednesday
d4 = Thursday
d5 = Friday
d6 = Saturday
'@
}
Import-LocalizedData -BindingVariable Day
#Build an array of weekdays.
$a = $Day.d0, $Day.d1, $Day.d2, $Day.d3, $Day.d4, $Day.d5, $Day.d6
# Get the day of the week as a number (Monday = 1).
# Index into $a to get the name of the day.
# Use string formatting to build a sentence.
"{0} {1}" -f $Day.messageDate, $a[(Get-Date -UFormat %u)] | Out-Host
スクリプトをサポートする .psd1 ファイルは、$PSUICulture 値と一致する名前を持つスクリプト ディレクトリのサブディレクトリに保存されます。
.\de-DE\sample1.psd1 の完全な一覧を次に示します。
# culture="de-DE"
ConvertFrom-StringData @'
messageDate = Heute ist
d0 = Sonntag
d1 = Montag
d2 = Dienstag
d3 = Mittwoch
d4 = Donnerstag
d5 = Freitag
d6 = Samstag
'@
その結果、$PSUICultureの値が de-DE であるシステムで Sample.ps1 を実行すると、スクリプトの出力は次のようになります。
Heute ist Freitag
こちらも参照ください
PowerShell