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.
Предложения?
Ответы
Ответ 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