PHP (SQL) 中的网站语言翻译
Website language translation in PHP (SQL)
我想在我的网站上实现语言翻译。为此在我的数据库中创建了一个 table“翻译”:
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 echo 方法我现在可以使用。如上所述,我在 table 中有翻译可用,但 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.";
?>
我想我可以使用它,从文本大小来看它看起来很有效。但我不确定如何修改上面 table 的查询。最好是我可以做一些类似的事情:
echo $text['1']
它显示文本输出:“Hallo”。万一:
echo $text['2']
它将显示“你好”。
你觉得这个方法怎么样?你能帮我修改我的查询以使这个方法工作吗?
非常感谢!
使用 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
最好有翻译器service/class,但我认为这个简单的版本更适合初学者。
你也可以考虑使用其中一种语言作为翻译键(或者甚至引入新的列作为翻译键),所以它更具描述性:echo t('hello')
- 这更容易在源代码中跟踪比 echo t(1)
.
根据你在我第一个回答下的问题,我决定添加另一个解决方案 - 没有功能等更容易
使用 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']
作为输入创建一个函数,其中 returns 它的格式与查询中的格式相同,这样可以使查询更小:
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);
}
请注意,这是针对我的情况的解决方案,但只要付出最少的努力,它就应该能满足您的需要
我想在我的网站上实现语言翻译。为此在我的数据库中创建了一个 table“翻译”:
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 echo 方法我现在可以使用。如上所述,我在 table 中有翻译可用,但 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.";
?>
我想我可以使用它,从文本大小来看它看起来很有效。但我不确定如何修改上面 table 的查询。最好是我可以做一些类似的事情:
echo $text['1']
它显示文本输出:“Hallo”。万一:
echo $text['2']
它将显示“你好”。
你觉得这个方法怎么样?你能帮我修改我的查询以使这个方法工作吗?
非常感谢!
使用 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
最好有翻译器service/class,但我认为这个简单的版本更适合初学者。
你也可以考虑使用其中一种语言作为翻译键(或者甚至引入新的列作为翻译键),所以它更具描述性:echo t('hello')
- 这更容易在源代码中跟踪比 echo t(1)
.
根据你在我第一个回答下的问题,我决定添加另一个解决方案 - 没有功能等更容易
使用 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']
作为输入创建一个函数,其中 returns 它的格式与查询中的格式相同,这样可以使查询更小:
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);
}
请注意,这是针对我的情况的解决方案,但只要付出最少的努力,它就应该能满足您的需要