Je veux traduire la phrase générique "x heures et y mintues". Bien sûr, si ce n'est qu'une heure, il faut dire "1 heure et y mintutes". La même chose vaut pour les minutes, "x heures et 1 minute". Je sais que _n()
traite de la question du célibataire/du pluriel, mais quelle est la meilleure pratique pour gérer deux nombres dans une phrase?
Méthode 1
printf(_n("%d hour", "%d hours", $hours), $hours);
_e(" and ");
printf(_n("%d minute", "%d minutes", $mins), $mins);
Fonctionne bien, mais la concaténation de chaînes rend la traduction inflexible. Je m'attendrais à ce que toutes les langues ne fonctionnent pas avec "[phrase heure] [et phrase] [phrase phrase]".
Méthode 2
printf(
"%s and %s",
sprintf(_n("%d hour", "%d hours", $hours), $hours),
sprintf(_n("%d minute", "%d minutes", $mins), $mins)
);
Cela semble juste, mais il semblerait qu’il serait difficile de traduire sans contexte. Peut-être que j'ai besoin d'ajouter un contexte avec _x()
?
quelque chose de plus lisible @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);
}
}
J'opterais pour la lisibilité et utiliserais une solution plutôt verbeuse:
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 );
}