Сайт | Скачать | Видео | Wiki

Автор Тема: Интернационализация (перевод). Теория, инструменты  (Прочитано 34577 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Обобщил свой опыт перевода xpnstools в http://wiki.puppyrus.org/programming/intern
rodin.s - проверьте опытным глазом  ;)

QT
« Последнее редактирование: 31 Март 2018, 09:54:09 от sfs »

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
Re:Интернационализация скриптов (перевод)
« Ответ #1 : 30 Апрель 2013, 22:52:15 »
Как-то всё сложно. Если бы я читал в первый раз - ничего-бы не понял. Я изначально использовал информацию из "Advanced Bush Scripring Guide".
Быстро не найду ссылку на эту страницу. Также что-то дополнил Барри, когда также начал использовать gettext. И недавно L18L дал эту ссылку, где также много полезной информации, которой я раньше не знал.
В принципе там всё просто.
Такую шапку всегда добавляю, иногда не задумываясь необходимости некоторых её частей. Например TEXTDOMAINDIR и так по умолчанию туда указывает. Вместо pupcontrol - имя mo-файла, который в этом каталоге будет находится для перевода этого файла. .gettext.sh также можно не указывать если не будет использоваться eval_gettext:

Код
export TEXTDOMAIN=pupcontrol # имя mo-файла
export TEXTDOMAINDIR=/usr/share/locale
export OUTPUT_CHARSET=UTF-8
. gettext.sh

Я использовал следующие способы добавления gettext в скрипт в зависимости от ситуации:
Код
$(gettext 'Hello world!')
`gettext \"Hello world! Can't do it!\" # если есть апостроф и одинарные кавычки не работают
И если сообщение в строгих кавычках:
Код
echo ' '$(gettext 'Hello world!')' '
Если в сообщении переменная:
Код
`eval_gettext \"Hello \\\$var world!\"`
Это основные приёмы, которые я долго использовал и не задумывался о других способах раз эти работали. Хотя другие способы тоже есть.
Барри подсказал простую штуку, как решить проблему с апострофом:
Код
$(gettext "Hello world! Can't do it") 
Правда это сбивает с толку цветовую подсветку geany.
Ну и новый для меня синтаксис из ссылки выше, например для eval_gettext:
Код
eval_gettext "text \$variable again text"
eval_gettext 'text $variable again text'

После того, как скрипт отмечен или даже в процессе разметки использую:
Код
xgettext -L Shell PupControl -o - # чтобы посмотреть отмеченные строки в процессе работы
и
Код
xgettext -L Shell PupControl -o pupcontrol.pot # чтобы создать pot-файл - шаблон для перевода

Последнюю строку использую всё реже. Сейчас в Puppy есть Momanager, который сам находит скрипты с gettext (правда делает это долго - несколько минут), там можно будет выбрать нужный скрипт и он будет открыт в poedit для перевода (будет автоматически сгенерирован его po-файл и mo-файл будет автоматически помещён куда надо после окончания перевода).

