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 Translator 或基于 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
选项负责过滤掉任何未知区域设置,因此只有 '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.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') ?>
翻译路由属性
如果您的路由的静态部分已翻译,当需要翻译动态部分,如产品别名、类别名称或其他动态路由参数时,您将非常快速地到达这一点。此包提供了 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) 保护。请参阅 许可证文件 以获取更多信息。