列表本地化

问题描述 投票:0回答:2

本地化字符串列表的正确方法是什么?我知道分隔符可以本地化为逗号或分号,但是连词是否本地化?如果是这样,任意长度列表的格式字符串会是什么样子?

示例

“蝙蝠、猫和狗”。我可以根据区域设置使用分隔符并构建列表,如下所示:

LIST := UNIT
LISTMID := UNIT SEPARATOR UNIT
LISTMID := LISTMID SEPARATOR UNIT
LIST := UNIT CONJUNCTION UNIT
LIST := LISTMID CONJUNCTION UNIT

我是否必须针对每种语言制定此规则?有什么图书馆可以帮助解决这个问题吗?

localization internationalization
2个回答
5
投票

我来这里寻找同一问题的答案,最后进行了更多谷歌搜索,发现了这个: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))

将其适用于其他语言应该很简单。


0
投票

Intl 有一个列表格式,在 MDN 上记录了 JavaScript:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat

© www.soinside.com 2019 - 2024. All rights reserved.