web-dev-qa-db-fra.com

Symfony2: Comment définir le filtre twig | date ("d F, Y") pour afficher les mois en suédois?

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?

24
tirithen

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 }
49
nifr

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.

2
Alexey B.

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

1
Seb

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:

  • Notre application utilise une seule langue (le néerlandais dans notre cas)
  • Nous utilisons notre objet DateTime étendu partout dans l'application
  • L'extension de la classe DateTime will causera d'autres problèmes, par exemple dans Doctrine, vous devrez implémenter un Type personnalisé pour gérer votre DateTime étendu et toutes les bibliothèques n'utilisent pas la variable 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 
0
Liiva