我有一个带有Windows LCID值的语言代码列表:
"de-de" 1031
"de" 1031
"en-us" 1033
"en" 1033
"en-US" 1033
我想创建一个函数,我可以输入像“en-US”这样的字符串,让它告诉我LCID(在这种情况下为1033)。
由于我只有300个这样的“项目”,我想对其进行硬编码。
但我不确定以什么方式对此进行编码。
我想我不应该使用
if (value == "en-us")
return 1033;
else if (value == "en-US")
return 1033;
有人能告诉我成人处理这个问题的方法吗?
答案 0 :(得分:3)
您需要一个函数来提供文化代码才能获得LCID吗?只需使用.NET默认方式:
return System.Globalization.CultureInfo.GetCultureInfo("de-DE").LCID;
如果您需要管理从这些代码到LCID的映射,您可以调用GetCultures()
因为“仅”300对我来说听起来不好硬编码。我们都知道.NET中的每一种文化都有LCID。那么如何列出所有这些内容并将它们放入一个可以轻松解决的问题中呢。
从此处获取默认列表:
foreach (var c in System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.UserCustomCulture | System.Globalization.CultureTypes.SpecificCultures))
Console.WriteLine(c.ToString() + " code:" + c.LCID);
答案 1 :(得分:0)
使用Dictionary
,键入语言代码,其值为LCID。
这仍然是"硬编码",因为您可以手动将字符串/值添加到字典中,但它使可维护性等更高,如果您想切换到更好的加载方式稍后,你可以很容易地(例如,只需用一些文件读取+解析来替换你的手册)。
Dictionary<string, int> lcidLookup = new Dictionary<string, int>();
lcidLookup.Add("de-de", 1031);
lcidLookup.Add("de", 1031);
lcidLookup.Add("en-us", 1033);
lcidLookup.Add("en", 1033);
...
int lcid = lcidLookup["en-us"];
还要考虑确保您使用的所有密钥都转换为大写/小写(请参阅String.ToLower
和类似String.ToUpper
),并确保您搜索的所有密钥都符合此约定,以避免套管周围的错误(en-US
vs en-us
)。
鉴于您的LCID值映射到实际的区域设置代码,您应该使用@ Waescher的答案 - 它会阻止您完全执行任何硬编码。
答案 2 :(得分:0)
一种解决方案是使用switch语句,即:
switch(value.ToLower())
{
case "en-us":
case "en":
return 1033;
case "de-de":
case "de":
return 1031;
default: return -1;
}
答案 3 :(得分:-1)
使用template <bool>
struct Foo
{ int a; };
template <>
struct Foo<true> : public Foo<false>
{ int b; };
template <bool Cond>
struct Test
{ using type = Foo<Cond>; };
int main ()
{
decltype(Test<true>::type::a) a1;
decltype(Test<true>::type::b) b1;
decltype(Test<false>::type::a) a0;
// decltype(Test<false>::type::b) b0; // compilation error
}
:
System.Globalization.CultureInfo
答案 4 :(得分:-1)
public static int LCIDFromLangName(string uKey)
{
uKey = uKey.ToLower();
Dictionary<string, int> _dic;
_dic = new Dictionary<string, int>();
_dic.Add("de-de", 1031);
_dic.Add("en-us", 1033);
(and so on)
int iRet = 0;
bool b = _dic.TryGetValue(uKey, out iRet);
if (!b)
{
iRet = 1033;
}
return iRet;