为了账号安全,请及时绑定邮箱和手机立即绑定

PHP (SQL) 网站语言翻译

PHP (SQL) 网站语言翻译

PHP
森栏 2023-07-21 15:54:15
我想在我的网站上实现语言翻译。为此,在我的数据库中创建了一个表“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 方法可以使用。如上所述,我在表中提供了可用的翻译,但是什么是回显它的最简单方法?例如。当前状态:<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']它显示文本输出:“ Hallo ”。以及万一:echo $text['2']它将显示“你好”。你觉得这个方法怎么样?您能帮我修改我的查询以使此方法起作用吗?
查看完整描述

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


查看完整回答
反对 回复 2023-07-21
?
拉丁的传说

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

}

请注意,这是我的案例的解决方案,但只需付出最少的努力,它也应该适合您的需求


查看完整回答
反对 回复 2023-07-21
?
小唯快跑啊

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)。


查看完整回答
反对 回复 2023-07-21
  • 3 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信