Problem z wyświetlaniem polskich nazw miesięcy dotyczy tego, co zwraca PHP-owa funkcja strftime(), której wynik jest znowuż zależny od innej funkcji, którą jest setLocale. Ta także jest standardową funkcją PHP - nie jest to funkcja Joomli. SetLocale wskazuje ustawienia regionalne, które mają być użyte w danym skrypcie i wskazuje dla jakiego typu operacji lub danych. Jest to kłopotliwa funkcja ponieważ jest mocno zależna od systemu operacyjnego, na którym mamy uruchomioną instancję PHP.
Jeżeli PHP działa na Linuxie, wówczas sprawa jest prosta: na początku pliku php generującego widok (np. /com_pbbooking/views/pbbooking/tmpl/consolidated_view.php) musimy po prostu dopisać coś takiego:
Kod PHP:
setlocale(LC_TIME, "pl_PL");
Lub jeśli mamy problemy z kodowaniem:
Kod PHP:
setlocale(LC_TIME,"pl_PL.UTF-8");
Problemy pojawiają się, gdy PHP działa na systemie Windows, ponieważ system ten miewa bardzo różne oznaczenia dla języków i kodowań w zależności od swojej wersji. Istnieją jednakże odpowiednie strony internetowe w bazach MSDN (http://msdn.microsoft.com/en-us/libr...(v=VS.71).aspx oraz http://msdn.microsoft.com/en-us/libr...0z(vs.71).aspx), którymi można się posiłkować. To, co powinno działać już na każdym obecnym Windowsie to:
Kod PHP:
setlocale(LC_TIME, "polish" );
Jednakże, to nie koniec problemów, bo pozostaje jeszcze kodowanie. Niestety, wbrew zdrowemu rozsądkowi, system Windows nie obsługuje UTF-8 dla funkcji setLocale! Można to sprawdzić samemu albo zagłębić się w literaturę. Jedynym sposobem jest niestety wstawienie wszędzie gdzie trzeba odpowiednich wywołań funkcji iconv(). Dla przykładu - trzeba taki kod (wzięty z kodu do PBBooking):
Kod PHP:
echo '<th colspan='.(count($this->timeslots)-2).'>'.strftime('%B',$currday->format('U')).'</th>';
zamienić na taki:
Kod PHP:
echo '<th colspan='.(count($this->timeslots)-2).'>'.iconv('Windows-1250', 'UTF-8', strftime('%B',$currday->format('U'))).'</th>';
No i teraz już tylko od chęci programisty zależy jak elegancko zostaną wdrożone odpowiednie zmiany w kodzie.
Wysłane przez
noiragneau
Pod wskazanym przez Ciebie linkiem mamy Consolidated View. Ja go u siebie (Windows + UTF-8) poprawiłem tak:
Kod PHP:
<?php //push stylesheet into head
setlocale(LC_TIME, 'polish');
$doc = &JFactory::getDocument();
$doc->addStyleSheet(JURI::root(false)."components/com_pbbooking/user_view.css");
//get first day of week
$arr = date_parse(date_format($date,DATE_RFC822));
$timestamp = mktime($arr['hour'],$arr['minute'],$arr['second'],$arr['month'],$arr['day'],$arr['year']);
$arr = getdate($timestamp);
$firstday = $date;
$firstday->modify('-'.$arr['wday'].' day');
$currday = clone $firstday;
$prevweek = clone $currday;
$prevweek->modify('-7 day');
$nextweek = clone $currday;
$nextweek->modify('+7 day');
//render week calendar view
echo '<table id="pbbooking">';
echo '<tr>';
echo '<td></td>';
echo sprintf("<th><a href=index.php?option=com_pbbooking&task=view&date=%s><<</a></td>",date_format($prevweek,'Ymd'));
echo '<th colspan='.(count($this->timeslots)-2).'>'.iconv('Windows-1250', 'UTF-8', strftime('%B',$currday->format('U'))).'</th>';
echo sprintf("<th><a href=index.php?option=com_pbbooking&task=view&date=%s>>></a></th>",date_format($nextweek,'Ymd'));
echo '</tr>';
echo '<tr><td></td>';
foreach ($this->timeslots as $timeslot) {
echo '<th>'.$timeslot['english'].'</th>';
}
echo '</tr>';
for($i=0;$i<7;$i++) {
echo '<tr>';
//TODO: check how proper implementation of setLocale in Joomla is done....
echo '<td>'.iconv('Windows-1250', 'UTF-8', strftime($this->config->date_format_heading,date_format($currday,'U'))).'</td>';
foreach ($this->timeslots as $timeslot) {
if ($this->block_same_day == 1) {
$currday->setTime(0,0);
} else {
$currday->setTime($timeslot['start_hour'],$timeslots['start_min']);
}
if ($this->now <= $currday) {
if (!$this->cal->isOpen($timeslot['id'],$currday)) {
echo '<td class="closed_cell">N/A';
}
else if (!$this->cal->isFree($currday,$timeslot['id'])) {
echo '<td class="free_cell">';
echo sprintf("<a href=index.php?option=com_pbbooking&task=create&date=%s&slot=%s>",date_format($currday,'Ymd'),$timeslot['id']);
echo JTEXT::_('COM_PBBOOKING_FREE_TEXT')."</a>";
} else {
echo '<td class="busy_cell">';
echo JText::_('COM_PBBOOKING_BUSY_TEXT');
}
echo '</td>';
} else {
echo '<td class="busy_cell">';
echo JText::_('COM_PBBOOKING_PAST_TEXT');
echo '</td>';
}
}
$currday->modify('+1 day');
echo '</tr>';
}
echo '</table>';
?>