wake-up-neo.com

Symfony2: Wie kann ich den twig | date-Filter ("d F, Y") einstellen, um Monate auf Schwedisch auszugeben?

Ich habe Probleme mit dem Filter | date ("d F, Y") in meinen Zweigvorlagen.

Ich möchte, dass die Monate auf Schwedisch ausgegeben werden. Ich habe versucht, "locale: sv" in meinen parameters.yml-Dateien einzustellen, bekomme aber keine Wirkung.

Es funktionierte, bevor ich von Symfony 2.1 auf 2.3 aufgerüstet habe. Ich denke, das hat etwas damit zu tun.

Irgendwelche Gedanken, wie man das beheben kann?

24
tirithen

The Twig Intl Extension

Sie können die Twig Intl-Erweiterung verwenden, die sich in der offiziellen Twig-Erweiterung von fabpotrepository befindet.

Es bietet einen lokalisierten Datumsfilter, der folgendermaßen verwendet werden kann:

{{ date | localizeddate('full', 'none', app.request.locale ) }}

verwenden Sie app.request.locale als dritten Parameter für das aktuelle Gebietsschema oder einfach 'sv'.

Einbindung in Ihr Projekt

fügen Sie die offiziellen Erweiterungen zu Ihrem composer.json hinzu:

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 }

kurzer Tipp:

eine weitere praktische Erweiterung ist die Erweiterung Text, die die Filter truncate, ... usw. enthält

services:
    twig.extension.text:
        class: Twig_Extensions_Extension_Text
        tags:
            - { name: twig.extension }
49
nifr

|date filter use DateTime::format-Funktion, die keine Gebietsschemas unterstützt. Siehe diese Frage und schreibe deine eigene Zweigerweiterung.

2
Alexey B.

Ich werde eine von @nifr gepostete Lösung hinzufügen.

Um Ihr Datumsformat zu verwenden, installieren Sie die Twig Intl Extension und dann können Sie:

{{ date|localizeddate('none', 'none', app.request.locale, null, 'dd MMMM, yyyy') }}

Das letzte Argument in meinem Beispiel ist ein Datumsformat - hier ist eine Dokumentation: http://userguide.icu-project.org/formatparse/datetime

Hier ist die Twig Intl Extension Dokumentation: https://twig-extensions.readthedocs.io/de/latest/intl.html

1
Seb

Ich mochte die Twig Intl-Erweiterung nicht wirklich, sie fühlte sich für meinen Anwendungsfall etwas aufgebläht an, also ging ich einen anderen Ansatz. In unserer Anwendung haben wir das DateTime-Objekt erweitert und die format-Funktion überladen, um das Datum mit der strftime-Funktion von PHP zu übersetzen.

Bevor Sie diesen Ansatz verwenden, sollten Sie hier einige Punkte beachten:

  • Unsere Anwendung verwendet eine einzige Sprache (in unserem Fall Niederländisch)
  • Unser erweitertes DateTime-Objekt verwenden wir überall in der Anwendung
  • Das Erweitern der DateTime-Klasse wird verursacht andere Probleme. Zum Beispiel müssen Sie in Doctrine einen benutzerdefinierten Typ implementieren, um Ihre erweiterte DateTime zu verarbeiten. Nicht alle Bibliotheken verwenden die Variable DateTimeInterface korrekt, sondern erwarten \DateTime-Objekte

Hier ist die DateTime-Klasse:

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;
    }

}

Stellen Sie dann in Ihrem Front-Controller (d. H. public/index.php) Ihr Gebietsschema ein:

setlocale(LC_ALL, 'nl_NL');

Jetzt in Ihrer Twig-Vorlage, überall wo eine DateTime formatiert ist:

// start is an instance of your extended DateTime object
{{ start.format('D d M')|capitalize }}
// Do 06 dec 
0
Liiva