Подтвердить что ты не робот

Gettext.po файлы под управлением версии

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

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

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

- #: 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"

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

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

4b9b3361

Ответ 1

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

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

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

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

grep -v '^#:' $1

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

*.po diff=podiff

и к файлу .git/config в вашем репозитории:

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

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

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

Ответ 2

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

В .gitattributes:

*.po    diff=po

В .gitconfig:

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

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

Ответ 3

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

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

Ответ 4

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

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

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