besimple/i18n-routing-bundle

在您的Symfony2项目中实现完整的路由国际化

安装次数: 787,562

依赖项: 7

建议者: 1

安全: 0

星标: 186

关注者: 14

分支: 63

开放问题: 18

类型:symfony-bundle

v2.4.1 2018-02-06 14:26 UTC

This package is auto-updated.

Last update: 2024-09-05 02:57:04 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

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

locales.filter选项负责过滤掉任何未知区域设置,因此只有'英文'和'荷兰语'的路由可用。

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)的约束。请参阅 许可文件 以获取更多信息。