[PS] 2.0の国際化対応機能

 PowerShell2.0でスクリプトの国際化機能が追加されています。どのような機能かと云えば、変数に格納するデータを言語識別子フォルダ(ja-JP、en-USとか)に格納しておくことで、UICultuteによって自動的に適用するデータを選択するというものです。

具体例を使って説明しましょう。以下に実行したいスクリプトファイル(world.ps1)を示します。

 # 変数msgTableのデフォルト定義
Data msgTable {
   ConvertFrom-StringData @'
      helloWorld = Hello, World
      errorMsg = You cannot leave the username field blank.
      promptMsg = Please enter your username.
'@
}
param ($language)
Import-LocalizedData -BindingVariable msgTable -Culture $language
$msgTable

次に日本語のデータを定義したファイル(world.psd1)をja-JPフォルダに配置します。

 ConvertFrom-StringData @'
      helloWorld = こんにちは。
      errorMsg = ユーザー名は空白にできません。
      promptMsg = ユーザー名を入力してください。
'@

更に内容を英語にしたファイル(world.psd1)をen-USフォルダに配置します。そして以下のように実行するとカルチャによってデータの内容が切り替わります。

 PS (1) >.\world ja-JP  #日本語を指定

Name         Value
----         -----
promptMsg       ユーザー名を入力してください。
helloWorld       こんにちは。
errorMsg        ユーザー名は空白にできません。

PS (2) >.\world en-US  #英語を指定

Name        Value
----        -----
promptMsg       Please enter your username.
helloWorld       Hello, World
errorMsg        You cannot leave the username field blank.

指定したカルチャによって、データの内容が切り替わっているのを確認することができます。PowerShell 2.0では、現在のカルチャを判断するために$UICultureシェル変数が追加されています。それでは、ここまでに出てきた新しいキーワードやコマンドレットを説明していきます。

  1. Dataキーワード
    指定した変数名にスクリプトブロックの実行結果を格納するデータ定義用のキーワードです。スクリプトブロックには、ConverFrom-StringDataコマンドレットの他にif文や一部のシェル変数を利用することができます。
  2. ConverFrom-StringDataコマンドレット
    文字列で指定した「名前=値」のペアからハッシュテーブルを作成するコマンドレットです。
  3. Import-LocalizedDataコマンドレット
    指定した変数に$UICultureに一致するデータファイルの内容を設定します。実際の動作は、Dataキーワードと同じで、データファイルの中身がスクリプトブロックの中身となります。
  4. デフォルトのデータ
    スクリプトファイルの中に記述したDataキーワードがデフォルトの値となります。が、Import-LocalizedDataコマンドレットを指定する場合は、すべてのデータが言語識別サブフォルダに無ければなりません。つまりスクリプトファイル中のDataキーワードは、意味がなくなります。

このような記述を行うことで変数定義をまとめたり、ローカライズをできるようにしたのが、PowerShell2.0の国際化対応となります。