Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] funkcja ile temu
Forum PHP.pl > Forum > Przedszkole
kavillock
znalazłem na necie funkcję ile temu ale po przetłumaczeniu nie działa po "polskiemu". czy ktoś może mi ją poprawić aby spełniała normy języka polskiego

  1. function iletemu($ts) {
  2. $ts=time()-$ts;
  3. if ($ts<1)
  4. // <1 second
  5. return " ONLINE";
  6. elseif ($ts==1)
  7. // <1 second
  8. return $ts." sekunda";
  9. elseif ($ts<60)
  10. // <1 minute
  11. return $ts." sekund";
  12. elseif ($ts<120)
  13. // 1 minute
  14. return "1 minuta";
  15.  
  16. elseif ($ts<60*60)
  17. // <1 hour
  18. return floor($ts/60)." minuty";
  19. elseif ($ts<60*60*2)
  20. // <2 hour
  21. return "1 godzin";
  22. elseif ($ts<60*60*24)
  23. // <24 hours = 1 day
  24. return floor($ts/(60*60))." godzin";
  25. elseif ($ts<60*60*24*2)
  26. // <2 days
  27. return "1 dni";
  28. elseif ($ts<(60*60*24*7))
  29. // <7 days = 1 week
  30. return floor($ts/(60*60*24))." dni";
  31. elseif ($ts<60*60*24*30.5)
  32. // <30.5 days ~ 1 month
  33. return floor($ts/(60*60*24*7))." tygodni";
  34. elseif ($ts<60*60*24*365)
  35. // <365 days = 1 year
  36. return floor($ts/(60*60*24*30.5))." miesięcy";
  37. else
  38. // more than 1 year
  39. return floor($ts/(60*60*24*365))." lat";
ShadowD
Niestety w język polski różni się od angielskiego i nie ma możliwości na tym kodzie poprawienia opisów by pasowały do liczb, trzeba go nieco przebudować.

Głównie chodzi o polskie liczby 0-60:
1 sekunda temu
2 sekundy temu
5 sekund temu
i np:
32 sekundy temu

Minuty wyglądają identycznie, albo będziesz tworzył tak jak jest to w tym kodzie po kolei liczby i zmieniał im nazwy lub poszukasz gotowca na tym forum, kolega któremu pomagałem rozwiązywać ten problem o ile pamiętam rozwiązał go do końca - poszukaj. winksmiley.jpg
kavillock
a mógłby mi ktoś do tego podać linka bo chyba ślepy lestem
thek
Trzeba sprawdzać modulo 10 z liczby lub jej wartość. I tak:
x=1 => sekunda
x%10=2, 3, 4 => sekundy
reszta => sekund
co sprowadza się do:
  1. if(x == 1)
  2. $końcówka = 'a';
  3. elseif( (x%10 == 2 OR x%10 == 3 OR x%10 == 4) AND !(x == 12 OR x == 13 OR x == 14) )
  4. $koncówka = 'y';
  5. else
  6. $końcówka = '';

Oczywiście to jest dla sekund, minut i godzin, bo tylko one mają końcówki inne. W dniach i dalej zmienia się temat słowa. 12, 13 i 14 trzeba w warunku drugim dodatkowo wyeliminować z prostej przyczyny - dla liczb typu xxxxnaście końcówka jest zawsze ta sama i nie ma na nią wpływu modulo. Zresztą sam zobacz:
1 minuta, 2 minuty, 3 minuty, 4 minuty, 5 minut, (...) 11 minut, 12 minut, 13 minut, 14 minut, (...) 20 minut, 21 minut, 22 minuty, 23, minuty, 24 minuty, 25 minut, 26 minut, (...), 31 minut, 32 minuty... i tak dalej. Popatrz na końcówki jak się zmieniają winksmiley.jpg
sekunda, sekundy, sekund
minuta, minuty, minut
godzina, godziny, godzin
dzień, dni, dni
tydzień, tygodnie, tygodni
miesiąc, miesiące, miesięcy
rok, lata, lat
wiek, wieki, wieków
millenium, millenia, milleniów
Tak więc jeśli już chcesz pisać końcówki to napisz funkcję, która zwraca nie tyle końcówki co całe określenia w zależności od tego czego tyczy, a byłoby to określone drugim parametrem funkcji i w efekcie miałby coś w stylu...
  1. function grammar($number, $what) {
  2. switch($what) {
  3. case 'sec':
  4. if($number == 1)
  5. return 'sekunda';
  6. elseif( ($number%10 == 2 OR $number%10 == 3 OR $number%10 == 4) AND !( $number == 12 OR $number == 13 OR $number == 14 ) )
  7. return 'sekundy';
  8. else
  9. return 'sekund';
  10. break;
  11. case 'min':
  12. if($number == 1)
  13. return 'minuta';
  14. elseif( ($number%10 == 2 OR $number%10 == 3 OR $number%10 == 4) AND !( $number == 12 OR $number == 13 OR $number == 14 ) )
  15. return 'minuty';
  16. else
  17. return 'minut';
  18. break;
  19. case 'hou':
  20. if($number == 1)
  21. return 'godzina';
  22. elseif( ($number%10 == 2 OR $number%10 == 3 OR $number%10 == 4) AND !( $number == 12 OR $number == 13 OR $number == 14 ) )
  23. return 'godziny';
  24. else
  25. return 'godzin';
  26. break;
  27. case 'day':
  28. if($number == 1)
  29. return 'dzień';
  30. else
  31. return 'dni';
  32. break;
  33. case 'wee':
  34. if($number == 1)
  35. return 'tydzień';
  36. elseif( ($number%10 == 2 OR $number%10 == 3 OR $number%10 == 4) AND !( $number == 12 OR $number == 13 OR $number == 14 ) )
  37. return 'tygodnie';
  38. else
  39. return 'tygodni';
  40. break;
  41. case 'mon':
  42. if($number == 1)
  43. return 'miesiąc';
  44. elseif( ($number%10 == 2 OR $number%10 == 3 OR $number%10 == 4) AND !( $number == 12 OR $number == 13 OR $number == 14 ) )
  45. return 'miesiące';
  46. else
  47. return 'miesięcy';
  48. break;
  49. case 'yea':
  50. if($number == 1)
  51. return 'rok';
  52. elseif( ($number%10 == 2 OR $number%10 == 3 OR $number%10 == 4) AND !( $number == 12 OR $number == 13 OR $number == 14 ) )
  53. return 'lata';
  54. else
  55. return 'lat';
  56. break;
  57. }
  58. }


EDIT: zapomniałem dodać nawiasów obejmujących całość po AND. Bez niego po sprawdzeniu 12 automatycznie by wywaliło do else, i 13 lub 14 by się już załapało, a to byłby błąd.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.