句子/i18n-routing-bundle

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

安装: 42

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 63

类型:symfony-bundle

v2.4.2 2018-07-04 15:22 UTC

README

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

Latest Version on Packagist Software License Build Status Total Downloads

信息

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

安装

composer.phar require besimple/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
    allowed: ['en']

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

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

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

locales.allowed指定了允许哪些区域设置,其余都将抛出RouteNotFoundException。

路由命名

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

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') ?>

翻译路由属性

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

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

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)下。有关更多信息,请参阅许可证文件