翻译将秒转换为人类可读字符串的PHP函数

时间:2011-11-02 22:54:26

标签: php string localization

In this website我找到了一个以人类可读格式转换秒数的函数,如下所示:

  

3周,2天,1小时,27分钟,52秒

我想用意大利语翻译它,所以我只是翻译了数组键。现在的功能就是这个

function secondsToHumanReadable($secs) {

$units = array(
'settimane' => 604800,
'giorni'    =>  86400,
'ore'       =>   3600,
'minuti'    =>     60,
'secondi'   =>      1
);

foreach ( $units as &$unit ) {
    $quot  = intval($secs / $unit);
    $secs -= $quot * $unit;
    $unit  = $quot;
}

return $units;
}

它运作得很好,但是有一点问题:在英语中,所有复数的结尾都少了一个字母,但不幸的是在意大利语中它们不一样,如下所示。

English             Italian    
- weeks, week       - settimane, settimana
- days, day         - giorni, giorno
- hours, hour       - ore, ora
- minutes, minute   - minuti, minuto
- seconds, second   - secondi, secondo

我希望找到一个解决方案,在值为== 1时打印奇异键。

我想我可以使用array_combine()将数组与另一个具有奇异键的数组合并。

$singular_units = array(
'settimana',
'giorno',
'ora',
'minuto',
'secondo'
);

print_r(array_combine( $singular_units, $units ));

/* print_r:
Array
(
    [settimana] => 604800
    [giorno] => 86400
    [ora] => 3600
    [minuto] => 60
    [secondo] => 1
)
*/

上面的数组是我需要的,但是我无法使用它,因为我不能使用另一个foreach

$seconds = 12345*60; // just an example
$units = secondsToHumanReadable($seconds);              
$time_string = '';
foreach ($units as $u => $v)
    if (!empty($v))
        $time_string.= $v.' '.$u.', ';
echo substr($time_string, 0, -2);
// 1 settimane, 1 giorni, 13 ore, 45 minuti
// this echo is not correct :( is expected to be like this:
// 1 settimana, 1 giorno, 13 ore, 45 minuti

我怎样才能实现单数词?

任何帮助真的赞赏!非常感谢你!

3 个答案:

答案 0 :(得分:3)

你可以用任何你喜欢的方式实现它们,恕我直言最好不要像目前的解决方案那样缺乏清晰度和可读性(至少这就是本地-var-mutation-with-refs-and-variable-pong-pong的样子对我来说。

只有一种可能的解决方案:

$input = 12345 * 60;

$units = array(
    604800 => array('settimana', 'settimane'),
    86400 => array('giorno', 'giorni'),
    // etc
);

$result = array();
foreach($units as $divisor => $unitName) {
    $units = intval($input / $divisor);
    if ($units) {
        $input %= $divisor;
        $name = $units == 1 ? $unitName[0] : $unitName[1];
        $result[] = "$units $name";
    }
}

echo implode(', ', $result);

<强> See it in action

答案 1 :(得分:0)

你可能想要这样的东西?

function secondsToHumanReadable($secs) {

    $units = array(
    'settimane' => 604800,
    'giorni'    =>  86400,
    'ore'       =>   3600,
    'minuti'    =>     60,
    'secondi'   =>      1
    );

    foreach ( $units as $key => &$unit ) {

        $this_unit  = intval($secs / $unit);

        $secs -= $this_unit * $unit;

        if($this_unit == 1):    
            switch($key):
                case "settimane":
                    $this_key = "settimana";
                break;
                case "giorni":
                    $this_key = "giorno";
                break;
                case "ore":
                    $this_key = "ora";
                break;
                case "minuti":
                    $this_key = "minuto";
                break;
                case "secondi":
                    $this_key = "secondo";
                break;
            endswitch;
        else:
            $this_key = $key;
        endif;


        $results[$this_key] = $this_unit;
    }

    return $results;
}

这将返回完整数组,而不是您的初始数组...结果...

答案 2 :(得分:0)

还要提到一些框架有Inflector类,它们将确定一个单词的复数/单数形式,但是我不确定它们是否支持意大利语这样的语言,但它可能值得一看。我个人使用CakePHP Inflector,因为它是一个独立的库,我不需要带任何其他文件。

CakePHP Inflector类 http://api.cakephp.org/class/inflector

Doctrine Inflector:http://www.doctrine-project.org/api/common/2.0/doctrine/common/util/inflector.html