Как мне перевести: "2 часа и 15 минут"?


Я хочу перевести общую фразу "x часов и y минут". Конечно, если это всего один час, там должно быть написано "1 час и y минут". То же самое относится и к минутам: "x часов и 1 минута". Я знаю, что _n() решает проблему с одним/множественным числом, но какова наилучшая практика обработки двух чисел во фразе?

Способ 1

printf(_n("%d hour", "%d hours", $hours), $hours);
_e(" and ");
printf(_n("%d minute", "%d minutes", $mins), $mins);

Работает, но объединение строк делает перевод негибким. Я бы ожидал, что не все языки будут работать с "[час фраза] [и фраза] [минутная фраза]".

Способ 2

printf(
    "%s and %s",
    sprintf(_n("%d hour", "%d hours", $hours), $hours),
    sprintf(_n("%d minute", "%d minutes", $mins), $mins)
);

Это кажется правильным, но, похоже, было бы трудно перевести без контекста. Может быть, мне нужно добавить контекст с _x()?

Решение, с которым я пошел:

Что-то более читаемое @toscho

function nice_time($minutes) {
    $hours = floor($minutes/60);
    $minutes = $minutes % 60;
    
    if ($hours == 0 && $minutes == 0) {
        return __("no length of time", 'context');
    } else if ($hours == 0 && $minutes == 1) {
        return __("1 minute", 'context');
    } else if ($hours == 1 && $minutes == 0) {
        return __("1 hour", 'context');
    } else if ($hours == 1 && $minutes == 1) {
        return __("1 hour and 1 minute", 'context');
    } else if ($hours == 0) {
        return sprintf(__("%d minutes", 'context'), $minutes);
    } else if ($minutes == 0) {
        return sprintf(__("%d hours", 'context'), $hours);
    } else if ($hours == 1) {
        return sprintf(__("1 hours and %d minutes", 'context'), $minutes);
    } else if ($minutes == 1) {
        return sprintf(__("%d hours and 1 minutes", 'context'), $hours);
    } else {
        return sprintf(__("%d hours and %d minutes", 'context'), $hours, $minutes);
    }
}
Author: Community, 2012-02-06

1 answers

Я бы предпочел удобочитаемость и использовал довольно подробное решение:

if ( 1 == $hours and 1 == $mins )
{
    _e( 'One hour and one minute', 'your_text_domain' );
}
elseif ( 1 == $hours )
{
    printf( __( 'One hour and %d minutes', 'your_text_domain' ), $mins );
}
elseif ( 1 == $mins )
{
    printf( __( '%d hours and one minute', 'your_text_domain' ), $hours );
}
else
{
    printf( __( '%d hours and %d minutes', 'your_text_domain' ), $hours, $mins );
}
 5
Author: fuxia, 2012-02-06 22:30:19