Reference
Routing
laminas-router provides routing capabilities for laminas-mvc. In version 2, these capabilities also included an opt-in feature of translatable route segments.
Laminas\Router\Http\Segment has built-in facilities for translatable route
segments, but this functionality is disabled by default. To enable it, a
translator must be present in the options provided when matching; such options
are typically passed by the route stack invoking the segment.
laminas-mvc-i18n provides Laminas\Mvc\I18n\Router\TranslatorAwareTreeRouteStack to
do exactly that. If it is injected with a translator, it will pass the
translator on to each segment when invoking match().
Enabling TranslatorAwareTreeRouteStack
To enable the TranslatorAwareTreeRouteStack in your application, you will need
to add configuration that tells laminas-mvc to use it instead of the default
router. Additionally, you may want to indicate the translation locale and/or
text domain to use for translatable route segments.
The following is a configuration example that could be specified in a module or at the application level:
use Laminas\Mvc\I18n\Router\TranslatorAwareTreeRouteStack;
return [
'router' => [
'router_class' => TranslatorAwareTreeRouteStack::class,
'translator_text_domain' => 'routing',
],
];
The above would configure and return a TranslatorAwareTreeRouteStack instance
when the router is requested. The instance would be configured to use the
routing text domain, and injected with either the MvcTranslator or
Laminas\I18n\Translator\TranslatorInterface service (whichever is present, with
the former having precedence).
The translator_text_domain, when not present, defaults to default.
Translatable route segments
As a refresher, segment routes
allow you to define a combination of literal characters and placeholders;
placeholders are denoted by :name notation within the definition.
To create a translatable segment, you use an alternate notation,
{translation-key}.
When matching, the translator uses its locale and the text domain configured to translate translation keys in the route definition prior to attempting a match.
As an example, consider the following route definition:
/{shopping_cart}/{products}/:productId
The above defines two translatable segments, shopping_cart and products.
When attempting to match, these keys are passed to the translator. If, for
example, the locale evaluates to de-DE, these might become einkaufswagen and
'produkte`, respectively, evaluating to:
/einkaufswagen/produkte/:productId
This will then be what the router attempts to match against.