financeua/i18n-routing-bundle

在您的Symfony2项目中完全国际化路由

安装次数: 2,869

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 63

类型:symfony-bundle

v2.4.1 2017-07-07 14:49 UTC

README

如果您有一个多语言网站,此包可避免复制粘贴不同语言的路线。此外,它还允许在Router#match和UrlGenerator#generate中使用Symfony Translator或基于Doctrine DBAL(+Cache)的后端在语言之间翻译给定的路由参数。

Latest Version on Packagist Software License Build Status Total Downloads

信息

当您创建一个I18N路由并在浏览器中访问它时,区域设置将被更新。

安装

composer.phar require financeua/i18n-routing-bundle
//app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        //...
        new BeSimple\I18nRoutingBundle\BeSimpleI18nRoutingBundle(),
    );
}

更新您的配置

# app/config/config.yml
be_simple_i18n_routing: ~

创建您的路由

要定义XML或YAML中的国际化路由,您需要使用be_simple_i18n类型导入路由文件。

my_yaml_i18n_routes:
    resource: "@MyWebsiteBundle/Resources/config/routing/i18n.yml"
    type: be_simple_i18n
    prefix:
        en: /website
        fr: /site
        de: /webseite
my_xml_i18n_routes:
    resource: "@MyWebsiteBundle/Resources/config/routing/i18n.xml"
    type: be_simple_i18n

您可以可选地指定一个前缀或如上所示的已翻译前缀。

Yaml路由文件

homepage:
    locales:  { en: "/welcome", fr: "/bienvenue", de: "/willkommen" }
    defaults: { _controller: MyWebsiteBundle:Frontend:index }

XML路由文件

<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://besim.pl/schema/i18n_routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://besim.pl/schema/i18n_routing http://besim.pl/schema/i18n_routing/routing-1.0.xsd">

    <route id="homepage">
        <locale key="en">/welcome</locale>
        <locale key="fr">/bienvenue</locale>
        <locale key="de">/willkommen</locale>
        <default key="_controller">MyWebsiteBundle:Frontend:index</default>
    </route>
</routes>

注意,XML文件使用的命名空间与使用核心加载器时不同:http://besim.pl/schema/i18n_routing

PHP路由文件

<?php

use Symfony\Component\Routing\RouteCollection;
use BeSimple\I18nRoutingBundle\Routing\RouteGenerator\I18nRouteGenerator;

$generator = new I18nRouteGenerator();

$collection = new RouteCollection();
$collection->addCollection(
    $generator->generateRoutes(
        'homepage',
        array('en' => '/welcome', 'fr' => '/bienvenue', 'de' => '/willkommen'),
        new Route('', array(
            '_controller' => 'MyWebsiteBundle:Frontend:index'
        ))
    )
);

return $collection;

控制器注释

仅支持Symfony 2.5及以上版本的注释加载,并需要按以下方式启用。

# app/config/config.yml
be_simple_i18n_routing:
    annotations: true
use BeSimple\I18nRoutingBundle\Routing\Annotation\I18nRoute;

class NoPrefixController
{
    /**
     * @I18nRoute({ "en": "/welcome", "fr": "/bienvenue", "de": "/willkommen" }, name="homepage")
     */
    public function indexAction() { }
}

您可以在路由中插入经典路由

Yaml路由文件

homepage:
    locales:  { en: "/en/", fr: "/fr/", de: "/de/" }
    defaults: { _controller: HelloBundle:Frontend:homepage }

welcome:
    locales:  { en: "/welcome/{name}", fr: "/bienvenue/{name}", de: "/willkommen/{name}" }
    defaults: { _controller: MyWebsiteBundle:Frontend:welcome }

XML路由文件

<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://besim.pl/schema/i18n_routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://besim.pl/schema/i18n_routing http://besim.pl/schema/i18n_routing/routing-1.0.xsd">

    <route id="hello" pattern="/hello/{name}">
        <default key="_controller">HelloBundle:Hello:index</default>
    </route>
        <route id="homepage">
        <locale key="en">/welcome/{name}</locale>
        <locale key="fr">/bienvenue/{name}</locale>
        <locale key="de">/willkommen/{name}</locale>
        <default key="_controller">MyWebsiteBundle:Frontend:index</default>
    </route>
</routes>

PHP路由文件

<?php

use BeSimple\I18nRoutingBundle\Routing\RouteGenerator\I18nRouteGenerator;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$generator = new I18nRouteGenerator();

$collection = new RouteCollection();
$collection->add('hello', new Route('/hello/{name}', array(
    '_controller' => 'HelloBundle:Hello:index',
)));
$collection->addCollection(
    $generator->generateRoutes(
        'homepage',
        array('en' => '/welcome/{name}', 'fr' => '/bienvenue/{name}', 'de' => '/willkommen/{name}'),
        new Route('', array(
            '_controller' => 'MyWebsiteBundle:Frontend:index',
        ))
    )
);

return $collection;

高级区域设置支持

默认情况下,此包允许使用任何区域设置,并且不会检查特定路由是否缺少区域设置。这很好,但有时您可能希望更加严格,让我们看看以下配置

be_simple_i18n_routing:
  locales:
    supported: ['en', 'nl']
    filter: true
    strict: true

