Различия

Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

Ссылка на это сравнение

programming:intern [2013/05/06 11:35]
programming:intern [2024/01/24 15:50] (текущий)
sfs [Правильный метод:]
Строка 1: Строка 1:
 +====== Интернационализация (перевод) ======
 +====== 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
 +<code>
 +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 <alex.valer@mail.com>\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 "строка будет переведена"
 +</code>
 +Первые строки - заголовок
 +
 +Пример многострочного перевода:
 +<code>
 +msgid ""
 +"<b>Note:</b> The Retrovol settings can be adjusted at any time in the future "
 +"by right-clicking on the loadspeaker-icon in the tray."
 +msgstr ""
 +"<b>Примечание:</b> Настройки Retrovol можно изменить в любой момент в "
 +"будущем, щелкнув правой кнопкой мыши на иконке звука в трее."
 +</code>
 +=== Пример 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 =====
 +Варианты:
 +  *Выделение из скрипта строк для перевода:
 +<code>
 +  xgettext --from-code=utf-8 -L shell -o name_of_shell_script.pot name_of_shell_script
 +</code>
 +  *Генерация .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
Печать/экспорт