Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ResourceManager.GetString() method returns wrong string from different assemblies

I have 2 resource files, one with english and another foreign. When I call

ResourceManager.GetString("Hello") 

from the .Designer.cs file it is always returning the english translation. I have checked my locale and language etc. and everything is correct.

it returns properly translated strings from my main assembly, but from loaded assemblies it is always returning the english.

like image 969
pengibot Avatar asked Oct 04 '12 15:10

pengibot


2 Answers

Here is what was going on. I had an assembly with several translation resource files. These were all embedded resources.

When I compiled the assembly it was putting the default English inside its .dll. As for the other languages it was creating folders, fr, da, de, etc. with the languages in.

I had to move all these as well if I wanted them to be picked up by my main application which was loading in all these other assemblies. Thought as I told the assembly that they were all embedded resource files it would actually embed them!

I now have a AssemblyLoader which loads all the required .dll's when it cant find them from their current locations, packaging it will be determined on whether I want to include all languages or select the ones I want before building the project. More work than I had hoped, but solved in the end.

Anyone have any question, feel free to ask.

like image 102
pengibot Avatar answered Nov 03 '22 00:11

pengibot


The first overload of GetString, ResourceManager.GetString(string), uses the current thread's CurrentUICulture (Thread.CurrentThread.CurrentUICulture).

Referring to MSDN:-

The resource that is returned is localized for the UI culture of the current thread, as defined by the CurrentUICulture property.

In a background thread, do not assume the thread's CurrentUICulture is the same as your main (or UI) thread's CurrentUICulture.

A better way to access the resource from a background thread is to use something like the following to get the correct localised string:-

var localString = Properties.Resources.ResourceManager.GetString("ResourceKey", CultureInfo.CurrentCulture);
like image 29
The Lonely Coder Avatar answered Nov 03 '22 00:11

The Lonely Coder