亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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'],該函數以查詢中的格式返回它,這樣您的查詢就會更?。?/p>

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 關注
  • 180 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號