PHP使用即时变量从数据库中获取多语言数据

时间:2018-05-14 16:32:29

标签: php mysql sql multilingual

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

表名:

tables

列:

translate

示例:

id, var, dutch, english, french

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

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

由于将有数百行,我不想为每一行设置<?php echo $titleOne; ?>

有人可以帮我解决一个不错的查询,拉,取,数组,循环......但是你这称呼? (或者一个不错的替代方式也很好!)

这是普通的PHP,没有使用框架。

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

非常感谢!

2 个答案:

答案 0 :(得分:0)

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

-- 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'];

但是你不想这样做。这种表结构将引导您走上一条遗憾的道路。注意我们的警告。有很多方法可以解决这个问题,你已经选择了SQL路线,所以这里有一些提示。

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

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

id, locale, language

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

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

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,会话,浏览器设置中指定的那个吗?如果没有指定,会发生什么?什么是后备区域设置?有关一些想法,请参阅https://stackoverflow.com/a/49758067/296555中的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'];

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

说实话,我认为你有正确的想法,但魔鬼在细节中或者他们说。阅读我指向的链接。它并不完美,但它可以帮助您相对快速地找到可行的解决方案。

答案 1 :(得分:0)

我是其他人提供的有关您的桌面结构的建议,但为了回答您的问题,您可以使用 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'