我想使用gettext php从MySQL转换字符串。
例如。

$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"


但是这种方法不起作用。我想要另一种解决方案

最佳答案

不起作用


这意味着(如果我错了,请纠正我)字符串提取器在解析源代码时甚至无法找到要翻译的文本,甚至可能抛出错误消息。可以预料到,因为您的字符串根本不在源代码中—它们在不可访问的关系数据库中。

基本的问题当然是gettext并非旨在那样工作。

有时我使用以下方法解决了该用例:


编写一个帮助程序脚本以从数据库中获取字符串并将其转储到如下所示的常规PHP文件中:

<?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将在* .mo编译资源中找到Foo

请注意,此方法主要用于您控制的字符串(即,它们是只有开发人员才能更新的固定文本),因为您还需要获取实际的翻译内容,所以这才是真正有意义的。如果您的文本是用户自己生成的,而无需您干预,则最好找到gettext的替代方法。

关于php - 如何使用gettext从MySQL转换数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58655363/

10-15 07:02