PHP 使用实例变量从数据库中获取多语言数据

PHP get multilanguage data from database with instant variables

我想要的是将每个单词/句子/...存储在数据库表中,如下所示:

Table 姓名:

translate

列:

id, var, dutch, english, french

示例:

'1', 'titleOne', 'Hallo Wereld!', 'Hello World!', 'Bonjour le monde!'

我想要的是在标题部分打印变量:

<?php
echo $titleOne;
?>

因为会有数百行,所以我不想为每一行都设置 $titleOne = $row['titleOne']

有人可以帮我解决一个很好的查询、拉取、提取、数组、循环……不管你怎么称呼它吗? (或者一个好的替代方法也很好!)

这很简单PHP,没有使用任何框架。

PS:我根本不是 PHP 专家所以请尽量保持简单:-)!

非常感谢!

直接回答你的问题。您可以查询您当前的设置如下:

-- For Dutch (pseudocode)
$query = 'SELECT var, dutch FROM translate';

$translations = array();   
while loop ($row = $query) {
    $translations['var'] = $row['dutch'];
}

// Then, to access translations you would:
echo $translations['titleOne'];

但是你不想这样做。这个 table 结构会让你后悔莫及。注意我们的警告。有很多方法可以解决这个问题,而您选择了 SQL 路线,所以这里有一些提示。

更改您的 table 结构,这样您就不必在每次添加新语言时都添加新的列。

Table:语言(添加新行以支持新语言)

id, locale, language

1, en_CA, English
2, en_US, English
3, en_UK, English
4, es_ES, Spanish
5, es_MX, Spanish
...

Table:翻译(添加新行以添加翻译)

id, locale, translation_key, translation

1, en_CA, 'hello', 'Hi from Canada'
2, en_US, 'hello', 'Hi from the US'
3, en_UK, 'hello', 'Hi from the UK'
4, es_ES, 'hello', 'Hi from Spain'
5, es_MX, 'hello', 'Hi from Mexico'
...

translations.locale 应该是指向语言的外键,但我不确定您的 SQL 级别是什么,所以我知道如何让它变得清晰。

我假设您可以弄清楚如何从 PHP 查询您的数据库。你要做的是:

  • 找出要使用的语言环境。这将是最棘手的部分之一。前任。您应该使用 URL、会话、浏览器设置中指定的那个吗?如果指定了 none 会怎样?什么是后备语言环境?请参阅我在 中的 getLanguage() 功能以了解一些想法。
  • 提取该语言环境的所有翻译并将它们存储在内存中。这是一个基本查询,用于提取给定语言环境的所有翻译。

    <?pseudocode 
    $locale = 'en_CA';    
    
    // Find all translations for a given locale
    $dbQuery = 'SELECT translation_key, translation
    FROM translations
    WHERE locale = :locale';
    ;
    
  • 将您刚刚提取的条目放入内存中。

    <?pseudocode 
    $translations = array();
    while loop ($row = $dbQuery) {
        $translations[$row['translation_key']] = $row['translation'];
    }
    
  • 在整个应用程序中,您现在可以通过该数组访问翻译。

    echo $translations['hello'];

您将希望在您的应用程序中的每个请求都调用的部分中执行此操作。完成此操作后,您将需要开始优化。您可以将数据库结果存储到会话中,这样您就不必在每次页面加载时查询数据库或实施更强大的缓存形式。

老实说,我认为您的想法是正确的,但细节决定成败,或者他们是这么说的。阅读我指向的 link。它并不完美,但它应该可以帮助您相对快速地找到可行的解决方案。

我第 2 次提出其他人对您的 table 结构的建议,但要回答您的问题,您可以使用 extract

$row = array(
    col_1 => 'a', 
    col_2 => 'b', 
    col_3 => 'c' 
)

extract($row);


// results in:

//   $col_1  assigned value 'a'
//   $col_2  assigned value 'b'
//   $col_3  assigned value 'c'