====== Интернационализация (перевод) ====== ====== 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