Интернационализация (перевод)

bash скрипты

Обсуждение и ценные (например про $переменную) замечания rodin.s

Имеем скрипт с сообщениями на языке, отличном от Вашего и желание перевести.

Неправильный метод:

  • В тексте скрипта заменяем все англ. сообщения на рус.
  • Если кто-то захочет другой язык - только повторить процедуру
  • Для возможности выбора языка придется хранить все скрипты на всех языках и подменять

Правильный метод:

  • Модификация скрипта и создания файла перевода /usr/share/locale/ru/LC_MESSAGES/имя_переводимой_программы.mo.
  • Экономим место и упрощаем жизнь переводчикам на другие языки.
  • Упомянутые утилиты (кроме poedit) находятся в devx модуле

Полный пример

  • Имеем скрипт script.sh
#!/bin/sh
TITLE="$(gettext 'Drive Mounter')"
echo $TITLE
  • Создаем script.po
xgettext script.sh -o script.po
  • В тесктовом редакторе переводим (заполняем пустоты в msgstr) и проверяем строку
"Content-Type: text/plain; charset=UTF-8\n"
  • Конвертируем в script.mo
msgfmt script.po -o /usr/share/locale/ru/LS_MESSAGES/script.mo
  • Модифицируем script.sh
#!/bin/sh
export TEXTDOMAINDIR=/usr/share/locale
export TEXTDOMAIN=skript
TITLE="$(gettext 'Drive Mounter')"
TITLE2="$(eval_gettext 'Drive Mounter $x')"
  • После запуска скрипта получаем переведенный текст
  • Если .mo Вашего языка нет - получите «Drive Mounter»
  • Сам скрипт может быть с сообщениями на русском. А в .mo перевод на английский
  • Перечисленные утилиты находятся в DEVX

Ссылки

Модификация оригинального скрипта

Добавляем в начало скрипта:

# Gettext internationalization
export TEXTDOMAIN="name_of_the_program"
export TEXTDOMAINDIR="destination_path_to_the_compiled_translations"
. gettext.sh

Пример:

До модификации:

# Version 4.3 - 28/07/2009
#  * replaced xorg.conf by fdi policy rule
# Take a look at "Xdialog" and use it instead of "dialog" in case X is running
if [[ "$DISPLAY" && "$(which Xdialog 2>&1 | grep -v "which: no")" ]]; then

После:

# Version 4.3 - 28/07/2009
#  * replaced xorg.conf by fdi policy rule
# Gettext internationalization
export TEXTDOMAIN="keyboardsetup"
export TEXTDOMAINDIR="/usr/share/locale"
. gettext.sh
# Take a look at "Xdialog" and use it instead of "dialog" in case X is running
if [[ "$DISPLAY" && "$(which Xdialog 2>&1 | grep -v "which: no")" ]]; then

Добавьте теги вокруг переводимого текста:

`eval_gettext 'string_to_be_translated'`

Пример:

До:

if [ "$xflag" = "yes" ] ; then
	answer="$(eval $dialog \
	--stdout \
	--title \"Keyboard configuration\" \
	--default-item \"$currentpathkeymap\" \
	--cancel-label \"Exit\" \
	--icon \"keyboardsetup\" \
	--check \"numlock\" \"on\" \
	--menu \
	\"\\n        Please select your prefered keyboard map:\" 20 75 11 "$list" )"	
else

После:

if [ "$xflag" = "yes" ] ; then
	answer="$(eval $dialog \
	--stdout \
	--title \"`eval_gettext 'Keyboard configuration'`\" \
	--default-item \"$currentpathkeymap\" \
	--cancel-label \"`eval_gettext 'Exit'`\" \
	--icon \"keyboardsetup\" \
	--check \"numlock\" \"on\" \
	--menu \
	\"\\n        `eval_gettext 'Please select your prefered keyboard map:'`\" 20 75 11 "$list" )"
else

Создание .po

Варианты:

  • Выделение из скрипта строк для перевода:
  xgettext --from-code=utf-8 -L shell -o name_of_shell_script.pot name_of_shell_script
  • Генерация .po из шаблона .pot
msginit -i name_of_shell_script.pot -o name_of_shell_script-name_of_locale.po
  • Взять .po другого языка, перевести на свой
  • Если есть только .mo
msgunfmt -o name_of_shell_script.po name_of_shell_script.mo

Перевод с PoEdit

  • Самый простой способ для локализации программного обеспечения Gettext является установка Poedit
  • Если уже есть .po файл для вашего языка - откройте и редактируйте.
  • Если нет - создайте его, выбрав в меню: «New catalog from .POT file»

Перевод без PoEdit

.po - это обычный текстовый файл. Используем любой текстовый редактор

Проверка перевода. Создание .mo

Конвертируем .po в .mo:

msgfmt name_of_shell_script-name_of_locale.po -o name_of_shell_script.mo

.mo помещаем в :

/usr/share/locale/name_of_locale/LC_MESSAGES/

Пример:

/usr/share/locale/ru/LC_MESSAGES/

Обновление перевода

При появлении новой версии скрипта нужно сгенерить новый .po, который будет включать старый перевод и новые непереведенные строки:

msgmerge -U name_of_shell_script-name_of_locale.po name_of_shell_script.pot

Исходники

https://fedoraproject.org/wiki/How_to_do_I18N_through_gettext

В .po надо charset=CHARSET заменить на charset=UTF-8

Печать/экспорт