0

我正在创建一个多语言应用程序。翻译功能的要求比我尝试过的使用 .resx 文件更复杂。

我正在调用一个 web 服务,它返回一个包含所需翻译的数据集,然后将这些翻译保存到静态类 Translation。在这个类中,我有一个数据表,数据集被转换为对象,然后添加到数据表中。

所以数据表就像其他教程中使用的数据集。当我希望翻译视图中的关键字时,问题就出现了。我尝试的第一件事是在我的控制器中声明一个关键字列表,翻译这些关键字并在 ViewData["Translations"] 中传递字典。这行得通,但这种方法不够有效。

在下面的示例中,可以只调用 Multi.{Keyword} 并且本地化将选择正确的文件用于显示翻译文本。

看法

//street is a keyword in the resx file
@Html.LabelFor(c => c.name, Multi.Street)

多基地

    public abstract class MultiBase : Controller
    {
        /*CLASS TO CHECK WHAT LANGUAGE IS 
         * SELECTED AND LOAD THE 
         CORRESPONDING LANGUAGE*/
        protected override void ExecuteCore()
        {
            string CultureName = null;
            string Language = null;
            HttpCookie cultureCookie = Request.Cookies["Language"];
            if (cultureCookie != null)
            {
                Language = cultureCookie.Value;
                switch (Language)
                {
                    case "English":
                        CultureName = "en";
                        break;
                    case "French":
                        CultureName = "fr";
                        break;
                    case "Dutch":
                        CultureName = "nl";
                        break;
                    default:
                        CultureName = "nl";
                        break;
                }
            }
            else
            {
                CultureName = "en";
            }

            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(CultureName);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
            base.ExecuteCore();
        }

        protected override bool DisableAsyncSupport
        {
            get { return true; }
        }



    }

1)这种方式看起来是最有效的方式,但是如果控制器内部不知道关键字,我该如何调用字典?

2 ) 将翻译放入我的视图的最佳方式是什么?在视图中查询似乎不是一个好主意...在视图中调用方法 translate("keyword") 并将结果显示为纯文本,这是要走的路吗?

例子

在翻译类中有一个声明为 translate 的方法,这将只返回一个翻译后的关键字。

 @Html.Label(keyword, translation.translate("keyword"));

3)有没有办法可以在我的cshtml列表/控制器中创建一个关键字列表,然后将字典或其他东西返回到我的视图中?

在此先感谢您的帮助。如果有不清楚的地方,请发表评论,我会尝试进一步解释。

4

1 回答 1

0

我想你可能想重新考虑设计。

例如,每次您想要一种新语言时,都必须更改ExecuteCore. 这从根本上与SOLID原则背道而驰。

最好将文化代码存储在 中cultureCookie,然后使用它来创建CultureInfo- 任何异常都可以使用默认值。这样你就可以去掉开关...

但是,我实际上不会使用 cookie 来保存语言详细信息,因为网络爬虫不会获取这些信息。Google 只会知道您的网站使用一种语言。我建议您更改每种语言的 URL,而不是使用 cookie。

于 2013-10-25T13:31:19.497 回答