Contao-Summit 2026

Ankündigung

Collapse
No announcement yet.

TranslatableLabelInterface

Collapse
X
 
  • Filter
  • Zeit
  • Show
Clear All
new posts

    5.7.x TranslatableLabelInterface

    Hallo!

    Man kann ja jetzt in dem DCA bestimmte Übersetzungen auch als enum und Yaml-Dateien angeben:

    PHP-Code:
    rank' => [
      '
    inputType' => 'select',
      '
    enum' => \Babelfisch\FossilsBundle\Data\TaxonomicRanks::class, 
    Funktioniert super, nur stehe ich gerade auf dem Schlauch, wie ich das in einem DCA-Callback selber verwenden kann. Ich rufe es jetzt so in einem Label Callback auf:

    PHP-Code:
    public function addIcon($row, $label): string
    {
      
    $strRank = TaxonomicRanks::from($row['rank'])->label(); 
    Der Wert ist jetzt bspw. 'class' und ich möchte 'Klasse' zurückbekommen. Zurück bekomme ich aber 'rank.label.class'. In der Select-Liste werden die verschiedenen Werte dagegen sauber übersetzt.

    Kann mir hier jemand weiterhelfen?

    Gruß
    Meine aktiven Contao-Projekte: Lingolia • Stiftung firmm

    #2
    Hilft dir der Abschnitt weiter? (Muss man aufklappen)
    Contao-Association unterstützen

    Comment


      #3
      Nvm, soweit warst du schon. Was genau hast du denn vor? Poste mal die enum Class oder einen Link zum Code, sofern Open Source
      Contao-Association unterstützen

      Comment


        #4
        Erreichen möchte ich folgendes:

        Click image for larger version

Name:	Bildschirmfoto 2026-06-03 um 20.45.51.png
Views:	1
Size:	88,7 KB
ID:	936927

        Die Übersetzung vom Feld rank soll dabei rechts stehen.

        Erreicht habe ich es jetzt erst einmal, indem ich die Format-Angabe im Label mit etwas HTML angepasst habe:

        PHP-Code:
        'label' => [
          
        'fields' => ['name', 'commonName', 'rank'],
          
        'format' => '%s (%s) <span style="margin-left:auto">[%s]</span>',
          
        'label_callback' => ['tl_foss_taxonomy', 'addIcon'], 
        Dort funktioniert die Übersetzung, genau wie beim Bearbeiten des Datensatzes. Gerne hätte ich die Übersetzung vom Feld rank aber im Callback zur Verfügung. Mein Ansatz war eben:

        PHP-Code:
        $strRank = TaxonomicRanks::from($row['rank'])->label(); 
        Das liefert mir aber nur rank.label.phylum oder rank.label.class zurück.

        Ich habe mir jetzt auch diese Erklärung mal angeschaut und testweise mal ein Model erstellt und es damit versucht:

        PHP-Code:
        if (($objTaxonomy = FossTaxonomyModel::findByPk($row['id'])) !== null) {
          
        $strRank = $objTaxonomy->getEnum('rank')->label();
        } 
        Da kommt aber das gleiche heraus. Sowohl $objTaxonomy->getEnum('rank'), als auch TaxonomicRanks::from($row['rank']) liefern mir zwar das richtige ENUM, ich weiß aber nicht, wie ich dann die Übersetzung dafür bekomme. Mit label() bekomme ich nur die TranslatableMessage aber ich brauche dann wohl noch den Translator.

        Mein ENUM sieht so aus:

        PHP-Code:
        enum TaxonomicRanks: string implements TranslatableLabelInterface
        {
            case 
        _domain = 'domain';
            case 
        _kingdom = 'kingdom';
            case 
        _phylum = 'phylum';
            case 
        _class = 'class';
            case 
        _order = 'order';
            case 
        _family = 'family';
            case 
        _genus = 'genus';
            case 
        _species = 'species';

            
        // https://docs.contao.org/5.x/dev/reference/dca/fields/#enumerations
            
        public function label(): TranslatableMessage
            
        {
                return new 
        TranslatableMessage(
                    
        'rank.label.'.$this->value,
                    [],
                    
        'taxonomy',
                );
            }
        } 
        Die Übersetzung taxonomy.de.yaml ist hier:

        Code:
        rank:
          label:
            domain: Domain
            kingdom: Reich
            phylum: Stamm
            subphylum: Unterstamm
            class: Klasse
            subclass: Unterklasse
            order: Ordnung
            suborder: Unterordnung
            family: Familie
            subfamily: Unterfamilie
            genus: Gattung
            species: Art
            subspecies: Unterart
        Da komme ich erst einmal nicht weiter.
        Meine aktiven Contao-Projekte: Lingolia • Stiftung firmm

        Comment


          #5
          Du musst dir in deinem Callback noch den Translator injecten um an die Übersetzung zu kommen.
          » sponsor me via GitHub or Revolut

          Comment


            #6
            Zitat von Spooky Beitrag anzeigen
            Du musst dir in deinem Callback noch den Translator injecten um an die Übersetzung zu kommen.
            Tja, dazu müsste ich aber wissen, welcher Translator das ist. Ich finde im Quellcode leider keinen, der mit einer TranslatableMessage umgehen kann.
            Meine aktiven Contao-Projekte: Lingolia • Stiftung firmm

            Comment


              #7
              Dazu brauchst du keinen speziellen Translator - die Methode erwartet sich einfach das normale TranslatorInterface.
              » sponsor me via GitHub or Revolut

              Comment


                #8
                Zitat von Spooky Beitrag anzeigen
                Dazu brauchst du keinen speziellen Translator - die Methode erwartet sich einfach das normale TranslatorInterface.
                Sorry aber da komme ich ohne einen Schnipsel Quellcode nicht weiter. Ich hätte jetzt gedacht, dass ich es in der Art machen kann:

                PHP-Code:
                class tl_foss_taxonomy
                {
                    public function 
                __construct(private readonly TranslatorInterface $translator)
                    {
                    } 
                … aber da bekomme ich nur einen Internal Server Error:

                Code:
                Too few arguments to function tl_foss_taxonomy::__construct(), 0 passed in /…/mfoss/managed-edition/vendor/contao/core-bundle/contao/library/Contao/System.php on line 248 and exactly 1 expected
                Wenn nicht, dann wechsle ich halt wieder zum normalen Übersetzungssystem, auch wenn ich die ENUMs schon nett finde.
                Meine aktiven Contao-Projekte: Lingolia • Stiftung firmm

                Comment


                  #9
                  Ok, ich sehe gerade, dass das wohl nur mit den neueren Listenern funktioniert. Den Callback habe ich jetzt so definiert und nun funktioniert es:

                  PHP-Code:
                  #[AsCallback(table: 'tl_foss_taxonomy', target: 'list.label.label')]
                  class 
                  FossTaxonomyLabelCallbackListener
                  {
                      private 
                  TranslatorInterface $translator;

                      public function 
                  __construct(TranslatorInterface $translator)
                      {
                          
                  $this->translator = $translator;
                      }


                      public function 
                  __invoke($row, $label, DataContainer $dc, string $imageAttribute = '', bool $returnImage = false, bool|null $isProtected = null): string
                      
                  {
                          
                  …

                          $strRank 
                  = $this->translator->trans(TaxonomicRanks::from($row['rank'])->label(), [], 'taxonomy');

                          
                  $label .= ' <span style="margin-left:auto">['.$strRank.']</span>';

                          return 
                  \Contao\Image::getHtml($image, 'Phylum', $attributes).' '.$label;
                      }
                  } 
                  Ich verstehe zwar nicht ganz, warum ich noch einmal die Domain angeben muss, obwohl die doch eigentlich im label (TranslatableMessage) schon drin ist aber es funktioniert jetzt.
                  Meine aktiven Contao-Projekte: Lingolia • Stiftung firmm

                  Comment


                    #10
                    Zitat von Babelfisch Beitrag anzeigen
                    PHP-Code:
                    $strRank = $this->translator->trans(TaxonomicRanks::from($row['rank'])->label(), [], 'taxonomy'); 
                    So geht das zwar, aber besser wäre es wenn du die trans() Methode des TranslatableInterface nutzt. So wie du es jetzt hast, musst du ja nun die Domain zwei mal definieren.
                    » sponsor me via GitHub or Revolut

                    Comment


                      #11
                      Zitat von Spooky Beitrag anzeigen
                      So geht das zwar, aber besser wäre es wenn du die trans() Methode des TranslatableInterface nutzt. So wie du es jetzt hast, musst du ja nun die Domain zwei mal definieren.
                      Du meinst so?

                      PHP-Code:
                      $transMessage = TaxonomicRanks::from($row['rank'])->label();
                      $strRank = $this->translator->trans($transMessage->getMessage(), $transMessage->getParameters(), $transMessage->getDomain()); 
                      Wenn ja, dann habe ich das schon geändert. Hatte es gestern Abend nur schnell so geschrieben, weil die Werte in TranslatableMessage private deklariert sind und ich erst einmal schauen nach dem Gettern schauen musste.
                      Meine aktiven Contao-Projekte: Lingolia • Stiftung firmm

                      Comment


                        #12
                        Nein, ich meinte die trans() Method des TranslatableInterface, also der TranslatableMessage.
                        » sponsor me via GitHub or Revolut

                        Comment


                          #13
                          Zitat von Spooky Beitrag anzeigen
                          Nein, ich meinte die trans() Method des TranslatableInterface, also der TranslatableMessage.
                          Ach … so:

                          PHP-Code:
                          $strRank = TaxonomicRanks::from($row['rank'])->label()->trans($this->translator); 
                          Habe im Code von TranslatableMessage nicht weit genug nach unten gescrollt und im Contao Core wird es auch nicht so oft in der Art verwendet.

                          So klappt es und ist schön kurz. Danke!
                          Meine aktiven Contao-Projekte: Lingolia • Stiftung firmm

                          Comment


                            #14
                            Zitat von Babelfisch Beitrag anzeigen
                            Ach … so:

                            PHP-Code:
                            $strRank = TaxonomicRanks::from($row['rank'])->label()->trans($this->translator); 
                            Habe im Code von TranslatableMessage nicht weit genug nach unten gescrollt und im Contao Core wird es auch nicht so oft in der Art verwendet.

                            So klappt es und ist schön kurz. Danke!

                            Ich würde hier noch tryFrom nutzen https://www.php.net/manual/en/backedenum.tryfrom.php
                            Contao-Association unterstützen

                            Comment

                            Working...
                            X