В принципе, поведение объяснимо.
Пример.
public ActionResult Plain(string text)
{
File(text.ToBytes(), "text/plain", "Текст.txt");
}
Файрфокс отобразит в диалоге сохранения файла: "Текст.txt", Хром же, как и Эксплорер, отобразят "Plain.txt".
Как вариант решения может быть использована транслитерация.
Пример.
public static class TranslitExtensions
{
private static readonly Dictionary<string, string> letters
= new Dictionary<string, string>
{
{"№", "N"},
{"а", "a"},
{"б", "b"},
{"в", "v"},
{"г", "g"},
{"д", "d"},
{"е", "e"},
{"ё", "yo"},
{"ж", "zh"},
{"з", "z"},
{"и", "i"},
{"й", "j"},
{"к", "k"},
{"л", "l"},
{"м", "m"},
{"н", "n"},
{"о", "o"},
{"п", "p"},
{"р", "r"},
{"с", "s"},
{"т", "t"},
{"у", "u"},
{"ф", "f"},
{"х", "h"},
{"ц", "c"},
{"ч", "ch"},
{"ш", "sh"},
{"щ", "sch"},
{"ъ", "j"},
{"ы", "i"},
{"ь", "j"},
{"э", "e"},
{"ю", "yu"},
{"я", "ya"},
{"А", "A"},
{"Б", "B"},
{"В", "V"},
{"Г", "G"},
{"Д", "D"},
{"Е", "E"},
{"Ё", "Yo"},
{"Ж", "Zh"},
{"З", "Z"},
{"И", "I"},
{"Й", "J"},
{"К", "K"},
{"Л", "L"},
{"М", "M"},
{"Н", "N"},
{"О", "O"},
{"П", "P"},
{"Р", "R"},
{"С", "S"},
{"Т", "T"},
{"У", "U"},
{"Ф", "F"},
{"Х", "H"},
{"Ц", "C"},
{"Ч", "Ch"},
{"Ш", "Sh"},
{"Щ", "Sch"},
{"Ъ", "J"},
{"Ы", "I"},
{"Ь", "J"},
{"Э", "E"},
{"Ю", "Yu"},
{"Я", "Ya"}
};
/// <summary>
/// Performs translation from Russian to Translit.
/// </summary>
/// <param name="russian">String in Russian to translate.</param>
/// <returns>String in Translit.</returns>
public static string ToTranslit(this string russian)
{
var builder = new StringBuilder(russian);
foreach (var letter in letters)
{
builder.Replace(letter.Key, letter.Value);
}
return builder.ToString();
}
}
public ActionResult Plain(string text)
{
File(text.ToBytes(), "text/plain", "Текст.txt".ToTranslit());
}
спасибо, только ваш код и заработал
ОтветитьУдалитьего результат отличается от http://translit.ru/
как исправить?
Рад, что пригодилось. Насчет транслитерации: вероятно, лучший способ изменить поведение транслитератора, это отредактировать словарь letters.
ОтветитьУдалить