我想到这样做的一种方法是这样的:
function array_to_str($array) {
$two_values = _("%s and %s");
$three_values = _("%s, %s and %s");
$separator = _(", ");
if (count($array) == 1) {
return $array[0];
}
if (count($array) == 2) {
return sprintf($two_values, $array[0], $array[1]);
}
$prev = '';
for ($i = 0; $i < count($array) - 2; $i++) {
$prev .= $array[$i];
if ($i < count($array) - 3) {
$prev .= $separator;
}
}
return sprintf(
$three_values,
$prev,
$array[count($array) - 2],
$array[count($array) - 1]
);
}
$arrays[] = array('apple');
$arrays[] = array('apple', 'plum');
$arrays[] = array('apple', 'plum', 'watermelon');
$arrays[] = array('apple', 'plum', 'watermelon', 'lemon');
foreach ($arrays as $array) {
echo array_to_str($array) . PHP_EOL;
}
这将输出:
apple
apple and plum
apple, plum and watermelon
apple, plum, watermelon and lemon
如果语言使用列表格式1 and 2, 3, 4, 5, 6
,那么翻译者可以通过翻译来克服这个问题。
$three_values = "%3$s and %2$s, %1$s";
不幸的是,这样做会导致列表乱序。该字符串将输出6 and 5, 1, 2, 3, 4
.
但是,通过谷歌翻译中当前定义的语言,没有任何语言可以将“和”的位置更改为倒数第二个位置。从右到左的语言在从左到右阅读时将它放在第一个元素之后,但由于它是从右到左,它实际上处于正确的(倒数第二个)位置。
使用此方法还可以让您克服以非标准方式显示其列表的语言:
(Korean) 1, 2, 3, 4 <-- only commas are used
(Italian) 1, 2, 3 e 4, <-- extra comma at the end
(Chinese) 1,2,3和4的 <-- extra 的 at the end
(Hungarian) Az 1., 2., 3. és 4. <-- extra A at the beginning for 2 numbers, Az at the beginning for 3 or more numbers
最后一个可以使用上面的函数来完成,如下所示:
$two_values = "A %s és %s";
$three_values = "Az %s, %s és %s";
$separator = ", ";
假设您的数字格式正确,这将输出:
A 1. és 2.
Az 1., 2. és 3.
Az 1., 2., 3. és 4.