Gettext .po файлы под контролем версий - PullRequest
35 голосов
/ 05 января 2010

В настоящее время используется Gettext для проекта, а файлы .po хорошо хранятся под контролем версий.

PO-файлы, конечно, содержат переводы, но в дополнение к этому они также содержат некоторые метаданные - информацию о точных файлах и номера строк, в которых расположены переводимые строки.

Проблема в том, что каждый раз, когда вы обновляете PO-файлы, метаданные меняется намного больше, чем фактические переводы. Это делает это очень трудно позже увидеть из контроля версий diff, что на самом деле было изменено - вы просто видите множество изменений в именах файлов и строк номера. Вот так:

- #: somefile.js:43
- #: somefile.js:45
- #: somefile.js:118
+ #: somefile.js:203
+ #: somefile.js:215
  msgid "Translate me please"
  msgstr "Tõlgi mind palun"

- #: somefile.js:23
- #: somefile.js:135
+ #: otherfile.js:23
+ #: otherfile.js:135
  msgid "Note"
  msgstr "Märkus"

- #: andThatFile.js:18
  #: orThisFile.js:131
- msgid "Before I was like this"
- msgstr "Selline olin ma enne"
+ msgid "I happen to be changed"
+ msgstr "Paistab, et mind muudeti"

Конечно, простым решением было бы просто отключить генерацию комментарии к имени файла / белья в выводе xgettext. Но я на самом деле нахожу эти имена файлов очень полезны при переводе.

Я, конечно, не могу быть единственным, кому не нравятся различия в его PO-файлах. Предложения?

Ответы [ 4 ]

25 голосов
/ 07 января 2010

Простым решением будет применение фильтра grep для удаления метаданных комментариев из просматриваемой разницы. Вы можете сделать это для вывода утилиты контроля версий:

myVersionControl diff REV1 REV2 filea | grep -v '^..#'

или вы можете указать утилите diff управления версиями игнорировать их перед выполнением сравнения, что, скорее всего, приведет к более надежному и красивому выводу:

Я не знаю, какую систему контроля версий вы используете, но git (например) позволяет вам предварительно обработать ввод в diff и удалить строки комментариев для определенных типов файлов (спасибо VonC), см. man gitattributes и поиск Выполнение текстовых различий двоичных файлов . Вот тело примера сценария, которое нужно сохранить как /usr/local/bin/strippocomments, что сделает это:

grep -v '^#:' $1

Затем вы можете указать git использовать этот сценарий для предварительной обработки po-файлов, добавив в файл .git/info/attributes в своем репозитории следующее:

*.po diff=podiff

и в файл .git/config в вашем хранилище:

[diff "podiff"]
    textconv = /usr/local/bin/strippocomments

Использование git diff не должно включать строки, начинающиеся с #:.

Обратите внимание, что различия, сгенерированные из git diff с использованием этого подхода, не должны использоваться для исправления - но git format-patch все равно будет использовать diff по умолчанию, поэтому исправления, сгенерированные для отправки по электронной почте, будут в порядке.

20 голосов
/ 02 июля 2012

Подход gitattributes / textconv - верный путь. Я хотел бы предложить лучшее решение в отношении инструментов для предварительной обработки.

В .gitattributes:

*.po    diff=po

В .gitconfig:

[diff "po"]
    textconv=msgcat --no-location --no-wrap --sort-output

msgcat из пакета gettext - полезный инструмент. У него есть несколько опций, с которыми вы можете играть. Параметр --no-location особенно подходит для фильтрации различий в номерах строк. Другие параметры могут быть полезны, если xgettext и / или msgmerge и / или ваш редактор продолжают переформатировать строки раздражающими способами. (В этом случае было бы также хорошо передать те же параметры этим инструментам и перенастроить ваш редактор.)

7 голосов
/ 08 января 2010

Вы можете посмотреть на различные опции, предлагаемые пользовательской разницей для файла .gitattribute , например, указав специальный diff для po-файлов

[diff "mypodiff"]
    command = mypodiff
*.po   diff=mypodiff

с mypodiff скриптом, вызывающим любой инструмент diff, способный отфильтровать строку, которую вы хотите

7 голосов
/ 07 января 2010

Пакет GNU gettext содержит множество полезных утилит для выполнения различных задач с PO-файлами. Существует msgcmp для сравнения двух PO-файлов, msgcomm для выбора общих / уникальных сообщений, msgattrib для выбора / фильтрации / преобразования существующих PO-файлов. Зависит от того, что вам действительно нужно из diff файла PO, я думаю, вам нужно использовать либо msgattrib, либо msgcomm.

Если вам нужно просто сравнить два PO-файла без комментариев о файле / строке, тогда достаточно простого скрипта для grep и сохранения в temp dir ваших старых и новых PO-файлов.

...