我想使用 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"
但是这个方法不行。我想要另一个解决方案
最佳答案
does not work
这意味着(如果我错了,请纠正我)字符串提取器在解析源代码时无法找到要翻译的文本,甚至可能抛出错误消息。这是预料之中的,因为您的字符串根本不在源代码中,它们位于无法访问的关系数据库中。
基本问题当然是 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/