Получить все переводы в одном запросе с помощью 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'],
];
Теперь вы не можете сделать это с помощью простой конструкции эха, но вы можете определить функцию следующим образом:
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
И если вы используете какой-либо несуществующий идентификатор перевода, например t(3);
, вы получите исключение: PHP Fatal error: Uncaught Exception: Unknown text key: 3
Лучше бы иметь переводчик service / class, но я думаю, что эта простая версия лучше для начинающих.
Также вы можете подумать об использовании одного из языков в качестве ключа перевода (или даже ввести новый столбец в качестве ключа перевода), чтобы он был более описательным : echo t('hello')
- это легче отследить в исходном коде, чем echo t(1)
.