Как подружить gettext и БД? Или как просканировать __("двойное подчеркивание")?

Мне нужно так промаркировать переводимые фразы, чтобы было удобно их собирать, но при этом переводы должны браться из БД.


При использовании _(«одиночного подчеркивания») (а также gettext(), ngettext()) я могу удобно добыть фразы с помощью xgettext. Однако _() — внутренняя функция и переопределить ее я не могу, а нужно чтобы она брала переводы не из .mo а из БД. Я бы с удовольствием использовал маркировку __(«двойным подчеркиванием») но не знаю как указать xgettext'у что сканировать нужно __() а не _()


Что делать, как быть? :)
  • Вопрос задан
  • 2744 просмотра
Решения вопроса 1
@Eddy_Em
> _() — внутренняя функция

Ничего подобного, этот макрос надо определить самому, и обычно его определяют как gettext(x).

Я, например, определяю так:

#define _(String) gettext(String)
#define gettext_noop(String) String
#define N_(String) gettext_noop(String)

Вы можете переопределить, если вам так хочется, например,

#define __(String) myfunc(String)

А уже myfunc будет брать данную строку из базы данных.

Чтобы xgettext повыдергивал нужное, просто укажите, что префиксом является __:

xgettext [прочие ключи] -k__ -o выходной_файл.po
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@pantoriy
Нет, ну определять макрос gettext_noop ни к чему. Собственно и макрос N_ тоже! Просто не вызывайте от него макрос _. И тогда утилита генерации файла локализации xgettext просто не включить вашу строку в выходной po файл. Кстати с базой это не сработает. Точнее не сработает xgettext. Ну потому что он должен знать какую строку надо выдёргивать на момент её запуска. А её там нет, она появится только в момент обращения к БД. Так работает только статическая локализация. Но можно обмануть если вы знаете какие строки там появляются мы можете вручную добавить их в ваш po файл... Это конечно не обезопасит вас от сбоев, если к примеру появятся новые. Можно будет каждый раз дописывать этот файл и перекомпилить а потом подкладывать. Но это неблагодарное занятие. Гораздо лучше написать перевод в самой базе добавив туда поле с соответсвующим языком и таскать срзу строк в нужном языке. Тогда при добавлении записи в бд вы можете потребовать так же добавить и её перевод. А не добавили ну их проблемы... Как хотят! Ну куда-то её надо добавлять, либо туда либо сюда и в любом случае вручную...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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