Gettext.pliki po pod kontrolą wersji

Obecnie używa Gettext w projekcie ipliki po są ładnie przechowywane pod kontrolą wersji.

Pliki PO oczywiście zawierają tłumaczenia, ale oprócz tego zawierają również pewne metadane - informacje o dokładnych plikach i numery linii, w których znajdują się tłumaczenia ciągów.

Problem polega na tym, że przy każdej aktualizacji plików PO metadane zmienia się o wiele bardziej niż rzeczywiste tłumaczenia. To sprawia, że naprawdę trudno później zobaczyć z wersji control diff co faktycznie było changed-po prostu widzisz mnóstwo zmian w nazwach plików i linii liczby. Tak:

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

Oczywiście prostą poprawką byłoby wyłączenie generowania komentarze o nazwach plików/numerach linii w wyjściu xgettext. Ale w rzeczywistości znajduję te nazwy plików są bardzo przydatne wskazówki podczas tłumaczenia.

Na pewno nie mogę być jedynym, który nie lubi różnic w jego plikach PO. Sugestie?

Author: Alex Brown, 2010-01-05

4 answers

Prostą poprawką byłoby zastosowanie filtra grep w celu usunięcia metadanych komentarzy z przeglądanych różnic. Możesz to zrobić na wyjściu narzędzia kontroli wersji diff:

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

Lub możesz polecić narzędzie kontroli wersji diff, aby zignorowało je przed dokonaniem porównania, co prawdopodobnie spowoduje bardziej niezawodne i ładniejsze wyjście: {]}

Nie wiem jakiego systemu kontroli wersji używasz, ale git (na przykład) pozwala na preproces wejście do diff i usunięcie linii komentarza dla niektórych typów plików (dzięki VonC), Zobacz man gitattributes i wyszukaj wykonując różnice tekstowe plików binarnych. Oto treść przykładowego skryptu do zapisania jako /usr/local/bin/strippocomments, który to zrobi:

grep -v '^#:' $1

Możesz następnie powiedzieć gitowi, aby użył tego skryptu do preprocesowania plików po, dodając do pliku .git/info/attributes w Twoim repozytorium:

*.po diff=podiff

I do pliku .git/config w Twoim repozytorium:

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

Używanie git diff powinno następnie nie dołączaj żadnych linii zaczynających się od #:.

Zauważ, że różnice wygenerowane z git diff przy użyciu tego podejścia nie powinny być używane do łatania - ale git format-patch nadal będą używać domyślnego różnicowania, więc łaty wygenerowane do wysyłania e-maili nadal będą w porządku.

 25
Author: Alex Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 14:10:06

The gitattributes/textconv podejście to właściwa droga. Chciałbym zaoferować lepsze rozwiązanie dotyczące narzędzi do wstępnego przetwarzania.

W .gitattributes:

*.po    diff=po

W .gitconfig:

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

msgcat z pakietu gettext jest tam użytecznym narzędziem. Ma wiele opcji, z którymi możesz grać. Opcja --no-location jest szczególnie tym, co chcesz odfiltrować różnice numerów linii. Inne opcje mogą być przydatne, jeśli xgettext i / lub msgmerge i / lub edytor nadal formatuje struny w denerwujący sposób. (W takim przypadku dobrze byłoby również przekazać te same opcje do tych narzędzi i ponownie skonfigurować edytor.)

 19
Author: Peter Eisentraut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-02 09:27:33

Pakiet GNU gettext posiada wiele przydatnych narzędzi do wykonywania różnych zadań z plikami PO. Msgcmp porównuje dwa pliki PO, msgcomm wybiera wspólne / unikalne wiadomości, msgattrib wybiera/filtruje / przekształca istniejące pliki PO. Zależy od tego, czego potrzebujesz od Diffa pliku PO, myślę, że musisz użyć msgattrib lub msgcomm.

JeĹ " li potrzebujesz po prostu porăłwnaä ‡ dwa pliki PO Bez komentarza na temat pliku / linii, to prosty skrypt do grepa i zapisanie w katalogu temp Twojego starego i Nowego PO pliki byłyby wystarczające.

 7
Author: bialix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 16:56:37

Możesz spojrzeć na różne opcje oferowane przez custom diff a .plik gitattribute , np. określanie specjalnych różnic dla plików po

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

With mypodiff A script calling any diff tool able to filter out the line that you wa wnt

 7
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 07:21:15