获取异常的本地化消息
当我在函数参数中添加一个 [ValidatePattern(...)],并将实际参数设为一个错误的值时,会出现一个错误,文本为 Cannot validate argument on parameter '<parameter name>'. The argument "{0}" does not match the "{1}" pattern. Supply an argument that matches "{1}" and try the command again.
至少在英文Windows上如此。但我有多台电脑,运行着不同语言的Windows。
如何以编程方式获取该消息的本地化版本?
我尝试在 ErrorRecord 中获取异常,并用 [...]::new() 创建一个新的异常,我甚至还试过 InnerException,但它们只是带有自定义文本的通用异常。
是否存在一个文件/某种方法可以获取本地化文本?还是被硬编码在某些C#函数中?
Name Value
---- -----
PSVersion 5.1.19041.6926
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.6926
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
解决方案
前言:
-
下面的解决方案仅在Windows PowerShell上工作(这是随Windows一起提供、仅Windows的旧版PowerShell,其最新且最终版本为5.1),因为它已被本地化为多种语言。
-
要查看某一系统上Windows PowerShell可用语言的具体列表,请运行:
bash Get-Item $PSHOME\* -Include [a-z][a-z], [a-z][a-z]-*+要将这些简写的文化名称翻译成完整的显示名称,例如de-DE,请运行:bash [cultureinfo] 'de-DE'+这些简写的文化名称对应于$PSHOME中的子目录,在其中你将找到包含该文化本地化文本元素的*.dll.mui文件。- 使用Windows MUI API函数 应该可以直接从这些DLL中提取本地化文本元素;然而,这需要你了解它们的(很可能是非公开的)标识符;下一节中的解决方案仅向你展示如何通过将PowerShell整体切换到该语言并提交一个输出所关注文本元素的命令来“隐式”检索它们。
- 与此相对的是 PowerShell (Core) 7 已尚未本地化(截至v7.6.x,短期内不太可能改变):它的所有文本资源都是英文;关于未来本地化的潜在问题正在GitHub issue #19860中跟踪。
要将Windows PowerShell切换到某种人类语言,您必须确保两点:
- (a) 该语言要么是系统的安装语言,要么已经通过语言包安装(例如通过设置应用程序)。
-
(b)
[cultureinfo]::CurrentUICulture必须能反映所给语言,例如德国德语在德国的显示名称为de-DE;这可以通过下列两种方式之一来确保: -
持久地:使用设置应用将Windows显示语言改为所需语言;[1] 这样就会相应地将
[cultureinfo]::CurrentUICulture的值持久地改为该语言。 -
临时地:在脚本开头显式设置
[cultureinfo]::CurrentUICulture。- 警告:在交互式提示符下,Windows PowerShell不幸地在每次命令执行后会重置对
[cultureinfo]::CurrentUICulture和[cultureinfo]::CurrentCulture的任何更改(幸运的是,PowerShell (Core) 7已不再这样做)。 要在给定的交互式Windows PowerShell会话中“保持”更改并在所有未来会话中通过$PROFILE文件实现,请参阅此回答中的变通方法。
- 警告:在交互式提示符下,Windows PowerShell不幸地在每次命令执行后会重置对
下面的 示例 展示了一个临时切换到 de-DE 作为显示语言,从而使错误信息以德语显示:
# NOTE: Windows PowerShell only.
& {
# Switch the display language to German.
[cultureinfo]::CurrentUICulture = 'de-DE'
# Define an advanced script block with a [ValidatePattern()] attribute
# and pass an argument that fails the validation.
& { [cmdletbinding()]param([ValidatePattern('^..$')] $param) } 123
}
你将看到如下的德语错误信息:
Das Argument für den Parameter "param" kann nicht überprüft werden. Das Argument "123" entspricht nicht dem Muster "^..$". Geben Sie ein Argument an, das
"^..$" entspricht, und führen Sie den Befehl erneut aus.
In Zeile:8 Zeichen:65
+ & { [cmdletbinding()]param([ValidatePattern('^..$')] $param) } 123
+ ~~~
+ CategoryInfo : InvalidData: (:) [], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError
[1] 直接跳转到设置应用相关页面的便捷命令是
Start-Process ms-settings:regionformatting
在那里你也可以选择安装其他语言。