我一直在这个问题上挣扎了好几个月,但我以前从来没有遇到过需要探索所有可能的选择的情况。现在,我觉得是时候去了解各种可能性,并创建我自己的个人偏好,以便在我即将到来的项目中使用。
让我先概述一下我要找的情况。
我即将升级/重新开发一个内容管理系统,我已经使用了很长一段时间了。然而,我觉得多语言是这个系统的一个很大的改进。之前我没有使用任何框架,但我将在即将到来的项目中使用LaraVal4。Laravel似乎是编写PHP代码的最佳选择,Sidenote: Laraval4 should be no factor in your answer
。我正在寻找独立于平台/框架的通用翻译方法。
应该翻译什么
由于我正在寻找的系统需要尽可能的用户友好,管理翻译的方法应该在CMS内部。应该不需要启动FTP连接来修改翻译文件或任何HTML/PHP解析的模板。
此外,我正在寻找最简单的方法来翻译多个数据库表,也许不需要制作额外的表。
我自己想出了什么?
因为我一直在寻找,阅读和尝试自己的东西。我有几个选择。但我仍然不觉得我已经达到了我真正追求的最佳实践方法。现在,这是我想出来的,但这种方法也有副作用。
Controller.View.parameter
。数据库表将具有这些带有value
字段的长型字段。在模板中,我们可以使用一些排序方法,比如__abc2,参数包含__abc3。因此结果是Welcome, Joshua
。这似乎是一种很好的方法,因为诸如:name之类的参数很容易被编辑器理解。languages/en_EN/Controller/View.php
或.INI,选择最适合您的。也许最终.ini的解析速度会更快。该文件应包含format parameter=value;
中的数据
.我想这是最好的方法,因为每个呈现的视图都可以包含它自己的语言文件(如果存在的话)。然后,应将语言参数加载到特定视图中,而不是全局范围内,以防止参数相互覆盖。News
和News_translations
)是一种选择,但要获得一个好的系统,感觉工作量太大。我想到的其中一件事是基于我编写的data versioning
系统:有一个名为Translations
的数据库表,该表具有language
、tablename
和primarykey
的唯一组合。例如:en_en/news/1(指ID=1的新闻条目的英文版本)。但这种方法有两个巨大的缺点:首先,由于数据库中有大量数据,这个表往往会变得很长;其次,使用这种设置来搜索表将是一项艰巨的工作。例如,搜索项目的SEO片段将是全文搜索,这是相当愚蠢的。但另一方面:这是一种在每个表中快速创建可翻译内容的快速方法,但我不认为这一优点会超过缺点。所以,他们在那里。到目前为止我的想法。它们甚至还不包括日期等的本地化选项,但由于我的服务器支持PHP5.3.2+,因此最好的选择是使用intl扩展,如下所述:http://devzone.zend.com/1500/internationalization-in-php-53/-但这将在以后的任何开发阶段中使用。目前的主要问题是如何有最好的实践翻译的内容在一个网站
除了我在这里解释的一切,我还有一件事还没有决定,这是一个看似简单的问题,但实际上它一直让我头疼:
URL转换?我们到底该不该这么做?以什么方式?
所以..如果我有这个网址:http://www.domain.com/about-us
和英语是我的默认语言。当我选择荷兰语作为我的语言时,是否应将此URL翻译为http://www.domain.com/over-ons
?或者,我们应该走一条简单的路,简单地更改/about
上可见页面的内容。最后一件事似乎不是一个有效的选择,因为这将生成同一URL的多个版本,这种索引内容将以正确的方式失败。
另一种选择是使用http://www.domain.com/nl/about-us
。这将为每个内容生成至少一个唯一的URL.此外,这将更容易转到另一种语言,例如http://www.domain.com/en/about-us
,并且所提供的URL对于Google和人类访问者来说都更容易理解。使用此选项,我们如何处理默认语言?默认语言是否应删除默认选择的语言?因此将http://www.domain.com/en/about-us
重定向到http://www.domain.com/about-us
。在我看来,这是最好的解决方案,因为当CMS只为一种语言设置时,不需要在URL中有这种语言标识。
第三个选项是两个选项的组合:使用“ language-identification-less ”-URL(http://www.domain.com/about-us
)作为主语言。并为子语言使用带有已翻译SEO片段的URL:http://www.domain.com/nl/over-ons
&;http://www.domain.com/de/uber-uns
我希望我的问题能让你们头晕目眩,他们肯定能让我头晕目眩!它确实已经帮助我解决了这里的问题。给了我一个机会来回顾我以前使用过的方法,以及我对即将到来的CMS的想法。
我已经想感谢你花时间阅读这一堆文字!
// Edit #1
:
我忘了说:__()函数是翻译给定字符串的别名。在这个方法中,显然应该有某种回退方法,当还没有可用的翻译时,就加载默认文本。如果缺少翻译,则应将其插入或重新生成翻译文件。