我最近刚刚安装了silverstripe Translatable,为我们处理多语言网站。我认为我已经正确设置了所有内容,但不能确定。也许我遗漏了什么,也许我误解了模块。
在我的网站_config.php中,我有以下
i18n::set_locale('en_US');
i18n::set_locale('fr_FR');
Translatable::set_default_locale('en_US');
SiteTree::add_extension('Translatable');
SiteConfig::add_extension('Translatable');
我已经浏览并创建了我们主页的翻译。我可以导航到翻译的页面,没有问题。我还可以验证主页和翻译是否意识到它们与page.ss 中的以下代码链接
<% if Translations %>
<% loop Translations %>
$Locale.RFC1766
$Link
<% end_loop %>
<% end_if %>
我还添加了lang="$ContentLocale" xml:lang="$ContentLocale" xmlns= "http://www.w3.org/1999/xhtml">
正如在主页的法语版本上所预期的那样,美国版本显示,反之亦然。然而,当我从一台带法语浏览器的法语电脑上访问该网站时,它会直接进入英语页面。我本以为这将由silverstripe的i18n部分或translateable自动处理。我需要自己处理吗?还是我错过了什么?
基于巴里答案的答案我在_config.php 中得到了以下几行代码
$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE']; //Get the languag from the client
$lang = substr($lang,0,strpos($lang,','));//Strip out the unnecesary stuff after the comma
$lang = str_replace("-","_",$lang);//Replace the hyphen with an underscore.
Translatable::set_default_locale($lang);//Set locale
使用silverstripe Translatable,有两个关键项目可以回答您的问题。
- 系统中的每个页面都有一个唯一的URL
- 您设置了默认区域设置
严格地说,对于一个和两个,你可以将区域设置作为_GET变量传入,但这不是你的访问者会做的。
因此,简单的答案是否定的。Translatable本身并不能确定要显示的语言环境,但您可以通过基于任何方法更改默认语言环境来实现这一点。。。
- http://php.net/manual/en/locale.getdefault.php
- 在PHP中检测客户端区域设置的最简单方法
- 如何在PHP中获取当前的语言环境
- 等等。。。(谷歌了解更多…)
一旦你有了这个,只需在_config.php中用。。。
Translatable::set_default_locale(<locale>);