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.uk
或 www.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']);
我目前正在开发一个网站,该网站将提供由不同 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.uk
或 www.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']);