Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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 如何制作多语言网站_Php_Mysql_Internationalization_Multilingual - Fatal编程技术网

Php 如何制作多语言网站

Php 如何制作多语言网站,php,mysql,internationalization,multilingual,Php,Mysql,Internationalization,Multilingual,有谁能告诉我如何用PHP和MySQL创建一个动态的多语言网站吗?我对此一无所知。我在谷歌上搜索,没有找到任何好的解决方案 有谁能为我提供一个循序渐进的指南吗?如果可能,制作一个多语言网站的演示。或者请让我参考任何解释其详细信息的链接。我经常使用的解决方案是创建一个包含所有可能消息的数据库表。对于每条消息,我都使用一个代码(缩写)来查找它。例如: lang id message en login Login en lostpass Lost your pass

有谁能告诉我如何用PHP和MySQL创建一个动态的多语言网站吗?我对此一无所知。我在谷歌上搜索,没有找到任何好的解决方案


有谁能为我提供一个循序渐进的指南吗?如果可能,制作一个多语言网站的演示。或者请让我参考任何解释其详细信息的链接。

我经常使用的解决方案是创建一个包含所有可能消息的数据库表。对于每条消息,我都使用一个代码(缩写)来查找它。例如:

lang  id        message
en    login     Login
en    lostpass  Lost your password?
de    login     Anmelden
de    lostpass  Paswort vergessen?
nl    login     Aanmelden
nl    lostpass  Wachtwoord vergeten?

使用MySQL查询查找翻译通常足够快,但您也可以将所有消息放在一个数组中,并在加载脚本时将其加载到内存中。用户应该总是能够设置他们喜欢的语言,不要盲目依赖Web浏览器所设置的语言标题。

<强>简短回答:没有简短的答案,因为有很多的变量要考虑,还有大量的工作要做。所以

长答案:我会尽可能地把它细分,但对于像你这样广泛的问题,没有一个“适合所有人”的答案

首先,手头任务的变量:

  • 语言列表:您的站点是采用预定义的一组语言,还是多种语言/异构语言?例如,一个站点可能完全是两种定义良好的语言的双语站点(或者,再举一个例子,我运行一个英语/加泰罗尼亚语/西班牙语站点);或者,不同的部分可以在不同的语言集上使用(例如,看看微软的网站:它们大部分都是同质的,但博客、知识库文章和一些文档等内容仅在假定支持的语言子集中可用)

  • 翻译来源:内容是否由您或合作者以每种相关语言提供?或者有些版本是通过翻译软件从单一的“基础”语言运行的?第一种方法需要大量额外的工作来生成内容,但产生的结果质量高于第二种方法

  • 语言本身:一旦你回答了1)和2)个问题,你就需要确切地知道你使用的是哪种语言。请注意,如果您使用方言(例如:美国英语+英国英语,或阿根廷西班牙语+西班牙西班牙语),您可能会在搜索引擎中遇到一些“重复内容”的问题,但这里的细节太离题了(仅提及此点,以便您了解潜在问题)

  • 你的目标是抽象语言吗(例如,我的网站提供了三种语言,根本不关心访问者在哪里:这就是我拥有的,所以选择你喜欢的语言);还是针对不同的地区/国家?在后一种情况下,事情可能会变得更加复杂,因为您可能需要关心语言之外的其他东西(例如时区、货币或日期-时间格式约定等等),但您可以从能够使用特定于国家的TLD中获益

  • 一旦你有了上述明确的定义,让我们开始工作。以下是您需要处理的最重要的任务:

  • 语言检测:最合理的方法是使用GET参数(类似于URL上的?lang=en us)。此外,当请求没有语言参数的URL时,您可能会使用一些cookie和/或IP地理位置来回退。此外,如果你有方法,考虑URL美化的主题(什么看起来更好:<代码>示例.COM/index?就个人而言,我喜欢授予我的.htaccess文件的power ModRewrite权限,但这只适用于Apache驱动的服务器

  • 内容管理:无论您是从数据库获取内容(如文章内容)、包含文件(面包屑、菜单、站点标题等的典型方式)还是任何其他方式,您都需要某种方式来分离内容的每个版本(语言)。以下是一些如何做到这一点的示例:

    • 对于DB内容,我最好的建议是提出一些实字段命名模式并坚持下去。例如,我将
      \u en
      \u es
      \u ca
      附加到数据库的所有语言相关字段中。这样,我就可以使用诸如
      $row[“title\u$lang”]
      之类的表达式访问正确的内容
    • 对于include文件,文件命名约定也是最合理的方法。在我的例子中,我的文件名以
      .en.php
      .ca.htm
      等结尾。我的include调用看起来像
      include(“some filename.$lang.php)
    • 有时,您会直接从PHP代码中吐出小块文本(例如,在标记表的标题时)。您可以使用每种语言的包含文件来定义“块”“使用相同键的数组,或者像Geert建议的那样使用DB表。前一种方法需要更少的工作来开发,后一种方法需要更少的工作来维护(特别是如果你不是一个人工作的话)
  • 语言选择:非常重要,你应该为你的用户提供一种选择他们自己语言的方法,而不是在URL上调整GET参数。对于少数语言,“标志”通常工作得很好,因为即使页面最初退回到用户根本不知道的语言,它们也可以被理解。对于更多语言,下拉菜单似乎更有效(就视口空间而言),但您应该确保添加一些视觉(即:非文本)提示。有些网站强迫你在输入时选择一种语言,并且只有每种语言的主页链接。就我个人而言,我的网站菜单上有三面旗子,每面旗子都指向当前地址,只改变了语言参数。这样的代码可以很好地工作:



  • CMS调整:如果你的网站(或其中的一部分)正在使用某种CMS、讨论板等,事情会变得相当混乱。根据我自己的经验,我的网站上有一个phpBB论坛,分为三个主要部分
    function translatedURI($new_lang) {
        return str_replace("lang=$lang", "lang=$new_lang", "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
    }