Mam zlokalizowaną aplikację i zastanawiam się, czy możliwe jest DisplayName
ustawienie właściwości dla określonego modelu z zasobu.
Chciałbym zrobić coś takiego:
public class MyModel {
[Required]
[DisplayName(Resources.Resources.labelForName)]
public string name{ get; set; }
}
Ale nie mogę, jak mówi kompilator: "Argument atrybutu musi być wyrażeniem stałym, wyrażeniem typu lub wyrażeniem tworzenia tablicy o typie parametru atrybutu" :(
Czy są jakieś obejścia? Wyprowadzam etykiety ręcznie, ale potrzebuję ich do wyjścia z walidatora!
c#
asp.net-mvc
localization
resources
resx
Palantir
źródło
źródło
Jeśli używasz MVC 3 i .NET 4, możesz użyć nowego
Display
atrybutu wSystem.ComponentModel.DataAnnotations
przestrzeni nazw. Ten atrybut zastępujeDisplayName
atrybut i zapewnia znacznie więcej funkcji, w tym obsługę lokalizacji.W twoim przypadku użyłbyś tego w ten sposób:
Na marginesie, ten atrybut nie będzie działał z zasobami wewnątrz
App_GlobalResources
lubApp_LocalResources
. Ma to związek z narzędziem niestandardowym (GlobalResourceProxyGenerator
) używanym przez te zasoby. Zamiast tego upewnij się, że plik zasobów jest ustawiony na „Zasób osadzony” i użyj niestandardowego narzędzia „ResXFileCodeGenerator”.(Na marginesie, nie powinieneś używać
App_GlobalResources
aniApp_LocalResources
z MVC. Możesz przeczytać więcej o tym, dlaczego tak się dzieje tutaj )źródło
Name = "labelForName"
możesz również użyćName = nameof(Resources.Resources.labelForName)
.Jeśli otworzysz plik zasobów i zmienisz modyfikator dostępu na publiczny lub wewnętrzny, wygeneruje on klasę z pliku zasobów, która umożliwi tworzenie silnie wpisanych odwołań do zasobów.
Co oznacza, że zamiast tego możesz zrobić coś takiego (używając C # 6.0). Wtedy nie musisz pamiętać, czy imię było zapisane małymi literami, czy wielbłądami. Możesz sprawdzić, czy inne właściwości używają tej samej wartości zasobu za pomocą polecenia Znajdź wszystkie odwołania.
źródło
Aktualizacja:
Wiem, że jest za późno, ale chciałbym dodać tę aktualizację:
Używam dostawcy metadanych modelu konwencjonalnego, który przedstawiony przez Phila Haackeda jest bardziej wydajny i łatwy w zastosowaniu, spójrz na to: ConventionalModelMetadataProvider
Stara odpowiedź
Tutaj, jeśli chcesz wspierać wiele rodzajów zasobów:
Następnie użyj tego w ten sposób:
Pełny samouczek dotyczący lokalizacji znajduje się na tej stronie .
źródło
Otrzymałem odpowiedź Gunders podczas pracy z moimi zasobami App_GlobalResources, wybierając właściwości zasobów i przełączając „Narzędzie niestandardowe” na „PublicResXFileCodeGenerator” i budując akcję na „Zasoby osadzone”. Proszę zwrócić uwagę na komentarz Gundersa poniżej.
Działa jak marzenie :)
źródło
Zdefiniuj nazwę atrybutu, który jest używany dla klucza zasobu, po C # 6,0 można użyć
nameof
do silnej obsługi typów zamiast sztywnego kodowania klucza.Ustaw kulturę bieżącego wątku w kontrolerze.
Resource.Culture = CultureInfo.GetCultureInfo("zh-CN");
Ustaw dostępność zasobu jako publiczny
Wyświetl etykietę w cshtml w ten sposób
@Html.DisplayNameFor(model => model.Age)
źródło