J'ai des problèmes avec le filtre | date ("d F, Y") dans mes modèles de brindille.
Je veux que les mois soient en suédois. J'ai essayé de définir "locale: sv" dans mes fichiers parameters.yml mais je n'ai aucun effet.
Cela fonctionnait avant la mise à niveau de Symfony 2.1 à 2.3, je pense donc que cela a peut-être un rapport avec cela.
Des idées sur la façon de résoudre ce problème?
L'extension Twig Intl
Vous pouvez utiliser l'extension Twig Intl Extension trouvée dans l'extension Twig officielle de fabpot/ repository .
Il fournit un filtre de date localisé qui peut être utilisé comme ceci:
{{ date | localizeddate('full', 'none', app.request.locale ) }}
utilisez app.request.locale
en tant que troisième paramètre pour l'environnement local actuel ou simplement 'sv'
.
Intégration dans votre projet
ajoutez les extensions officielles à votre composer.json
en utilisant:
composer require twig/extensions:1.0.*@dev
composer update twig/extensions
config.yml
#enable intl extensions
services:
twig.extension.intl:
class: Twig_Extensions_Extension_Intl
tags:
- { name: twig.extension }
Conseil rapide:
une autre extension pratique est l'extension Text fournissant les filtres tronqués, ... etc
services:
twig.extension.text:
class: Twig_Extensions_Extension_Text
tags:
- { name: twig.extension }
Filtre |date
utiliser la fonction DateTime::format
qui ne prend pas en charge les paramètres régionaux. Voir cette question et écrivez votre propre extension de brindille.
Je ferai un ajout à la solution publiée par @nifr.
Pour utiliser votre format de date, installez Twig Intl Extension et vous pourrez utiliser:
{{ date|localizeddate('none', 'none', app.request.locale, null, 'dd MMMM, yyyy') }}
Le dernier argument de mon exemple est un format de date - voici une documentation: http://userguide.icu-project.org/formatparse/datetime
Voici la documentation de Twig Intl Extension: https://twig-extensions.readthedocs.io/en/latest/intl.html
Je n’aimais pas vraiment l’extension Twig Intl, c’était un peu trop lourd pour mon cas d’utilisation et j’ai opté pour une approche différente. Dans notre application, nous avons étendu l'objet DateTime et surchargé la fonction format
pour traduire la date à l'aide de la fonction strftime
de PHP.
Quelques points devraient être considérés ici avant d'utiliser cette approche:
DateTimeInterface
correctement mais attendent des objets \DateTime
.Voici la classe DateTime:
YourNameSpace;
class DateTime extends \DateTime {
public static function createFromFormat($format, $time, $timezone = null) {
$dateTime = parent::createFromFormat($format, $time, $timezone);
// we want to return a <YourNameSpace>\DateTime instead of a 'normal' DateTime, thus we have to instantiate one
// note that this returns `null` instead of `false` so you can use nullable return types `?DateTime` and the `??` operator
return $dateTime && $dateTime->format($format) == $time ? (new DateTime())->setTimestamp($dateTime->getTimestamp()) : null;
}
const FORMAT_LOCALE_MAP = [
'F' => '%B', // full textual representation of a month, such as January or March
'M' => '%b', // short textual representation of a month, three letters
'l' => '%A', // full textual representation of the day of the week
'D' => '%a' // short textual representation of a day, three letters
// add any other if your application needs it
];
public function format($format): string {
$formattedDate = parent::format($format);
// localize string
foreach(self::FORMAT_LOCALE_MAP as $dateFormat => $strftimeFormat) {
if(strpos($format, $dateFormat) !== false) {
$formattedDate = str_replace(parent::format($dateFormat), strftime($strftimeFormat, $this->getTimestamp()), $formattedDate);
}
}
return $formattedDate;
}
}
Ensuite, dans votre contrôleur frontal (c.-à-d. public/index.php
), définissez vos paramètres régionaux:
setlocale(LC_ALL, 'nl_NL');
Désormais dans votre modèle Twig, n'importe quel DateTime est formaté:
// start is an instance of your extended DateTime object
{{ start.format('D d M')|capitalize }}
// Do 06 dec