locales.supported指定了支持哪些区域设置。

locales.filter选项负责过滤掉任何未知的区域设置,因此只有'en'和'nl'的路线可用。

locales.strict选项设置为true时,负责在找到区域设置未知或缺少区域设置的i18n路由时抛出异常。此选项还可以设置为null以禁用缺少路由区域设置的异常,或设置为false以禁用异常。

路由命名

默认情况下,所有导入的路线都被命名为'<route_name>.',但有时您可能希望更改此行为。为此,您可以在配置中指定一个路由名称屈折服务,如下所示。

be_simple_i18n_routing:
  route_name_inflector: 'my_route_name_inflector_service'

该服务必须实现BeSimple\I18nRoutingBundle\Routing\RouteGenerator\NameInflector\RouteNameInflectorInterface接口。

目前默认提供2个屈折器:be_simple_i18n_routing.route_name_inflector.postfixbe_simple_i18n_routing.route_name_inflector.default_postfix

默认后缀屈折器

默认后缀屈折器更改了行为,只在区域设置不是默认区域设置时添加区域设置后缀。一个示例配置如下。

be_simple_i18n_routing:
  route_name_inflector: 'my_route_name_inflector_service'
  locales:
    default_locale: '%kernel.default_locale%'

在模板中生成路由

指定区域设置

Twig

{{ path('homepage.en') }}
{{ path('homepage', { 'locale': 'en' }) }}
{{ path('homepage.fr') }}
{{ path('homepage', { 'locale': 'fr' }) }}
{{ path('homepage.de') }}
{{ path('homepage', { 'locale': 'de' }) }}

PHP

<?php echo $view['router']->generate('homepage.en') ?>
<?php echo $view['router']->generate('homepage', array('locale' => 'en')) ?>
<?php echo $view['router']->generate('homepage.fr') ?>
<?php echo $view['router']->generate('homepage', array('locale' => 'fr')) ?>
<?php echo $view['router']->generate('homepage.de') ?>
<?php echo $view['router']->generate('homepage', array('locale' => 'de')) ?>

使用用户的当前区域设置

Twig

{{ path('homepage') }}

PHP

<?php echo $view['router']->generate('homepage') ?>

翻译路由属性

如果您的路由的静态部分已翻译,那么当需要翻译动态部分,如产品别名、分类名称或其他动态路由参数时,您会非常快速地到达这个点。该包提供了两种实现。

配置您要使用的后端之后(请参见下面的每个示例),您可以在路由默认值中定义要翻译的属性。

product_view:
    locales: { en: "/product/{slug}", de: "/produkt/{slug}" }
    defaults: { _controller: "ShopBundle:Product:view", _translate: "slug" }
product_view2:
    locales: { en: "/product/{category}/{slug}", de: "/produkt/{category}/{slug}" }
    defaults:
        _controller: "ShopBundle:Product:view"
        _translate: ["slug", "category"]

同样,在生成路由时也是反向的。

{{ path("product_view", {"slug": product.slug, "translate": "slug"}) }}
{{ path("product_view2", {"slug": product.slug, "translate": ["slug", "category]}) }}

反向翻译仅在模板中有“原始”值时才需要。如果您可以访问当前区域的本地化值,则只需传递此值,无需使用“translate”键提示翻译。

Doctrine DBAL后端

配置DBAL后端的使用

# app/config/config.yml
be_simple_i18n_routing:
    attribute_translator:
        type: doctrine_dbal
        connection: default # Doctrine DBAL connection name. Using null (default value) will use the default connection
        cache: apc

Doctrine后端具有以下表结构

CREATE TABLE routing_translations (
    id INT NOT NULL,
    route VARCHAR(255) NOT NULL,
    locale VARCHAR(255) NOT NULL,
    attribute VARCHAR(255) NOT NULL,
    localized_value VARCHAR(255) NOT NULL,
    original_value VARCHAR(255) NOT NULL,
    UNIQUE INDEX UNIQ_291BA3522C420794180C698FA7AEFFB (route, locale, attribute),
    INDEX IDX_291BA352D951F3E4 (localized_value),
    PRIMARY KEY(id)
) ENGINE = InnoDB;

通过路由名称、区域和要翻译的路由的属性组合进行查找。

每次查找都会缓存在一个Doctrine\Common\Cache\Cache实例中,您应配置为APC、Memcache或Xcache以提高性能。

如果您正在使用Doctrine,它将自动注册一个SchemaTool监听器以为您数据库后端创建routing_translations表,您只需要调用

./app/console doctrine:schema:update --dump-sql
./app/console doctrine:schema:update --force

翻译后端

此实现使用Symfony2翻译器来翻译属性。翻译域将使用以下模式创建:<route name>_<attribute name>

# app/config/config.yml
be_simple_i18n_routing:
    attribute_translator:
        type: translator

自定义后端

如果您想使用不同的实现,只需创建一个实现BeSimple\I18nRoutingBundle\Routing\Translator\AttributeTranslatorInterface的服务。

# app/config/config.yml
be_simple_i18n_routing:
    attribute_translator:
        type: service
        id: my_attribute_translator

许可证

此软件包受MIT许可证(MIT)许可。有关更多信息,请参阅许可证文件