3 回答
TA贡献1818条经验 获得超3个赞
根据您在我的第一个答案下提出的问题,我决定添加另一个解决方案 - 没有功能等更容易。
使用 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 ...
TA贡献1789条经验 获得超8个赞
我曾经这样解决过,我不想选择所有数据,因为我认为这会浪费资源。我想出的解决方案(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);
}
请注意,这是我的案例的解决方案,但只需付出最少的努力,它也应该适合您的需求
TA贡献1863条经验 获得超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
最好有翻译服务/课程,但我认为这个简单的版本更适合初学者。
您还可以考虑使用其中一种语言作为翻译键(甚至引入新列作为翻译键),因此它更具描述性: -echo t('hello')这比在源代码中更容易跟踪echo t(1)。
- 3 回答
- 0 关注
- 130 浏览
添加回答
举报