2015-02-19 3 views
0

sModel:Web Api - стоимость недвижимости Локализация

public class Product 
{ 
    public string NameEN { get; set; } 
    public string NameFR { get; set; } 
    public double Price { get; set; } 
} 

Контроллер:

// GET: api/Products/5 
    [ResponseType(typeof(Product))] 
    public IHttpActionResult GetProduct(int id) 
    { 
     return Ok(new Product(){NameEN = "Cookie", NameFR = "Biscuit", Price = 10}); 
    } 

Я хочу, чтобы этот результат:

{"Name" = "Cookie", "Price" = "10"} 

В produtcs являются хранить в базе данных

Как я могу трансформировать опору erties NameEN и NameFR для имени во время сериализации с требуемым языком Accept?

Спасибо

ответ

1

Вы можете создать и культуру доступа конкретные строки с помощью файла ресурсов.

Сначала создайте файл ресурсов и назовите его в соответствии с кодом культуры. Итак, по умолчанию у вас будет Names.resx, а для французского - Names.fr-FR.resx. Отсюда вы должны открыть свойства каждого файла resx и предоставить ему аналогичное пространство имен для таких инструментов, как ViewRes. Теперь, когда вы получаете доступ к файлу resx для захвата строки следующим образом: ViewRes.Names.MyString, вы получите строку в соответствии с текущей культурой, определенной в Thread.CurrentThread.CurrentCulture, которую вы можете установить. Вы можете установить это с помощью Accept-Language в вашем Global.asax.cs файл следующим образом:

protected void Application_AcquireRequestState(object sender, EventArgs e) 
{ 
    string culture = HttpContext.Request.ServerVariables.Get("HTTP_ACCEPT_LANGUAGE"); 
    CultureInfo ci = culture as CultureInfo; 
    if (ci == null) 
     ci = new CultureInfo("en"); 
    Thread.CurrentThread.CurrentUICulture = ci; 
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name); 
} 

Теперь в следующий раз, вы получаете доступ ViewRes.Names в контроллере он будет с культурой, установленной Accept-Language.

Вы также можете установить культуру, когда доступ к вашей Resx строки следующим образом:

[ResponseType(typeof(Product))] 
public IHttpActionResult GetProduct(int id, string culture) 
{ 
    ViewRes.Names.Culture = new CultureInfo(culture); 
    return Ok(new Product(){Name = ViewRes.Names.MyString, Price = 10}); 
} 
+0

Он не может работать, потому что продукты хранить в базе данных. Пример продукта: 1. Печенье, печенье, 1,99 $ 2. Автомобиль, автомобильный, 4999 $ Мой продукт динамичны. Я не могу использовать resx для хранения моего значения. – jonlabr

+0

@ jonlabr, тогда вам нужно применить свою собственную логику. Захватите и проанализируйте значение accept-language и соответствующим образом укажите значение имени. См. Https://stackoverflow.com/questions/9927871/need-an-example-on-how-to-get-preferred-language-from-accept-language-request-he –

+0

Я не могу поверить, что эта функция не включают :(Спасибо! – jonlabr

Смежные вопросы