【问题标题】:How do you handle static list internationalization in asp.net mvc?您如何处理 asp.net mvc 中的静态列表国际化?
【发布时间】:2011-07-14 04:00:40
【问题描述】:

假设我希望我的应用完全国际化......并且用户应该从表单中的国家列表(下拉列表)中进行选择......

国家/地区不是(当前)我数据库中的表,但我愿意更改这一点,尽管我不确定最好的主意是什么。

例如,在西班牙,德国是 Alemania。

许多国家有不同的名称,因此需要使用不同的语言。

我该怎么做?请帮忙。

编辑澄清:

请记住,这个国家/地区下拉菜单与语言切换机制无关...我们的应用程序应该跟踪用户的出生地地址...所以我想要的是取决于当前选定的文化将显示不同的可能国家列表....重申我的例子

  • 在德国出生并使用英语应用程序的用户将 从 dropdwon 中选择德国

  • 出生在德国并以西班牙语使用该应用程序的用户将 从下拉列表中选择 Alemania。

语言切换工作正常。任何用户都可以选择任何语言来显示应用程序,并将存储在 url 上。

【问题讨论】:

  • 问题是你为什么要这样做?为什么你首先需要这些信息?另一个问题是,如果(通常)可以从网络浏览器中检测到,为什么需要强制用户选择国家?
  • 我会编辑澄清

标签: asp.net asp.net-mvc internationalization


【解决方案1】:

要获得 .Net 或多或少支持的国家/地区列表,您可以像这样使用 CultureInfo 和 RegionInfo:

List<RegionInfo> allRegions = new List<RegionInfo>();
var specificCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
foreach (CultureInfo culture in specificCultures)
{
    var info = new RegionInfo(culture.LCID);
    allRegions.Add(info);
}

这将为您提供所有国家/地区,其中一些国家/地区多次(因为使用不同的语言)。

RegionInfo 有几个有趣的属性:

  • NativeName 将为您提供国家/地区的翻译名称,但不幸的是与给定的区域设置标识符 (LCID) 相对应的名称,即波兰的“Polska”,德国的“Deutschland”等等;有些会被翻译成几种语言(这很有趣,因为美国既可以作为美国也可以作为 Estados Unidos 看到)
  • DisplayName 应该是你要找的东西,但不幸的是不是——微软“忘记”在 .Net 框架中翻译它(也许没关系,因为它不应该是属性)
  • 与名称不同的名称将为您提供两个字母的国家/地区代码。

那么你可以用这些信息做什么?从理论上讲,您可以使用翻译后的国家/地区名称——在这种情况下,您只需创建一个字典 (Dictionary&lt;int, string&gt;) 并添加具有相应 NativeName 字符串的 LCID,并将其用作下拉菜单的来源。
理论上,一个出生在这个国家的人应该能够理解至少一种语言(至少大多数情况下都是这样)。

但实际上,您可能希望将唯一的国家/地区列表翻译成您的应用程序当前显示的任何语言。您可以使用上述方法获取国家/地区列表并使用例如DisplayName(或EnglishName)。在运行时,您可以将其解析为翻译后的名称,就像任何其他字符串一样。由于这需要在后端发生,您将添加另一个资源文件(可以放在 App_GlobalResources 中,没关系)并在您的代码隐藏中读取它。没有更多的理论,需要一些代码示例:

const string RESOURCE_FILE = "Countries";
Dictionary<string, string> countryNames = new Dictionary<string, string>();

var specificCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
foreach (CultureInfo culture in specificCultures)
{
    var info = new RegionInfo(culture.LCID);
    var name = info.EnglishName;
    var translated = GetGlobalResourceObject(RESOURCE_FILE, name).ToString();
    countryNames[name] = translated;
}

如果您想以特定语言(CurrentUICulture 除外)读取名称,请将 CultureInfo 对象作为第三个参数传递给 GetGlobalResourceObject()

【讨论】:

  • 我希望 C# 适合你,因为你忘了选择语言。只需正确标记问题,您肯定可以获得更多答案...
  • 我刚刚看到是Asp.Net-MVC的问题...嗯,我相信你仍然可以使用这个解决方案(可能稍作修改)。
【解决方案2】:

用户选择他们的区域,您将其存储在他们的会话或使用包含区域代码的路由的 URL 中。您可以在操作过滤器中阅读它,例如在此处完成:

ASP.Net MVC switching Cultures after compile for initial load

如果选择路由方式

ASP.NET (MVC) routes internationalization

但这似乎对你的场景来说有点多,所以第一个链接将是你最好的选择。

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 2017-12-09
    • 2011-03-23
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多