PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   time_elapsed_string - auf Deutsch... (https://www.php-resource.de/forum/php-developer-forum/107476-time_elapsed_string-auf-deutsch.html)

Kayleigh11 23-04-2022 19:08

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ß

ArneDrews 25-04-2022 10:15

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'); 


Kayleigh11 26-04-2022 17:13

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...?

ArneDrews 26-04-2022 23:02

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:28 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG