PHP 翻译内容的片段。这是一个好习惯吗?能得到better/simpler吗?

PHP snippet for translated content. Is it a good practice? Can it get better/simpler?

我目前正在开发一个网站,该网站将提供由不同 gTLD 提供的翻译内容。 (example.com, example.fr, example.de)

我们的想法是让它们都重定向到同一台服务器上的相同内容,并且基于 gTLD,有一个简单的 php 程序来提供正确的语言。

这是我用来检测 domain/language:

的代码
<?php

$url_tld = explode("." , $_SERVER['HTTP_HOST'] , 3);
if ($url_tld[2] == "fr") { $language = "FR"; $lang_id = 1;}
elseif ($url_tld[2] == "de") { $language = "DE"; $lang_id = 2;}
elseif ($url_tld[2] == "nl") { $language = "NL"; $lang_id = 3;}
else { $language = "EN"; $lang_id = 0;}

function txt($x) {
    global $lang_id;
    echo $x[$lang_id];
};

在 html 代码中,每当我需要不同的语言内容时,我都会使用 运行 txt 函数;示例:

<h1><?=txt(['Hello World','Bonjour France','Hallo Deutschland','Hallo Nederland'])?></h1>

我尽量避免使用任何数据库,因为网站大部分是静态的。

这种方法可以更简单吗?还是对眼睛更友好(对于那些手动更新代码的人)?

提前致以最诚挚的问候和感谢。

我不喜欢您 explode() 中的 3 和索引中的 2。它基于什么?如果域是 example.co.ukwww.example.fr 怎么办?更好用:

$domainExtension = end(explode(".",$_SERVER['HTTP_HOST']));

那么你可以这样做:

switch ($domainExtension) {
  case 'fr' : $language = 'FRE'; break;
  case 'de' : $language = 'GER'; break;
  case 'nl' : $language = 'DUT'; break;
  default   : $language = 'ENG'; break;
}

如您所见,switch () 使代码更具可读性。为了更好的可读性,我不会不必要地缩写。我还使用了语言的官方三字母缩写。它更通用一些,但是两个字母就可以了,参见:

https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes

就我个人而言,我不喜欢语言的数字,这就是我将它们排除在外的原因,尽管我理解您为什么使用它们。你可以这样做:

$texts = ['hello','Bonjour','Guten Tag','Hallo'];

但在那种情况下,您不能遗漏任何语言。我会忘记数字并执行:

$texts = ['ENG' => 'hello',
          'FRE' => 'Bonjour',
          'GER' => 'Guten Tag',
          'DUT' => 'Hallo'];

然后,当缺少一种语言时,您可以用另一种语言替换它:

function getText($language,$texts) {
  if (isset($texts[$language]) return $texts[$language];  // it is there
                          else return reset($texts);      // take the first
};

然后您还可以将语言从最常用到很少使用排序。请注意,我没有使用全局变量,这是故意的。同样,您可以选择使用一个。

最后,要返回更简单的文本列表,您可以使用另一个函数:

function setTexts($english,$french,$german,$dutch)
{
  return ['ENG' => $english,
          'FRE' => $french,
          'GER' => $german,
          'DUT' => $dutch];
}

$helloTexts = setTexts('hello','Bonjour','Guten Tag','Hallo');

然后像这样使用:

echo getText($language,$helloTexts);

但我必须强调,还有许多其他方法可以做到这一点。例如,您可以为各种语言设置单独的包含文件。这样您就不会处理任何未使用的文本。它可能会节省一点时间,但它会是最少的,并且最好将同一段文本的不同翻译放在一起。

最后一个提示:浏览器可以告诉您访问者的首选语言。参见:$_SERVER['HTTP_ACCEPT_LANGUAGE'].

一个简单的方法(你不需要给一个id,只需要数组的键):

$url_tld = 'FR';//explode("." , $_SERVER['HTTP_HOST'] , 3);

$lang_available = array('en','fr','de','nl');

$language = strtolower($url_tld);

$lang_id = array_search($language, $lang_available); 

txt(['Hello World','Bonjour France','Hallo Deutschland','Hallo Nederland']);