Различия
Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
programming:intern [2014/09/23 13:16] |
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 |