翻译事物的最佳方法是什么(即几天)

我目前正在尝试将不同的事物翻译成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;
  }
}
shaliang8 回答:翻译事物的最佳方法是什么(即几天)

您可以根据语言创建CultureInfo对象,并使用该对象的DateTimeFormat属性。有AbbreviatedDayNames个数组,其中包含工作日名称,请在MSDN中查找详细信息。该代码段可以遵循

CultureInfo ci = CultureInfo.CreateSpecificCulture("fr");
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
var dayNames = dtfi.AbbreviatedDayNames;
var dayName = dtfi.GetDayName(DayOfWeek.Monday);

请查看CreateSpecificCulture method的评论。支持的区域性标签取决于使用的操作系统版本(Windows 10或更早版本)

另一种选择是使用GetDayName method,它根据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
}

然后创建一个自定义类,以所需的格式存储翻译,例如:

public class Translation
{
    public string Key { get; set; }
    public Dictionary<Language,string> Values { get; set; }
}

以下代码将在days列表中的Enum中存储所有语言的翻译。

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))
    });
}
本文链接:https://www.f2er.com/2905745.html

大家都在问