====== Интернационализация (перевод) ======
====== bash скрипты ======
[[http://forum.puppyrus.org/index.php/topic,14194.0.html|Обсуждение и ценные (например про $переменную) замечания rodin.s]]
Имеем скрипт с сообщениями на языке, отличном от Вашего и желание перевести.
===== Неправильный метод: =====
*В тексте скрипта заменяем все англ. сообщения на рус.
*Если кто-то захочет другой язык - только повторить процедуру
*Для возможности выбора языка придется хранить все скрипты на всех языках и подменять
===== Правильный метод: =====
*Модификация скрипта и создания файла перевода ///usr/share/locale/ru/LC_MESSAGES/имя_переводимой_программы.mo//.
*Экономим место и упрощаем жизнь переводчикам на другие языки.
*gettext и прочие упомянутые ниже утилиты (кроме poedit) находятся в devx модуле
==== Полный пример ====
*Имеем скрипт script.sh
#!/bin/sh
TITLE="$(gettext 'Drive Mounter')"
echo $TITLE
*Создаем script.po
xgettext script.sh -o script.po
xgettext не настолько интеллектуальный. Как правило , если автор сам не сделал .po - придется делать самому руками, т.е править текст скрипта как в Пример 1 ниже. Готовый вариант отправить автору, чтобы следующие версии были уже интернационализованы
*В тесктовом редакторе переводим (заполняем пустоты в 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. Далее вольный перевод
* [[http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html#LOCALIZATION|Дополнительная информация]]
* [[http://forum.puppyrus.org/index.php/topic,14194.0/topicseen.html|Обсуждение статьи на форуме]]
===== Модификация оригинального скрипта =====
==== Добавляем в начало скрипта: ====
# Gettext internationalization
export TEXTDOMAIN="name_of_the_program"
export TEXTDOMAINDIR="destination_path_to_the_compiled_translations"
. gettext.sh
В простых случаях можно обойтись без 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'`
=== Пример 1: ===
До:
echo "string to be translated"
После:
echo "$(gettext 'string to be translated')"
Создаем файл text.po
msgid ""
msgstr ""
"Project-Id-Version: Midnight Commander\n"
"Report-Msgid-Bugs-To: http://www.midnight-commander.org/\n"
"POT-Creation-Date: 2019-06-22 13:45+0200\n"
"PO-Revision-Date: 2019-03-03 23:22+0000\n"
"Last-Translator: AlexL \n"
"Language-Team: Russian (http://www.transifex.com/mc/mc/language/ru/)\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"%100>=11 && n%100<=14)? 2 : 3);\n"
msgid "string to be translated"
msgstr "строка будет переведена"
Первые строки - заголовок
Пример многострочного перевода:
msgid ""
"Note: The Retrovol settings can be adjusted at any time in the future "
"by right-clicking on the loadspeaker-icon in the tray."
msgstr ""
"Примечание: Настройки Retrovol можно изменить в любой момент в "
"будущем, щелкнув правой кнопкой мыши на иконке звука в трее."
=== Пример 2: ===
До:
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 является [[http://forum.puppyrus.org/index.php/topic,1424.0.html|установка 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
======== Qt ========
http://forum.puppyrus.org/index.php?topic=20588.0