В php (или, возможно, gettext вообще), что делает gettext, когда видит переменную в динамическом контенте?
У меня есть 2 случая.
1) Предположим, что у меня есть <?=$user1?> poked John <?=$user2?>
. Возможно, на каком-то языке порядок слов отличается. Как gettext обрабатывает это? (нет, я не строю facebook, это был всего лишь пример)
2) Предположим, я храню некоторые категории в базе данных. Они редко, но они хранятся в базе данных. Что произойдет, если я сделаю <?php echo gettext($data['name']); ?>
<?php echo gettext($data['name']); ?>
? Я бы хотел, чтобы переводчики также переводили имена этих категорий, но нужно ли это делать в самой базе данных?
благодаря
Ваш лучший вариант – использовать функцию spritf (). Затем вы должны использовать нотацию printf для обработки динамического содержимого в своих строках. Вот некоторая функция, которую я нашел здесь некоторое время назад, чтобы легко справиться с этим:
function translate() { $args = func_get_args(); $num = func_num_args(); $args[0] = gettext($args[0]); if($num <= 1) return $args[0]; return call_user_func_array('sprintf', $args); }
Теперь, например, 1, вы хотите изменить строку:
%s poked %s
Что бы вы ввели в функцию translate () следующим образом:
<?php echo translate('%s poked %s', $user1, $user2); ?>
Вы будете разбирать все функции translate () с помощью poEdit. а затем перевести строку «% s toked% s» на любой язык, который вам нужен, без изменения заполнителей строки % s . Они заменили бы на выходе функцией translate () с user1 и user2 соответственно. Вы можете больше узнать о sprintf () в руководстве PHP для более продвинутых способов использования.
Для выпуска №2. Вам нужно будет создать статический файл, который poEdit может анализировать, содержащий имена категорий. Например, «misctranslations.php»:
<?php _('Cars'); _('Trains'); _('Airplanes');
Затем выполните poEdit parse misctranslations.php. Затем вы сможете выводить преобразование имени категории с помощью <?php echo gettext($data['name']); ?>
<?php echo gettext($data['name']); ?>
Чтобы немного рассказать о том, что сказал Марк … единственная проблема с вышеупомянутым решением заключается в том, что статический список должен всегда поддерживаться вручную, и если вы добавляете новую строку перед всеми остальными или полностью меняете существующую, вы используете для перевода, может смутить новые строки, и вы можете потерять некоторые переводы.
Я на самом деле пишу статью об этом (слишком мало времени, чтобы закончить это в ближайшее время!), Но мой предложенный ответ выглядит примерно так:
Gettext позволяет хранить номер строки, который строка отображается в коде внутри файла .po. Если вы полностью измените строку, редактор .po будет знать, что строка не нова, но она старая (благодаря номеру строки).
Мое решение заключается в написании сценария, который читает базу данных и создает статический файл со всеми строками gettext. Большая разница с решением Маркса заключается в том, что первичный ключ (давайте назовем его ID) в базе данных соответствует номеру строки в новом файле. В этом случае, если вы полностью меняете один оригинальный перевод, строки остаются прежними, а ваш переводчик будет распознавать строки.
Конечно, могут быть более новые и более интеллектуальные редакторы .po там, но, по крайней мере, если ваши проблемы с новыми строками, то это решит их.
Мои 2 цента.
@Julian
Я думаю, что ваш подход не будет хорошо работать на практике. Представьте, что вы перемещаете некоторую функцию по коду. Номер строки будет отличаться, и имя файла может отличаться.
Я думаю, что единственным разумным способом управления изменением идентификаторов перевода было бы попытаться найти похожие идентификаторы в вашем .po-файле. Редактор может показать предложение о слиянии нового текста перевода с существующим, если они очень похожи и нет строки перевода в сохраненном номере строки в вашем коде.
Если у вас есть где-то в вашем коде: <?=sprintf(_('%s poked %s'), $user1, $user2)?>
И один из ваших языков нуждается в замене аргументов, это очень просто. Просто переведите свой код следующим образом: msgid "%s poked %s" msgstr "%2$s translation_of_poked %1$s"