【问题标题】:PHP snippet for translated content. Is it a good practice? Can it get better/simpler?用于翻译内容的 PHP 片段。这是一个好习惯吗?它可以变得更好/更简单吗?
【发布时间】:2017-11-13 12:20:34
【问题描述】:

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

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

这是我用来检测域/语言的代码:

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

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

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

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

【问题讨论】:

    标签: php html language-translation


    【解决方案1】:

    我不喜欢你的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']

    【讨论】:

      【解决方案2】:

      一个简单的方法(你不需要给一个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']);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        • 1970-01-01
        • 2011-07-17
        • 2016-01-03
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        相关资源
        最近更新 更多