it-swarm-ru.tech

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

Я пытаюсь создать условный перевод внутренней функции date () PHP. Можно ли как-то переопределить внутренние переменные - например, - date ('M'), date ('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;
13
Brian

Всякий раз, когда вам нужно манипулировать метками даты/времени в зависимости от локали, вы должны использовать 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
28
netcoder
    $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);

и уходи.

8
Marc B

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

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

0
JakeSteam

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

ОПРЕДЕЛИТЬ (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];
}

ВЫКЛЮЧАТЕЛЬ (или если заявление)

// With a switch (or if)
$untranslated_date = $date('D');
translate_date($untranslated_date);

function translate_date($untranslated_date)
{
switch ($untranslated_date)
{
        case "Mon":
        $translated_date = "Ma";
        break;
                
    case "Tue":
        $translated_date = "Di";
        break;
                
        case "Wed":
        $translated_date = "Wo";
        break;
                
        case "Thu":
        $translated_date = "Do";
        break;
                
        case "Fri":
        $translated_date = "Vr";
        break;
                
        case "Sat":
        $translated_date = "Za";
        break;
                
        case "Sun":
        $translated_date = "Zo";
        break;
}
        
echo $translated_date;
}
0
Chris Baaijens