php - 如何使用 gettext 翻译 MySQL 中的数据?

标签 php mysql gettext translate

我想使用 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 并不是设计成这样工作的。

我有时会使用以下方法来解决此用例:

  1. 编写一个帮助程序脚本来从数据库中获取字符串并将其转储到常规 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);
    
  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 已经在 *.mo 编译的资源中找到 Foo

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

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

相关文章:

php - 重复输入错误消息格式

mysql - 如何从 WooCommerce 中的 Webhook 获取客户的变量

php - i18n 无法在 debian 中通过 php-fpm 工作

php - 使用 gettext 不会翻译任何内容

php - 如何通过提供种子并获得相同顺序来随机化 PHP 中的数组?

javascript 或 php 函数在文本的开头和结尾添加一些内容

mysql - Ruby on Rails - Mysql2::错误:无法连接到 'localhost' 上的 MySQL 服务器 (10061)

Python gettext i18n 具有相同语言的不同版本

php 将 id 或传递对象传递给函数以获得更好的内存使用

mysql - Mysql 中未创建触发器