Перевод даты PHP() для многоязычного сайта

Я пытаюсь создать условный перевод внутренней функции date() PHP. Возможно ли каким-то образом переопределить внутренние переменные - например. - дата ('M'), дата ('y') и т.д., так что в оставшуюся часть функции PHP на основе этого теста подаются разные строки:

if (ICL_LANGUAGE_CODE == 'fr') { }

Ниже приведен рабочий пример кода, который я использую для модуля дат. Поскольку $date определяется многими переменными, содержащимися в этом определении, важно предварительно переопределить переменные в PHP date() во-первых, чтобы избежать переопределения переменной 100 раз или более в каждом ключе.

if($start <= $end):
    if($start == $end):
        //Month Day, Year
        $date =  date('F', $start).' '.date('j',$start).', '.date('Y', $start);
    else:
        if($start_year == $end_year):
            if($start_month == $end_month):

                //Month Day - Day, Year
                $date = date('F', $start).' '.date('j',$start).' - '.date('j', $end).', '.date('Y', $start);
            else:
                //Month Day - Month Day, Year
                $date =  date('F', $start).' '.date('j',$start).' - '.date('F', $end).' '.date('j', $end).', '.date('Y', $start);
            endif;
        else:
            //Month Day, Year - Month Day, Year
            $date =  date('F', $start).' '.date('j',$start).', '.date('Y', $start).' - '.date('F', $end).' '.date('j', $end).', '.date('Y', $end);
        endif;
    endif;
endif;

Ответ 1

Всякий раз, когда вам нужно манипулировать метками даты и времени на основе языка, вы должны использовать strftime:

switch ($lang) {
    case 'en':
        setlocale(LC_TIME, 'en_CA.UTF-8');
        echo strftime("%B %e, %G");
        break;
    case 'fr':
        setlocale(LC_TIME, 'fr_CA.UTF-8');
        echo strftime("%e %B %G");
        break;
}

Результаты:

February 11, 2011  // en
11 février 2011    // fr

Конечно, вам необходимо установить локали в вашей системе. В Ubuntu для примера:

bash-4.1$ sudo locale-gen fr_CA.UTF-8

Ответ 2

    $date =  date('F', $start).' '.date('j',$start).', '.date('Y', $start);

Это довольно болезненный путь. Строка формата в date() не должна быть одним символом. Эта строка может быть уменьшена до

$date = date('F j Y');

И учитывая, что у вас может быть простой

switch($whats_my_locale) {
    case 'FR':
       $format = 'date format characters for a french date';
       break
    case 'EN' :
       $format = 'format chars for english date'
       break
    case etc....
    default:
       $format = 'default date format string here';
}

$local_date_string = date($format, $start);

и от вас.

Ответ 3

Я уверен, что у вас есть, но вы считали, что используете только числовые значения?

Кроме того, если вы их используете, помните, что у США есть месяцы в день, напротив Великобритании и других.

Ответ 4

Может быть сделано довольно легко либо с помощью определения, либо с помощью переключателя.

ОПРЕДЕЛИТЬ (PHP 7)

<?php
// With Define
$untranslated_date = $date('D');
translate_date($untranslated_date);
							
function translate_date($untranslated_date)
{
  define('translated_days', array(
	'Mon' => 'Ma',
	'Tue' => 'Di',
	'Wed' => 'Wo',
	'Thu' => 'Do',
	'Fri' => 'Vr',
	'Sat' => 'Za',
	'Sun' => 'Zo')
	);
	
	echo translated_days[$untranslated_date];
}