在 C# 中,我使用资源字符串和 string.Format
进行本地化。有时我需要从任意大小的术语列表中生成一条消息。 (例如:“您必须从列表 [“狗”、“猫”、“猴子”] 中选择狗、猫或猴子之一)
我可以编写代码来生成该消息,但它破坏了格式字符串的灵 active (翻译人员重新排列参数在格式字符串中出现的位置的能力)及其清晰度(例如:“您必须选择 {0} 之一”)。
我可以在我的代码和资源文件中做些什么来避免这些缺点?
当前代码示例:
// assuming all string literals are in a Resource file somewhere...
string message = string.Format(
"You must select one of {0}.",
Conjoin(new []{ "Dog", "Cat", "Monkey" }));
// produces "You must select one of Dog, Cat, or Monkey
string Conjoin(string[] items)
{
if (items.Length == 1) return items[0];
if (items.Length == 2) return string.Format("{0} or {1}", items[0], items[1]);
if (items.Length >= 3)
{
string result = items[0];
for (int i = 1; i < items.Length - 1; i++)
{
result = string.Format("{0}, {1}", result, items[i]);
}
result = string.Format("{0}, or {1}", result, items[items.Length - 1]);
return result;
}
return "";
}
最佳答案
如果列表的最大大小较小,只需本地化列表格式化程序就足够容易了:
ListFormatter[1] "{0}"
ListFormatter[2] "{0} or {1}"
ListFormatter[3] "{0}, {1}, or {2}"
etc...
为了将其推广到任意列表大小,我在类似情况下使用的一种方法是使用不规则格式化程序为列表大小设置单独的格式化程序,然后为其他所有内容使用常规范式化程序。该格式化程序可以分为三个部分,前缀、后缀和中间重复部分。所以:
ListFormatter[1] "{0}"
ListFormatter[2] "{0} or {1}"
ListFormatterNStart "{0}, "
ListFormatterNMid "{{0}}, "
ListFormatterNEnd "or {{0}}"
对于英语,Prefix 和 Mid 是相同的,但在其他语言中可能不同。请注意双括号 {{0}}
参数,它允许您格式化格式化程序。
在使用中你会做这样的事情,其中 N 是列表大小(伪代码)
if List[N] exists
formatter = ListFormatter[N]
else
formatter = ListFormatterNStart
for i = 1 to N-2
formatter += String.Format(ListFormatterNMid,i)
formatter += String.Format(ListFormatterNEnd, N-1)
关于c# - 如何在 C# 中使用逗号和连词本地化或字符串格式化单词列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38536455/