2012-06-30 17 views
7

Bardzo prosta sprawa i nie mogę jej uruchomić. Chcę zglobalizować moją bibliotekę dll, dlatego używam plików zasobów + ResourceManager.Resourcemanager zwraca ten sam zasób, chociaż podano CultureInfo

nazywam ResourceManager tak:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); 

Pobierz za sznurki jak ten

System.Diagnostics.Debug.WriteLine(p.GetString("greeting")); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en"))); 

I zwraca 4 razy ten sam ciąg. Moje pliki są nazywane

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx 

Wszystkie ustawienia plików są takie same, ale jak wspomniano - używany jest tylko zasób w pliku domyślnym.

Co ja tu jest?

+2

Czy plik .resx faktycznie uzyskiwanie skompilowany do zespołów satelitarnych? Zajrzyj do folderu bin/Debug i poszukaj podkatalogów o nazwach en, nl i nl-NL. –

+0

Spróbuj uzyskać tłumaczenia za pomocą 'Default.ResourceManager.GetString'. Najprawdopodobniej tworzony menedżer zasobów dostaje nieprawidłowe parametry. –

Odpowiedz

10

Istnieje kilka sposobów korzystania z plików zasobów, z których jeden korzysta z plików .resx. Pliki te są automatycznie lokalizowane na podstawie wartości Thread.CurrentThread.CurrentUICulture. Domyślny plik .resx zostanie wkompilowany w zespół, którego jest częścią (na przykład główny plik wykonywalny), a zlokalizowane zasoby (Default.nl-NL.resx) zostaną wkompilowane do własnego katalogu (na podstawie identyfikatora kultury, nl-NL w tym przypadku) do zespołu, o nazwie <AssemblyName>.resources.dll.

Adresowanie wartości z tych zasobów jest tak proste, jak <ResourceName>.<KeyName>, na przykład Default.Greeting. By to sprawdzić, należy zmienić kulturę, używając:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(Default.Greeting); 

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL"); 
Console.WriteLine(Default.Greeting); 

Które wyjście

Hello 
Hallo 

Po uruchomieniu programu, Kultura UI jest ustawiony na kulturze komputera, który jest uruchomiony na, więc wygrał Musisz samodzielnie określić język, aby zawsze prezentować zlokalizowane zasoby. Tak więc, pliki .resx wydają się być drogą do zrobienia.

Podczas korzystania z ResourceManager z var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());, będziesz musiał odczytać pliki .resources. Jeśli nie ma pliku (w twoim przypadku) Appname.Default.resources, nie powiodło się p.GetString. Sądzę więc, że wcześniej utworzyłeś plik .resources, ale nie przekonwertowałeś zlokalizowanych plików .resx na pliki .resources.

Jeśli chcesz użyć ResourceManager aby móc określić kulturę, można użyć:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US")); 
+1

Dzięki - Nie wiem, dlaczego nie użyłem tylko Resources.Default. To musi być weekend! –

+0

@CodeCaster, proszę, proszę spojrzeć na moje pytanie. http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc