我使用this blog by Alex Adamyan上的代码创建了本地化的MVC网站。

如果我使用现有的文化,这将非常有用。但是,我正在尝试本地化他加禄语(tl或tl-PH)。 Windows没有内置这种文化,因此我根据以下代码创建了一种文化(我已经尝试了tl和tl-PH):

public static void CreateCustomCultures()

{

    var cultureBuilder = new CultureAndRegionInfoBuilder(
                            "tl", CultureAndRegionModifiers.Neutral);

    cultureBuilder.LoadDataFromCultureInfo(new CultureInfo("en-US"));
    cultureBuilder.LoadDataFromRegionInfo(new RegionInfo("US"));
    cultureBuilder.IsMetric = true;
    cultureBuilder.CultureEnglishName = "Tagalog";
    cultureBuilder.CultureNativeName = "Tagalog";
    cultureBuilder.RegionEnglishName = "Tagalog";
    cultureBuilder.RegionNativeName = "Tagalog";
    cultureBuilder.TwoLetterISOLanguageName = "tl";
    cultureBuilder.ThreeLetterISORegionName = "PH";
    cultureBuilder.Register();

    var cultureBuilder2 = new CultureAndRegionInfoBuilder(
                            "tl-PH", CultureAndRegionModifiers.None);

    cultureBuilder2.LoadDataFromCultureInfo(new CultureInfo("en-US"));
    cultureBuilder2.LoadDataFromRegionInfo(new RegionInfo("US"));
    cultureBuilder2.IsMetric = true;
    cultureBuilder2.CultureEnglishName = "Tagalog";
    cultureBuilder2.CultureNativeName = "Tagalog";
    cultureBuilder2.RegionEnglishName = "Tagalog";
    cultureBuilder2.RegionNativeName = "Tagalog";
    cultureBuilder2.TwoLetterISOLanguageName = "tl";
    cultureBuilder2.ThreeLetterISORegionName = "PH";
    cultureBuilder2.Register();

}

我的测试站点上还有〜/Views/Home/Resources中的四个资源文件:
  • Home.aspx.resx;
  • Home.aspx.tl.resx
  • Home.aspx.tl-PH.resx
  • Home.aspx.de.resx

  • 构建时,我在bin目录下获得了三个适当命名的目录,每个目录都有一个适当命名的dll。

    因此,当我进入网站主页http://localhost:1907时,将获得默认的(英语)语言字符串。

    当我访问德语(de)主页http://localhost:1907/de时,会获得该站点的德语版本。

    当我转到他加禄语版本http://localhost:1907/tlhttp://localhost:1907/tl-PH时,我得到的是英语版本而不是他加禄语版本。

    我在资源获取代码中放置了断点,并确认当前线程的区域性和UI区域性已正确设置为Tagalog文化,并且Tagalog是传递给resourceManager.GetString(key,culture)的区域性。

    有什么想法吗?我没有正确地建立自己的文化吗?

    最佳答案

    我认为您的文化从未注册过,至少其中一种没有注册。

    以下代码将引发异常,因为您无法为中性文化指定区域值。就像您无法为中性文化创建DateTimeFormatInfo对象一样。

    var cultureBuilder = new CultureAndRegionInfoBuilder(
                            "tl", CultureAndRegionModifiers.Neutral);
    
    cultureBuilder.LoadDataFromCultureInfo(new CultureInfo("en-US"));
    cultureBuilder.LoadDataFromRegionInfo(new RegionInfo("US"));
    cultureBuilder.IsMetric = true;
    cultureBuilder.CultureEnglishName = "Tagalog";
    cultureBuilder.CultureNativeName = "Tagalog";
    cultureBuilder.RegionEnglishName = "Tagalog";
    cultureBuilder.RegionNativeName = "Tagalog";
    cultureBuilder.TwoLetterISOLanguageName = "tl";
    cultureBuilder.ThreeLetterISORegionName = "PH";
    cultureBuilder.Register();
    

    应该是这样的
    var cultureBuilder = new CultureAndRegionInfoBuilder(
                            "tl", CultureAndRegionModifiers.Neutral);
    
    cultureBuilder.LoadDataFromCultureInfo(new CultureInfo("en-US"));
    cultureBuilder.CultureEnglishName = "Tagalog";
    cultureBuilder.CultureNativeName = "Tagalog";
    cultureBuilder.TwoLetterISOLanguageName = "tl";
    cultureBuilder.Register();
    

    第二种特定文化似乎还不错。

    关于.net - 使用自定义区域性时,ResourceManager未选择正确的资源集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3743801/

    10-09 05:23