主題
    about_Script_Internationalization

簡短描述
    說明 Windows PowerShell 2.0 的指令碼國際化功能,這些功能可讓指令碼更容易以
    使用者介面 (UI) 語言,對使用者顯示訊息和指示。


完整描述
    Windows PowerShell 指令碼國際化功能可讓您以使用者的 UI 語言顯示指令碼的說明
    和使用者訊息,以便為全球各地的使用者提供更好的服務。
    
    在執行過程中,指令碼國際化功能會查詢作業系統的 UI 文化特性、匯入適當的翻譯
    文字字串,並對使用者顯示這些字串。Data 區段可以讓您將文字字串與程式碼分開儲
    存,方便您識別及擷取兩者。新的 ConvertFrom-StringData Cmdlet 可將文字字串轉
    換成類似字典的雜湊表,以協助翻譯工作的進行。

    Windows PowerShell 1.0 不支援指令碼國際化中使用的 Windows PowerShell 2.0 功
    能。包含這些功能的指令碼需要修改後才能在 Windows PowerShell 1.0 中執行。

    為了支援國際化說明文字,Windows PowerShell 2.0 包含下列功能:

       -- 將文字字串與程式碼指令分開的 Data 區段。如需 Data 區段的詳細資訊,
          請參閱 about_Data_Sections。

       -- 新的自動變數 $PSCulture 和 $PSUICulture。$PSCulture 可儲存系統用於日
          期、時間和貨幣等元素的 UI 語言名稱,而 $PSUICulture 變數則可儲存系統
          在使用者介面元素 (例如功能表和文字字串) 中使用的 UI 語言名稱。

       -- ConvertFrom-StringData Cmdlet,用來將文字字串轉換成類似字典的雜湊表,
          以協助翻譯工作的進行。如需詳細資訊,請參閱 ConvertFrom-StringData。

       -- 新的 .psd1 檔案類型,用來儲存翻譯後的文字字串。.psd1 檔案儲存在指令 
          碼目錄的特定語言子目錄中。
    
       -- Import-LocalizedData Cmdlet,用來在執行階段將指定之語言的翻譯文字字
          串匯入至指令碼。這個 Cmdlet 可辨識及匯入 Windows 支援之任何語言的字
          串。如需詳細資訊,請參閱 Import-LocalizedData。
	

 DATA 區段:儲存預設字串
 
     在指令碼中使用 Data 區段即可儲存預設語言的文字字串。
     請在 here-string 中以索引鍵/值組的形式排列字串。每個索引鍵/值組必須自成一
     行。如果要包含註解,必須將註解放在不同行。

     ConvertFrom-StringData Cmdlet 會將 here-string 中的索引鍵/值組轉換成類似字
     典的雜湊表,而此雜湊表是儲存在 Data 區段變數的值中。

     在下列範例中,World.ps1 指令碼的 Data 區段包含一組英文-美國 (en-US) 版的指
     令碼提示訊息。ConvertFrom-StringData Cmdlet 會將字串轉換成雜湊表,並將字串
     儲存在 $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.
	’@
	}

