не работает
Это означает (пожалуйста, исправьте меня, если я ошибаюсь), что экстракторы строк не могут найти текст для перевода при разборе исходного кода и, возможно, дажекиньте сообщения об ошибках. Этого следует ожидать, поскольку ваши строки вообще отсутствуют в исходном коде - они находятся в недоступной реляционной базе данных.
Основная проблема, конечно, в том, что gettext не предназначен для такой работы.
Иногда я рассматривал этот вариант использования с помощью следующего метода:
Напишите вспомогательный скрипт для извлечения строк из базы данных и выгрузки их в обычный файл PHP, который выглядит какthis:
<?php // db-strings.php
// Autogenerated file, do not edit
_('Bar');
_('Foo');
Этот автоматически созданный файл не предназначен для выполнения. Это просто для использования Poedit или любого другого экстрактора, который вы будете использовать. Вспомогательный сценарий будет выглядеть примерно так:
<?php // dump-db-strings.php
$fp = fopen('db-strings.php', 'wb');
fwrite($fp, "<?php\n");
fwrite($fp, "// Autogenerated file, do not edit\n");
/** @var PDO $db*/
$stmt = $db->prepare('
SELECT name AS text
FROM cities
UNION
SELECT some_other_column AS text
FROM some_other_table
ORDER BY text
');
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
fwrite($fp, sprintf("_('%s');\n", addcslashes($row['text'])));
}
fclose($fp);
Добавьте вспомогательный сценарий (dump-db-strings.php
) в вашу систему сборки, чтобы db-strings.php
оставался обновленным.
Создайте пользовательскую функцию, которая будет действовать как оболочка gettext, чтобы вы больше не получали сообщений об ошибках экстрактора, например:
// Untested!
function _db($string) {
return ${'_'}($string);
}
foreach($value as $k => $v) {
$array[$v['id']] = _db($v['name']);
}
Теперь, когда вы запустите Poedit,просканируйте db-strings.php
, он найдет реальные строки и включит их в каталог * .po. Во время выполнения _db($v['name'])
будет выполняться как, например, _db('Foo')
, и gettext уже найдет Foo
в скомпилированном ресурсе * .mo.
Обратите внимание, что этот метод в основном предназначен для строк, которыми вы управляете (т.е. они 'фиксированные тексты, которые обновляют только разработчики), что действительно имеет смысл, поскольку вам также необходимо получить фактические переводы. Если ваш текст создается самими пользователями без вашего вмешательства, вам лучше найти альтернативу gettext.