Это старая версия документа.
Содержание
Интернационализация (перевод)
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
Ссылки
- Подробности процесса перевода описаны в http://www.salixos.org/wiki/index.php/Internationalize_shell_scripts. Далее вольный перевод
Модификация оригинального скрипта
Добавляем в начало скрипта:
# 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
Добавьте теги вокруг переводимого текста:
$(gettext 'string_to_be_translated')
или
`eval_gettext 'string_to_be_translated'`
Пример:
До:
echo "string_to_be_translated"
После:
echo "$(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 - это обычный текстовый файл. Используем любой текстовый редактор
Несколько строк
msgid "Text" msgstr "" "Текст\n" "продолжение"
Проверка перевода. Создание .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