Достижение этого лучше всего сделать с помощью разделения кода или использования неоднозначности контекста.
Если вы можете отделить код своего меню от кода нижнего колонтитула, то вы действительно можете рассматривать их как разные домены и извлекать их соответственно из известных местоположений.
Если модульное разделение невозможно и весь код живет вместе, то на самом деле вы должны использовать контекст вместо доменов. например
translate( 'A string', 'myproject', 'some module' )
Где "myproject"
- ваш домен, а "some module"
устраняет неоднозначность строки.
Однако реальность не всегда совпадает с передовой практикой, поэтому, если вы не можете реорганизовать свой код, как предлагает Асевере (и это, вероятно, лучший ответ), тогда у меня есть огромный взлом, чтобы предложить.
Вы могли бы использовать флаг контекста, упомянутый в ответе Бориса. Мы можем использовать это повторно, но только если мы не собираемся использовать контексты.
Я повторю это. Этот хак будет работать, только если ваш код не использует контексты .
Некоторый PHP, содержащий два домена (включая одну строку, используемую в обоих) -
<?php // test.php
dgettext( 'abc', 'foo' );
dgettext( 'abc', 'bar' );
dgettext( 'xyz', 'bar' );
Мы можем обмануть и принять аргумент домена, как если бы мы предполагали, что он является контекстом сообщения (поле msgctxt). Извлечение из командной строки:
xgettext -LPHP --keyword=dgettext:1,2c -o - test.php \
| sed 's/CHARSET/utf-8/' \
> combined.pot
Создает файл combined.pot
, содержащий все строки с нашим контекстным хаком. (обратите внимание, мы также исправили поле набора символов заполнителя, которое сломало бы следующий бит)
Теперь мы можем отфильтровать все сообщения данного контекста в отдельные файлы, используя msggrep
. Обратите внимание, что мы также удаляем контекстное поле, поскольку мы его не используем.
msggrep -J -e foo -o - combined.pot | sed '/^msgctxt/d' > foo.pot
msggrep -J -e bar -o - combined.pot | sed '/^msgctxt/d' > bar.pot
Неправильно, но работает.