Вопрос или проблема
Объяснение
Создать систему перевода в 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, которая обрабатывает как двухбуквенные, так и пятбуквенные языковые коды из переменной окружения LANG
, вы можете использовать следующий подход. Это будет включать использование if
и string
для проверки и извлечения языковых кодов, а также реализацию механизма возврата к английскому в случае отсутствия перевода.
Вот пример кода, который решает вашу задачу:
# Получаем значение LANG из переменной окружения
let language = $env.LANG
# Извлекаем языковой код на основе длины строки
let lang_code = if ($language | str length) == 5 {
$language | str substring 0..5 # для пятбуквенного кода
} else if ($language | str length) == 8 { # например для pt_PT.UTF-8
$language | str substring 0..2 # возвращаем первые две буквы, так как код будет 'pt'
} else {
$language | str substring 0..2 # на случай двухбуквенного кода
}
# Определяем систему переводов
let translations = {
"pt":
{
"hello_world": "Olá, gajo",
},
"pt_BR":
{
"hello_world": "Oi, garoto",
},
"fr":
{
"hello_world": "Bonjour, gars",
},
"it":
{
"hello_world": "Ciao, ragazzo",
},
_:
{
"hello_world": "Hello, guy",
}
}
# Получаем текущие переводы
let current_translations = $translations | get $lang_code
# Если текущих переводов нет, возвращаем английский перевод
let hello_world = if $current_translations {
$current_translations.hello_world
} else {
$translations._.hello_world # английская версия по умолчанию
}
# Печатаем результат
print $hello_world
Пояснения:
-
Извлечение языкового кода:
- В зависимости от длины значения
LANG
, код проверяет, является ли он пятбуквенным (например,pt_BR
) или двухбуквенным (например,pt
) и соответственно извлекает соответствующий подстроку.
- В зависимости от длины значения
-
Система переводов:
- Система переводов представлена как хеш-таблица, где ключами служат языковые коды, а значениями – словари с переводами.
-
Получение переводов:
- При использовании
get
кода, если текущих переводов не существует, возвращается английская версия по умолчанию, находящаяся вtranslations._
.
- При использовании
Ожидаемое поведение:
- Если установить
LANG
значение, например,pt_BR.UTF-8
, программа вернёт "Oi, garoto". - Если установить значение
LANG
другое, например,fr_FR.UTF-8
, программа вернёт "Bonjour, gars". - В случае отсутствия перевода для другого кода, программа вернёт "Hello, guy".
Это решение должно корректно обрабатывать и возвращать переводы в зависимости от структуры переменной окружения LANG
, что позволит вам реализовать желаемую функциональность системы перевода.