Я не могу сопоставить как двухбуквенные, так и пятибуквенные коды языка из переменной среды LANG в операторе if в Nushell.

Вопрос или проблема

Объяснение

Создать систему перевода в 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

Пояснения:

  1. Извлечение языкового кода:

    • В зависимости от длины значения LANG, код проверяет, является ли он пятбуквенным (например, pt_BR) или двухбуквенным (например, pt) и соответственно извлекает соответствующий подстроку.
  2. Система переводов:

    • Система переводов представлена как хеш-таблица, где ключами служат языковые коды, а значениями – словари с переводами.
  3. Получение переводов:

    • При использовании get кода, если текущих переводов не существует, возвращается английская версия по умолчанию, находящаяся в translations._.

Ожидаемое поведение:

  • Если установить LANG значение, например, pt_BR.UTF-8, программа вернёт "Oi, garoto".
  • Если установить значение LANG другое, например, fr_FR.UTF-8, программа вернёт "Bonjour, gars".
  • В случае отсутствия перевода для другого кода, программа вернёт "Hello, guy".

Это решение должно корректно обрабатывать и возвращать переводы в зависимости от структуры переменной окружения LANG, что позволит вам реализовать желаемую функциональность системы перевода.

Оцените материал
Добавить комментарий

Капча загружается...