2

我正在考虑实现一个真正的多语言多元化类,并且我将它基于我创建的接口 IPlural。

IPlural 定义了函数pluralType

string pluralType(float value);

对于我想要支持的每种语言,我计划创建一个类文件,该文件实现了确定复数类型的规则集,它可以是“零”、“一”、“二”、“少数”、“许多”或“其他” . 函数很简单,传入一个数值,得到一个字符串。

我的问题是我想根据用户当前的 CultureInfo / Language 选择 IPlural 的实现之一,所以没有大量的 switch 语句,我该怎么做呢?

我所有的课程都被称为:

  • 复数
  • 复数_pl
  • 复数_bs

其中最后两个字符是语言(在这种情况下通常与语言环境无关)。

这些类都实现了 IPlural,我设想它应该按如下方式工作......

IPlural pluraliser = new "dynamically chosen pluraliser class"
string pt = pluraliser.pluralType(5);

问题是,我不知道这是否可能?

任何指针都将受到欢迎。

谢谢

4

2 回答 2

3

你需要的是工厂模式

您可以有一个名为 的类PluralizerFactory,它可以:

public static IPlural CreatePluralizer(string language)
{
  if (language=="en")
    return new Plural_en();
  if (language=="pl")
    return new Plural_pl();
  if (language=="bs")
    return new Plural_bs();
  throw new ArgumentException("invalid language");
}

这可以比使用

IPlural pluraliser = PluralizerFactory.CreatePluralizer("en");
string pt = pluraliser.pluralType(5);

方法中的代码CreatePluralizer可以随心所欲地丑陋或聪明。重要的是你的调用代码被屏蔽了,所以调用代码甚至不需要知道“en”和“pl”存在不同的类。

这个实现是最简单和最丑陋的,但它代表了它是如何完成的。

于 2013-09-03T13:26:24.390 回答
1

有两个相对简单的解决方案:

  • 使用 aDictionary<string,Func<IPlural>>来构造Plural_..类,或者
  • 使用反射来定位根据您的约定命名的类。

以下是如何实施第一个解决方案:

private readonly IDictionary<string,Func<IPlural>> LangToPlural =
    new Dictionary<string,Func<IPlural>> {
        {"en", () => new Plural_en()}
    ,   {"pl", () => new Plural_pl()}
    ,   {"bs", () => new Plural_bs()}
    ,   ...
    };
public IPlural MakePluralForLanguageCode(string langCode) {
    Func<IPlural> res;
    if (LangToPlural.TryGetValue(langCode, out res)) {
        return res();
    }
    return new Plural_en(); // Provide a default
}

以下是实施第二种解决方案的方法:

var typeName = typeof(IPlural).Assembly.FullName.+".Plural_"+langCode;
var plType = Type.GetType(typeName);
if (plType == null) retunr new Plural_en(); // Provide a default
var constr = plType.GetConstructor(new Type[0]);
return (IPlural)constr.Invoke(new Type[0]);

第一种方法的优点是简单;第二种方法的优点是它能够在其他实现Plural_xy可用时获取它们,而无需对您的代码进行任何进一步的修改。

于 2013-09-03T13:36:11.773 回答