about_script_internationalization
主题
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-strings 的详细信息,请参阅 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 (in German).
errorMsg1 = You cannot leave the user name field blank (in German).
promptMsg = Please enter your user name (in German).
'@
同样,脚本目录的 ar-SA 子目录中的 World.psd1 文件可能包括以下语句:
ConvertFrom-StringData @'
helloWorld = Hello, World (in Arabic).
errorMsg1 = You cannot leave the user name field blank (in Arabic).
promptMsg = Please enter your user name (in Arabic).
'@
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 变量显示用户消息时,这些消息会以阿拉伯语显示。
例如,以下脚本以阿拉伯语显示"请输入用户名"消息:
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 (in German)
d2 = Tuesday (in German)
d3 = Wednesday (in German)
d4 = Thursday (in German)
d5 = Friday (in German)
d6 = Saturday (in German)
d7 = Sunday (in German)
'@
因此,当您在 PSUICulture 值为 de-DE 的系统上运行 Sample.ps1 时,脚本的输出为:
Today is Friday (in German)
另请参阅
about_Data_Sections
about_Automatic_Variables
about_Hash_Tables
about_Quoting_Rules
ConvertFrom-StringData
Import-LocalizedData