如需 here-string 的詳細資訊,請參閱 about_Quoting_Rules。

 PSD1 檔案:儲存翻譯字串

    請將每一種 UI 語言的指令碼訊息儲存在與指令碼同名且副檔名為 .psd1 的個別文
    字檔中,並將這些文字檔儲存到指令碼目錄的子目錄,其中這些子目錄具有下列格
    式之文化特性名稱:

	<語言>–<地區>

    範例: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 @'
	    helloWorld = Hello, World (德文).
	    errorMsg1 = You cannot leave the user name field blank (德文).
            promptMsg = Please enter your user name (德文).
	'@


    同樣地,指令碼目錄之 ar-SA 子目錄中的 World.psd1 檔案可能包含下列陳述式:


    	ConvertFrom-StringData @'
	    helloWorld = Hello, World (阿拉伯文).
	    errorMsg1 = You cannot leave the user name field blank (阿拉伯文).
            promptMsg = Please enter your user name (阿拉伯文).
	'@


 IMPORT-LOCALIZEDDATA:動態擷取翻譯字串

    若要擷取目前使用者之 UI 語言的字串,請使用 Import-LocalizedData Cmdlet。

    Import-LocalizedData 會尋找 $PSUICulture 自動變數的值,並匯入符合
    $PSUICulture 值之子目錄中 <指令碼名稱>.psd1 檔案的內容。接著,它會將匯入的
    內容儲存到 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 變數顯示使用者訊息時,這些訊息就會以阿拉伯文顯
    示。

    例如,下列指令碼會以阿拉伯文顯示 "Please enter your user name" (請輸入您的
    使用者名稱) 訊息:

	if (!($username)) { $msgTable.promptMsg }
    
    如果 Import-LocalizedData 找不到與 $PSUIculture 的值相符的 .psd1 檔案,則不
    會取代 $msgTable 的值,而且呼叫 $msgTable.promptMsg 時將會顯示遞補的 
    en-US 字串。
   


 範例

    這個範例示範指令碼國際化功能在指令碼中的用法,以電腦中設定的語言對使用者顯
    示星期別。
     
    以下列出 Sample1.ps1 指令檔的完整清單。

    指令碼開頭是名為 Day ($Day) 的 Data 區段,其中包含 ConvertFrom-StringData
    命令。提交到 ConvertFrom-StringData 的運算式是 here-string,其中包含預設 UI
    文化特性 en-US 中星期別名稱的索引鍵/值組。ConvertFrom-StringData Cmdlet 會
    將 here-string 中的索引鍵/值組轉換成雜湊表,然後再將雜湊表儲存在 $Day 變數
    的值中。

    Import-LocalizedData 命令會匯入符合 $PSUICulture 自動變數值之目錄中 .psd1 
    檔案的內容,然後再儲存到 $Day 變數,以取代 Data 區段中定義的 $Day 值。

    其他命令會將字串載入至陣列,並顯示這些字串。
   
	     $Day = DATA {
	     # culture="en-US"
	     ConvertFrom-StringData @'
	        messageDate = Today is
	        d1 = Monday
	        d2 = Tuesday
	        d3 = Wednesday
	        d4 = Thursday
	        d5 = Friday
	        d6 = Saturday
	        d7 = Sunday
	     '@
	     }


	Import-LocalizedData -BindingVariable Day

	# 建立星期別的陣列。
	$a = $Day.d1, $Day.d2, $Day.d3, $Day.d4, $Day.d5, $Day.d6, $Day.d7


        # 取得代表星期別的數字 (星期一 = 1)。
        # 編製 $a 的索引以取得星期別的名稱。
        # 使用字串格式來建立句子。

        "{0} {1}" –f $Day.messageDate, $a[(get-date -uformat %u)] | Out-Host



    支援指令碼的 .psd1 檔案會儲存在指令碼目錄中名稱與 $PSUICulture 值相符的子
    目錄。

    以下列出 .\de-DE\sample1.psd1 的完整清單:

            # culture="en-US"
	    ConvertFrom-StringData @'
		messageDate = Today is
		d1 = Monday (德文)
		d2 = Tuesday (德文)
		d3 = Wednesday (德文)
		d4 = Thursday (德文)
		d5 = Friday (德文)
		d6 = Saturday (德文)
		d7 = Sunday (德文)
	    '@

    因此,當您在 $PSUICulture 值為 de-DE 的系統執行 Sample.ps1 時,指令碼會輸
    出以下結果:
	

	Today is Friday (德文)


請參閱
    about_Data_Sections
    about_Automatic_Variables
    about_Hash_Tables
    about_Quoting_Rules
    ConvertFrom-StringData
    Import-LocalizedData




目錄