besimple / i18n-routing-bundle
在您的Symfony2项目中实现完整的路由国际化
Requires
- php: >=5.3.2
- symfony/config: ~2.3 || ~3.0
- symfony/routing: ~2.3 || ~3.0
Requires (Dev)
- doctrine/dbal: ~2.2
- matthiasnoback/symfony-config-test: ^1.4
- matthiasnoback/symfony-dependency-injection-test: ^0.7
- phpunit/phpunit: ~4.7@stable
- symfony/dependency-injection: ~2.3 || ~3.0
- symfony/http-kernel: ~2.3 || ~3.0
- symfony/translation: ~2.3 || ~3.0
Suggests
- doctrine/dbal: ~2.2
README
如果您有一个多语言网站,这个包可以避免在不同语言中复制粘贴路由。此外,它还允许在Router#match和UrlGenerator#generate中使用Symfony翻译器或基于Doctrine DBAL (+Cache)的后端,在语言之间翻译给定的路由参数。
信息
当您创建一个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.postfix
和be_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)的约束。请参阅 许可文件 以获取更多信息。