本地化字符串列表的正确方法是什么?我知道分隔符可以本地化为逗号或分号,但是连接符是否可以本地化?如果是这样,我的任意长度列表的格式字符串将是什么样?
例
“蝙蝠,猫和狗”。我可以根据区域使用分隔符,并按以下方式构造LIST:
LIST := UNIT
LISTMID := UNIT SEPARATOR UNIT
LISTMID := LISTMID SEPARATOR UNIT
LIST := UNIT CONJUNCTION UNIT
LIST := LISTMID CONJUNCTION UNIT
我是否需要根据每种语言制定此规则?有没有可用的图书馆来帮助这一点?
最佳答案
我来到这里寻找相同问题的答案,并最终进行了更多的谷歌搜索,结果发现:http://icu-project.org/apiref/icu4j/com/ibm/icu/text/ListFormatter.html
该类采用参数two
,start
,middle
和end
:
two-两个项目的字符串,第一个包含{0},第二个包含{1}。
start-列表项开始的字符串,第一个包含{0},其余包含{1}。
middle-列表项开头的字符串,其中,列表的第一部分包含{0},列表的其余部分包含{1}。
end-列表项末尾的字符串,包含{0}用于列表的第一部分,{1}用于最后的项目。
因此,对于英语,这将是:
- TWO := "{0} and {1}"
- START := "{0}, {1}"
- MIDDLE := "{0}, {1}"
- END := "{0} and {1}"
我写了一个简短的Lua演示来说明我的工作原理:
function list_format(words, templates)
local length = #words
if length == 1 then return words[1] end
if length == 2 then
return replace(replace(templates['two'], '{0}', words[1]),
'{1}', words[2])
end
local result = replace(templates['end'], '{1}', words[length])
while length > 3 do
length = length - 1
local mid = replace(templates['middle'], '{1}', words[length])
result = replace(result, '{0}', mid)
end
result = replace(result, '{0}', words[2])
result = replace(templates['start'], '{1}', result)
result = replace(result, '{0}', words[1])
return result
end
function replace(template, index, text)
str, _ = string.gsub(template, index, text)
return str
end
local english = {
["two"] = "{0} and {1}",
["start"] = "{0}, {1}",
["middle"] = "{0}, {1}",
["end"] = "{0} and {1}"
}
print(list_format({"banana"}, english))
print(list_format({"banana", "apple"}, english))
print(list_format({"banana", "apple", "mango"}, english))
print(list_format({"banana", "apple", "mango", "pineapple"}, english))
使其适应其他语言应该是微不足道的。