Ergebnis 1 bis 14 von 14

Thema: TranslatableLabelInterface

  1. #1
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    952
    Contao-Projekt unterstützen

    Support Contao

    Standard 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: LingoliaStiftung firmm

  2. #2
    Contao-Urgestein
    Registriert seit
    24.02.2021.
    Beiträge
    2.087
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hilft dir der Abschnitt weiter? (Muss man aufklappen)
    https://docs.contao.org/5.x/dev/refe...c-translations

  3. #3
    Contao-Urgestein
    Registriert seit
    24.02.2021.
    Beiträge
    2.087
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Nvm, soweit warst du schon. Was genau hast du denn vor? Poste mal die enum Class oder einen Link zum Code, sofern Open Source

  4. #4
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    952
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Erreichen möchte ich folgendes:

    Bildschirmfoto 2026-06-03 um 20.45.51.png

    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 TaxonomicRanksstring 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: LingoliaStiftung firmm

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    38.681
    Partner-ID
    10107

    Standard

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

  6. #6
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    952
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat 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: LingoliaStiftung firmm

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    38.681
    Partner-ID
    10107

    Standard

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

  8. #8
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    952
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat 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: LingoliaStiftung firmm

  9. #9
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    952
    Contao-Projekt unterstützen

    Support Contao

    Standard

    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$labelDataContainer $dcstring $imageAttribute ''bool $returnImage falsebool|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: LingoliaStiftung firmm

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    38.681
    Partner-ID
    10107

    Standard

    Zitat 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

  11. #11
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    952
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat 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: LingoliaStiftung firmm

  12. #12
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    38.681
    Partner-ID
    10107

    Standard

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

  13. #13
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    952
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat 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: LingoliaStiftung firmm

  14. #14
    Contao-Urgestein
    Registriert seit
    24.02.2021.
    Beiträge
    2.087
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat 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

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •