Приложение G. Локализация


Возможность локализации сценариев Bash нигде в документации не описана.

Локализованные сценарии выводят текст на том языке, который используется системой, в соответствии с настройками. Пользователь Linux, живущий в Берлине (Германия), будет видеть сообщения на немецком языке, в то время как другой пользователь, проживающий в Берлине штата Мэриленд (США) — на английском.

Для создания локализованых сценариев можно использовать следующий шаблон, предусматривающий вывод всех сообщений на языке пользователя (сообщения об ошибках, приглашения к вводу и т.п.).

  1. #!/bin/bash
  2. # localized.sh
  3. # Автор Stephane Chazelas, дополнил Bruno Haible
  4. . gettext.sh
  5. E_CDERROR=65
  6. error()
  7. {
  8.   printf "$@" >&2
  9.   exit $E_CDERROR
  10. }
  11. cd $var || error "`eval_gettext \"Can't cd to \$var.\"`"
  12. read -p "`gettext \"Enter the value: \"`" var
  13. # ...


  1. bash$ bash -D localized.sh
  2. "Can't cd to %s."
  3. "Enter the value: "
Это список всех текстовых сообщений, которые подлежат локализации. (Ключ -D выводит список строк в двойных кавычках, которым предшествует символ $, без запуска сценария на исполнение.)

  1. bash$ bash --dump-po-strings localized.sh
  2. #: a:6
  3.  msgid "Can't cd to %s."
  4.  msgstr ""
  5.  #: a:7
  6.  msgid "Enter the value: "
  7.  msgstr ""
Ключ --dump-po-strings в Bash напоминает ключ -D, но выводит строки в формате "po", с помощью утилиты gettext.

Note

Bruno Haible отмечает, что:

Начиная с версии gettext-0.12.2, вместо bash --dump-po-strings localized.sh, рекомендуется использовать xgettext -o - localized.sh, потому что xgettext . . .

1. понимает команды gettext и eval_gettext (тогда как bash --dump-po-strings только свой синтаксис в виде $"..." )

2. может извлекать комментарии программиста, предназначенные для переводчика.

Такой код не привязан к определенной версии Bash и может быть исполнен в Bash 1.x или других реализациях /bin/sh.

Теперь построим файл language.po, для каждого языка, на которые предполагается перевести сообщения сценария. Например:

Файл ru.po сделан переводчиком, в оригинальном документе локализация выполнена на примере французского языка

ru.po:

  1. #: a:6
  2. msgid "Can't cd to %s."
  3. msgstr "Невозможно перейти в каталог %s."
  4. #: a:7
  5. msgid "Enter the value: "
  6. msgstr "Введите число: "


Затем запустите msgfmt.

msgfmt -o localized.sh.mo ru.po

Перепишите получившийся файл localized.sh.mo в каталог /usr/share/locale/ru/LC_MESSAGES и добавьте в начало сценария строки:

  1. TEXTDOMAINDIR=/usr/share/locale
  2. TEXTDOMAIN=localized.sh


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

Note

В старых версиях Bash или в других командных оболочках, потребуется воспользоваться услугами утилиты gettext, с ключом -s. В этом случае наш сценарий будет выглядеть так:

  1. #!/bin/bash
  2. # localized.sh
  3. E_CDERROR=65
  4. error() {
  5.   local format=$1
  6.   shift
  7.   printf "$(gettext -s "$format")" "$@" >&2
  8.   exit $E_CDERROR
  9. }
  10. cd $var || error "Can't cd to %s." "$var"
  11. read -p "$(gettext -s "Enter the value: ")" var
  12. # ...


А переменные TEXTDOMAIN и TEXTDOMAINDIR, необходимо будет экспортировать в окружение.

---

Это приложение написано Stephane Chazelas, и дополнено Bruno Haible, ведущим разработчиком GNU gettext.