Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP(SQL)中的网站语言翻译_Php_Sql_Arrays_Echo_Translation - Fatal编程技术网

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

PHP(SQL)中的网站语言翻译,php,sql,arrays,echo,translation,Php,Sql,Arrays,Echo,Translation,我想在我的网站上实现语言翻译。为此,在我的数据库中创建了一个表“translations”: id | de | en | other languages 1 | Hallo | Hello | ... 基于此,我在标题中添加了以下查询: if ($user['language'] == 'de') { // Select prepared PDO $statement = $pdo->prepare("SELECT i

我想在我的网站上实现语言翻译。为此,在我的数据库中创建了一个表“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>
它显示了文本输出:“你好”。如果:

echo $text['2']
它将显示“你好

你觉得这个方法怎么样?你能帮我修改我的查询让这个方法工作吗


非常感谢

使用fetchAll在单个查询中获取所有翻译:

$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$texts = $statement->fetchAll();
$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$textsRaw = $statement->fetchAll();
您的
$text
将如下所示:

$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']];
}
$textsRaw = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];
$texts = [1 => 'Hello', '2' => 'Good bye'];
现在,您无法使用简单的echo构造来实现这一点,但您可以定义如下函数:

$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']];
}
$textsRaw = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];
$texts = [1 => 'Hello', '2' => 'Good bye'];
现在,无论你想在哪里翻译,你只要做:
echott(1)
回波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致命错误:未捕获异常:未知文本键:3

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


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

使用fetchAll在单个查询中获取所有翻译更容易在源代码中跟踪:

$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$texts = $statement->fetchAll();
$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$textsRaw = $statement->fetchAll();
您的
$text
将如下所示:

$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']];
}
$textsRaw = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];
$texts = [1 => 'Hello', '2' => 'Good bye'];
现在,您无法使用简单的echo构造来实现这一点,但您可以定义如下函数:

$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']];
}
$textsRaw = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];
$texts = [1 => 'Hello', '2' => 'Good bye'];
现在,无论你想在哪里翻译,你只要做:
echott(1)
回波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致命错误:未捕获异常:未知文本键:3

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


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

基于您在我第一次回答中提出的问题,我决定添加另一个解决方案-无需函数等,更容易实现


使用fetchAll在单个查询中获取所有翻译:

$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$texts = $statement->fetchAll();
$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$textsRaw = $statement->fetchAll();
您的
$textsRaw
将如下所示:

$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']];
}
$textsRaw = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];
$texts = [1 => 'Hello', '2' => 'Good bye'];
现在,我们将
$textsRaw
转换为结构更简单的
$texts

$texts = [];
foreach ($textsRaw as $text) {
  $texts[$text['id']] = $text[$user['language']];
}
现在,
$text
如下所示:

$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']];
}
$textsRaw = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];
$texts = [1 => 'Hello', '2' => 'Good bye'];
如果你有这样的能力,那么翻译就像做一样简单:

echo $texts[1];
echo $texts[2];

如果您访问不存在的翻译id,您将得到正常的php通知:
php通知:未定义的偏移量:3英寸….php在线…

基于您在我的第一个答案下提出的问题,我决定添加另一个解决方案-无需函数等更容易


使用fetchAll在单个查询中获取所有翻译:

$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$texts = $statement->fetchAll();
$statement = $pdo->prepare("SELECT id, de, en FROM translations");
$result = $statement->execute();
$textsRaw = $statement->fetchAll();
您的
$textsRaw
将如下所示:

$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']];
}
$textsRaw = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];
$texts = [1 => 'Hello', '2' => 'Good bye'];
现在,我们将
$textsRaw
转换为结构更简单的
$texts

$texts = [];
foreach ($textsRaw as $text) {
  $texts[$text['id']] = $text[$user['language']];
}
现在,
$text
如下所示:

$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']];
}
$textsRaw = [ 
  ['id' => 1, 'de' => 'Hallo', 'en' => 'Hello'],
  ['id' => 2, 'de' => 'auf Wiederschauen', 'en' => 'Good bye'],
];
$texts = [1 => 'Hello', '2' => 'Good bye'];
如果你有这样的能力,那么翻译就像做一样简单:

echo $texts[1];
echo $texts[2];

如果您访问不存在的翻译id,您将得到正常的php通知:
php通知:未定义的偏移量:3 in.…php在线…

我曾经这样解决过这个问题,我不想选择所有数据,因为我认为这会浪费资源。我提出的解决方案(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);
}

请注意,这是针对我的案例的解决方案,但只要付出最小的努力,它也应该满足您的需要。

我曾经这样解决过它,我不想选择所有数据,因为我认为这会浪费资源。我提出的解决方案(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);
}

请注意,这是针对我的案例的解决方案,但只要付出最小的努力,它也会满足您的需要

谢谢!我试图运行代码,但出现错误:
致命错误:未捕获异常:未知文本键:C:\xampp\htdocs\Auditmanager\2.php:99堆栈跟踪中的50:#0 C:\xampp\htdocs\Auditmanager\2.php(105):t(50)#1{main}在C:\xampp\htdocs\Auditmanager\2.php的第99行抛出
查询正在工作。我已经和印刷部核对过了。它看起来像tehre是函数的一个问题。老实说,我对解决这个问题的函数不太了解。你有没有发现一些错误,或者你需要更多的信息?顺便问一下:表中有ID50。有时在函数中从文本切换到文本是正常的吗?@MischaMilivoj