2017-02-26 89 views
5

Próbuję zlokalizować odpowiedzi z mojego interfejsu API.Jak bezpiecznie uzyskać zlokalizowany łańcuch w kontrolerach Web Api?

Utworzono plik zasobów (Messges.resx) w moim projekcie zawierającym wszystkie znalezione ciągi. Używając nagłówka Accept-Language, aby zidentyfikować język użytkownika.

W odpowiedzi mogę ustawić ciąg jako:

response = Messages.KEY_GOOD_MORNING 

który będzie uzyskać ciąg dla tej nazwy w języku obecnej kulturze gwintu. Będę musiał zmienić bieżącą kulturę wątku na kulturę znalezioną z nagłówka Accept-Language. Ale nie chcę zmieniać kultury wątku, ponieważ spowoduje to również zmianę formatowania liczb/daty, co jest dla mnie problematyczne.

Inną alternatywą widzę IS- użyciu ResourceManager i przekazywanie kultury as-

Messages.ResourceManager.GetString("KEY_GOOD_MORNING", CultureInfo.CreateSpecificCulture(lang.value)) 

ten sposób nie będę musiał zmienić kulturę wątku. Ale problem z tym podejściem jest następujący: nazwy łańcuchów nie są już bezpieczne pod względem typów. Literówka w nazwie ciągu przekazywana do GetString() może spowodować zwracanie wartości pustych.

Czy istnieje inne podejście, które mogę zastosować, aby uniknąć obu powyższych problemów?

Odpowiedz

3

Po pierwsze należy sprawdzić to być msdn discussion

Dla najlepszego podejścia do tego problemu. Powinieneś ustawić globalizację w swoim pliku web.config.

<configuration> 
<system.web> 
    <globalization 
    enableClientBasedCulture="true|false" 
    requestEncoding="any valid encoding string" 
    responseEncoding="any valid encoding string" 
    fileEncoding="any valid encoding string" 

    responseHeaderEncoding = "any valid encoding string" 
    resourceProviderFactoryType = string 
    enableBestFitResponseEncoding = "true|false" 

    culture="any valid culture string" 
    uiCulture="any valid culture string"/> 

Dla kultury angielskiej przypadku

<globalization 
    enableClientBasedCulture="false" 
    uiCulture="en-US" 
    culture="en-US" /> 

Dzięki, że będziesz w stanie wykorzystać wątek kultury z config. Możesz również ustawić culturethread z ustawieniami przeglądarki na auto, możesz ustawić automatyczne i zignorować niektóre przypadki. Aby uzyskać więcej informacji, sprawdź powyższy link.

Jeśli chcesz zaakceptować kulturę przeglądarki

<globalization 
    enableClientBasedCulture="true" 
    uiCulture="auto" 
    culture="auto" /> 

Albo z domyślnej akcji

<globalization 
    enableClientBasedCulture="true" 
    uiCulture="auto:en-US" 
    culture="auto:en-US" /> 

najlepszych praktyk nie kiedykolwiek zmienić wątek komputer informacje kultura. Ale możesz zmienić zmianę bieżącego wątku w oparciu o sesję, to tylko informacje na temat wątku, a nie cały system. Mam nadzieję, że będzie to przydatne.

2

Po prostu myśl, ale możesz użyć swojego podejścia i użyć konstruktu/słowa kluczowego nameof(), aby zachować bezpieczeństwo typu - jako że to było twoje pytanie początkowo "ut problem z tym podejściem is-string nazwy nie są już bezpieczne typu a. literówka w nazwie ciąg przekazany do getString() może doprowadzić do wartości null zwracane "

przykład stosującnameof.

Messages.ResourceManager.GetString(nameof(Messages.KEY_GOOD_MORNING), CultureInfo.CreateSpecificCulture(lang.value)) 

Co robi & dokumentacja:

  • Kompilator będzie następnie emitują ciąg jako „KEY_GOOD_MORNING”, ale pojawi się zachować wszystkie refaktoryzacji/zmiana nazwy/typ bezpiecznej jare rzeczy.
  • ta jest dostępna dopiero od C# 6.0
  • Odniesienie do dokumentacji: https://msdn.microsoft.com/nl-be/library/dn986596.aspx