Ich versuche, mehrere Sprachen in einer ASP.NET Webforms (.NET 4.5, C#) Anwendung von mir zu behandeln.Automatisch mehrsprachige Eigenschaften in einer .NET-Klasse behandeln
Grundsätzlich haben einige meiner Entitäten in meiner SQL Server 2012-Datenbank Eigenschaften wie Name
oder Description
, die in drei Sprachen vorhanden sind - Deutsch, Französisch, Italienisch.
Diese werden als Spalten (deutsch), Name_Fr
(französisch) und Name_It
(italienisch) gespeichert.
Wenn ich meine .NET-Objekte aus der Datenbank erstellen, bekomme ich natürlich auch diese drei Eigenschaften in meiner Entitätsklasse. Aber für die Darstellung auf dem Bildschirm, zum Beispiel in einem Raster, wäre es schön, wenn ich irgendwie "magisch" immer die "richtige" Sprache zeigen könnte. Dies sollte auf der Thread.Current.CurrentUICulture.TwoLetterISOLanguageName
(die de
, fr
oder it
zurückgibt, abhängig von den Spracheinstellungen des Browsers) basieren.
Also hatte ich gehofft, irgendwie in der Lage zu sein, z.B. ein .NET-Attribut, das mir so etwas zu tun erlauben würde:
Base "Module" Entity - erzeugt aus bestehenden SQL Server-Datenbank:
public partial class Module
{
public string ModuleCode { get; set; }
public string Name_De { get; set; }
public string Name_Fr { get; set; }
public string Name_It { get; set; }
... // other properties
}
Teilauszug in einer separaten Datei
public partial class Module
{
[Multilingual]
public string Name { get; set; }
}
Die Grundidee ist: Ich kann auf die Module.Name
Eigenschaft zugreifen, und abhängig von der aktuellen Einstellung von CurrentUICulture
, würde entweder der Wert Name_De
, Name_Fr
oder Name_It
geholt werden, wh de Ich greife auf den Getter der Name
Eigenschaft zu.
Kann so etwas in C# gemacht werden? Ich habe mir viele benutzerdefinierte Attribut-Implementierungen angeschaut, aber nichts schien jemals so etwas zu tun ...
Danke - sicher könnte ich das tun - aber dies für mehrere Klassen tun, und bis zu 3 Gruppen von Eigenschaften für jede Klasse scheint übermäßig langweilig. Und ja - ich habe darüber nachgedacht, Reflektion in diesem Attribut zu verwenden - in dem Wissen, dass es an die Eigenschaft 'Name' angehängt ist, könnte es dann nach den Eigenschaften' Name_De' und so weiter suchen und den "korrekten" Wert zurückgeben. Aber ich habe keine geeignete Basisklasse für 'Attribut' gefunden, die es mir irgendwie ermöglichen würde, darüber informiert zu werden, wann der Getter dieser Eigenschaft aufgerufen wird ... –
Eigentlich sind das zwei getrennte Dateien - aber beide sind' public partielle Klasse Modul, so dass der C# -Compiler diese am Ende zu einer einzigen Einheit verschmelzen wird. –
Ja, es ist sicherlich mühsam. Benutzerdefinierte Attribute sind jedoch Metadaten über Ihrer Eigenschaft, so dass Sie 'Objekt.Name' nicht ausführen können und Ihren benutzerdefinierten Attributcode aufrufen müssen. Ich werde versuchen, eine andere Möglichkeit, dies ohne Autoadapter zu tun denken –