本地化管理器


  本地化管理器 IStringLocalizerManager 接口可以管理多组字符串资源,每组资源为一个 IStringLocalizer 对象。


1、获得实例

  要使用本地化管理器,首先得获取到它的实例。我们不推荐使用 new 构造一个实例,而是使用 StringLocalizerFactory 工厂类来创建一个实例。该工厂类提供一个 CreateManager 方法,可以接收一个 configName 参数,这个参数对应本地化配置(可参考 配置与扩展)中配置项的名称,如果未配置缓存配置项,则返回默认的的单例。如下所示:

[TestMethod]
public void TestCreateManager()
{
    var manager = StringLocalizerFactory.CreateManager();
    Assert.IsNotNull(manager); //DefaultStringLocalizerManager
}

  在使用 IOC 的环境中,也可以通过构造注入或属性注入得到 IStringLocalizerManager 的实例。如下所示:

public class HomeController : Controller
{
    private readonly IStringLocalizerManager _localizerManager;

    public HomeController(IStringLocalizerManager localizerManager)
    {
        _localizerManager = localizerManager;
    }
}

  GetLocalizer 方法用于根据不同的名称返回一个 IStringLocalizer 对象。 IStringLocalizer 是本地化字符串访问器。允许你为不同的模块制定不同的资源文件。


2、使用资源文件

  在 .Net 应用程序里可以使用资源文件实现本地化,为每一种语言建立相应后缀的资源文件。可以按不同的模块建立多个资源文件。如下所示:

资源文件 说明
Main.Resource.zh-CN 主功能的中文资源文件
Main.Resource.en-US 主功能的英文资源文件
Product.Resource.zh-CN 产品模块的中文资源文件
Product.Resource.en-US 产品模块的英文资源文件
Order.Resource.zh-CN 订单模块的中文资源文件
Order.Resource.en-US 订单模块的英文资源文件

  以 Order 为例,建立一个名称为 Create_Succeed 和 OrderNotExists 的资源。如下所示:

资源文件 名称
Order.Resource.zh-CN Create_Succeed 订单创建成功!
Order.Resource.zh-CN OrderNotExists 订单号 {0} 不存在!
Order.Resource.en-US Create_Succeed Order created successfully.
Order.Resource.en-US OrderNotExists The order {0} does not exist.

  设置 CultureInfo 信息(默认为 zh-CN)就可以获取不同语言下的字符串的值。如下所示:

[TestMethod]
public void TestGetResourceValue()
{
    var manager = StringLocalizerFactory.CreateManager();
    var localizer = rr.GetLocalizer("Order.Resource", this.GetType().Assembly);
    var value = localizer["Create_Succeed"];
    Console.WriteLine(value); //订单创建成功!
    value = localizer["OrderNotExists", "NO0001"];
    Console.WriteLine(value); //订单号 NO0001 不存在!
}

[TestMethod]
public void TestGetEnResourceValue()
{
    var manager = StringLocalizerFactory.CreateManager();
    manager.CultureInfo = CultureInfo.GetCultureInfo("en-US");
    var localizer = rr.GetLocalizer("Order.Resource", this.GetType().Assembly);
    var value = localizer["Create_Succeed"];
    Console.WriteLine(value); //Order created successfully.
    value = localizer["OrderNotExists", "NO0001"];
    Console.WriteLine(value); //The order NO0001 does not exist.
}

3、使用 XML 资源文件

  除了使用内嵌的资源文件,还可以使用 XML 文件,文件放在程序集目录下。如 zh-CN\Order.Resource.xml 文件的格式如下:

<?xml version="1.0" encoding="utf-8" ?>
<strings>
  <Create_Succeed>订单创建成功!</Create_Succeed>
  <OrderNotExists>订单号 {0} 不存在!</OrderNotExists>
</strings>

  使用 XML 资源文件应配置 XmlStringLocalizerManager