ASP.NET MVC4 wielojęzyczne adnotacje do danych

W standardowej aplikacji mam następujące:

[Required]
[DisplayName("Email Address")]
public string EmailAddress { get; set; }

...to z kolei automatycznie generuje etykietę dla tego pola formularza w języku angielskim.

Teraz, jeśli potrzebuję mojej aplikacji do obsługi 5 języków, jakie jest najlepsze podejście z ASP.NET aplikacja MVC do obsługi tego?

Zakres zastosowania wynosi około 400 - 600 pól danych.

Aktualizacja: będę również potrzebował wsparcia dla aktualizacji małych sekcji tekstu w aplikacji, takich jak nazwy stron i wprowadzenie do każdego formularza (mały akapit).

Author: Erwin, 2012-10-10

3 answers

Zamiast przypisywać rzeczywiste wartości właściwościom atrybutów, Przypisz klucze łańcuchów zasobów. Następnie możesz użyć niestandardowej ModelMetadataProvider, która jest świadoma kontekstu lokalizacji i zapewni odpowiedni ciąg znaków. Aby uzyskać lepsze rozwiązanie, możesz stworzyć własne konwencje ModelMetadataProvider wnioskujące, (co zmniejsza zapotrzebowanie na szczegółowe atrybuty).

Phil Haack ma artykuł na blogu o nazwie metadane modelu i lokalizacja walidacji przy użyciu Konwencji , który wyjaśnia, w jaki sposób działa. Istnieje również odpowiedni pakiet NuGet o nazwie ModelMetadataExtensions z kodem źródłowym dostępnym na GitHubie pod adresem https://github.com/Haacked/mvc-metadata-conventions .

na marginesie, polecam przejrzenie niektórych niesamowitych odpowiedzi, które dostałem na moje stare pytanie: skuteczne strategie lokalizacji w. Net. nie odnoszą się one konkretnie do twojego pytania, ale będą bardzo pomocne, jeśli pracujesz nad wielojęzycznym. NET app.

 9
Author: smartcaveman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 07:31:21

Zrobiłbym własny atrybut, np. [MyDisplayName ("sekcja", "Klucz")] A to zapewni tłumaczenie w oparciu o wybrany język. Sprawdź również Menedżera zasobów opartych na bazie danych, jak http://www.west-wind.com/presentations/wwDbResourceProvider/

 -1
Author: hkarask,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-07 14:21:05

Najlepszym podejściem do lokalizacji jest przechowywanie ciągów w bazie danych, a nie plików zasobów, chyba że

  1. Twoja aplikacja jest bardzo statyczna
  2. twój zestaw językowy jest bardzo statyczny

Możesz ozdobić swój model atrybutem niestandardowym, w którym ustawiasz domyślny ciąg znaków i DB id dla zasobu np.

[MyResource("email", 123)]

Możesz napisać niestandardową obsługę delegowania http, aby uzyskać zasoby z pamięci podręcznej (na przykład). Po uwierzytelnieniu klienta poznasz wymagania językowe klienta i resource id. Tak więc klient z hiszpańskim i zasobem id = 1 otrzyma "Si", ten z angielskim otrzyma "tak". Identyfikator zasobu zostanie odwzorowany na ciąg znaków specyficzny dla języka.

 -1
Author: T.S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-06 06:47:32