tutorials.de Buch-Aktion 05/2012
Like Tree5Danke
  • 1 Beitrag von saftmeister
  • 1 Beitrag von saftmeister
  • 1 Beitrag von saftmeister
  • 1 Beitrag von Sebastian Schmidt
  • 1 Beitrag von Sebastian Schmidt
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
310
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hallo,

    bei meinem aktuellen Projekt habe ich folgendes Problem. Ich habe eine Translater-Klasse, mit der ich die Stings auf meiner Seite in verschiedene Sprachen übersetzen möchte. Mein Problem ist an der Stelle, dass ich immer die translate Funktion aufrufen muss, wenn ich das tun möchte und das sieht echt bescheuert aus und nervt.

    $this->translater->translate('Welcome');

    Gibt es eine Möglichkeit, die Funktion direkt per Kürzeln anzusprechen? Idealfall wäre, wenn es dann nur noch hieße:

    translate('Welcome');

    Gruß, Tommy
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Wenn ich das lösen müsste, dann würde ich das so machen: Klasse "ML" (steht für Multilanguage) hat eine statische Funktion translate.

    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    class ML
    {
      private static $lang = 'en';
     
      public static function setLanguage($lang)
      {
        self::$lang = $lang;
     
        // z.b. gettext verwenden
        bindtextdomain($lang, '/Verzeichnis/mit/den/mo/files');
      }
     
      public static function translate($str)
      {
        // Hier kommt der Code, der die Übersetzung in die jeweilige Sprache macht
        $trans = gettext($str);
     
        return $trans;
      }
    }

    Dann kann mna prima überall folgendes machen:


    Code php:
    1
    2
    3
    4
    5
    6
    7
    
    class SomeClass
    {
      public function someFunction($someParameter)
      {
         echo ML::translate('__WILLKOMMEN__');
      }
    }
    Geändert von saftmeister (24.12.11 um 10:45 Uhr)
    Tommy57 bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hi Saftmeister,

    ja über ne statische Funktion wäre ne Idee, wobei der Aufruf ML->translate('...'), auch recht kurz ist. Bei mir würde es ja wieder so aussehen:
    Translater::translate('...').

    Wenn PHP Mehrfachvererbung unterstüzen würde, würde ich mich ja für diese Variante entscheiden:

    class Test extends Translater {
    ...
    ...
    $this->translate('...');
    }


    Ich denke, es führt kein Weg an diesem Schönheitsfehler vorbei.

    Danke und Gruß,
    Tommy
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Wofür brauchst du in diesem Falle Mehrfach-Vererbung? Du könntest von Translater eine abgeleitete Klasse ML erstellen, und in dieser die Methoden statisch machen, dazu noch ein Singleton und gut ist.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hi,

    also ich möchte einfach nur ne kürze und zugleich sinnvolle Schreibweise für den Funktionsaufruf haben.

    Ich habe gerade eine Möglichkeit gefunden über Delegation, das heißt ich übergebe den Funktionsnamen in einem String als Parameter an die Klasse weiter. Diese kann dann ganz normal über die Variable auf die Funktion zu greifen. Sehr schick, aber dann müsste ich glaub ich die Translaterklasse umschreiben in normale Funktionen. Muss ich mal drüber nachdenke. Aber ich denke, das wäre nen guter Ansatz.

    Danke nochmal und Gruß,
    Tommy
     

  6. #6
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Und wo hast du dann Code gespart? Du musst dann halt eine Delegations-Funktion aufrufen und übergibst dann statt einem eben 2 Parameter. Ist nicht wirklich weniger code. Außerdem hast du dann Code-Verdoppelungen an allen Ecken und Enden. Aber es ist deine Entscheidung. Meine Variante ist hier etwas kürzer:

    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    class ML extends Translater
    {
      private static $_instance;
     
      public static function translate($string)
      {
        if(!self::$_instance)
          self::$_instance = new Translator();
     
        return self::$_instance->translate($string);
      }
    }

    Ganz easy

    Natürlich kann man auch so was machen:

    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    $translator = new Translator();
    function translate($string)
    {
      return $translator->translate($string);
    }
     
    class SomeClass
    {
      public function someFunktion($someParameter)
      {
        echo translate('__WILLKOMMEN__');
      }
    }
    Tommy57 bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  7. #7
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Ja, das stimmt auch wieder. Also deine erste Variante gefällt mir auch besser, wobei ich meine Translater Klasse auch gleich ML nennen kann und nen Singleton habe ich auch schon drinnen.

    Aber könnte ich vllt der Klasse die Parameter direkt übergeben?
    So dass ich dann statt
    $this->translater->translate(...);
    einfach sagen könnte:
    $this->translater(..);

    Gruß, Tommy
     

  8. #8
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Hast du für deine "Geschäftsklassen" eine allgemeine Klasse? Dann könntest du dort einfach eine Methode "translate" einbauen, die eine Instanz von Translater erzeugt und dort die Methode "translate" aufruft. In etwa so:

    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    class Allgemein
    {
      protected function translate($string)
      {
        return Translater::getInstance()->translate($string);
      }
    }
     
    class BusinessLogic extends Allgemein
    {
      public function someFunction()
      {
        echo $this->translate('__WILLKOMMEN__');
      }
    }

    Die Klasse BusinessLogic macht zu Beispiel das Anzeigen von News-Beträgen oder whatever...
    Tommy57 bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  9. #9
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    1.000 Dank! Das habe ich gesucht******!

    Ich bau mir einfach eine Basisklasse, die ich immer vererben kann, wenn ich sie brauch.
    Danke
     

  10. #10
    Avatar von Sebastian Schmidt
    Sebastian Schmidt Sebastian Schmidt ist offline Mitglied Silber
    Registriert seit
    Dec 2002
    Ort
    Hannover
    Beiträge
    75
    Das ganze könntest du auch einfach über Namespace lösen, einfach ein MyTools instanzieren und Translate aufrufen, als default Paramter würde ich englisch benutzen und wenn du Französisch bräuchtest einfach MyTools::Translate('Hallo', FRENCH); fertig. Das ist alles eine Sache von Geschmack und Sichtweise, was einem halt besser gefällt
    Tommy57 bedankt sich. 

  11. #11
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Da hatte ich auch schon drüber nachgedacht gehabt, aber ich wollte halt unbedingt $this->translate('Hallo') haben. Die Spache steht in der Session (Browsereinstellung oder Profileinstellung), also muss ich die nicht übergeben.

    Ich finde halt den ständigen Aufruf nervig und statisch erst recht, wenn ich im Code durchgehend mit dem Pfeil-Operator arbeite, da möchte ich dann nicht bei allen zu übersetzenden echos nen :: haben.

    Daher ist dieser Lösungsansatz von Saftmeister schon ideal.

    Danke trotzdem für den Tipp.

    Gruß und frohes Fest, Tommy
     

  12. #12
    Avatar von Sebastian Schmidt
    Sebastian Schmidt Sebastian Schmidt ist offline Mitglied Silber
    Registriert seit
    Dec 2002
    Ort
    Hannover
    Beiträge
    75
    Das ist ja mehr eine Sache von Zugehörigkeit der Klassen und Abhängigkeit, Static Functions sind ja um Toolfunktionen in deiner Klasse oder Views zu nutzen die mit dem Context ansich überhaupt gar nix zu tun haben. Das reicht halt weit in die Objektorientierte Programmierung.

    Aber ich hab gern geholfen.
    Tommy57 bedankt sich. 

Ähnliche Themen

  1. Frage zu Alias
    Von ratze79 im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 27.05.08, 13:04
  2. alias mit Java
    Von Meccan im Forum Java
    Antworten: 2
    Letzter Beitrag: 16.10.07, 20:14
  3. Was ist Alias Maya
    Von spirits92 im Forum Autodesk Maya (ehemals Alias)
    Antworten: 3
    Letzter Beitrag: 18.08.05, 22:58
  4. Alias Funktion beim Tomcat?
    Von mail2mrx im Forum Hosting & Webserver
    Antworten: 0
    Letzter Beitrag: 12.07.05, 15:17
  5. Alias mitbrennen
    Von mardazad im Forum Mac OS
    Antworten: 0
    Letzter Beitrag: 25.10.04, 05:06