0

基于本教程,我试图在我的项目中具有国际化能力。我有这些资源文件用于保存不同语言的单词:

resources.resx --> 默认语言 (en-US)

resources.fa.resx --> 波斯语

resources.es.resx --> 西班牙语

文字喜欢faes显示文化。

views我以这种方式将资源文件中的单词替换为相等的单词:

<a href="#" >@Resources.IranNewsStand</a>

编辑:我已经根据教程实现了所有逻辑。但是我对所有语言都有一个视图,在这个视图中我使用的是 resources.resx 。这是一个正确的逻辑吗?

我的问题是我的项目如何知道根据 的值加载哪个资源文件Thread.CurrentThread.CurrentCulture?我错过了什么?

编辑:我已经实施了这些步骤:

1-我有一个包含三个Class Library Project提到的Resourcesresx 文件的名称(resources.resx、resources.fa.resx、resources.es.resx)。

2-Resource project作为参考添加到我的 mvc 应用程序中。

3-controllers 继承了这个 Base Controller :

public class BaseController : Controller
{
    protected override void ExecuteCore()
    {
        string cultureName;
        HttpCookie cultureCookie = Request.Cookies["_culture"];
        if (cultureCookie != null)
            cultureName = cultureCookie.Value;
        else
            cultureName = Request.UserLanguages[0];
        cultureName = utilities.CultureHelper.GetValidCulture(cultureName);
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
        base.ExecuteCore();
    }
}

4-正如我所说,view我使用resource.resx了包含默认语言(en-US)字符串的文件中的资源字符串:

<p>@Resources.Resources.Home</p>

5-in view 我有一个链接,当点击它时,这个 jquery 代码运行:

    <script type="text/javascript">
        $("#btnChangeLanguage").click(function () {
            $.cookie("_culture", "fa-IR", { expires: 365, path: '/' });
            window.location.reload(); // reload 
        })
    </script>

fa-IR是用户选择的文化。但点击此链接时,语言不会改变。

编辑:解决方案

我在我的项目中发现了 2 个问题,解决它们后一切正常:

1-jQuery cookie 插件需要让 jquery 代码正确工作:

<script type="text/javascript" src="~/Scripts/jquery.cookie.js" ></script>

2- ExecuteCore 事件BaseController不会触发,这听起来像是asp.net MVC 4. 所以基于这个问题我试图覆盖OnActionExecuted

4

1 回答 1

2

基于当前文化拉取资源的逻辑内置于 .NET 本身。

有两个步骤:

  1. 当前的文化需要在请求中适当设置。ASP.NET 有一些内置机制来执行此操作,例如您链接到的文章中描述的内容。
  2. 设置后,.NET Framework 将使用请求的当前区域性来加载适当的资源。如果请求的语言环境不可用,则将加载文化中性资源(“后备”)。
于 2013-04-09T17:40:35.517 回答