time_elapsed_string - auf Deutsch...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • time_elapsed_string - auf Deutsch...

    Hallo liebe Gemeinde,


    ich grüble seit Stunden an dem Problem meine "time_elapsed_string - Funktion" auf die deutsche Sprache umzumodeln,- ich kriege das nicht hin...


    Die bekannte Funktion sieht bei mir so aus:
    PHP-Code:
    public function time_elapsed_string($datetime$full false,  $future false ) {
            
            
    $now = new DateTime;
            
    $ago = new DateTime($datetime);
            
    $diff $now->diff($ago);

            
    $diff->floor($diff->7);
            
    $diff->-= $diff->7;

            
    $string = array(
                
    'y' => 'year',
                
    'm' => 'month',
                
    'w' => 'week',
                
    'd' => 'day',
                
    'h' => 'hour',
                
    'i' => 'minute',
                
    's' => 'second',
            );

            foreach (
    $string as $k => &$v) {
                if (
    $diff->$k) {
                    
    $v $diff->$k ' ' $v . ($diff->$k 's' '');
                } else {
                    unset(
    $string[$k]);
                }
            }

            if (!
    $full$string array_slice($string01);

            if(
    $future)
            {
                return 
    $string implode(', '$string) . ' to go' 'to go';
            }
            return 
    $string implode(', '$string) . ' ago' 'just now';
        } 
    Bei z.B. 1 Tag wird "1 Day ago" ausgegeben, bei 2 Tagen die Mehrzahl "2 Days ago".


    Ich brauche die Ausgabe in deutscher Sprache.
    Während in englischer Sprache bei Mehrzahl immer nur das 's' an day(s), week(s)......second(s) angefügt wird, ist das Handling sehr einfach.


    In deutscher Sprache endet die Mehrzahl aber mal mit 'e' wie bei 'Tag(e)', dann aber wieder mit 'en' wie bei 'Minute(n).
    Nun einfach statt dem 's' ein 'en' einzusetzen geht ja nicht,- die Ausgabe würde dann ja 'Minuteen', 'Stundeen' usw. lauten...


    Wie kann ich das in deutsch hin kriegen? Ich dachte schon an ein zweites array, aber es gelingt mir einfach nicht.


    Wer weiß das?


    Danke und Gruß

  • #2
    Das soll kein Schönheitswettbewerb sein, sondern nur als kleine Ansatz dienen:
    PHP-Code:
    $dtNow = new DateTime();
    $dtAgo = new DateTime('23.04.2022 15:04:39');
    $dtDiff $dtNow->diff($dtAgo);

    // week quick fix
    $dtDiff->floor($dtDiff->7);
    $dtDiff->-= $dtDiff->7;

    $string_parts = [];

    if (
    $dtDiff->y)
      
    $string_parts[] = $dtDiff->. ($dtDiff->' Jahre' 'Jahr');

    if (
    $dtDiff->m)
      
    $string_parts[] = $dtDiff->. ($dtDiff->' Monate' 'Monat');

    if (
    $dtDiff->w)
      
    $string_parts[] = $dtDiff->. ($dtDiff->' Wochen' 'Woche');

    if (
    $dtDiff->d)
      
    $string_parts[] = $dtDiff->. ($dtDiff->' Tage' ' Tag');

    if (
    $dtDiff->h)
      
    $string_parts[] = $dtDiff->. ($dtDiff->' Stunden' 'Stunde');

    if (
    $dtDiff->i)
      
    $string_parts[] = $dtDiff->. ($dtDiff->' Minuten' 'Minute');

    if (
    $dtDiff->s)
      
    $string_parts[] = $dtDiff->. ($dtDiff->' Sekunden' 'Sekunde');


    echo 
    implode(', '$string_parts) . ($dtDiff->invert ' vergangen' ' entfernt'); 
    Code:
    1 Tag, 17 Stunden, 8 Minuten, 50 Sekunden vergangen

    Etwas kompakter, wenn man denn möchte:
    PHP-Code:
    $dtNow = new DateTime();
    $dtAgo = new DateTime('03.04.2022 15:04:39');
    $dtDiff $dtNow->diff($dtAgo);

    // week quick fix
    $dtDiff->floor($dtDiff->7);
    $dtDiff->-= $dtDiff->7;

    $date_parts = [
        
    'y' => ['Jahr''Jahre']
        , 
    'm' => ['Monat''Monate']
        , 
    'w' => ['Woche''Wochen']
        , 
    'd' => ['Tag''Tage']
        , 
    'h' => ['Stunde''Stunden']
        , 
    'i' => ['Minute''Minuten']
        , 
    's' => ['Sekunde''Sekunden']
      ];

    $string_out = [];

    foreach (
    $dtDiff as $key => $value)
    {
      if (
    $value && isset($date_parts[$key]))
        
    $string_out[] = $value ' ' . ($dtDiff->{$key} > $date_parts[$key][1] : $date_parts[$key][0]);
    }

    echo 
    implode(', '$string_out) . ($dtDiff->invert ' vergangen' ' entfernt'); 
    Zuletzt geändert von ArneDrews; 25.04.2022, 11:23. Grund: Fix für die Anzahl der Wochen eingefügt

    Kommentar


    • #3
      Super,- herzlichen Dank für Deine Mühe.


      Deine Idee gibt aber einen ganzen String aus. Also Anzahl jahre, Monate, Wochen... usw.
      Angezeigt soll aber nur 1 Kriterium. Also 1 Jahr her, oder 3 Monate her, 5 Tage her etc.
      So dachte ich dass dies doch mit der Variante 1 aus Deinem Vorschlag hin kriegen sollte, wenn ich nach dem ersten "if" mit "else if" weitermache.
      Oder denke ich schon wiede verkehrt...?

      Kommentar


      • #4
        Das wäre noch einfacher
        PHP-Code:
        $tsNow = (new DateTime())->getTimeStamp();
        $tsOther = (new DateTime('03.04.2022 15:04:39'))->getTimeStamp();
        $tsDiff $tsNow $tsOther;

        $date_parts = [
            
        'y' => ['Jahr''Jahre']
            , 
        'm' => ['Monat''Monate']
            , 
        'w' => ['Woche''Wochen']
            , 
        'd' => ['Tag''Tage']
            , 
        'h' => ['Stunde''Stunden']
            , 
        'i' => ['Minute''Minuten']
            , 
        's' => ['Sekunde''Sekunden']
          ];

        $index $tsDiff 0;
        $suffix $tsDiff ' entfernt' ' vergangen'
        Beispiel für die Tage:
        PHP-Code:
        echo date('d'$tsDiff) . ' ' $date_parts['d'][$index] . $suffix
        Code:
        24 Tage vergangen

        Kommentar


        • #5
          Möchte mich herzlich bedanken....

          Ja,- spät, aber...


          Danke vielmals, aber Du 'ArneDrews' hast mich auf den richtigen Weg gebracht.
          Echt top,- wehe ich erwisch' Dich,- dann gebe ich einen aus!

          Kommentar

          Lädt...
          X