Файлы Gettext .po при управлении версиями

В настоящее время использование Gettext на проекте и .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"

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

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

35
задан Alex Brown 8 January 2010 в 13:23
поделиться

3 ответа

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

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

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

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

grep -v '^#:' $1

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

*.po diff=podiff

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

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

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

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

.
25
ответ дан 27 November 2019 в 07:09
поделиться

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

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

.
7
ответ дан 27 November 2019 в 07:09
поделиться

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

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

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

.
7
ответ дан 27 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: