2

我想像这样声明路由:/{_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”或树枝助手。

有任何想法吗?

4

3 回答 3

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

于 2016-09-15T15:05:25.233 回答
0

Take a look at this repository. You can see how to redirect to a preferred locale.

// 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))
    );
});

Edit: I think the workaround I described above do not solve the problem, it only works for the index URL. But another possible solution would be to set a default locale after the initialization of the application, as discussed in this GitHub issue.

$app = new Silex\Application();
$app['locale'] = 'fr';
于 2014-03-21T23:06:56.737 回答
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的方法,希望对今天遇到这个问题的人有帮助!

于 2018-03-12T09:47:11.783 回答