Hallo,
gibt es eine Möglichkeit zu erkennen, welche Lokalisierungen in einer Anwendung vorhanden sind? Grundsätzlich kann man ja auf die Resource-Verzeichnisse gehen, da für jede Übersetzung im Output-Folder ja ein entsrpechendes Unterverzeichnis mit der Sprache angelegt wird. Allerdings weiß man dann immer noch nicht, was die Defaultsprache ist/war. Kann man das irgendwie aus der Assembly auslesen?
Hintergrund ist, dass ich ein DropDown-Control zur Sprachauswahl bastle. Das Control soll möglichst unabhängig arbeiten und von selbst erkennen, was alles angezeigt werden soll. Bis jetzt parse ich eben das Directory und füge die Resource-Subdirectories entsprechend hinzu. Zusätzlich hab ich jetzt noch fest drin, dass immer auch noch Deutsch hinzugefügt wird, da das bei mir in der Regel die Standardsprache ist. Das ist aber ziemlich unflexibel, da man eben nicht immer deutsch als Standard-Sprache verwendet.
Gibt es dafür eine Lösung?
ich glaube folgendes sollte dir helfen:
using System.Threading;
Thread.CurrentThread.CurrentCulture.Name == "en-US"
torti
@torti:
mir fällt beim besten willen nciht ein wie das helfen sollte. das sieht mir eher nach themaverfehlung aus?
@Mossi:
es kommt immer darauf an, wie lokalisiert wird. wenn man das frameworkinterne mithilfe des ressourcemanagers nutzt, ists noch recht einfach:
mit "GetNeutralResourcesLanguage" bekommst du die fallback-kultur. also die defaultsprache.
wie du die bereits vorhandenen sprachen bekommst kann ich dir jedoch nicht sagen.
weiterhin gilt: wenn dieser weg nciht genutzt wird, hast du kaum chancen.
Danke,
GetNeutralResourcesLanguage wär genau das richtige, wie ich in der Doku gesehen habe. Allerdings darf ich darauf nicht zugreifen. Die Methode wird vom Intellisens nicht vorgeschlagen und wenn ich sie dennoch einfach mal so hinschreibe, kommt sofort die Fehlermeldung
Der Zugriff auf "System.Resources.ResourceManager.GetNeutralResourcesLanguage(System.Reflection.Assembly)" ist aufgrund der Sicherheitsebene nicht möglich.
jetzt müsste man sich eben wieder mit dem Security-Concept auskennen. bisher bin ich noch nie auf so ein problem gestoßen grml
EDIT: Interessanterweise kann man die Function aber im Quickwatch aufrufen. Nachdem ich das AssemblyAttribute NeutralResourcesLanguage gesetzt habe, wird dann auch das richtige angezeigt. Hilft mir aber eben nichts, da ich den Quellcode nicht damit kompilieren kann.
ok. ich hab's jetzt so gelöst, dass ich per Reflection die Attribute der Assembly abfrage
public static CultureInfo GetNeutralCultureInfo()
{
if (_defaultCulture != null)
return _defaultCulture;
object[] attributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(NeutralResourcesLanguageAttribute), false);
if (attributes.Length != 1)
_defaultCulture = CultureInfo.GetCultureInfo("de-DE");
else
_defaultCulture = CultureInfo.GetCultureInfo(((NeutralResourcesLanguageAttribute)attributes[0]).CultureName);
return _defaultCulture;
}
In den Assembly-Einstellungen muss man dann eben die entsprechende Sprache setzen. Entweder über die Projekt-Einstellungsseite oder in der AssemblyInfo.cs manuell
[assembly: NeutralResourcesLanguageAttribute("de-DE")]
ist die default-sprache nicht dieselbe, die auch durch System.Globalization.CultureInfo.CurrentUICulture() As System.Globalization.CultureInfo
angegeben ist?
Der frühe Apfel fängt den Wurm.
@Mossi:
Habs mir nicht genauer angesehen, aber vielleicht hilft das ja weiter:
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
ist die default-sprache nicht dieselbe, die auch durch
System.Globalization.CultureInfo.CurrentUICulture() As System.Globalization.CultureInfo
angegeben ist?
Das ist die Default-Sprache des Benutzers, der die Anwendung ausführt. Das heißt, wenn man mit den Amerikanischen Einstellungen die Applikation startet, bekommt man en-US, während man auf deutschen Rechnern de-DE bekommen würde.
Was ich gesucht habe, ist die Default-Resource-Datei sozusagen. Also die Sprache, in der die Anwendung entwickelt wurde.
Gleiches gilt auch für den Snippet von dr4g0n76
Sonst wär's ja zu einfach 😃
Damit ich eben in einer ComboBox anzeigen kann, welche Lokalisierungen vorhanden sind. Die zusätzlichen Lokalisierungen kann man ganz leicht über die Directories rausbekommen, aber die ursprüngliche Sprache findet man sonst nicht.
ich denk, entwickelt wird immer in invariant culture, d.h. en-us.
Ich mache das daran fest, dass zB. Datum-Literale wie folgt anzugeben sind:
var today = 4 / 23 / 2010;
Der frühe Apfel fängt den Wurm.