Дальше использую poedit. Создаю на основе pot-файла русский po-файл с переводом и при его сохранении автоматически генерируется mo-файл, который копирую с учётом правильного имени, указанного в шапке, в /usr/share/locale/ru/LC_MESSAGES.
Полезная команда msgunfmt позволяет из mo-файла получить po-файл, если его нет в наличии. Как было сказано po-файл - это обычный текстовый файл - его можно редактировать в geany (poedit удобнее - есть проверка правописания и база данных переводов), mo-файл - это бинарный файл который используется в процессе работы и должен быть помещён в каталог для mo-файлов.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Основная инфа - перевод буржуйской статьи. Сократил и упростил по максимуму.
Неужели и мой пример в конце сложен? Может его перенести в начало?
Ок. Вашу инфу чуть позже добавлю. Если есть идеи по переделке статьи - не молчите.
Mo-manager - будет работать только в puppy? Есть смысл с ним заморачиваться?

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
Нет, пример в конце не сложен, но в начале не совсем понятно. Например, eval_gettext используется только если в сообщении есть переменная, а в начале он используется как основной пример. Я тоже находил статьи по интернационализации bash, которые были очень сложными и если бы я им следовал, но не перевёл бы ни одного скрипта.
MoManager можно использовать только в Puppy. 
Также есть ещё интересная штука - ngettext для перевода множественного числа. Нигде пока не довелось применить в bash, разве, что в Hardinfo, но там код C.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Перекроил статью:
Свой пример перенес в начало.
Добавил ссылку на http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html#LOCALIZATION и форум
Хотел перенести Ваши варианты использования gettext из 2го поста, но засомневался - не запутать бы. Может хватит ссылки на этот пост...

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Re:Интернационализация скриптов (перевод)
« Ответ #5 : 14 Апрель 2014, 09:34:08 »
чтоб приступить к переводу мне надо разобраться с паппи слако 5.60. Скорее всего буду переустанавливать, всю систему, так как программа переводчик momanager требует файл сохранения.
Все проще.
Подключаете devx
Код
msgunfmt -o name_of_shell_script.po name_of_shell_script.mo
.po - редактируете как текст
Код
msgfmt script.po -o /usr/share/locale/ru/LS_MESSAGES/script.mo
Вот и все  ;)
http://wiki.puppyrus.org/programming/intern
Спасибо, я понял.
Получается, благодаря выше описанной схеме, я смогу переводить в любом текстовом редакторе, на любом устройстве..
Хоть на компе по 5 мин в день,
хоть на моём телефоне LG A390 с установленным текстовым редактором всё "незанятое время" (к примеру по дороге куда-нибудь).
Только не ясно, а где найти эти файлы которые Вы запросили для перевода? Поиском пройтись?  Я прошёл. Файлы не найдены.
Да , основная работа - просто редактирование текста в любом редакторе
Есть более продвинутые спецредакторы (poedit), но жизнь они не упрощают
Если он будет не юниксовый - возможны нюансы с переводом строк и т.п (решаемо - расскажу)
.mo файлы находятся как правило в /usr/share/locale/ru/LC_MESSAGES/
В тексте программы должны быть конструкции $(gettext 'eng-txt или любой др. язык")
Если их нет - надо приводить к такому виду +
Т.е. указано где искать .mo
Если .mo другого языка есть - конвертируем в .po, правим в текст. редакторе на нужный язык. Всё
Не обязательно исходный текст должен быть англ. - любой
« Последнее редактирование: 17 Апрель 2014, 14:10:32 от sfs »

Оффлайн Sender

  • Пользователь
  • **
  • Сообщений: 53
  • Репутация: +6/-0
Re:Интернационализация скриптов (перевод)
« Ответ #6 : 19 Август 2014, 11:52:46 »
Я с этим вопросом ( я про "фальшивые" mo файлы) столкнулся вчера вечером,  когда пытался перевести один файл из мо в по. И  в вики к сожалению тоже ничего не понял ( наспех смотрел ).

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Re:Интернационализация скриптов (перевод)
« Ответ #7 : 19 Август 2014, 13:14:10 »
Не совсем понял про "фальшивые"
Я имел ввиду что prun написан без конструкций `eval_gettext 'string_to_be_translated'`
Т.е. надо переписывать сам скрипт. Для pra его еще надо переделать. Получается автору наш труд не послать
Соответственно можно просто перевести сам скрипт без mo - c потерей совместимости, которой и так нет


Оффлайн Sender

  • Пользователь
  • **
  • Сообщений: 53
  • Репутация: +6/-0
Re:Интернационализация скриптов (перевод)
« Ответ #8 : 19 Август 2014, 13:32:36 »
Я имел ввиду когда мо файл не в формате GNU (смотреть вложение).

Цитата
Соответственно можно просто перевести сам скрипт без mo - c потерей совместимости
Ну давайте так.

Оффлайн Pro

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 10737
  • Репутация: +113/-2
Re:Интернационализация скриптов (перевод)
« Ответ #9 : 19 Август 2014, 14:32:27 »
Я имел ввиду когда мо файл не в формате GNU (смотреть вложение).
наоборот хороший и простой вариант перевода, смотреть можно простым редактором текста без всяких преобразований
Я загружаю новые пакеты сюда: http://file.puppyrus.org/users/ а дальше можно найти самостоятельно.

Оффлайн Pro

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 10737
  • Репутация: +113/-2
очень хорошо помогает программа msgmerge и msgcmp
Я загружаю новые пакеты сюда: http://file.puppyrus.org/users/ а дальше можно найти самостоятельно.

Оффлайн knn

  • Ветеран
  • *****
  • Сообщений: 2538
  • Репутация: +33/-0
... gettext...
- интересная ссылка, а то пробовал как-то 'gettext' (без руководств) на скору-руку, но что-то на тот раз не удалось.
- добавил себе в заметки ссылку на gettext-паппирус-Вики, и ссылки упомянутые в тексте и далее контекстно.
( надеюсь найдется время вернуться к этому вопросу).
=======
зы
цитата из вики:
Цитата
Упомянутые утилиты (кроме poedit) ...
- имхо, при прочтении по тексту не понятно - ?какие?
( так-то не принципиально - ссылок понабрал - при возможности поознакамливаюсь)
Gr4D, Grub2; HP Mini 210 VT - Intel Atom N470  @ 1.83GHz, Intel GMA3150, RAM=2 ГБ ;
Sams-n110: N270 - 1,6 ГГц, Intel GMA 950, RAM=2 ГБ.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
при прочтении по тексту не понятно - ?какие?
gettext и прочие упомянутые ниже утилиты (кроме poedit) находятся в devx модуле
так норм?

Оффлайн knn

  • Ветеран
  • *****
  • Сообщений: 2538
  • Репутация: +33/-0
имхо, (c) "...упомянутые ниже утилиты..." - нормально
-----------
с одной стороны - 'devx' не на каждой системе (и возможно не помешало б перечисление), с другой - есть и ссылки-по-тексту и далее контекстные
---------
 ) мне для 'дальнейшего' будет иметь значение 'положительный промежуточный хотя б минимальный результат' .
а это - когда-то позже.
Gr4D, Grub2; HP Mini 210 VT - Intel Atom N470  @ 1.83GHz, Intel GMA3150, RAM=2 ГБ ;
Sams-n110: N270 - 1,6 ГГц, Intel GMA 950, RAM=2 ГБ.

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1708
  • Репутация: +49/-1
  • /dev/hands < /dev/ass
gettext и прочие упомянутые ниже утилиты (кроме poedit) находятся в devx модуле
Там еще гуевина валяется. momanager. Умеет искать скрипты и бинарники без переводов. Предлагает создать. Использует тот же gettext. Удобная штука.
Компьютер имеет то преимущество перед мозгом, что им пользуются.