繁体   English   中英

PHP (SQL) 中的网站语言翻译

[英]Website language translation in PHP (SQL)

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

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

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

 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 回声方法。 如上所述,我在表格中有可用的翻译,但最简单的方法是呼应它吗?

例如。 当前 state:

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

带有翻译的新 state(当然它不起作用):

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

所以我缺少的是一种简单的方法来将id(行)寻址到这个文本output,在那个例子中是“1”。

作为一种可能的方法,我发现了这个例子:

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

我想我可以使用它,并且从文本大小来看它是有效的。 但我不确定如何修改上面表格的查询。 最好的办法是我可以做一些类似的事情:

echo $text['1']

它显示文本 output:“你好”。 以防万一:

echo $text['2']

它会显示“你好”。

你觉得这个方法怎么样? 您能帮我修改我的查询以使此方法正常工作吗?

非常感谢!

根据您在我的第一个答案下的问题,我决定添加另一个解决方案 - 没有功能等更容易。

使用 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...

我曾经这样解决它,我不想 select al 数据,因为我认为这会浪费资源。 我想出的解决方案是(IMO)非常优雅:

有一个变量,其中的语言,例如$language = 'NL' 然后,在 select 中使用:

SELECT description_{$language} as description FROM example

如果您获取它,您可以简单地以您想要的语言使用$result['description'] :)

这需要您的查询最少的努力。 您可以使用['title', 'description']作为输入创建 function ,它以查询中的格式返回它,这样可以使查询更小:

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);
}

请注意,这是我的案例的解决方案,但只需付出最小的努力,它就可以满足您的需求

使用 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 :

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); 并根据用户语言将 output 翻译,例如:

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

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

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

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

和 output:

Hello
Good bye
Hallo
auf Wiederschauen

如果你使用一些不存在的翻译 id,比如t(3); 你会得到PHP Fatal error: Uncaught Exception: Unknown text key: 3

最好有翻译服务/类,但我认为这个简单的版本更适合初学者。

您也可以考虑使用其中一种语言作为翻译键(甚至引入新列作为翻译键),因此它更具描述性: echo t('hello') - 这比在源代码中更容易跟踪echo t(1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM