如何不依赖psd1文件实现单PS1 PowerShell脚本的多语言本地化
PowerShell 单ps1文件多语言本地化可行方案
轻量哈希表方案(最易维护,适合单文件场景)
这个方案不依赖官方psd1相关逻辑,所有语言内容都内嵌在脚本中,扩展新语言成本极低,执行零额外开销:
# 多语言字符串总表,新增语言直接加对应节点即可 $localizedStrings = @{ "en-US" = @{ WelcomeMsg = "Starting software installation..." ConfigSuccess = "Configuration file modified successfully" InstallFinish = "Software installation completed" } "fr-FR" = @{ WelcomeMsg = "Démarrage de l'installation du logiciel..." ConfigSuccess = "Fichier de configuration modifié avec succès" InstallFinish = "Installation du logiciel terminée" } } # 自动匹配当前系统UI语言,兜底使用英语 $targetLang = $PSUICulture # 兼容仅语言前缀匹配的场景,比如系统语言是fr-CA也会匹配到fr-FR if (-not $localizedStrings.ContainsKey($targetLang)) { $targetLang = $localizedStrings.Keys | Where-Object { $_ -match "^$($PSUICulture.Split('-')[0])-" } | Select-Object -First 1 $targetLang = $targetLang ? $targetLang : "en-US" } # 全局统一调用入口 $lng = $localizedStrings[$targetLang] # 用法示例 Write-Host $lng.WelcomeMsg
普通用户新增语言只需按照现有格式,在$localizedStrings中添加对应语言标识和翻译后的键值对即可,无需修改其他逻辑。
DATA段合规方案(符合PowerShell官方安全规范)
如果你需要遵循官方规范使用DATA段隔离静态字符串,可以通过动态变量名的方式调用对应语言的DATA段:
# 已支持语言列表 $AvailLng = "fr-FR","en-US" # 兜底默认语言 $defaultLng = "en-US" # 英语字符串DATA段,命名规则固定为 Data_语言标识 DATA Data_en-US { ConvertFrom-StringData @' WelcomeMsg = Starting software installation... ConfigSuccess = Configuration file modified successfully InstallFinish = Software installation completed '@ } # 法文字符串DATA段 DATA Data_fr-FR { ConvertFrom-StringData @' WelcomeMsg = Démarrage de l'installation du logiciel... ConfigSuccess = Fichier de configuration modifié avec succès InstallFinish = Installation du logiciel terminée '@ } # 匹配目标语言 $targetLng = $AvailLng -contains $PSUICulture ? $PSUICulture : $defaultLng # 动态读取对应DATA段内容 $lng = Get-Variable "Data_$targetLng" -ValueOnly # 用法示例 Write-Host $lng.WelcomeMsg
该方案遵循PowerShell DATA段的安全限制,仅允许存储静态字符串内容,规避恶意代码注入风险,更适合对外公开发布的脚本。
内容的提问来源于stack exchange,提问作者useful
相关产品推荐
相关产品推荐

