如果未在Silex的URI中设置,如何使用默认的'_locale'?

时间:2013-08-25 23:17:42

标签: php symfony internationalization silex

我想申报这样的路线:/{_locale}/some/route,这可以通过Silex轻松完成。

但我也想让/some/route自动使用默认语言环境(例如:'en'),而不必在请求URI中指定它。这样,请求/some/route将与请求/en/some/route相同。

如果我没记错,这个问题已经解决了Symfony2,但我找不到Silex的任何内容。

我所知道的是,我可以使用$app['controllers']->assert('_locale', 'en|fr|es')->value('_locale', 'en');全局应用这些方法。但我仍然需要声明重复的路由,我想还需要修改'url_generator'或twig helpers。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我发现这是最好的解决方案(Silex 2.0):

$app->register(new Silex\Provider\LocaleServiceProvider());
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
    'locale_fallbacks' => array('en'),
    'locale' => 'en',
));

定义'locale'=>成 'en'即可。这是将使用的默认语言环境。

来源:http://silex.sensiolabs.org/doc/master/providers/translation.html

答案 1 :(得分:0)

看看这个repository。您可以看到如何重定向到首选语言环境。

// app.php

$app['config.locales.regexp'] = 'ca|es|en';


// controllers.php

/**
* Index URL, automatic redirect to preferred user locale
*/
$app->get('/', function (Silex\Application $app) {
    $locale = $app['request']->getPreferredLanguage($app['config.locales']);

    return $app->redirect(
        $app['url_generator']->generate('homepage', array('locale' => $locale))
    );
});

修改 我认为上面描述的解决方法没有解决问题,它只适用于索引URL。但另一种可能的解决方案是在应用程序初始化之后设置默认语言环境,如本GitHub issue中所述。

$app = new Silex\Application();
$app['locale'] = 'fr';

答案 2 :(得分:0)

这个问题很旧,但现在您可以使用Silex-localehttps://github.com/pmaxs/silex-locale)让您的路线像这样工作:

/some/route
/en/some/route
/fr/some/route
etc.

根据您的Silex版本阅读文档以使用它,但以下是如何使用它:

1 /正在加载提供商

$app->register(new Pmaxs\Silex\Locale\Provider\LocaleServiceProvider(), [
    'locale.locales' => ['en', 'ru', 'es'], // the locales you will use in your website
    'locale.default_locale' => 'en',        // the default locale
    'locale.resolve_by_host' => false,
    'locale.exclude_routes' => ['^_'],
]);

2 /用法

// will be accessible by urls `/`, `/en/`, `/ru/`, `/es/`
$app->get('/', function (Request $request) use ($app) {
    return new Response('index ' . $request->getLocale());
})->bind('index');

// will be accessible by urls `/test/123`, `/en/test/123`, `/ru/test/123`, `/es/test/123`
$app->get('/test/{var}', function(Request $request) use ($app) {
    return new Response('test ' . $request->getLocale() . ' ' . $request->get('var'));
})->bind('test');

你也有生成URL的方法,希望它能帮助今天遇到这个问题的人!