php(sql)网站语言翻译

nr9pn0ug  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(315)

我想在我的网站实现一个语言翻译。为此,在我的数据库中创建了一个表“translations”:

id | de    | en    | other languages    
1  | Hallo | Hello | ...

基于此,我在标题中添加了以下查询:

if ($user['language'] == 'de') {
        // Select prepared PDO 
        $statement = $pdo->prepare("SELECT id, de FROM translations");
        $result = $statement->execute(array());
        $text = $statement->fetch();
    }

if .... other languages

我想展示基于用户语言的文本翻译。我想知道现在是否有一个简单的php echo方法可以使用。如上所述,我有在表中可用的翻译,但whta是最简单的方法来回应它?
例如。当前状态:

<h4 class="...">Hallo</h4>

翻译的新状态(当然不起作用):

<h4 class="..."><?php echo $text['en'] ?></h4>

因此,我缺少的是一个简单的方法,将id(行)寻址到这个文本输出,在这个示例“1”中。
作为一种可能的方法,我发现了这个例子:

<?php
$age=array("Peter"=>"35");
echo "Peter is " . $age['Peter'] . " years old.";
?>

我想我可以用它,它看起来从文本大小的效率。但是我不知道如何修改上面表的查询。最好是我能做一些像这样的事情:

echo $text['1']

它显示了文本输出:“哈罗”。万一:

echo $text['2']

它会显示“你好”。
你觉得这个方法怎么样?你能帮我修改我的查询让这个方法工作吗?
谢谢!

4jb9z9bj

4jb9z9bj1#

基于你在我第一个答案下的问题,我决定添加另一个解决方案-没有函数等更容易。
使用fetchall在单个查询中获取所有翻译:

$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$textsRaw = $statement->fetchAll();

你的 $textsRaw 将如下所示:

$textsRaw = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];

现在我们改变了 $textsRaw 进入 $texts 结构更简单:

$texts = [];
foreach ($textsRaw as $text) {
  $texts[$text['id']] = $text[$user['language']];
}

现在 $texts 像这样:

$texts = [1 => 'Hello', '2' => 'Good bye'];

如果你有这个,那么翻译就像做:

echo $texts[1];
echo $texts[2];

如果您访问的翻译id不存在,您将得到正常的php通知: PHP Notice: Undefined offset: 3 in ....php on line ...

ygya80vv

ygya80vv2#

我曾经这样解决它,我不想选择所有的数据,因为我认为这将是浪费资源。我提出的解决方案(imo)相当优雅:
在语言中有一个变量,如 $language = 'NL' . 然后,在选择中使用:

SELECT description_{$language} as description FROM example

如果你拿到了,你可以用 $result['description'] 使用您想要的语言:)
对于您的查询,这需要最少的工作。你可以用 ['title', 'description'] 作为以查询中的格式返回的输入,这样可以使查询更小:

function langCols($columns){
    $lang = 'NL'; // implement your language logic here
    $transColumns = array_map(function(string $column){
        return $column .'_'.$lang.' AS '.$column;
    }, $columns);

    return implode(', ', $transColumns);
}

请注意,这是解决我的情况,但以最小的努力,它应该适合您的需要也

7lrncoxx

7lrncoxx3#

使用fetchall在单个查询中获取所有翻译:

$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$texts = $statement->fetchAll();

你的 $texts 将如下所示:

$texts = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];

现在您不能用简单的echo构造来实现这一点,但您可以这样定义函数:

function t(int $key): string {
  global $texts;
  global $user;

  $translationTexts = array_filter($texts, function(array $text) use ($key, $user) { return $text['id'] === $key; });

  if (count($translationTexts) !== 1) {
    throw new Exception('Unknown text key: '.$key);
  }

  return reset($translationTexts)[$user['language']];
}

现在无论你想在哪里翻译你只要做: echo t(1); 或者 echo t(2); 并根据用户语言输出翻译,例如:

$user = ['language' => 'en'];

echo t(1);
echo t(2);

$user = ['language' => 'de'];

echo t(1);
echo t(2);

和输出:

Hello
Good bye
Hallo
auf Wiederschauen

如果你使用一些不存在的翻译id,比如 t(3); 您将获得例外: PHP Fatal error: Uncaught Exception: Unknown text key: 3 最好有翻译服务/类,但我认为这个简单的版本更适合初学者。
您还可以考虑使用其中一种语言作为翻译键(甚至引入新列作为翻译键),这样更具描述性: echo t('hello') -这比在源代码中跟踪更容易 echo t(1) .

相关问题