说我希望我的应用程序完全国际化......并且用户应该从表单中的国家/地区列表(下拉列表)中进行选择...
国家/地区(目前)不是我数据库中的一个表格,但我愿意改变这一点,但我不确定这是最好的主意。
例如,在西班牙德国是Alemania。许多国家/地区的名称不同,因此需要使用不同的语言。
我该怎么做?请帮忙。
编辑以澄清:
请记住,这个国家/地区下拉列表与语言切换机制无关......我们的应用程序应该跟踪用户的出生地址....所以我想要的是取决于当前选定的文化将显示不同的可能国家列表....重申我的例子
在德国出生并正在使用该应用程序的用户将使用英语 从dropdwon中选择德国
出生于德国且正在使用西班牙语应用的用户 从下拉列表中选择Alemania。
语言切换工作正常。任何用户都可以选择任何语言来显示应用程序,并将其存储在网址上。
答案 0 :(得分: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<int, string>
)并添加带有相应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()
。
答案 1 :(得分:0)
用户选择他们的区域,将其存储在会话或URL中,使用包含区域代码的路径。您可以在动作过滤器中阅读,例如在此处完成:
ASP.Net MVC switching Cultures after compile for initial load
如果选择路线方法
ASP.NET (MVC) routes internationalization
但这对您的方案来说似乎更有用,所以第一个链接将是您最好的选择。