Explicação
Foi fácil implementar um sistema de tradução em Bash e Zsh.
Agora, é particularmente desafiador implementar um sistema de tradução no Nushell porque o Nushell é diferente do Bash e do Zsh.
Estou tentando combinar corretamente os códigos de idioma de duas letras (como en
para inglês, pt
português e português europeu) e os códigos de idioma de cinco letras (como pt_BR
para português brasileiro) e fazer com que os idiomas inexistentes retornem à versão em inglês.
Entretanto, meu código atual só corresponde aos dois caracteres do LANG
valor do ambiente para todos os outros idiomas.
Aqui está meu pequeno código:
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
Executei os seguintes comandos no terminal, usando 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
Também tentei implementar outra alternativa:
let language = $env.LANG
let lang_code = if $language == "pt_BR.UTF-8" {
$language | str substring 0..5
} else {
$language | str substring 0..1
}
Comportamento real
- O código retorna corretamente todos os códigos de idioma de duas letras, incluindo
pt
e exibe a tradução correta. - Para outros códigos de idiomas de duas letras que não existem no sistema de tradução, o código não conseguiu retornar à versão padrão em inglês.
- Para outros códigos de idiomas de cinco letras, se você selecionar
pt_BR.UTF-8
, ele retornará apenas a versão em português europeu incorretamente, fazendo com que a pesquisa na tabela de traduções falhe.
Comportamento desejado
Quero manipular códigos de idioma de duas e cinco letras, como pt
e códigos de cinco letras, como pt_BR
, e retornar os códigos de idioma de duas e cinco letras inexistentes para a versão padrão em inglês.
Atualizar
Testei a outra alternativa e funcionou, mas o código é feio:
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
Não sei
nushell
, mas parece que você pode usar uma tabela com 2 colunas, o padrão e o idioma resultante, e então iterar pelas linhas por meio dofilter
comando, usando um fechamento ou função que testa o idioma do ambiente em relação ao padrão e, se estiver ok, retorna o idioma.Parece que você não precisa citar strings alfanuméricas simples. Eu tentei o seguinte também, mas ele retornou uma lista vazia por algum motivo.