如何制作多语言网站

use*_*239 29 php mysql multilingual internationalization

任何机构都可以告诉我如何在PHP和MySQL中创建一个动态的多语言网站吗?我不知道.我在Google上搜索过,但没有找到任何好的解决方案.

任何人都可以为我提供一步一步的指导吗?如果可能的话,为多语言网站制作一个演示.或者,请参阅我解释其详细信息的任何链接.

Edu*_*ual 72

简短回答:没有简短的答案,因为需要考虑很多变量,还有很多工作要做.所以...

答案长:我会尽可能地将其分解,但对于像你这样广泛的问题,没有"对所有人都有好处"的答案.

首先,手头的任务变量:

  1. 语言列表:您的网站将使用预定义的语言集,还是会变化/异构?例如,一个站点可能完全是两种语言定义良好的语言(或者,换句话说,我运行英语/加泰罗尼亚语/西班牙语站点); 或者可以在不同的语言集上使用不同的部分(例如,查看MS的网站:它们大多是同质的,但是博客,知识库文章和一些文档等内容只能在所谓的支持语言的子集中提供).

  2. 翻译来源:您或某个合作者提供的每种相关语言的内容是什么?或者某些版本是通过一种"基础"语言运行翻译软件的吗?第一种方法需要大量额外的工作才能生成内容,但产生的结果质量高于第二种方法.

  3. 语言本身:一旦你有1)和2)回答,你需要知道你正在使用哪种语言.请注意,如果你包括方言(例如:美国英语+英国英语,或阿根廷西班牙语+西班牙语西班牙语),你可能会遇到一些与搜索引擎有关的"重复内容"问题,但是这里的细节太偏离主题(只是提到所以你知道潜在的问题).

  4. 你是在抽象地定位语言吗(例如,我的网站提供三种语言而不关心访问者:这就是我所拥有的,所以选择你喜欢的东西); 或者更确切地说是针对不同地区/国 在后一种情况下,事情可能会变得更加复杂,因为您可能需要关注除语言之外的其他内容(例如时区,货币或日期时间格式约定,仅举几例),但您可以获得使用它的好处特定国家/地区的TLD.

一旦你有了上面明确的定义,让我们开始工作吧.这些是您需要处理的最突出的任务:

  1. 语言检测:最合理的方法是使用GET参数(如URL上的?lang = en-us).此外,当请求没有语言参数的URL时,您可能会使用某些cookie和/或IP地理位置.此外,如果您有手段,请考虑URL美化的主题(看起来更好:example.com/index.php?lang=en-usexample.com/en-us/home?).就个人而言,我喜欢ModRewrite授予我的.htaccess文件的权力,但这只适用于基于Apache的服务器.

  2. 内容管理:无论您是从数据库中获取内容(如文章内容),包含文件(典型的面包屑,菜单,网站范围标题等),还是任何其他方式,您都需要一些方法来分隔每个版本(语言)的内容.以下是一些如何完成的示例:

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


function translatedURI($new_lang) {
    return str_replace("lang=$lang", "lang=$new_lang", "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
}
Run Code Online (Sandbox Code Playgroud)
  1. CMS调整:如果您的网站(或部分网站)使用某种CMS,讨论板等,事情就会变得非常混乱.根据我自己的经验,我在我的网站上有一个phpBB论坛,分为三个主要类别(每种语言一个),这样他们看起来像三个独立的论坛(但用户只需登录/注册其中一个到获得所有语言的访问权限,因为它们确实只是同一块板的类别).为了让这项工作顺利进行,我必须做出的调整威胁到我仍然保留的最后残余的理智:S.对于这些情况,我建议查找您正在使用的特定软件的文档和支持功能.

嗯,这就是我现在可以提出的一切.我认为你应该有足够的力气拉起袖子开始工作.然后,如果你在路径上碰壁,请回答具体问题,我相信你会得到更具体的答案.

希望这可以帮助.


Gee*_*ert 7

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

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?
Run Code Online (Sandbox Code Playgroud)

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

  • 我的问题(为什么你没有获得upvote)是一个页面可能是100多个SQL查找.即使您将它们存储在内存缓存(memcached)中,SQL查找仍然存在.正确/有效的解决方案是创建一个本地化类,它将对填充了转换数组的静态文件(en_us.php,en_gb.php等)执行查找.虽然你提到类似的东西,我仍然不喜欢你仍在建议/依赖SQL的事实. (3认同)
  • 文件解析与数据库访问 - 永恒的讨论.如果您运行的是自制服务器,文件是最佳解决方案,但如果您使用专业的高性能服务器,则数据库访问时间和开销变得无关紧要.适用于SMALL,适用于PRO的数据库.tks @geert! (3认同)