c# - 如何在 C# 中使用逗号和连词本地化或字符串格式化单词列表?

标签 c# localization string-formatting

在 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/

相关文章:

c# - Unity 使用触摸旋转相机 - 移动

c# - 使用数组检查字符串是否包含特定字符串

c# - 本地化 ObjectListView OLVColumn,由于 Empty Name 属性而无法实现

c# - 运行时本地化

python - 在 Python 2 中,我可以将列表传递给百分比格式运算符吗?

c# - 使用 Mvvmcross 进行 UITableView 分组的现代方法

c# - 使用反射获取特定键的字典完整路径

Flutter MaterialApp Widget 参数中的本地化

java - 如何将 double 格式化为字符串(只有两位小数)?

c# - 现在日期时间格式