翻译事物的最佳方式是什么(即天数)
What is the best way to translate things (i.e Days)
我目前正在尝试将不同的东西翻译成不同的 C# 语言。我确信有比我目前使用的方式更好的方法来做到这一点。我在枚举文档中进行了搜索,但并没有真正找到我要找的东西。我想要英文索引,但我想要作为参数传递的语言的值。有没有办法让这个像.. 一行?
即day("MO" : fr="lundi", eng="monday", de="montag")
或类似的东西(我愿意接受建议)
private void SetDays(string language)
{
switch(language)
{
case "french":
days.Add( "MO", "lundi");
days.Add( "TU", "mardi" );
days.Add( "WE", "mercredi" );
days.Add( "TH", "jeudi" );
days.Add( "FR", "vendredi" );
days.Add( "SA", "samedi" );
days.Add( "SU", "dimanche" );
break;
case "english":
days.Add( "MO", "monday" );
days.Add( "TU", "tuesday" );
days.Add( "WE", "wednesday" );
days.Add( "TH", "thursday" );
days.Add( "FR", "friday" );
days.Add( "SA", "saturday" );
days.Add( "SU", "sunday" );
break;
case "german":
days.Add( "MO", "montag" );
days.Add( "TU", "dienstag" );
days.Add( "WE", "mittwoch" );
days.Add( "TH", "donnerstag" );
days.Add( "FR", "freitag" );
days.Add( "SA", "samstag" );
days.Add( "SU", "sonntag" );
break;
default:
//Fixme what do we do in this default case ?
break;
}
}
您可以创建 CultureInfo
object based on language and use DateTimeFormat
property of this object. There is AbbreviatedDayNames
属性,其中包含工作日名称。代码片段可以是下面的
CultureInfo ci = CultureInfo.CreateSpecificCulture("fr");
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
var dayNames = dtfi.AbbreviatedDayNames;
var dayName = dtfi.GetDayName(DayOfWeek.Monday);
请记住 CreateSpecificCulture
的备注部分。支持的文化标签取决于使用的 OS 版本(Windows 10 或更早版本)
另一种选择是使用 GetDayName
,其中 returns 基于 DayOfWeek
值的全天名称(如上面的示例)。这两个选项(取决于您的要求)都比手动维护日期名称更容易。
如果需要在字典中存储日期名称,使用下面的某种代码会很有意义。使用 DayOfWeek
是键比字符串更容易。结果字典包含每种通过的语言的本地化日期名称列表,可通过键
获得
var dictionary = new Dictionary<DayOfWeek, List<string>>();
AddDayNames("en");
AddDayNames("de");
AddDayNames("fr");
void AddDayNames(string language)
{
CultureInfo ci = CultureInfo.CreateSpecificCulture(language);
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)))
{
if (dictionary.ContainsKey(day))
dictionary[day].Add(dtfi.GetDayName(day));
else
{
dictionary.Add(day, new List<string> { dtfi.GetDayName(day) });
}
}
}
如果你想在几个月内做同样的事情,这段代码会很有帮助——使用缩写不变的月份名称作为键,使用特定于文化的月份名称列表作为值
void AddMonthNames(string language)
{
CultureInfo ci = CultureInfo.CreateSpecificCulture(language);
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
for (int i = 1; i <= 12; i++)
{
var month = CultureInfo.InvariantCulture.DateTimeFormat.GetAbbreviatedMonthName(i);
if (dictionary.ContainsKey(month))
dictionary[month].Add(dtfi.GetMonthName(i));
else
{
dictionary.Add(month, new List<string> { dtfi.GetMonthName(i) });
}
}
}
Resx 文件是最好的方法,但是这个修改后的方法根据原始问题设置集合。
private void SetDays(string name)
{
CultureInfo ci = CultureInfo.CreateSpecificCulture(name);
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
string[] dayNames = dtfi.DayNames;
string[] dayKeys = { "SU", "MO", "TU", "WE", "TH", "FR", "SA" };
for (int dayIndex = 0; dayIndex < 7; dayIndex++)
{
days.Add(dayKeys[dayIndex], dayNames[dayIndex]);
}
}
您需要输入有效的区域性名称,请参阅此 documentation。
方法如下:
首先用你想要的语言创建一个枚举,使用他们的 ISO 639-1 代码
public enum Language
{
FR, //French
EN, //English
DE //German
}
然后创建一个自定义 class 以您想要的格式存储翻译,例如:
public class Translation
{
public string Key { get; set; }
public Dictionary<Language, string> Values { get; set; }
}
以下代码会将我们枚举中所有语言的翻译存储在 days
列表中。
var days = new List<Translation>();
var languages = Enum.GetValues(typeof(Language)).Cast<Language>();
var cultures = languages.Select(x => x).ToDictionary(
k => k,
v => new CultureInfo(v.ToString()).DateTimeFormat);
foreach (var dayOfWeek in Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>())
{
days.Add(new Translation()
{
Key = cultures[Language.EN].GetAbbreviatedDayName(dayOfWeek),
Values = languages.ToDictionary(k => k, v => cultures[v].GetDayName(dayOfWeek))
});
}
我目前正在尝试将不同的东西翻译成不同的 C# 语言。我确信有比我目前使用的方式更好的方法来做到这一点。我在枚举文档中进行了搜索,但并没有真正找到我要找的东西。我想要英文索引,但我想要作为参数传递的语言的值。有没有办法让这个像.. 一行?
即day("MO" : fr="lundi", eng="monday", de="montag")
或类似的东西(我愿意接受建议)
private void SetDays(string language)
{
switch(language)
{
case "french":
days.Add( "MO", "lundi");
days.Add( "TU", "mardi" );
days.Add( "WE", "mercredi" );
days.Add( "TH", "jeudi" );
days.Add( "FR", "vendredi" );
days.Add( "SA", "samedi" );
days.Add( "SU", "dimanche" );
break;
case "english":
days.Add( "MO", "monday" );
days.Add( "TU", "tuesday" );
days.Add( "WE", "wednesday" );
days.Add( "TH", "thursday" );
days.Add( "FR", "friday" );
days.Add( "SA", "saturday" );
days.Add( "SU", "sunday" );
break;
case "german":
days.Add( "MO", "montag" );
days.Add( "TU", "dienstag" );
days.Add( "WE", "mittwoch" );
days.Add( "TH", "donnerstag" );
days.Add( "FR", "freitag" );
days.Add( "SA", "samstag" );
days.Add( "SU", "sonntag" );
break;
default:
//Fixme what do we do in this default case ?
break;
}
}
您可以创建 CultureInfo
object based on language and use DateTimeFormat
property of this object. There is AbbreviatedDayNames
属性,其中包含工作日名称。代码片段可以是下面的
CultureInfo ci = CultureInfo.CreateSpecificCulture("fr");
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
var dayNames = dtfi.AbbreviatedDayNames;
var dayName = dtfi.GetDayName(DayOfWeek.Monday);
请记住 CreateSpecificCulture
的备注部分。支持的文化标签取决于使用的 OS 版本(Windows 10 或更早版本)
另一种选择是使用 GetDayName
,其中 returns 基于 DayOfWeek
值的全天名称(如上面的示例)。这两个选项(取决于您的要求)都比手动维护日期名称更容易。
如果需要在字典中存储日期名称,使用下面的某种代码会很有意义。使用 DayOfWeek
是键比字符串更容易。结果字典包含每种通过的语言的本地化日期名称列表,可通过键
var dictionary = new Dictionary<DayOfWeek, List<string>>();
AddDayNames("en");
AddDayNames("de");
AddDayNames("fr");
void AddDayNames(string language)
{
CultureInfo ci = CultureInfo.CreateSpecificCulture(language);
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)))
{
if (dictionary.ContainsKey(day))
dictionary[day].Add(dtfi.GetDayName(day));
else
{
dictionary.Add(day, new List<string> { dtfi.GetDayName(day) });
}
}
}
如果你想在几个月内做同样的事情,这段代码会很有帮助——使用缩写不变的月份名称作为键,使用特定于文化的月份名称列表作为值
void AddMonthNames(string language)
{
CultureInfo ci = CultureInfo.CreateSpecificCulture(language);
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
for (int i = 1; i <= 12; i++)
{
var month = CultureInfo.InvariantCulture.DateTimeFormat.GetAbbreviatedMonthName(i);
if (dictionary.ContainsKey(month))
dictionary[month].Add(dtfi.GetMonthName(i));
else
{
dictionary.Add(month, new List<string> { dtfi.GetMonthName(i) });
}
}
}
Resx 文件是最好的方法,但是这个修改后的方法根据原始问题设置集合。
private void SetDays(string name)
{
CultureInfo ci = CultureInfo.CreateSpecificCulture(name);
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
string[] dayNames = dtfi.DayNames;
string[] dayKeys = { "SU", "MO", "TU", "WE", "TH", "FR", "SA" };
for (int dayIndex = 0; dayIndex < 7; dayIndex++)
{
days.Add(dayKeys[dayIndex], dayNames[dayIndex]);
}
}
您需要输入有效的区域性名称,请参阅此 documentation。
方法如下:
首先用你想要的语言创建一个枚举,使用他们的 ISO 639-1 代码
public enum Language
{
FR, //French
EN, //English
DE //German
}
然后创建一个自定义 class 以您想要的格式存储翻译,例如:
public class Translation
{
public string Key { get; set; }
public Dictionary<Language, string> Values { get; set; }
}
以下代码会将我们枚举中所有语言的翻译存储在 days
列表中。
var days = new List<Translation>();
var languages = Enum.GetValues(typeof(Language)).Cast<Language>();
var cultures = languages.Select(x => x).ToDictionary(
k => k,
v => new CultureInfo(v.ToString()).DateTimeFormat);
foreach (var dayOfWeek in Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>())
{
days.Add(new Translation()
{
Key = cultures[Language.EN].GetAbbreviatedDayName(dayOfWeek),
Values = languages.ToDictionary(k => k, v => cultures[v].GetDayName(dayOfWeek))
});
}