Как перевести данные из MySQL с помощью gettext? - PullRequest
0 голосов
/ 01 ноября 2019

Я хотел бы перевести строки из MySQL с помощью gettext php. Например,

$string = $db->prepare('SELECT * FROM `cities`');
$string->execute();
$value = $string->fetch(PDO::FETCH_ASSOC);

foreach($value as $k => $v) {
  $array[$v['id']] = _($v['name']);
}

. Вот где _ ($ v ['name']) Я хочу использовать gettext

msgid "Some City"
msgstr "Some City Other Lang"

Но этот метод не работает. Я хотел бы другое решение

1 Ответ

0 голосов
/ 01 ноября 2019

не работает

Это означает (пожалуйста, исправьте меня, если я ошибаюсь), что экстракторы строк не могут найти текст для перевода при разборе исходного кода и, возможно, дажекиньте сообщения об ошибках. Этого следует ожидать, поскольку ваши строки вообще отсутствуют в исходном коде - они находятся в недоступной реляционной базе данных.

Основная проблема, конечно, в том, что gettext не предназначен для такой работы.

Иногда я рассматривал этот вариант использования с помощью следующего метода:

  1. Напишите вспомогательный скрипт для извлечения строк из базы данных и выгрузки их в обычный файл 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);
    
  2. Добавьте вспомогательный сценарий (dump-db-strings.php) в вашу систему сборки, чтобы db-strings.php оставался обновленным.

  3. Создайте пользовательскую функцию, которая будет действовать как оболочка 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.

...