0

在 ZF 工作:是否可以将 www.example.com 上的基本或根 url 更改为 www.example.com/$language/home,从而取决于用户浏览器的(浏览器)区域设置?

例子; 如果客人手动键入 www.example.com,我想将网址自动更改为具有区域设置的网址:www.example.com/en/home 用于 en_GB 地区的客人或 www.example.fr/home 用于 fr_FR 的客人地区。

从 root-url 我知道所有的 menu-urls 和内容区域设置。单击 url 中菜单项的链接,lang 会自动添加到根目录之后。根 url 上的内容也可以使用翻译来识别区域设置,因此 en_GB 为英语,fr_FR 为法语等。

虽然我希望从访问应用程序开始时就将根 url 更改为区域设置,但仍然缺少,如果只输入根。

根据我从这个论坛上的问答中了解到的,我猜想像 Rails 3 中的 root :to => redirect("/prepayments")

据我在这个论坛上可以找到的,我已经尝试并实现了控制器动作助手、重定向等,但它们都没有提供解决方案。
我认为 htaccess 中的重定向是不可能的,因为我首先需要从浏览器中获取语言环境。由于我不知道重定向是动态的,因此我无法在 htaccess 中设置重定向。

我很感激任何建议?

4

2 回答 2

0

由于我不知道您使用的是哪个版本的 Zend,我将其发布为Zend 1.1x。您可以做的一件事是在发送请求之前“捕获”请求,获取Accept-Language 标头并根据用户的偏好设置区域设置或将用户重定向到您喜欢的 URL。一种方法是使用FrontController'spreDispatch() 方法。请记住:

  1. 您需要检查是否所有浏览器都通过
  2. 必须小心解析此标头字符串

由于它的定义方式: Accept-Language en,bg;q=0.7,en-us;q=0.3

此外,用户可能并且经常将语言首选项设置为外语,因此仅此标头可能还不够。

以 OOP 方式执行此操作的最佳方法是将此功能包装在 ZendPlugin 中。将其附加到您的引导程序中:

    protected function _initLocaleHandlerControllerPlugin() {
        $frontController = Zend_Controller_Front::getInstance();
        $plugin = new App_Controller_Plugin_LocaleHandler();
        $frontController->registerPlugin($plugin);
    }

现在在这个插件中重新定义preDispatch()回调:

public function preDispatch(Zend_Controller_Request_Http $request) {
    $acceptLang = $request->getHeader('Accept-Language');
     //Parse string and get language
    //After parsing set the appropriate locale in `Zend_Locale`
    //redirect the user/dispatch the request?
    //THIS IS JUST AN EXAMPLE:
     $request->setModuleName('home')
             ->setControllerName('registration')
             ->setDispatched(true);
}

Zend 1.x 似乎没有为此内置的类,Zend 2 确实有"Zend\Http\Header\AcceptLanguage" 类

于 2013-09-16T08:24:04.890 回答
0

在Zend 框架中 Florent 的帮助下,我终于找到了我的问题的下一个解决方案: Redirect from action helper :

在我的语言插件中,我添加了

public function routeShutdown(Zend_Controller_Request_Abstract $request)
{...some code handling translate...

$url = $request->getRequestUri();

if ($url === '/') {
    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
    $redirector->gotoUrl($lang.'/home');
}

我将它们放在 routes.ini 中的路由因此$lang.'/home'被路由到默认模块的 indexController 和 indexAction 。

于 2013-09-16T19:59:21.863 回答