解释
在 Bash 和 Zsh 中实现翻译系统很容易。
现在,在 Nushell 中实现翻译系统特别具有挑战性,因为 Nushell 与 Bash 和 Zsh 不同。
我正在尝试正确匹配双字母语言代码(例如en
英语、pt
葡萄牙语和欧洲葡萄牙语)和五字母语言代码(例如pt_BR
巴西葡萄牙语),并将不存在的语言恢复为英语版本。
LANG
但是,我当前的代码仅匹配所有其他语言的环境值的两个字符。
这是我的小代码:
let language = $env.LANG | str substring 0..1
let translations = {
"pt":
{
"hello_world": "Olá, gajo",
},
"pt_BR":
{
"hello_world": "Oi, garoto",
},
_:
{
"hello_world": "Hello, guy",
}
}
let current_translations = $translations | get $lang_code
let hello_world = $current_translations.hello_world
我使用 Nushell 在终端中运行了以下命令:
$env.LANG = "pt_BR.UTF-8"; source 01-translations; print $hello_world
$env.LANG = "pt_PT.UTF-8"; source 01-translations; print $hello_world
$env.LANG = "es_ES.UTF-8"; source 01-translations; print $hello_world
我还尝试实施另一种替代方案:
let language = $env.LANG
let lang_code = if $language == "pt_BR.UTF-8" {
$language | str substring 0..5
} else {
$language | str substring 0..1
}
实际行为
- 该代码正确返回所有两字母的语言代码,包括
pt
并显示正确的翻译。 - 对于翻译系统中不存在的其他双字母语言代码,代码无法恢复为默认的英语版本。
- 对于其他五个字母的语言代码,如果您选择
pt_BR.UTF-8
,它只会错误地返回欧洲葡萄牙语版本,导致翻译表中的查找失败。
期望的行为
我想要处理两字母和五个字母的语言代码,如pt
和五个字母的代码pt_BR
,并将不存在的两字母和五个字母的语言代码恢复为默认的英语版本。
更新
我测试了另一种方法,并且它有效,但是代码很丑陋:
let lang = if ($env.LANG =~ 'fr') { "fr" } else if ($env.LANG =~ 'pt_BR') { "pt_BR" } else if ($env.LANG =~ 'pt') { "pt" } else if ($env.LANG =~ 'it') { "it" } else { "default" }
let hello = $translations | get $lang | get hello
let bye = $translations | get $lang | get bye
let how_are_you = $translations | get $lang | get how_are_you
let where_are_you_from = $translations | get $lang | get where_are_you_from
我不知道,
nushell
但似乎您可以使用一个有两列的表,即模式和生成的语言,然后通过filter
命令遍历各行,使用闭包或函数根据模式测试环境语言,如果可以,则返回语言。您似乎不需要引用简单的字母数字字符串。我也尝试了以下方法,但由于某种原因,它给出了一个空列表。