web-dev-qa-db-ja.com

「2時間15分」と翻訳しますか。

「x時間とyミント」という総称を翻訳したい。もちろん、1時間しかない場合は、「1時間とミント」と表示されます。同じことが、「x時間1分」の分にも当てはまります。私は_n()が単数形/複数形の問題を扱うことを知っていますが、フレーズ内の2つの数を扱う上でのベストプラクティスは何ですか?

方法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);
    }
}
5
Matt

読みやすさを選び、やや冗長な解決策を使用します。

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
fuxia